#help-development

1 messages · Page 2010 of 1

tender shard
#

no

ornate patio
#

i've been trying to solve this problem for a long time and now i'm starting to think it may have something to do with spigot..

I'm making a resource pack for my plugin, here's my models/item/potions.json

{
    "parent": "item/generated",
    "textures": {
        "layer0": "item/potion_overlay",
        "layer1": "item/potion"
    },
    "overrides": [
        {
            "predicate": {
                "custom_model_data": 1
            },
            "model": "item/beer"
        }
    ]
}

however the custom texture is being applied to every potion that has a custom model data on it:

tardy delta
#

i wouldnt check for the name "world_nether" but for Bukkit.getWorlds().get(1).getName()

#

assuming there is a nether world, idk if thats possible to play without

ornate patio
tender shard
ornate patio
#

I expect the texture to be only applied to items that have a custom model data of 1

misty current
ornate patio
#

but its being applied to literally any item that has any number for custom model data

tender shard
#

if you specify custom data for int 1, it also applies to 2, 3, 4, ....... if those aren't defined explicitly

misty current
#

i don't think it returns the world name

tender shard
#

also it has nothing to do with spigot, the vanilla client handles that stuff

tender shard
misty current
#

there should be a getname method

#

bump

viral crag
tardy delta
tender shard
#

nope if you say
1 = texture a
2 = texture b
3 = texture c
and that's it, texture c applies to everything above 2

ornate patio
tender shard
#

that's how vanilla works

ornate patio
#

damn

#

okay

kindred valley
#

How can i make a loop for loop all online players.

ornate patio
#

well thanks, i know this isnt entirely spigot related but i've been asking on like 5 other servers and no one had an answer

misty current
#

Bukkit.getOnlinePlayers

#

and iterate

tender shard
#

now just do a regular for-each

ancient jackal
#

Alex do you make money from plugin development

misty current
#

how can i generate a void world? afaik you need to override generatechunkdata from chunkgenerator but it's deprecated

ancient plank
#

reposts message after like 10 minutes, pain

misty current
#

i've bumped once and i preferred reasking than rebumping

eternal needle
#

if(e.getPlayer().getLocation().getWorld().toString().equals("world_nether")) {

is this rigth?

misty current
#

use getName

#

not tostring

eternal needle
raw ibex
#

hey

#

why is my plugin not working

#
name: Fortune 1000 # the plugins name as it should appear in the plugin list /pl
version: 1.0 # the plugin's version
author: Orla
main: me.orla.Main
api-version: 1.18.1

commands:
  fortune:
    description: Give a fortune 1000 pickaxe
    usage: /fortune
undone axleBOT
misty current
tender shard
undone axleBOT
#

"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.

tender shard
misty current
raw ibex
#

@tender shard

#

java.lang.NullPointerException: Cannot invoke "org.bukkit.command.PluginCommand.setExecutor(org.bukkit.command.CommandExecutor)" because the return value of "me.orla.main.getCommand(String)" is null

misty current
#

use getWorld().getName()

tender shard
raw ibex
#

i did

misty current
tender shard
#

show the full stacktrace @raw ibex

misty current
#

i meant to say dont

ancient plank
#

do u have a typo where u register the command

raw ibex
ancient plank
tender shard
#

the error message in your console

#

is the stacktrace

raw ibex
#

oh

#
[17:36:39 ERROR]: Error occurred while enabling MaxFortune v1.0 (Is it up to date?)
java.lang.NullPointerException: Cannot invoke "org.bukkit.command.PluginCommand.setExecutor(org.bukkit.command.CommandExecutor)" because the return value of "me.orla.main.getCommand(String)" is null
        at me.orla.main.onEnable(main.java:9) ~[maxFortune-1.0.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:564) ~[paper-1.18.1.jar:git-Paper-177]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:478) ~[paper-1.18.1.jar:git-Paper-177]
        at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:727) ~[paper-1.18.1.jar:git-Paper-177]
        at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:503) ~[paper-1.18.1.jar:git-Paper-177]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:313) ~[paper-1.18.1.jar:git-Paper-177]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1202) ~[paper-1.18.1.jar:git-Paper-177]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-177]```
tender shard
#

what's main line 9?

raw ibex
#
        this.getCommand("fortune").setExecutor(new GivePickaxe());
eternal needle
ancient plank
#

can't help but notice that the main class is 1.) named main, and 2.) its lowercase. more pain

tardy flame
#

Don't name your main class "main" bruh

tender shard
raw ibex
#

oh i typoed

tender shard
raw ibex
#

i know why

tender shard
#

not the world's toString()

raw ibex
#

because i put Main in the plugin.yml

#

and main in the files

tardy flame
#

I recommend you naming the file using UpperCamelCase and not naming it main but after your plugin

ancient plank
#

?main

tender shard
#

wait, your whole plugin can't work

kindred valley
# tender shard Bukkit.getOnlinePlayers() returns a Collection<Player>
        for (Player s: Bukkit.getOnlinePlayers()) {
            if(s.hasPermission("Doktor")) {
                if(p.isDead()) {
                    Location p_locationx = p.getLocation();
                    double x = p_locationx.getX();
                    double y = p_locationx.getY();
                    double z = p_locationx.getZ();
                    s.sendMessage("X:" + p_locationx + "  Y:" + p_locationx.getY() + "  Z:" + p_locationx.getZ());
                }
            }
        }
    }```
tardy delta
#

what people do with java sometimes

eternal needle
raw ibex
#

@tender shard it's dififerent

#

in the jar

tender shard
kindred valley
tender shard
raw ibex
#

oki

tender shard
#

and not the world's name

undone axleBOT
#

"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.

kindred valley
ancient plank
#

sirens Location p_locationx naming convention police police

eternal needle
tender shard
#

and World#toString() is NOT "world_nether", as I already said

tender shard
kindred valley
tender shard
#

also a player is not dead yet in PlayerDeathEvent IIRC

#

why do you even loop over all players in the death event?

#

what are you actually trying to achieve?

kindred valley
deft forum
#

Hello everyone!
can anyone help me how to check is a bungee server online or not?

ancient plank
#

does the event actually fire tho or is it just getting caught on the p.isDead()

#

I think players are dead in the death event but I'm not certain

deft forum
#

they are'nt

#

