#help-development

1 messages · Page 2000 of 1

tender shard
#

ConfigurationSerializable

lost matrix
#

Something like that

torn vale
#

no, it does not fire when I do the hover thing

lost matrix
#

one moment

fading lake
#

alright we're kinda interrupting someone else a bit, can you create a thread real quick

subtle pewter
#

I could set the proxy instance to my own class that extends ProxyServer right?

ivory sleet
#

I don’t believe that’s the intention of the api

#

But you sure can

ivory sleet
#

?jd-bc

subtle pewter
round elbow
tender shard
lost matrix
round elbow
#
public class HomeModule {

    @Getter
    @Setter
    private String name;
    
    private int x;
    private int y;
    private int z;
    private float yaw;
    private float pitch;
    private UUID worldUniqueId;

    HomeModule(String name, Location location) {
        this.name = name;
        this.x = location.getBlockX();
        this.y = location.getBlockY();
        this.z = location.getBlockZ();
        this.yaw = location.getYaw();
        this.pitch = location.getPitch();
        this.worldUniqueId = location.getWorld().getUID();
    }
    
    public Location getLocation() {
        return new Location(Bukkit.getWorld(worldUniqueId), x, y, z, yaw, pitch);
    }
    
    public void setLocation(Location location) {
        this.x = location.getBlockX();
        this.y = location.getBlockY();
        this.z = location.getBlockZ();
        this.yaw = location.getYaw();
        this.pitch = location.getPitch();
        this.worldUniqueId = location.getWorld().getUID();
    }
}
#

but ur way of doing it is clean as fuck

lost matrix
round elbow
#

thank u so much for helping me

#

i would've never figured it out lmao

#
{
  "0867b702-e48b-4cc7-8a88-af9ed424a9ac": [
    {
      "name": "home",
      "location": {
        "world": "34268d9f-02f6-49de-aebb-2c6d67b87d98",
        "x": 38.369164472631404,
        "y": -29.0,
        "z": 14.000366179546882,
        "pitch": 24.124159,
        "yaw": 61.882202
      }
    }
  ]
}
#

result

#

:D

lost matrix
#

nice

torn vale
sterile token
#

Spigot api or spigot jar?

torn vale
#

spigot api

lost matrix
torn vale
#

There is no such import

#

or is this just for the newer version? I am using 1.8.8

lost matrix
torn vale
#

My IDE cant find it

lost matrix
torn vale
#

oh

#

is there a other way to set the players max health?

lost matrix
torn vale
#

okay

lost matrix
torn vale
#

👍

raw ibex
#

out of curiousity (can hashmaps be madepublic)?

hollow bluff
#

duh

raw ibex
#

how though

hollow bluff
#

just add a public infront of ur line thingy

chrome beacon
#

^

raw ibex
#

it doesn't work

#
public Map<Location, Boolean> blockMap = new HashMap<>();```
#

this?

sterile token
#

Have you imported the Spigot dependency?

#

🤔

raw ibex
sterile token
#

Generally happen because you didnt import the spigot into your ide

chrome beacon
lost matrix
raw ibex
#

OK

#

oh it does work

#

hmm

#

it didnt work earlier

lost matrix
raw ibex
#

oki

lost matrix
#

*Methods that access and edit the content of the map without ever presenting the map to other classes

raw ibex
#

@lost matrix so you suggest my hashmaps should be like this

#
private final Map<Location, Boolean> blockMap = new HashMap<>();```
lost matrix
#

Yes

raw ibex
#

oki

#

why should they not be public just wondering

lost matrix
#

Because making them public damages the robustness of your code. You lose control and track of your data.

raw ibex
#

ok

raw ibex
raw ibex
#

ok

#

thanks 7smile7

undone axleBOT
raw ibex
#

?

#

?

sterile token
#

?

sterile token
#

He?

#

Never o tag you

ivory sleet
#

Can you guys just drop it

sterile token
raw ibex
#

lol he basically typed ?jd-s randomly

#

i was wondering if he needed help

sterile token
#

Okay?....

ivory sleet
#

I thought I said stop

raw ibex
#

bruh you have to boot up your browser to actually open the docs :/

#

and stop

vestal barn
#

does opening a new inventory from another inventory call InventoryCloseEvent?

ivory sleet
#

iirc yes

torn vale
#
            ItemStack marioChar = new ItemStack(Material.STAINED_CLAY, 1, (byte) DyeColor.RED.getDyeData());

How can I change the color of the clay block?

torn vale
#

1.8.8 (ik its not supported anymore)

river oracle
#

Probably different byte data I would not try doing dye color

#

Try just adding a byte data of 1 etc

young knoll
#

Red was like

#

13 or something

river oracle
#

Red is 14

torn vale
#

works now, ty :)

river oracle
blazing rune
#

How do I shrink the world border in mc?

#

Like the UHC gamemode where the border gradually shrinks as time passes by

vocal cloud
sage dragon
#

Hey \o

I want to disable teleportation via Spectator Mode (Because of an animation which would pretty much break if the player just teleported...).

Is it enough to block PacketPlayInSpectate?

vocal cloud
#

Took me 5s to find in the docs

young knoll
#

That packet is for spectating an entity anyway

weary flame
#

why when trying to get the material type of a netherite item i get air?
api version 1.16

raw ibex
#

why is this not available in different classes?