make a bukkitrunnable wiht like 5 ticks and you'll be fine

kindred valley
viral crag
ancient plank
#

idk

tender shard
#

but I am not sure either

ancient plank
#

I'd make a quick test to check but it'd take me forever to open minecraft & intellij

tender shard
# kindred valley its Doktor

add debug statements. e.g. add an "else" clause to your permission check and also to your isDead check, then print out what players are actually dead or not and whether they have the permission or not

tender shard
#

I always have my Test project open

ancient plank
#

pluginname.permission.subpermission

tardy flame
tender shard
#

ugh

#

my launcher takes an hour to start the game

#

wtf

ancient plank
#

yep same

tender shard
#

a player IS dead in PlayerDeathEvent

tender shard
#

they are

brave sparrow
#

^

tender shard
#
[18:53:25 INFO]: mfnalex issued server command: /kill mfnalex
[18:53:25 INFO]: true

#
    @EventHandler
    public void onDeath(PlayerDeathEvent e) {
        System.out.println(e.getEntity().isDead());
    }
brave sparrow
#

That’s freaky because they shouldn’t be dead lol

#

I’ve looked at the code, the player state doesn’t get modified until after the event finishes

tender shard
#

PlayerDeathEvent is not cancellable

quaint mantle
#

oh yeah thats weird

eternal oxide
#

if an event is cancellable it fires before the event happens.l

brave sparrow
viral crag
#

if you want to check, just heal them in the death event

tender shard
quaint mantle
#

thats programmed weirdly

brave sparrow
#

It’s strange

viral crag
#

it would follow the damageEvent behavior though

brave sparrow
#

@tender shard my guess is that isDead only returns based on health so their health is 0 but none of the actual death stuff has happened yet

eternal oxide
ancient plank
#

Someone should make a PlayerPreDeathEvent

#

Ez

tender shard
brave sparrow
#

If you heal them on death none of the death stuff happens iirc

#

So isDead must be just returning true because their health is 0

#

Can you try healing them before the print since you already have the test code up @tender shard

eternal oxide
#

They will also not exist in getOnlinePlayers() in the PlayerDeathEvent.

eternal oxide
#

no

brave sparrow
#

They don’t get disconnected when they die

eternal oxide
#

check it and see

sacred mountain
#

help my intellij is now light mode and idk what i did

viral crag
sacred mountain
#

how do i fix it lol

eternal oxide
#

during, and after, until they respawn

brave sparrow
#

They aren’t removed from the world when they die

#

All the respawn does is teleport them and heal them

ancient plank
sacred mountain
#

thanks

tender shard
brave sparrow
tender shard
#

let me check

brave sparrow
#

Or what do you mean they die anyway

eternal oxide
#

check if they exist in the getOnlinePlayers() while you are at it

tender shard
#

seems like they don't actually die, the client just gets confused

#

I'll do a videoi

brave sparrow
#

It’s supposed to

#

Ahhh

#

That makes sense

viral crag
sacred mountain
#

what is a good theme that has easy readable colors?

sacred mountain
#

for intellij

tender shard
#

seems like they drop the stuff

#

but then pick it up again

brave sparrow
tender shard
#

yeah that's how I remembered it too

#

I always use runTask to respawn them a tick later

#

but I also never set their health to > 0 in the death event lol

brave sparrow
#

I’d have to check to verify that’s how we make sure the respawn screen is never displayed but I buy it

tender shard
#

if someone wants to prevent people from dying, they should NOT wait until the death event but instead cancel the damage event

brave sparrow
#

To respawn them without showing a respawn screen

viral crag
ivory sleet
tender shard
ivory sleet
#

and I dont say that lightly

#

they really are

tender shard
#

if the sun is shining = light mode
if not = darcula lol

tender shard
#

windows doesn't 😦

brave sparrow
#

I’m checking our code

viral crag
crimson terrace
#

is this something my plugin did or just some random 1/1000 error?

brave sparrow
#

I’m just looking for where we hide the respawn screen

misty current
crimson terrace
#

Ill try to do that again

tender shard
viral crag
#

a tick task was run but its also looking at Async?

brave sparrow
#

I’m doing it on mobile so it’s a pain to find it

#

But we’ve definitely hidden it from the player

#

And we aren’t cancelling damage before they die, we use the PlayerDeathEvent

crimson terrace
crimson terrace
#

hold on, trying to reproduce the error

tender shard
#

they do get a respawn screen but only for 1/20th second

crimson terrace
#

?paste

undone axleBOT
misty current
#
private void updateEmptyCacheFlag() {
        if (this.emptyCacheFlag && this == EMPTY) {
            throw new AssertionError("TRAP");
        } else {
            this.emptyCacheFlag = false;
            this.emptyCacheFlag = this.isEmpty();
        }
    }
#

this is the nms method throwing the ex

#

not really sure what is this meant to do but

crimson terrace
#

I assume the error occurs in line 31 in that paste

tender shard
#

like

#

what event is that even

misty current
#

oh so basically this is something about trying to modify something about an air itemstack

brave sparrow
#

Just found it, that’s what we do

tender shard
brave sparrow
#

Looks like you have a respawn screen still popping up

crimson terrace
brave sparrow
#

Make it 10 instead of 1 tick @quaint mantle

#

And it’ll work

misty current
#

yes, the method is called in setCount

#

so trying to change an itemstack that has a null itemlike value will throw an exception

tender shard
misty current
brave sparrow
#

It’s because the event finishes firing and then they die

tender shard
#

break the item a tick later

crimson terrace
crimson terrace
brave sparrow
#

You’re respawning them in the event before they’ve finished dying, which is what I said when I looked at the code the other day. Glad we’re in agreement

misty current
#

the method that could throw an assertionerror is only called in the setcount method and in ItemStack constructors

#

so i am not sure how are you getting that exception if an item breaks while you are in creative

#

maybe minecraft tries to replace your hand slot with EMPTY (the constant) and set its count to 0?

#

im confused

crimson terrace
#

could it be a fix to replace the Material.AIR with null?

misty current
#

you could try that

crimson terrace
#

this is the main thing I believe

misty current
#

also how is the durability reducing if you are in creative

crimson terrace
#

line 4

kindred valley
#

@tender shard checked but its not entering this condition if(p.isDead())

misty current
#

so you are changing it

crimson terrace
#

yes

misty current
#

try to not change it if it's gonna get to 0

crimson terrace
#

gotcha

misty current
#

but just remove the item before making the durability 0

crimson terrace
#

will do, thanks

somber hull
#

dont ask to ask

misty current
crimson terrace
#

will do, mind if I ping you at that point?

quaint mantle
#

scroll up to yesterday

#

to tell me this

#

props to you thats dedication

misty current
somber hull
misty current
#

i got a question about code design, I'm coding a skyblock island manager class that will hold all the island objects

quaint mantle
#

alr

misty current
#

would it be fine if I made a private static class in the manager that holds the methods to generate an island?

somber hull
#

Would it be a duplicate?

#

Like

#

Of another class

#

or methods that already exist

misty current
#

nope, just make this class handle all the island generation

#

and not copy paste code from anywhere

somber hull
#

I would create a island generator class

misty current
#

since i don't need it elsewhere but i don't fancy slapping those methods in the manager class

somber hull
misty current
misty current
#

actually instanciating it could be useful instead of putting only static methods

#

yea i think i'll make a separate class

somber hull
#

Well, you should make a generator class weith static methods no?

misty current
#

also, i coded a spiral-like generation thing but i am not sure how efficient it is

#

would you mind looking at it rq

somber hull
#

sure

#

Im probably just as experienced as you tbh but ill take a look

misty current
#
        public void execute(Player player, String[] args) {
            iteration = 0;
            int arg1 = Integer.parseInt(args[0]);
            Location loc = player.getLocation().getBlock().getLocation();

            Bukkit.broadcastMessage(String.valueOf(System.currentTimeMillis()));
            for(iteration = 0; iteration < arg1; iteration++){
                //loc.getBlock().setType(Material.GOLD_BLOCK);
                changeLocation(loc);
            }
            Bukkit.broadcastMessage(String.valueOf(System.currentTimeMillis()));
        }

        private void changeLocation(Location location){
            switch (getDirection()) {
                case 0 -> location.add(distance, 0, 0);
                case 1 -> location.add(0, 0, distance);
                case 2 -> location.add(-distance, 0, 0);
                case 3 -> location.add(0, 0, -distance);
            }
        }

        private int getDirection(){
            int direction = 0;
            int iteration = this.iteration;
            for(int j = 1; true; j++) {
                for(int k = 0; k < 2; k++) {
                    iteration -= j;
                    if (iteration < 0) return direction;
                    direction = (direction + 1) % 4;
                }

            }
        }
#

execute is a method my command api calls

#

also there is an iteration global field

#

getDirection returns an int based on the direction the next island should go towards

#

changeLocation adds to the center location based on getDirection

somber hull
#

yea that should be fine

#

Are you creating the islands by hand/by code?

#

Why not use a schematic

#

And either do code yoursel;f or use worldedit as a dependency

misty current
somber hull
#

he never said he was going to?

misty current
#

this code was just a test

#

that was the idea but i couldn't really come up with a better name

somber hull
misty current
#

any suggestions?

somber hull
#

IslandManager

#

lol

quaint mantle
#

Kinda a weird question: Was Lua made using Java?

#

I see massive similarties between the 2, just the way its coded is different

somber hull
#

y?

quaint mantle
#

nothing really appeared lol

#

so i was asking here

#

Lua has been used to extend programs written not only in C and C++, but also in Java, C#, Smalltalk, Fortran, Ada, Erlang

#

nvm found my awnser

#

its a port of a crapload of languages, made to be easier for others basically

#

:P

#

so lua just "ez code"

misty current
#

so what should i call it? it is a class with a map that contains island objects and methods to create/remove them

somber hull
#

doesnt that just mean "Manager classes are generally considered bad"

#

Anti-pattern is just a fancy way of saying not good am i wrong?

crimson terrace
#

@misty current I fixed it by not replacing the item in the hand with air or null, but by setting the amount of the item to 0.
This is the new code, thanks for the help 😄

misty current
#

no problem

somber hull
#

But WHY

#

I guesse

#

When your managing islands

#

Its not that vague

#

could you elaborate, i wanna learn things

#

Idk what either of those are

misty current
#

oh yes my class is basically a registry

#

ight imma call is IslandRegistry

somber hull
#

gracias

#

Oh thats gay

#

I knew that

#

I just didnt know the name for it

misty current
#

so a registry should also be a singleton

somber hull
#

gross

#

I tried using it a long time ago and i couldnt figure it out 😅

#

Their pretty much the same no?

misty current
#

mongo uses bson iirc so i don't think i got many options here

somber hull
ivory sleet
#

Hehe Gson and Jackson

#

Moshi tho

tender shard
#

Michael Gson

#

I went to the lido the day he died

#

what a weird word

#

lido

#

"open air bath"

ornate patio
#

i have this class:

public class Alcohol {

    ...

    private ItemStack itemStack;

    ...