#
    public void setTeam(UUID player, String colour) {
        teamMap.put(player, colour);
    }```
young knoll
#

Nothing to do with teleporting

vague swallow
#

How is the nms ChatComponentText called in nms remapped?

sage dragon
vocal cloud
#

Delete NMS return to API

vague swallow
lavish hemlock
#

Because NMS is discouraged when the API exists already

vocal cloud
#

Because 99% of the time someone in here is trying to NMS an API feature

#

As just seen

lavish hemlock
#

NMS has the problem of being version-specific

#

And, it's a pain to maintain it across versions

raw ibex
lavish hemlock
#

Even if you use abstractions, you still have to write said abstractions every time a new update comes out

vague swallow
#

Okay, can you please tell me how to modify the names in the tab list?

lavish hemlock
#

Which means your plugin will likely stop working at some point

young knoll
#

Player.setTabListName

sage dragon
vague swallow
#

alr ty

young knoll
#

Something like that

vocal cloud
young knoll
#

setPlayerListName

raw ibex
young knoll
#

Well it’s public

vocal cloud
#

The method? Or the hashmap?

young knoll
#

But not static

woeful dagger
#

Hey all, has anyone gotten the 1.18.2 build to work from BuildTools?

young knoll
#

So you need an instance of that class to use it

raw ibex
#

I can't use it in differnet class

young knoll
#

It’s public

#

But not static

raw ibex
#

so do i need to make it static to use?

woeful dagger
#

ah nvm, just tried it again. It threw an error the first time around, my b

young knoll
#

Do you know what static means

vague swallow
vocal cloud
#

Learn java moment

young knoll
raw ibex
#

it means i dont have to make an instance of the class to use it

vague swallow
young knoll
#

setPlayerListHeader/Footer

#

You really should use the javadocs

vocal cloud
#

?jd

raw ibex
#

@young knoll so i make it static?

young knoll
#

That’s up to you

#

Static abuse is bad

#

Is it something that should be static?

raw ibex
#

i just need it to be used anywhere

young knoll
#

Then have an instance if that class

raw ibex
#

ok

#

i'm iterating through a collection (for)and i'm trying to assign teams

#

and there are 8 colours

#

how do i set the colours

#

randomly

vague swallow
undone axleBOT
young knoll
#

Tbf I don’t know if the API has a method for that

#

Probably need packets

viral temple
#

Is the spigot jar inside spigot repo or only the spigot-api?

young knoll
#

Only the API

viral temple
#

Sad... I need some way to get the spigot and not the api other way than running BuildTools inside GitHub action

#

Atm it takes around 50 minutes to complete

young knoll
#

There isn’t one

quaint mantle
#

Can you take the version from build.gradle and load it into the plugin.yml I think it was something like ${version}

cobalt tinsel
#

hi

#

player.setMetadata("blood", new FixedMetadataValue(Killeffects.getInstance(), true));

#

I have that code, and when the plugin is trying to set the metadata

#

it says owningPlugin cannot be null

west oxide
#

hey everyone

#

can someone tell me if this is a right sql statement

#

"CREATE TABLE IF NOT EXISTS "+tableName+
"(NAME VARCHAR(100),UUID VARCHAR(100),ELO INT(100),RANK VARCHAR(100),GAMESPLAYED INT(100),WINSTREAK INT(100),LOSSES INT(100),ISBANNED INT(10);"

rough drift
rough drift
#

make sure you are using the instance after you set it

west oxide
eternal oxide
rough drift
#

oh wait

#

you are missing a singular ) before ;

cobalt tinsel
#

public static Killeffects instance;

public static Killeffects getInstance() {
    return instance;
}
cobalt tinsel
#

ohhhhhhhhh

west oxide
#

ty

cobalt tinsel
young knoll
#

Also why is uuid a varchar

rough drift
cobalt tinsel
#

i forgot to set it, how may I do it? this.instance = instance on the onEnable?

fluid nacelle
#

Any idea how I'd go about changing a player's skin only for some of the players via ProtocolLib or nms directly?

rough drift
#

instance = this

#

in on enable

cobalt tinsel
#

oh

west oxide
#

lol

#

thank you

rough drift
#

np

cobalt tinsel
# rough drift nope

@Override
public void onEnable() {
instance = this;
registerListeners();
registerCommands();

}
#

like that

cobalt tinsel
#

ty

rough drift
#

you got it

cobalt tinsel
#

i'll test rn

rough drift
west oxide
#

do i have to end this with a ; too ?

SELECT * FROM "+tableName+" WHERE UUID=?

rough drift
#

iirc every sql statement ends with a ;

west oxide
#

in every statement

#

ahhh

#

ok thank you

rough drift
#

o

young knoll
#

Iirc SQL doesn’t really care

#

But you should still add it

rough drift
#

yeah it aint bad practice

rough drift
#

if and else are control blocks

#

why?

#

ohhhhhhhh

#

you mean

#

bool ? smt : else

#

oh

#

its still a control block

west oxide
#

big w first time using sql for something

#

i think am pro coder now

rough drift
#

like... an if-else

young knoll
#

? Is called a conditional operator

rough drift
#

its literally that

#

OH

young knoll
#

Yes it is a ternary operator

#

Conditional operator is the proper name

lost matrix
young knoll
#

Ternary operator refers to any 3 argument operator

quaint mantle
#

about this

#

um

#

where did he get the

#

which 1?

rough drift
#

why not

#

i use it all the time

quaint mantle
#

ohhh

rough drift
#

its a life saver

#

how?

#

never had one problem with plugins

#

ofc i hate it with mods

#

but its good with plugins

quaint mantle
#

"

#

*?

lost matrix
#

I think its a brilliant alternative for archetypes + it has extra code analysis

quaint mantle
#

a

lost matrix
#

This plugin does literally nothing at compile time

quaint mantle
#

anyone?

young knoll
#

Please don’t use java 1.8.0_92

lost matrix
#

If you get compile time issues then you need to fix your pom

rough drift
young knoll
#

Well yeah

#

But at least use the latest java 8

rough drift
#

ues

quaint mantle
rough drift
#

yes

#

it does

rough drift
quaint mantle
#

wat

rough drift
#

you spit in the face of 1.8

quaint mantle
#

how do

rough drift
#

and stop it in the ground

quaint mantle
#

noo

#

but how do those people do it?

#

like

rough drift
#

1.16 should be unsupported by all

quaint mantle
#

aa

rough drift
#

imo

lost matrix
# quaint mantle how do

1.8 is half a decade old and support was dropped years ago. Also the community is vanishingly small.

rough drift
#

only support latest version, maybe version before that

quaint mantle
#

I asked everyone

#

no answer

rough drift
#

yeah

#

because nobody cares about 1.8

lost matrix
#

1.8 is literally a bubble where everyone thinks all the world uses 1.8 while they are a minority.

rough drift
#

only hypixel

young knoll
#

They just use java 8 I imagine

rough drift
quaint mantle
#

just

#

please

#

tell

vocal cloud
#

nonononononon dont use 92

quaint mantle
#

taco!

lost matrix
# quaint mantle tell

Go search in old forum posts from half a decade ago. This version is not supported anymore.

young knoll
#

If you are going to use java 8, use the latest version

#

It’s like 202 or something

vocal cloud
#

java 92 is 89 versions behind

quaint mantle
#

but does it support 1.8?

vocal cloud
#

wait no it's way back

rough drift
vocal cloud
#

229 versions behind

quaint mantle
#

idk

vocal cloud
#

Update your java

lost matrix
# quaint mantle idk

spigot 1.8 usually is written using java 8. But use the latest java 8 version.

young knoll
#

Okay

#

Apparently the latest java 8 is 311

#

I guess oracle really means LTS when they say LTS

vocal cloud
#

imagine not being able to cast in if instanceof checks kek

rough drift
#

LTS means = Long (infinite) term suppotr for orcale

rough drift
#

thats java 16

#

but like

#

1.16 and under?

#

no

#

people asked me for 1.16 support because they didn't know how to install viaver

young knoll
#

I’m pretty sure 1.8 will happily run on java 17

wet breach
crimson terrace
#

is there a way to color a mobs display name?

young knoll
#

Yes

#

Using standard ChatColor stuff

crimson terrace
#

then I must have used it the wrong way, thanks

subtle folio
#

why hasn’t spigot made a method to change game profile “profileName” yet?

viral crag
#

it was removed

viral crag
#

you can only set it and UUID while creating a player

charred blaze
#

any ideas?

#

Multiple markers at this line
- The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from
required .class files
- The method contains(CharSequence) from the type String refers to the missing type
CharSequence

rough drift
charred blaze
rough drift
#

I don't know

#

maybe

#

ask

#

google

charred blaze
#

already

vocal cloud
#

Looks like eclipse

charred blaze
#

can i ignore that error?

rough drift
#

no

young knoll
#

No

#

You hecked something up

charred blaze
#

:vv

#

intresting?

viral crag
#

contains(CharSequence) is old java, what version are you using?

young knoll
#

How is it old java

viral crag
#

hmm, well it was introduced in Java 8, specifically which version of 8 I do not know...

young knoll
#

Ah

charred blaze
#

mmm

young knoll
#

I thought you meant it was removed in newer java

charred blaze
#

can i ping staff?

rough drift
#

contains(CharSequence) works just fine

charred blaze
rough drift
#

intelli and gh copilot both suggest it

viral crag
#

hahaha - it tells you right there you are missing the import

vocal cloud
#

It has the solution right there

charred blaze
#

and

#

it goes here

viral crag
#

you need java.lang.CharSequence

young knoll
#

That’s not a missing import

#

Also you don’t need to import CharSequence anyway

viral crag
#

he could add it to his reference library as well

charred blaze
#

add what

#

where can i download

#

charsequence

#

;-;

viral crag
young knoll
#

What

charred blaze
#

regex?

young knoll
#

No

#

You don’t need to import stuff from java.Lang

#

Download the jdk

charred blaze
#

anyways

young knoll
#

You have the jre right now

charred blaze
#

java development kit?

#

already?

young knoll
#

That’s not the version ecplise is using

charred blaze
#

wdym

young knoll
#

Eclipse is using the jre

charred blaze
#

wdym x2

#

anyways

#

how can i fix dis

young knoll
#

Do you not see where it says jre1.8.0_321

#

Change which java eclipse is targeting

#

Google should help you there

charred blaze
#

jre1.8.0_321

#

download dis?

#

ok ill try

young knoll
#

No

#

You already have that

charred blaze
#

um?

young knoll
#

Tell eclipse to use the jdk, not the jre

charred blaze
#

how

young knoll
#

Google

charred blaze
#

he is not listening

charred blaze
#

how to

#

use

#

jdk

viral crag
#

buildtool settings

charred blaze
charred blaze
viral crag
#

yes that window

charred blaze
#

what to do in that window

#

um

#

where is

#

1.8

viral crag
#

actually, two windows up now - i was too quick i thought it was the same one

young knoll
#

Hold on

#

What version of eclipse do you have

viral crag
#

this window and add the second jdk

charred blaze
viral crag
#

help/about

charred blaze
#

this?

viral crag
young knoll
#

I’m pretty sure he’s running like

#

A billion year old version of eclipse

charred blaze
viral crag
#

add a library path for teh jdk so you can access it

young knoll
#

Please check your eclipse version

charred blaze
viral crag
#

oof 2010

young knoll
#

Jfc

charred blaze
#

i cant

young knoll
#

Update eclipse

charred blaze
#

use

#

latest

#

i cant

#

im on 32 bit

#

im stuck on here

#

;(

young knoll
#

Well eclipse 2010 doesn’t support java 8

chrome beacon
#

You can use Intellij 2021.1

charred blaze
#

supports 32 bit?

chrome beacon
#

Yes

young knoll
#

That’s the last eclipse version with 32 bit support

charred blaze
#

this?

chrome beacon
young knoll
#

Yes

pulsar zenith
#

Also get a new pc that was made in the last 7 years

young knoll
#

InteliJ 2021.1 is probably a better option, at least it isn’t as old

pulsar zenith
#

Nothing supports 32 bit anymore

young knoll
#

Minecraft won’t

#

Soon

charred blaze
#

why im dumb :D

#

:/

#

mmmmmm

floral kindle
#

Does anyone know how to rename an item using package?

charred blaze
#

i ll use intelij

young knoll
#

Idk I don’t use InteliJ

proud basin
#

Why are you using 2021 version

#

Use the 2022 version

chrome beacon
#

32bit

sleek pond
#

Cringe

viral crag
#

CharSequence has a pretty bumpy history

#

"
Java 8 supports default methods in interfaces. And in JDK 8 a lot of old interfaces now have new default methods. For example, now in CharSequence we have chars and codePoints methods.
If source level of your project is lower than 1.8, then compiler doesn't allow you to use default methods in interfaces. So it cannot compile classes that directly on indirectly depend on this interfaces.
If I get your problem right, then you have two solutions. First solution is to rollback to JDK 7, then you will use old CharSequence interface without default methods. Second solution is to set source level of your project to 1.8, then your compiler will not complain about default methods in interfaces."

#

its both an eclipse and java issue

#

I will have to try and remember about the pre-java 8 indirect issue.

sage patio
#

Why this code spawns armor stand twice ?

floral kindle
#

Does anyone know how to rename an item's name using package?

viral crag
viral crag
#

well you have armorStand.remove() inside the run()

sage patio
#

yes, after 2 seconds removes the armor stand

viral crag
#

you sure it is actually getting called?

sage patio
#

yes

#

its working

sage patio
eternal oxide
#

If it spawns 2 then its being called twice

#

is teh damage on both stands the same?

#

if it is, I'm going to guess you registered the listener twice

sage patio
#

ummm

eternal oxide
#

sysout the damager and damagee

#

if they are identical, sysout the damage type

sage patio
eternal oxide
#

so second event has no entity?

sage patio
#

yes

rough drift
#

check if it has no entity then

eternal oxide
#

just exit the event if there is no entity then

sage patio
#

fixed

#

no nono

#

it spawns a armor stand

#

so when u hit, armor stands hits too

#

so there is a damage to armor stand

#

lol

viral crag
#

yup

sage patio
#

i think a setInvulnerable(true); will fix this

#

no

viral crag
#

why not check for both entities

chrome beacon
#

Try marker

viral crag
#

and deal with them? (seeing that this is specific to both player and armorstands)

restive mango
#

Anyone got a resource for using scoreboards and teams?

sage patio
#

i've a better idea, how can i disable armorstand's hitbox ?

crimson terrace
viral crag
sage patio
#

ow, thanks

viral crag
#

why would you think that?

torn vale
#

Hello 👋

chrome beacon
#

This is correct

torn vale
#

I created a custom texture pack with custom sounds for my minigame and put the direct download link into my server.properties, the pack gets downloaded after joining my server but I cant hear the custom sound, why?

chrome beacon
#

How are you triggering the custom sounds?

torn vale
#
            player.playSound(player.getLocation(), "minecraft:custom.jump-1",2.0F, 1.0F);
chrome beacon
#

And how is your resourcepack structured

torn vale
#

my sounds.json is in my minecraft folder

#

in singleplayer it worked just fine with:
/playsound minecraft:custom.jump-1 @p ~ ~ ~ 0.05

#

it is no space

#

its a folder

#

its like assets/minecraft/sounds/custom/jump-1.ogg

raw ibex
minor fox
#

Getting the same results with something other than a pressure plate.

torn vale
#

also it worked just fine in singleplayer with the following command:
/playsound minecraft:custom.jump-1 @p ~ ~ ~ 0.05

raw ibex
ivory sleet
#

Create a set with initial capacity to be 8, then for every taken color push it to the set, and then have a linked list or sth for the available colors and then remove by index there

raw ibex
#

okay thanks

torn vale
#

bruh, wait a sec

#

bruh

#

works now

#

thank you so much xd

#

yes xd

quaint mantle
#

hey, my events in different classes do not get fired.

package de.juslife0.resourcepackenforcement;

import de.juslife0.resourcepackenforcement.events.join;
import de.juslife0.resourcepackenforcement.events.response;
import org.bukkit.plugin.java.JavaPlugin;

public final class ResourcepackEnforcement extends JavaPlugin {

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(new join(), this);
        getServer().getPluginManager().registerEvents(new response(), this);
        getLogger().info("Das Plugin wurde aktiviert.");

    }

    @Override
    public void onDisable() {
        getLogger().info("Das Plugin wurde deaktiviert.");
    }
}

is there something i do wrong in this main class?

#

the class names are response and join

#

the classes in the src of the plugin are also lowercase. should i change it?

#

Okay. i forget it always. but then the classes/events get fired?

hollow bluff
quaint mantle
#

okay but what then is the problem that the events are not fired?

package de.juslife0.resourcepackenforcement.events;

import org.bukkit.ChatColor;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

public class join implements Listener {
    public void onJoin(PlayerJoinEvent event){
        event.getPlayer().sendMessage(ChatColor.AQUA + "Um das selbe Spielerlebnis für jeden zu ermöglichen, bitten wir dich das Resourcepack zu akzeptieren. Du darfst das Resourcepack ablehnen, bekommst dann aber eine minimale Roleplay-Strafe.");
        event.getPlayer().setResourcePack("http://download1979.mediafire.com/7082nvqti96g/aikgiqv20n860a3/Wolfhound+Classic+Medieval.zip");

    }
}

this is the join class

brave sparrow
#

they need @EventHandler

quaint mantle
#

oh

brave sparrow
#

on top of each method

quaint mantle
#

thank you

#

i knew i forgot something

brave sparrow
#

i knew what it was gonna be

#

lol

quaint mantle
#

i know that i need an eventhandler but i forgot to write it in there

#

I can but the plugin is only local for my server so nobody will ever see the code or get the plugin

brave sparrow
#

you'll see it later

#

and you won't remember what you were doing

#

"When I wrote this code, only I and God knew what it did. Now, only God knows"

quaint mantle
#

the plugin is already final. i will delete the project folder after i check that the plugin works

brave sparrow
#

why would you do that

#

lmao

#

that makes absolutely no sense to delete it

#

what if you want to change it later?

#

why would you want to have to go back and redo it all

vocal cloud
#

//this code does something

restive mango
#

@crimson terrace in theory but im not doing that

#

i'm trying to use it to make it so projectiles dont have collision for particular players

sage patio
#

How can i round a number like 6.123345 to 6 or 5.89694 to 5.5

vocal cloud
#

Math.round

restive mango
#

Also, .setcancelled is not a valid method for projectilehitevent?

vocal cloud
#

Google it lol

brave sparrow
#

that rounds to an int doesnt it

vocal cloud
#

Read the docs and find out

sage patio
brave sparrow
#

i feel confident it rounds to an int

#

it rounds to an int

sage patio
#

idk what is that but thanks

brave sparrow
#

@sage patio don't use Math.round

sage patio
#

aaaa ok, so what

sage patio
quaint mantle
brave sparrow
#

doesn't that convert it to text

restive mango
#
[11:32:14 ERROR]: Could not pass event ProjectileHitEvent to AesopianProject v1.15.2
java.lang.NoSuchMethodError: 'void org.bukkit.event.entity.ProjectileHitEvent.setCancelled(boolean)'
        at co.lotc.aesopianproject.listeners.SpellListener.OnFireballHitEntity(SpellListener.java:259) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor1164.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.15.2.jar:git-Paper-236]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.15.2.jar:git-Paper-236]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.15.2.jar:git-Paper-236]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:607) ~[patched_1.15.2.jar:git-Paper-236]
        at org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory.callProjectileHitEvent(CraftEventFactory.java:1279) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.EntityFireball.tick(EntityFireball.java:84) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.WorldServer.entityJoinedWorld(WorldServer.java:803) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.World.a(World.java:869) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.WorldServer.doTick(WorldServer.java:528) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.MinecraftServer.b(MinecraftServer.java:1303) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.DedicatedServer.b(DedicatedServer.java:430) ~[patched_1.15.2.jar:git-Paper-236]
#
        at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:1157) ~[patched_1.15.2.jar:git-Paper-236]
        at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:946) ~[patched_1.15.2.jar:git-Paper-236]
        at java.lang.Thread.run(Thread.java:832) [?:?]
#

Relevant stacktrace

#

It's wierd because the method is on the spigot javadocs...

brave sparrow
#

yes this is for printing it

restive mango
#

Is it a version problem maybe?

sage patio
#

I hate Java docs because that is completely not understandable for me

brave sparrow
#

@sage patio what are you planning to do with this rounding

vocal cloud
#

Woops

#

Wrong person

sage patio
#

np xd

vocal cloud
#

@restive mango that's an issue with paper

brave sparrow
#

just tell me

#

lol

brave sparrow
#

are you trying to print to the user?

#

or what

sage patio
#

watch the video

brave sparrow
#

im in class, it isn't going to load lmao

#

what are you trying to do

sage patio
#

When i hit some entity, an armor stand spawns and shows the damage

brave sparrow
#

then yes use DecimalFormat

sage patio
#

but sometimes that damage is something liek 5.2545945615

vocal cloud
#

I'd recommend DecimalFormat

quaint mantle
#

How many decimal places should be visible?

brave sparrow
#

1

vocal cloud
#

Just set the max amount of ending zeros to 2 or 1 or whatever

tardy delta
#
DecimalFormat df = new DecimalFormat("#.#");
System.out.println(df.format(someNumber));```
#.# would respresent 100.3 or 20.4
#