    public void setPersistentDataValue(NamespacedKey key, int value) {
        ItemMeta meta = itemStack.getItemMeta();

        PersistentDataContainer container = meta.getPersistentDataContainer();
        container.set(key, PersistentDataType.INTEGER, value);

        itemStack.setItemMeta(meta);
    }

no matter what I do, setPersistentDataValue doesn't seem to save the value I give it..

#

here's the whole class:

#

i want to consume a sip and check that if it's empty, remove the item from the player's inventory

@EventHandler
public void onPlayerConsume(final PlayerItemConsumeEvent event) {
    if (Alcohol.isAlcohol(event.getItem())) {
        event.setCancelled(true);

        Alcohol alcohol;
        Player player = event.getPlayer();
        try {
            alcohol = new Alcohol(event.getItem());
            alcohol.consumeSip();

            if (alcohol.isEmpty()) {
                Inventory inventory = player.getInventory();
                inventory.remove(event.getItem());
                
            }
        } catch (AlcoholMissingPersistentData e) {
            e.printStackTrace();
            return;
        }
    }
}
#

in my testing, sipsLeft is always the initial value i set in the constructor, even if i try to decrement it

tender shard
#

this feels weird

cerulean mirage
ornate patio
#

alcohol = new Alcohol(event.getItem());

tender shard
trail pilot
quaint mantle
trail pilot
#

the important thing if this code is working

red sedge
#
var initialLocation = loc.clone();
        initialLocation.add(0, 100, 0);
        System.out.println(initialLocation);
        var armorStand = (ArmorStand) e.getEntity().getWorld().spawnEntity(initialLocation, EntityType.ARMOR_STAND);
        initialLocation.add(0, -100, 0);
        System.out.println(initialLocation);
        armorStand.setVisible(false);
        armorStand.setGravity(false);
        armorStand.setCustomNameVisible(true);
        armorStand.setInvulnerable(true);
        armorStand.setMarker(true);
        armorStand.teleport(initialLocation);```
the teleport doesnt work
#

the location goes back to normal

#

but it does not teleprot back

ornate patio
eternal night
#

@ornate patio item stacks may or may not be snapshots

ornate patio
#

wdym snapshots

eternal night
#

in the case of this event it is

#

e.g. you get an instance you can modify

#

but it won't reflect in game

tender shard
#

you add 100 to the location, then remove 100 again

#

so you teleport it to the original location

trail pilot
#

@eternal nighthello friendo

red sedge
#

when i create the armor stand

eternal night
red sedge
#

there is a tick that it is visible

#

eventho i make it invisible right away

eternal night
#

you will need to feed the mutated item stack back to the event/server

red sedge
#

so

#

i want to spawn the armor stand 100 blocks above

#

set it up

ornate patio
#

i call PlayerItemConsumeEvent#setItem(alcohol.getItemstack())?

red sedge
#

and teleport it back to its start location

eternal night
#

Yea 👍

ornate patio
#

@eternal night umm still still not working somehow

rotund pond
ornate patio
#

same issue

#
@EventHandler
public void onPlayerConsume(final PlayerItemConsumeEvent event) {
    if (Alcohol.isAlcohol(event.getItem())) {
        event.setCancelled(true);

        Alcohol alcohol;
        Player player = event.getPlayer();
        try {
            alcohol = new Alcohol(event.getItem());
            alcohol.consumeSip();
            event.setItem(alcohol.getItemStack());

            if (alcohol.isEmpty()) {
                Inventory inventory = player.getInventory();
                inventory.remove(alcohol.getItemStack());
            }
        } catch (AlcoholMissingPersistentData e) {
            e.printStackTrace();
            return;
        }
    }
}
red sedge
crimson marsh
#

is anyone here familiar with the ACF command framework ?

tender shard
quaint mantle
#

Am I using rand.nextInt(); wrong?

int counter = 0;
        Random rand = new Random();

        String rewardData = "Crates.crateRewardData.";
        FileConfiguration conf = EmeraldsPlugin.jp.getConfig();
        ItemStack item = null;

        for (int i = 0; i < conf.getInt("Crates."+crateType+".Amount"); i++) {
            String s = conf.getString("Crates."+crateType+".Items."+i);
            counter += conf.getInt(rewardData+s+".Weight");
        }

        double Chosen = rand.nextInt();

        for (int i = 0; i < conf.getInt("Crates."+crateType+".Amount"); i++) {
            String s = conf.getString("Crates."+crateType+".Items."+i);
            counter -= conf.getInt(rewardData+s+".Weight");

            if (counter > Chosen) {
                item = new ItemStack(Material.getMaterial(conf.getString(rewardData+s+".Material")), conf.getInt(rewardData+s+".Amount"));
            }
        }
#

It doesnt work as expected

crimson marsh
tender shard
rotund pond
quaint mantle
#

Which is a diamond

tender shard
red sedge
tender shard
#

(haven't looked at the whole class though)

quaint mantle
#

Its suppost to be an emerald

red sedge
#

uh

#

mybe add a cap

tender shard
crimson marsh
eternal night
#

oh you cancel the event @ornate patio that might bite you 😅 not too sure, but I'd expect the replacement to not happen then

ornate patio
#

hmm

eternal night
#

at which point, this is pretty ugly

ornate patio
#

what if i cancel after

eternal night
#

nah

#

the server does not care when you cancel

tender shard
crimson marsh
eternal night
#

your entire method finishes before it checks for cancelled state

tender shard
#

I always use acf-paper 0.5.0-SNAPSHOT

ornate patio
#

so.. what would be the correct way of doing this

tender shard
#

(acf-paper is the recommended one, even when supporting spigot)

crimson marsh
#

Alright ill try use 0.5.0

quaint mantle
tender shard
#

yeah use acf-paper 0.5.0-SNAPSHOT and use PaperCommandManager (works also on bukkit / spigot)

eternal night
red sedge
quaint mantle
ornate patio
#

can i just not cancel the event, and instead immediately replace the empty glass bottle with the item after its consumed

eternal night
#

I mean yea, or just replace the item manually during the event and cancel it

ornate patio
#

how so

eternal night
#

really ugly that this is not a linked copy

#

not going to lie

ornate patio
#

bruhh

eternal night
#

actually

ornate patio
#

im lost

eternal night
#

I was about to suggest you just grab the current active item of the player

#

after you cancel the event

quaint mantle
#

Nvm, I got it to work!

eternal night
#

but oh well, that is a paper only method 😅

quaint mantle
#

Horray!

ornate patio
#

so what should i even do then

quaint mantle
#

How would I make a chest have text above it, if right clicked w/ an item?

#

*I just want to know how to do the text above it part btw

viral crag
tender shard
ornate patio
tender shard
#

then make the entity invisible and give it a custom name

ornate patio
#

"use the effects of the new item"

#

oh wait i think i see

viral crag
ornate patio
#

if a player eats a pumpkin pie

#

but i set the item to a golden apple

#

the pumpkin pie won't get consumed

#

and they get golden apple effects?

tender shard
#

yes

ornate patio
#

okay..

#

so maybe i don't cancel the event

#

but im still confused

tender shard
ornate patio
#

i tried setting the item to beetroot instead

#
@EventHandler
public void onPlayerConsume(final PlayerItemConsumeEvent event) {
    if (Alcohol.isAlcohol(event.getItem())) {
        
        Alcohol alcohol;
        Player player = event.getPlayer();
        try {
            alcohol = new Alcohol(event.getItem());
            alcohol.consumeSip();
            event.setItem(new ItemStack(Material.BEETROOT));
            
            System.out.println(alcohol.getSipsLeft());
            if (alcohol.isEmpty()) {
                Inventory inventory = player.getInventory();
                inventory.remove(alcohol.getItemStack());
            }
        } catch (AlcoholMissingPersistentData e) {
            e.printStackTrace();
            return;
        }
    }
}
#

it consumed the potion..

viral crag
#

you didnt really modify the itemstack

eternal night
#

I mean, you can't even do that with spigot

night torrent
#

how would i make it so a custom death message would appear upon a custom death?

eternal night
#

the item you get is a copy not a mirror

night torrent
#

i made it so when you enter water in a cold biome you freeze

eternal night
#

setItem only works if not cancelled but then is also consumed

#

paper has some nice API to fix this 😄 ¯_(ツ)_/¯

ornate patio
#

well i kind of have to use spigot

eternal night
#

Yea

#

Guess you could try to set the replaced item to a stack with size 2

ornate patio
#

is there some sort of event listener for after an event was fired?

eternal night
#

no

eternal night
#

then you'd just have to remove the glass bottle

#

if needed

#

tho that would have to be done a tick after

vocal cloud
eternal night
#

not at all close tho

tender shard
#

still closer then LOWEST priority lol

eternal night
#

wow xD

quaint mantle
#

How would I do p.getInventory().removeItem()

eternal night
#

ah yes, I have 2 cents instead of 1

quaint mantle
#

but it only removes 1

#

not an entire stack

eternal night
#

closer to a car than before

vocal cloud
#

You'd basically see what's going to happen but you'd still be pre execution

quaint mantle
#

(removeItem for some reason removes an entire stack of items)

#

(how do I make it only remove one)

ornate patio
#

ughh

viral crag
#

wouldnt there be an inventory event right after?

tender shard
ornate patio
#

ok i've got some code that will just consume the potion

#

maybe i can set a 1 tick timeout to replace the bottle with the potion?

tender shard
#

the int parameter should be 1 in your case

young knoll
#

removeItem exists

#

Which removes up to the itemstacks amount

tender shard
#

IIRC they tried that and it removes the whole stack

tender shard
#

It will try to remove 'as much as possible' from the types and amounts you give as arguments.

#

they only want to remove one item / reduce one stack by 1

young knoll
#

Yeah

tender shard
#

and also removeItem seems to behave different between different forks

It is known that in some implementations this method will also set the inputted argument amount to the number of that item not removed from slots.

young knoll
#

So pass an itemstack with a size of one

tender shard
#

but what does the last sentence mean?

#

I don't really understand that one, that's why I made my own method IIRC lol

young knoll
#

It means it may mutate the input item

tender shard
#

that's so weird

#

if the javadocs are so weird I tend to just use my own methods instead

young knoll
#

So don’t try and reuse it after, as the amount may change

#

removeItem works perfectly

night torrent
#

yo can someone help me

#

sorry if im interupting

tender shard
#

no we can't, you didn't ask any questions

#

?ask

undone axleBOT
#

If you have a question, please just ask it. Don't look for staff or topic experts. Don't ask to ask or ask if people are awake or available. Just ask the question to the channel straight out, and wait patiently for a reply. Make sure you use the right channel regarding the topic of your question. Create a thread in case the channel is already in use!

night torrent
#

i did

tender shard
#

where?

night torrent
#

ill reask it it got covered by other messages

#

how do i make a custom death message for a custom death event?

#

I made it so you freeze when entering water in a snow biome

#

but it still says "(PLAYER) withered away"

night torrent
#

thanks

young knoll
#

You’ll need to track if it’s your wither effect killing them

tender shard
#

IIRC you can use "%s" in that to get the player's name but not 100% sure

#

maybe you have to manually insert the player name

night torrent
viral crag
#

mmm removeItem says it removes item stacks, not items

night torrent
#

?

tender shard
night torrent
#

ohhhh "your" wither effect

tender shard
#

inventories can only contain itemstacks

viral crag
#

removeItem
@NotNull HashMap<Integer,ItemStack> removeItem(@NotNull ItemStack... items) throws IllegalArgumentException
Removes the given ItemStacks from the inventory.

young knoll
#

Yes

tender shard
#

yes, that's what was asked for

young knoll
#

What about it

viral crag
#

right, but it doesnt say it works for anything less than a stack

young knoll
#

It does

#

If you pass a stack with an amount of 7

#

It will remove up to 7 of that item

tender shard
#

clone the itemstack, set it's amount to 1, then pass that to the removeItem method

loud haven
#

A stack of items. The size of the stack can vary, from 1 to any number.

tender shard
#

or use the method I've sent

ornate patio
#

solved my problem, I just used a Runnable:

@EventHandler
public void onPlayerConsume(final PlayerItemConsumeEvent event) {
    if (Alcohol.isAlcohol(event.getItem())) {
        
        Alcohol alcohol;
        Player player = event.getPlayer();
        try {
            alcohol = new Alcohol(event.getItem());
            alcohol.consumeSip();
            
            Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(main, new Runnable() {
                public void run() {
                    try {
                        if (alcohol.isEmpty()) {
                            player.getInventory().setItemInMainHand(new ItemStack(Material.AIR));;
                        }
                        else {
                            player.getInventory().setItemInMainHand(alcohol.getItemStack());
                        }
                    } catch (AlcoholMissingPersistentData e) {
                        e.printStackTrace();
                    }
                }
            }, 1L);
        } catch (AlcoholMissingPersistentData e) {
            e.printStackTrace();
            return;
        }
    }
}
tender shard
waxen plinth
#

Arrow code

viral crag
ornate patio
#

my bad

young knoll
#

Weird that you have a custom exception there

tender shard
ornate patio
young knoll
#

You should probably avoid that

#

Because exceptions are slow, and are meant for unexpected issues

misty current
#

^

#

also the name is not very good

young knoll
#

Use a simple null check

ornate patio
#

it's there because Alcohol is gonna be available for other plugins to use

young knoll
#

Or an optional

ornate patio
#

trying to make it user friendly

misty current
#

exceptions don't make code more user friendly

#

anyways if you really wanted to use an exception you should choose a better name

#

a simple illegalStateException should be good since the persistent data missing would be an illegalstate

#

or a wrapper of it

tender shard
ornate patio
#

hmm ok

#

thanks

tender shard
#

it's not a big deal imho though

#

but yeah if you CAN easily avoid try/catch, you should probably avoid it

#

you know it's like having a safety net under a bridge

#

it'll prevent you from dying when jumping off the bridge

#

but it's better to just not jump off any bridges in the first place

#

you know? 😄 I think that's a good comparison

misty current
#

i like that lol

#

jumping off a bridge on purpose is no good

tender shard
#

exactly, it's useful for accidently falling down but that doesn't mean you should force having to use the safety net

silver shuttle
#

Why does this not save the now modified config to disk?

tender shard
#

Great, now I have to write a new post again...

tender shard
silver shuttle
#

a FileConfiguration

wet breach
silver shuttle
misty current
tender shard
silver shuttle
tender shard
misty current
viral crag
#

you sure you are saving to the right folder?

silver shuttle
#

yes, the file appears correctly

young knoll
#

Using / in the file constructor is fine

#

Modern java will translate it for you

ornate patio
silver shuttle
ornate patio
#

it's possible to quickly switch items just as you consume the drink

misty current
ornate patio
#

and do this

wet breach
ornate patio
#

this could be dangerous because if you drink the potion and immediately switch to a valueable item in your hotbar

#

it'll be replaced

silver shuttle
#

But that still doesn't solve the issue that the config file does not save any changes

wet breach
# silver shuttle

are you certain that the file config instance is the same one you think it is?

silver shuttle
#

yes

night torrent
#

when i make a custom death message, the player's name is red despite me doing "ChatColor.WHITE"

tender shard
#

I would never trust it

young knoll
#

Hence why I said modern

wet breach
#

it should be removed lol

tender shard
#

even if it will work in 99% of cases, there is no reason to try your luck

wet breach
# silver shuttle

a better line of code to get your file, instead of the way you have it

#

is this

#
File(plugin.getDataFolder(), "data.yml");
#

notice I used a comma

tender shard
#

Files should always be used either using

new File(pathFile, "child.yml");

or

new File("path" + File.separator() + "child.yml");
wet breach
#

this will automatically add a path separator for the file

silver shuttle
#

Well I can correctly read stuff from that file. It is simply not displaying it correctly

wet breach
#

Not entirely sure if that is your problem or not, however as I stated sometimes java will in fact put / as the filename the way you are doing it

loud haven
#

Probably should input customConfigFile for Save()'s parameter.
Or include the data folder path with "data.yml"

viral crag
wet breach
#

so when you call save, call load

worn sierra
#

anyone familiar with google guice?

#

i am stuck with something

wet breach
#

it should refresh the instance

loud haven
#

It's trying to save to wrong location

silver shuttle
wet breach
#

well the only thing I can think of is the way are specifying the file

silver shuttle
#

So I save it like this now the first time?

viral crag
#

if does not exist?

wet breach
#

I guess you can go with that, but you could just use a comma after getDataFolder()

silver shuttle
wet breach
#
File(plugin.getDataFolder(), "data.yml").exists;
silver shuttle
#

alright

#

so what way do I save the file now once I modified it ?

wet breach
#

you should also change it for your save method and load methods

night torrent
#

player name on death messages is always red, despite me prefixing it with "ChatColor.WHITE". Any suggestions?

young knoll
#

Are you using getDisplayName

night torrent
#

yessir

young knoll
#

use getName for a raw name

night torrent
#

oh ok

young knoll
#

Or strip colors if you want to use display names

wet breach
young knoll
#

ChatColor.stripColor

wet breach
#

this way / doesn't get added to the actual filename

night torrent
#

ok

silver shuttle
worn sierra
quaint mantle
#

Can you assign NamespacedKey to uis?

#

like inventories?

wet breach
#

odd way you have it though

young knoll
silver shuttle
#

alright now it works

#

thank you

quaint mantle
# young knoll No

How would I get a ui then without people just renaming a chest to smth

silver shuttle
#

also - wtf

quaint mantle
#

Cause I wanna add protection

silver shuttle
#

why does it do that

quaint mantle
#

So that ppl cant just rename a chest something

#

To get access to a ui

young knoll
#

When you openInventory it returns an inventory view

#

Use that to identify your custom inv

wet breach
#

UUID.toString()

silver shuttle
#

ty

quaint mantle
young knoll
#

Normally you just add the view to a set

#

And then check contains() on that set in inventory events

wet breach
#

and that should get you back a proper UUID object from the uuid string 😛

granite owl
#

can someone help me how to get the server to safe entities which are inheriting a super entity like the Skeleton upon shutdown?

#

so its loaded correctly

#

because like custom AI behavior where pathfinding goals are overriden obv dont make it past restart

#

since its in RAM only

subtle folio
#

How do I get the name of an itemstack?

#

the displayname*

#

.getItemMeta().getDisplayName()?

young knoll
#

Yes

#

Keep in mind it may be null

subtle folio
#

ok good im not going crazy

subtle folio
dire salmon
young knoll
#

Display name

#

If the item doesn’t have a custom name, it will be null

dire salmon
#

oh ye

void wraith
#

Hi! I now make a BungeeCord plugin, but when I try to load the config, I got this error. Can anyone help me?

dire salmon
#

i cant even read it

granite owl
#

so any help for me with custom entities?

void wraith
dire salmon
worn sierra
#

@ivory sleet are you familiar with google guice?

void wraith
granite owl
# dire salmon what you need?
- I want to create custom entities
- I inherit a superclass like the Zombie as base
- I want to override pathfinding goals with custom written ones(can do dont need help)

- I need help with making the server save those to the harddrive in the world files on shutdown and be restored as it is, because by default it looses its inheriting class and is being saved as vanilla entity rather than the custom one
dire salmon
#

why code block

granite owl
#

because i used line breaks alot and discord tends to send the msg too early

#

if u press enter

dire salmon
#

k

#

i never made custom mobs

#

so i dont know

granite owl
#

basically anything you inherit returns to its vanilla counterpart as soon as u shutdown the server

void wraith
#

?

granite owl
#

so u can wrap the try catch clause around it

#

the super constructor expects the instance to handle exceptions

#

which u cant do in global scopes

#

alternatively put the whole thing in

#
static
{
  //...
}
#

doesnt really change anything functionally since plugins are merely callbacks anyway

hasty prawn
#

Just extend the Zombie class and start adding Pathfinders

#

Then save the custom type in PDC or something

#

And when the entity is loaded, if the custom type is in their PDC, respawn them with the new custom type

dire salmon
#

?pdc if you dont know

young knoll
#

A bit janky but yeah that works

young knoll
#

In the past I think you could make their custom type save if you loaded your plugin and startup and a bunch of stuff

#

Don’t think it ever worked for me

hasty prawn
#

Oh really? Never knew that

#

Worth a shot if you can find out how to do that lol

young knoll
#

Maybe we’ll get data driven entities next :p

granite owl
#

hmm

hasty prawn
#

That'd be great

granite owl
#

ill read into pdc

#

teye 😄

granite owl
hasty prawn
#

Pretty much yep

granite owl
#

kk

#

so just grab the entityspawnevent or however its called

hasty prawn
#

Although I would definitely try to do whatever Coll is talking about first.

#

That seems like a much better approach if you can figure out how it's done.

young knoll
#

I don’t think entities that already exist fire any event when they are loaded

#

Could be wrong

dire salmon
#

sorry, i dont remember
Player p = event.getPlayer()
p is object? if no, what is object

young knoll
#

Make your plugin load: STARTUP and register your entities in onLoad

#

Might work, no idea haven’t done it in a while

tardy flame
granite owl
#

well im mostly busy writing auxillary functions rn(putting everything into a master plugin and accessing it via reflection) XD which is what i get alot of hate for from the java community

tardy flame
#

so yes

young knoll
#

Of type player

dire salmon
#

+👍

#

bruh

tardy flame
granite owl
tardy flame
#

you mean custom by-

#

custom textures?

young knoll
#

You don’t have to inject them into stuff anymore? That’s nice

granite owl
tardy flame
#

I mean normal entities that are used by nms works fine without being registered

#

At least for me ^^

granite owl
#

they work fine

#

until reload

young knoll
granite owl
#

and i mean

#

i inherit existing entities and override the pathfinder goals with my own ones

tardy flame
granite owl
#

to create a boss AI for the giant

hasty prawn
#

PDC it is then HYPERS

granite owl
#

well not much to override since its empty but still xD

hasty prawn
#

Lol maybe we need 2Hex to extend his EntitySerializer to support Custom entities

granite owl
#

so my destroy on shutdown gets ignored

#

basically

granite owl
#

by the backup method

tardy flame
#

hmm

tender shard
#

it's pretty non-technical but I guess it explains what exceptions are actually meant for

tender shard
young knoll
#

That’ll probably be useful

tender shard
#

PDC would do a great prime minister / president / whatever is electable in any country

tardy flame
hasty prawn
#

That'd be great if it was lol

young knoll
#

Doubt it

tardy flame
granite owl
#

what if i use custom nms tags and on entity load i check for it having custom nms tags and then serialize, destroy existing entity and create new instance of custom entity inheriting the serialized object

tardy flame
#

Like what the hell bru

young knoll
#

Reload doesn’t reload chunks

hasty prawn
#

Testing purposes

#

True, I doubt it's ran

granite owl
#

well

young knoll
#

Pdc is just NBT without the NMS

granite owl
#

isnt that resource heavy?

young knoll
#

No?

granite owl
#

side question can i even serialize minecraft classes

#

xD

tender shard
young knoll
#

That’s literally what it is

#

An NBT wrapper

granite owl
#

okay so the entitiesload event is an alternative to letting the server handle it with vanilla methods

#

btw because someone mentioned it before, id also need custom textures without overriding the vanilla entities texture if possible

#

and if possible without armor stands

young knoll
#

Well you can make them invisible and place an item on their head

#

Said item having a 3D model

#

That only works for mobs that display helmets though

granite owl
#

but does it have like a walking animation then?

#

the item itself is static right?

young knoll
#

Yes

#

You’d need to constantly update it to make animations

tardy flame
#

No-

young knoll
#

I think there’s a program for that

tardy flame
#

Why am I lagging

young knoll
#

AnimatedJava or something

granite owl
#

so basically custom skin easy

#

with item thats undroppable and head worn

#

animation not

young knoll
#

Pretty much

granite owl
#

and the item has a custom model data is suppose

young knoll
#

Yes

granite owl
#

with corrisponding skin

#

well done that before

#

but not with 3d models

#

only 2d

granite owl
#

and if the entity was reloaded on /reload it would turn vanilla

quaint mantle
#
public class InvClickEvent implements Listener {
    @EventHandler
    public void clickEvent(InventoryClickEvent event){
        Inventory inv = event.getClickedInventory();
        if(inv != null){
            Player p = (Player) event.getWhoClicked();
            String title = p.getOpenInventory().getTitle();

            if(title.equals(ChatColor.DARK_RED + "Challenges")) {
                Material itemType = event.getCurrentItem().getType();
#

This seems a bit risky.

#

Any way I can make this not risky?

#

cause if somebody renames to a chest then

#

.e

granite owl
#

whats risky about that

young knoll
#

Didn’t I say to use inventoryView and a set

quaint mantle
#

Like at all

#

I tried that lol

young knoll
#

Then you have design issues

quaint mantle
quaint mantle
#

Challenges.getUi(p);

#

for example

#

so idk

granite owl
#

that

#

put custom nms tags on it

#

i did that with obsidian tools

#

where ive created new items server side only

quaint mantle
granite owl
#

uff

quaint mantle
#

NMS tags

granite owl
#

kinda yanky

#

u have to use vanilla methods

#

and bypass the bukkit api

digital haven
#

What kind of tag should I use for an array of compound tags?

granite owl
#

means u have to update ur plugin with every version chance

granite owl
quaint mantle
#

?

young knoll
#

Don’t use NMS

#

Use PDC

digital haven
#

Well thats not all that helpful lol

young knoll
#

?pdc

digital haven
granite owl
#

something like that

quaint mantle
#

inventory guis

granite owl
#
ItemStack itemNMS = CraftItemStack.asNMSCopy(inv.getItem(i));        
NBTTagCompound itemCompound = (itemNMS.hasTag()) ? itemNMS.getTag() : new NBTTagCompound();    
itemCompound.setInt("custom.Durability", (250 - itemNMS.getDamage()) * 6);        
itemNMS.setTag(itemCompound);
inv.setItem(i, CraftItemStack.asBukkitCopy(itemNMS));
#

its just a snipped from a super old project which ill rewrite soon

young knoll
#

Yeah that’s basically what pdc does

#

Just less ugly because it’s not NMs

granite owl
#

well

tender shard
#

then compare them using ==

#

instead of comparing the title

granite owl
#

like ive said old thing

#

yea

worn sierra
#

@tender shard are you familiar with google guice?

granite owl
#

the real uglyness comes from this

#
import net.minecraft.server.v1_16_R3.ItemStack;
import net.minecraft.server.v1_16_R3.NBTTagCompound;
tender shard
granite owl
#

means u MUST always update ur plugin every server version

tender shard
#

PDC exists since 1.14.1

granite owl
#

because all tutorials are 10years old

#

xD

young knoll
#

?pdc

granite owl
#

and i didnt know about pdc

young knoll
#

That one isn’t

digital haven
#

I have this

 public CustomPotion(String name, int color, int effectId, int effectDuration, int effectAmplifier) {
        item = Items.POTION.getDefaultInstance();

        CompoundTag effectsTag = new CompoundTag();
        CompoundTag effectTag = new CompoundTag();
        effectTag.put("id", IntTag.valueOf(effectId));
        effectTag.put("amplifier", IntTag.valueOf(effectAmplifier));
        effectTag.put("duration", IntTag.valueOf(effectDuration));
        effectsTag.put("", effectTag);

        CompoundTag displayTag = new CompoundTag();
        displayTag.put("name", StringTag.valueOf("Potion of " + name));

        CompoundTag nbtData = new CompoundTag();
        nbtData.put(PotionUtils.TAG_CUSTOM_POTION_COLOR, IntTag.valueOf(color));
        nbtData.put(PotionUtils.TAG_CUSTOM_POTION_EFFECTS, effectsTag);
        nbtData.put("display", displayTag);

        item.setTag(nbtData);
}

But the NBT it creates looks like this
{id: "minecraft:potion", tag: {display: {name: "Potion of Haste"}, CustomPotionColor: 15724066, CustomPotionEffects: {"": {id: 3, duration: 3600, amplifier: 1}}}, Count: 1b}
When it should look like this
{id: "minecraft:potion", tag: {CustomPotionColor: 16777215, CustomPotionEffects: [{ShowParticles: 1b, Id: 9b, Duration: 100, ShowIcon: 1b, Amplifier: 0b, Ambient: 0b}], Potion: "minecraft:water"}, Count: 1b} (Notice the array inside CustomPotionEffects)

#

I'm just not sure what the type would be for an array of CompoundTags

granite owl
#

btw would you say its like acceptable to outsource methods used by many of my plugins into a master plugin and access them via reflection rather than implementing it in every individual plugin?

#

makes updating indiviual methods easier

digital haven
prisma needle
#

Land Plot Math

night torrent
#

Is there anyway to check if the player is in water specificaly? I know there's such thing as .isLiquid(), but that means lava to.

young knoll
#

Check if the block is water

#

Iirc there is also Entity.inWater or something

night torrent
#

oh ok

misty current
#

is there a map that has 2 values for the same key? i'd need it to store islands, as i want to be able to get an island from the owner and from the location

young knoll
#

That sounds more like 2 keys with the same value

crimson terrace
misty current
ancient jackal
#

where key is player and values are the islands

misty current
young knoll
#

Have 2 maps

#

One for Location -> island

#

One for owner -> island

ancient jackal
#

why not just store the island's location with the island?

young knoll
#

Because then you can’t get the island from location

quaint mantle
#

@young knoll I found a way to do the thing you said to do

#

So ty

young knoll
#

Well you can with ugly loops, but that’s not efficient

ancient jackal
#

then find the island with the location

young knoll
#

Yeah like I just said

#

That’s not efficient

quaint mantle
#

also, @young knoll, how would I make floating text above a chest?

#

Just wondering

young knoll
#

Armor stand

crimson terrace
quaint mantle
young knoll
#

Spawn armor stand

#

Make it a marker

#

Give it a name

ancient jackal
#

I'd rather find an island's location in O(n) async than use double the memory while a server's up personally

young knoll
#

It’s not double the memory

#

Well I guess it is, but it’s double a tiny amount of memory

misty current
ancient jackal
#

the O(n) is temporary, the space complexity is forever

young knoll
#

A reference is 4 bytes

ancient plank
#

imagine not nesting ur maps

#

smh

ancient jackal
#

on god

misty current
#

it's not that big since the object stored as a value is the same

quaint mantle
#

help

misty current
#

since both map values will point to the same thing

young knoll
#

Exactly

quaint mantle
#

i spawned the armor stand @young knoll with text

#

and hhh

#

i cant remove it

young knoll
#

The value will be 4 bytes

#

The key will be however big a location is

misty current
#

also i can't really query stuff async since i'll need to check if a player breaks stuff in an island they are not a member of

#

and canceling events async is kind of a nono

young knoll
#

Hmm so you don’t want a single location

quaint mantle
young knoll
#

You want the entire island

quaint mantle
#

do i have to place it 1 block above or

ancient jackal
#

well you could also say that earlier

young knoll
#

In that cast store a bounding box in the island instance

misty current
#

i have a class called islandLocation that you can get from a location

#

the islandLocation basically is a 2d location that stores a y int and a z int

young knoll
#

So you can get that from a location

misty current
#

then there's a static nullable method that returns an IslandLocation from a Bukkit Location

young knoll
#

Yeah just map that to an island then

misty current
#

since i know the size of the island and the distance between them its easy to math

young knoll
#

It’s what, 16 bytes

misty current
#

with a very small complexity too

misty current
rough drift
misty current
#

oh and i have some static constants but they are very negligible

young knoll
#

Why ints

misty current
rough drift
#

only some people get that

#

and i have no clue how lmao

misty current
#

oh i misread my bad

#

send the command code

rough drift
#

its like if some people have a working plugin, and others don't

young knoll
#

Actually no int is fine

#

Minecraft worlds are limited to 30 million

quaint mantle
#

@young knoll last question: how do I add multiple lines to the armor stands na,e?

young knoll
#

More armor stands

misty current
#

it could even be a smaller datatype since islands are gonna be far apart but we live in 2022 so i cba

quaint mantle
#

tor