just one digit after the comma

sage patio
#

nvm just don't look at this

#

XD

tardy delta
#

no not .1

sage patio
#

just that #.# ?

tardy delta
#

ye

sage patio
#

nice, thanks

#

thanks all

quaint mantle
#

Is this ok or do I not need the DecimalFormatSymbols? (asking for my own project)

torn vale
#

How can I change the Skin of a player? I have like no package knowledge so I will need a good explanation xd

restive mango
#

Well, that's fair

halcyon marsh
#

Hello i have a problem for use NameTag edit, but its on paper, i was told that the spigot plugins worked on paper

||```java

[ERROR] null
org.bukkit.command.CommandException: Cannot execute command 'ne' in plugin NametagEdit v4.5.0 - plugin is disabled.
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:37) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.v1_18_R1.CraftServer.dispatchCommand(CraftServer.java:907) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.server.network.ServerGamePacketListenerImpl.handleCommand(ServerGamePacketListenerImpl.java:2289) ~[?:?]
at net.minecraft.server.network.ServerGamePacketListenerImpl.handleChat(ServerGamePacketListenerImpl.java:2100) ~[?:?]
at net.minecraft.server.network.ServerGamePacketListenerImpl.handleChat(ServerGamePacketListenerImpl.java:2081) ~[?:?]
at net.minecraft.network.protocol.game.ServerboundChatPacket.handle(ServerboundChatPacket.java:46) ~[?:?]
at net.minecraft.network.protocol.game.ServerboundChatPacket.a(ServerboundChatPacket.java:6) ~[?:?]
at net.minecraft.network.protocol.PacketUtils.lambda$ensureRunningOnSameThread$1(PacketUtils.java:56) ~[?:?]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:149) ~[?:?]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:23) ~[?:?]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1414) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.server.MinecraftServer.c(MinecraftServer.java:189) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:122) ~[?:?]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1391) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1384) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:132) ~[?:?]
at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1362) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1268) ~[paper-1.18.1.jar:git-Paper-207]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-207]
at java.lang.Thread.run(Thread.java:833) ~[?:?]```||

vocal cloud
vocal cloud
#

2 for 2

torn vale
#

Player

red sedge
#

so i need to reorder an array every time a command is ran

#

but since the array can get to sizes like 60k it stalls the server for a few seconds

#

i was thinking i can create another thread

#

but im not sure since while that is happening someone else cant use that array

sterile token
#

What doing lol?

red sedge
#

okay yeah i see now im not good at explaining

#

okay so

#

i have an auction house and i store the ordered values as lists right

#

and whenever a player purchases/auctions an item i need to reorder that list

#

but while that is happening the server stalls for a second to do the processing

viral crag
#

why are you not using a database?

red sedge
#

i am but i need to store the orders

#

eitherway i would need to reorder them

tardy delta
#

bruh just add it at the end of the list

red sedge
#

yeah but then i need to reorder the ordered lists

tardy delta
#

where are the new auctions added on the list?

#

begin, end?

red sedge
#

i add them to the end of the list

#

and i reorder the lists

#

i mean like

#

ordered by price
ordered by creation time
etc

tardy delta
#

wdym reordering? are you sorting it alphabetical?

#

oh

viral crag
red sedge
#

that wont help anything

tardy delta
#

you're just ordering the auctions by price?

viral crag
#

you wont be parsing and sorting on the main thread

red sedge
tardy delta
#

so an user can pick multiple sorting criterias?

red sedge
#

yep

tardy delta
#

Collections.sort on a collection object is prolly better than holding an array

#

or is it a list/ set?

red sedge
#

its a list

#

i already use collections.sort

tardy delta
#

ah

red sedge
#

its fast but it gets laggy when the size is like 60k

tardy delta
#

lol 60k

#

does those auctions have en expire time?

red sedge
#

ye

tardy delta
#

and do users have a limit of auctions they can post a day?

red sedge
#

its an extreme case that it would ever reach 60k

red sedge
#

i should probably make that a feature tho

tardy delta
#

how many players do you have?

red sedge
#

60k is an extreme case

#

but i still need a way to like

#

not make the server wait to reindex

viral crag
#

MySQL ORDER BY Keyword

tardy delta
#

do your db operations async

red sedge
#

mm okay

tardy delta
#

dont tell me you werent doing that

#

._.

tardy delta
#

tell me ._.

red sedge
#

hehe anyways thank yall!

tardy delta
#

😶

#

bruh im not understanding this, when my server version is 1.17, players cant connect with fking 1.18

viral crag
restive mango
#

Okay, really, I'm just trying to get entities to not collide at this point.

#

I've tried with teams, yet it does not appear to work.

#

For example:

#
        Team team;
        Scoreboard scoreboard = p.getScoreboard();
        if(scoreboard == null)
        {
            scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
        }
        if (scoreboard.getTeam(p.getName()) != null) {
            team = scoreboard.getTeam(p.getName());
        } else {
            team = scoreboard.registerNewTeam(p.getName());
        }
        team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
        if (!team.hasEntry(p.getName()))
        {
            team.addEntry(p.getName());
        }
        team.addEntry((p.getWorld().spawnEntity(p.getLocation(), EntityType.ZOMBIE_HORSE)).getUniqueId().toString());
        p.setScoreboard(scoreboard);
#

I know there must be a way to do this with teams, or the collision rule crap would not exist...

#

This should spawn a zombie horse on the same team as the player and thus be not collidable, yet it is still collidable

viral crag
#

do team rules apply to non-player entities?

#

pushOwnTeam - Entities in this team cannot be pushed by another entity in this team.[1]

pearl ibex
#

How do I use Persistent Data Container on an item?

chrome beacon
#

?pdc

viral crag
#

not sure how that is different from: never - No entities can push entities in this team.

chrome beacon
viral crag
vocal cloud
#

Did someone say modifying source code 👀

tardy delta
viral crag
tardy delta
#

lmao stupid explenation

lone remnant
#

im trying to implement tab completion for a command. ```java
public void onEnable() {
try {
final Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");

bukkitCommandMap.setAccessible(true);
commandMap = (CommandMap) bukkitCommandMap.get(Bukkit.getServer());

} catch (Exception ignored) {}

SomeCommand command = new SomeCommand(this);
commandMap.register("somecommand", command);
getCommand("somecommand").setTabCompleter(command);
}

//now the SomeCommand Class

public class SomeCommand extends BukkitCommand implements TabCompleter {
JavaPlugin plugin;
public SomeCommand(JavaPlugin plugin) {
super("somecommand");
this.plugin = plugin;
}

public execute(/.../) {
/.../
}

public List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) {
/.../
}
}``` now I get a NullPointerException for getCommand("somecommand")

#

if i remove that line the command works as declared in execute in SomeCommand

tardy delta
#

register it in plugin.yml

lone remnant
#

thats what i didnt want to do...

tardy delta
#

oh right i see

#

whats wrong with it

lone remnant
#

the line java getCommand("somecommand").setTabCompleter(command); somehow throws me a NullPointerException

tardy delta
#

getCommand gets it from plugin yml

lone remnant
#

removing it makes the command work, without TabCompletion

tardy delta
#

i guess

lone remnant
#

ok, how can i workaround that?

tardy delta
#

you're never adding it to the commandmap

viral crag
#

isnt it commandMap.register("cmd", new Command("cmd"));

tardy delta
#

dont you have to declare it as a SimpleCommandMap instead of a Field lmao

#

or just invoke it

young knoll
#

They are declaring it as a command map

lone remnant
tardy delta
#

the thing is that you're not doing anything with it

#

ah what

#

random field

viral crag
#

not really sure why someCommand() is a plugin and not a command

young knoll
#

It is a command?

tardy delta
#

?

sage patio
#

If I add 100 Locations to a ArrayList of Location with a Runnable, is that ArrayList usable in another Runnable ?

tardy delta
#

iirc its synchoronized

sage patio
#

because i tried, it seems when runnable cancels, arraylist clears

tardy delta
#

type aids lmao

#

its probably not cleared
show your code

elfin steppe
#

Someone who has got a good documentation for learning how to work w teams (for example for a duel plugin)?

tardy delta
#

microsoft teams 👀

lone remnant
lone remnant
tardy delta
#

please else if is something

elfin steppe
tardy delta
#

unchecked cast

#

not checking args length

lone remnant
#

huh?

#

who?

tardy delta
#

not using else if

#

whats wrong with the scheduler too

sage patio
#

just look at the start and play part

#
        ArrayList<Location> locations = new ArrayList<>();
        if (args[0].equalsIgnoreCase("start")) {

            BukkitTask record = new BukkitRunnable() {

                int ticks = 0;

                @Override
                public void run() {
                    locations.add(player.getLocation());
                    Utils.sendActionbar(player, "&dRecorded " + String.valueOf(ticks) + " ticks");
                    if (ticks == 100) {
                        cancel();
                        Utils.sendActionbar(player, "&dDone!");
                    }
                    ticks++;
                }
            }.runTaskTimer(Main.getInstance(), 1, 1);
        }

        if (args[0].equalsIgnoreCase("play")) {
            BukkitTask record = new BukkitRunnable() {

                int ticks = 1;

                @Override
                public void run() {
                    NPC.walkNPC(player, locations.get(ticks), locations.get(ticks + 1));
                    Utils.sendActionbar(player, "&dPlayed " + String.valueOf(ticks - 1) + " ticks");
                    if (ticks == 101) {
                        cancel();
                        locations.clear();
                        Utils.sendActionbar(player, "&dDone!");
                    }
                    ticks++;
                }
            }.runTaskTimer(Main.getInstance(), 1, 1);
        }
lone remnant
tardy delta
#

uhh i cant figure out whats it is supposed to do

young knoll
tardy delta
#

coll can you live with that code? 🥺 i cant

young knoll
#

You create a new list every time you run the command

#

So of course it’s going to be empty

sage patio
#

owwww

#

ur right

viral crag
sage patio
#

thanks

tardy delta
#

please fix the if if if if thing

sage patio
tardy delta
#

it will go thro all those options lol

sage patio
#

with switch case

tardy delta
#

better

lone remnant
tardy delta
#

wouldnt make sense in this case

#

to avoid using super

lone remnant
#

makes the main class a little cleaner

#

As the same Class only works with one command, it (should) know its own name

tardy delta
#

do it in super class and not in main the command map thing

lone remnant
#

ok, update: tried to use java ((PluginCommand) commandMap.getCommand("somecommand")).setTabCompleter(command); now i get a classcastexception or something

#

yep, ClassCastException Class SomeCommand cannot be cast to PluginCommand

tardy delta
#

does BukkitCommand extends PluginCommand?

viral crag
#

command.SomeCommand(command) subclass should override hurts my head, too many similar names

tardy delta
#

actuallt i dunno lol

viral crag
#

i cant quite sort out the order it should be in

tardy delta
#

i cant think today lol

lone remnant
#

could i use TabCompleteEvent?

tardy delta
#

you dont want to listen for that

lone remnant
#

thats a clear and upright private repository

tardy delta
#

404

young knoll
#

Oh yeah it’s private

#

Hol up

#

There

raw ibex
#

can spigot surpass the max enchantment level of 255

young knoll
#

No

raw ibex
#

@young knoll so i can't make fortune 1000?

#

only fortune 255?

young knoll
#

Well I mean you can

raw ibex
#

how?

young knoll
#

But it will just act the same as 255

raw ibex
#

ok

#

how?

young knoll
#

ItemMeta.addEnchant

raw ibex
#

just addEnchantment() 1000?

#

oh

#

in itemmeta

#

ok

young knoll
#

Or ItemStack.addUnsafeEnchant

raw ibex
#

unsfae enchant sounds fun

#

thanks

#

for something like this, would it work, or does the for all happen at the same time?

#
         List<String> colours = new ArrayList<>(8);
           colours.add("Red");
            colours.add("Blue");
            colours.add("Green");
            colours.add("Yellow");
            colours.add("Aqua");
            colours.add("Grey");
            colours.add("White");
            colours.add("Pink");


            for (Player value : players) {
                int random = (int) (Math.random() * colours.size());
                String team = colours.get(random);
                setTeam(value.getUniqueId(), team);
                colours.remove(random);
            }```
lone remnant
raw ibex
floral kindle
grim ice
#

finally

#

its back

tardy delta
#

was discord down?

viral crag
#

api is down

grim ice
tardy delta
#

oh i thought it was my internet

grim ice
#

dummy

#

i just check twitter when its down

tardy delta
#

yt worked ._.

viral crag
golden turret
#

guys

#

i am spawning a bat outside the worldborder

#

and then, applying a velocity to it

#

but my bat dont enter the worldborder

#

is there a way for me to do it?

viral crag
#

dont think that will load while the api is still down

viral crag
#

your spawning yourself riding the bat?

golden turret
#

i just spawn the bat, add me as passenger and set the velocity to the bat

viral crag
#

not sure how that works in spigot, I use a different server when I need ridable

tardy delta
#

images still arent loading

#

emojis are broken too

quiet ice
#

You can still open the files directly

young knoll
coarse crow
#

FIREWORK_SHOOT Effect not playing
location.getWorld().playEffect(location, Effect.FIREWORK_SHOOT, 1);

is playing an arrow shoot effect instead of a FIREWORK_SHOOT

misty current
#

can you get all the constants of an enum if you have its class?

golden turret
#

but with the entity trying to move itself

young knoll
#

You can’t get that from a Class

grim ice
#

wa

young knoll
#

You could reflect to get the values array though

grim ice
#

oh he meant an actual "Class"

#

prob not what he meant

misty current
#

yeah a Class<Enum<?>> object

grim ice
#

cant u do getEnumConstants()

misty current
#

yea i just realized

#

so it will return the constants in declaration order?

#

so i can check them to string and see if they are equal to something?

grim ice
#

probably

young knoll
#

That’s a method of the class?

#

Interesting

minor fox
#

Has anyone had any problems with Player#setVelocity suddenly not applying the velocity anymore?

modern summit
#

How can I exchange an item in a chest and have it reset after 30 minutes?

charred wind
#

Someone knows, why this Error is showing up? It says, it can't find the path, but the directory is existing

golden turret
charred wind
#

?

#

It works for other directions

viral crag
#

to figure out where I was: String path3 = Paths.get("").toAbsolutePath().getParent().toString(); it was dropping me into the wrong directory

young knoll
#

You do know Plugin.getDataFolder exists

ivory sleet
#

^

viral crag
#

i am personally not working in the plugin folder

young knoll
#

Sus

ivory sleet
#

Plugin::getDataFolder then just toPath and toAbsolutePath and resolve the actual file, at least if you do work with the plugin data directory which they seem to be doing

viral crag
#

no, I am lazy and managing my server config files

eternal oxide
#

config files should be IN your data folder

tacit elk
#

Hello i started working on a plugin few days ago but i just hit my first real problem.
And i was wondering if anyone could help me.
Tanks 🙂

delicate lynx
#

that is an ancient version

#

use 3.0.0

tacit elk
eternal oxide
#

wrong repo

#

add the bstats repo

delicate lynx
#

there's a separate repo?

#

it's on spigot I thought

eternal oxide
#

maven repo is different

delicate lynx
#

oh I see, it is different

hasty prawn
#

So is --remapped just not necessary anymore to get Mojang Maps?

viral crag
#

the maven part is at the top

sacred mountain
#

helol is there any way to create a static knockback environment, maybe with packets and stuff? I want to mAKE KNOCKBACK CONSISTENT

#

oops caps

#

but also in async

#

e

ivory sleet
#

Why async

#

That’ll most likely just make it delayed if anything

young knoll
#

Async fast

hasty prawn
#

quik

ivory sleet
viral crag
#

... fast? its just a different scheduling

ivory sleet
#

It’s fast if used correctly

young knoll
#

It doesn’t block the main thread

#

So it’s good for operations that take an indeterminate amount of time

#

Like io

viral crag
#

that does not make it any faster, it is just a more efficient use of your time

ivory sleet
#

Can be good for large procedural tasks that can be decomposed into smaller ones (hence why it can be faster)

hasty prawn
#

Personally I do all my Bukkit methods async and do all the IO and Requests on the main thread

#

Just better tbh 🙄

young knoll
#

I’m doing a bunch of math async

#

Computers are fast, but hey it can’t hurt

viral crag
#

if you want faster math, then you would use branch prediction

ivory sleet
#

Which is already done by JIT afaik

young knoll
#

Compiler smort

ivory sleet
#

But even so, using some sort of asynchronous worker load distributor for big mathematical tasks that can be split up and processed in parallel sometimes won’t harm you at all

viral crag
#

nope

young knoll
#

It’s not even split up, it’s just on one thread

#

Gotta solve the issues before users complain about your task using 0.05% of a tick

ivory sleet
#

Parallel streams are the perfect example

young knoll
#

I wonder how many blocks I can search per tick

#

Reasonably

hasty prawn
#

Wait does BuildTools compile SpecialSource?

golden turret
# ivory sleet It’s fast if used correctly
public void runAsync(Runnable action) {
  ExecutorService service = Executors.newCachedThreadPool();
  service.execute(() -> {
    new Thread() {
      @Override
      public void run() {
        Bukkit.getScheduler().runTaskAsynchronously(PLUGIN, action);
      }
    }.start();
  });
}```
ivory sleet
#

💀

#

Command ui :0

chrome beacon
#

Brigadier?

ivory sleet
#

Brigadier?

chrome beacon
#

:)

ivory sleet
#

(:

young knoll
#

Frogadier?

chrome beacon
#

I've been reading about the Minestom API today... it looks quite nice ngl

young knoll
#

Isn’t it just the paper API

chrome beacon
#

No

#

It does contain adventure but other than that...

ivory sleet
#

Yeah that’s brigadier and Minecraft which hooks into it

#

There’s little documentation

#

Or well from what I know

#

Thought there are many open sources that use it, maybe they can teach you one or two things

chrome beacon
#

You can use Forge and Fabric guides too

sterile token
#

Who tag me?

#

Anyone need help?

chrome beacon
#

Fabric has a good quide

young knoll
#

You can also use a command framework that hooks it

ivory sleet
#

zacken tho to simplify it for you in abstract terms, you basically have command node trees where super nodes know little to nothing about sub nodes, and then there’s two type of nodes, literals and arguments,

literals are for sub commands usually as it’s basically an enumeration of a set of strings that gets tab completed

arguments are the things that will show <blah> etc, with those you’re able to fetch inputs / actual arguments, as opposed to literals, that’s all

#

no not really

#

For instance luckperms

#

lps first subcommand set is only literals

#

lp group, lp user, lp listgroups etc

#

group would be one literal

#

user another literal

#

however

#

lp group <name>, here <name> would be an argument

#

yes

young knoll
#

Does LP use brigadier?

ivory sleet
#

it uses commodore

#

Which uses brig

sterile token
#

So this is correct so:

/faction - command
/faction list - argument
/faction create <name> - sub command

#

🤔

ivory sleet
#

Myes in principle it is

#

verano yeah

sterile token
#

Ah allright thanks

#

Bungeecord permissions are manage vía Events?

ivory sleet
#

iirc yes

sterile token
#

I didnt find any class like PermissionAttachment (at least on spigot exists)

ivory sleet
#

It’s a bit less extensive

solar sable
#

hey guys is there a better way to make this detects more than one word because I just kind of copied and paste it a lot and it works like a charm but it seems like a mess so how do i make it detect a lot of words in just one

if (e.getMessage().toLowerCase(Locale.ROOT).contains("bitch")) {
            e.setCancelled(true);
            String message = ChatColor.translateAlternateColorCodes('&', "&c&l(!) &bHey, no swearing ") + p.getName();
            Bukkit.getScheduler().runTaskLater(plugin, () -> e.getPlayer().sendMessage(message), 20);
#

this is a mess

sterile token
ivory sleet
#

I’d keep a set of strings

ivory sleet
#

?jd-bc

sterile token
ivory sleet
#

Well

#

CommandSender::hasPermission is a thing

young knoll
#

Why loop a set

#

.contains exists

sterile token
#

I didnt know it exists on set

young knoll
#

That’s one of the big benefits of a hashset

#

Fast .contains

sterile token
ivory sleet
#

This and the permission event should suffice

sterile token
#

Allright thanks

ivory sleet
#

But basically you’re accountable for managing the permissions persistently

#

Which LuckPerms for instance does

sterile token
#

Im spigot you managed them by PermissionAttachment