#help-development

1 messages · Page 677 of 1

young knoll
#

Did you switch to sending

rare rover
#

ye

#

never used protocol xD

#
        ProtocolManager manager = ProtocolLibrary.getProtocolManager();
        manager.addPacketListener(new PacketAdapter(javaPlugin, ListenerPriority.HIGH, PacketType.Play.Server.NAMED_SOUND_EFFECT) {

            @Override
            public void onPacketSending(PacketEvent event) {
                final PacketContainer packet = event.getPacket();
                final String sound = packet.getStrings().read(0);

                Bukkit.broadcastMessage(sound);
            }
        });```
young knoll
#

It won’t always have a string

#

If it’s a vanilla sound it likely won’t

rare rover
#

bruh

#

so how do i only change block breaking sounds?

young knoll
#

Read the id and figure out which sound corresponds to which id

rare rover
#

ah

#

smort

#

still ain't working doe

#

i'm just broadcasting "packet" now

#

still doesn't broadcast

#

oh sometimes it does

#

just not block breaking

#

whenever i hit something it works

#

i've also tried ENTITY_SOUND

young knoll
#

It’s possible the break sound is client side

#

I mean, it would make sense to me if it was

rare rover
#

there's no client side packet for sound doe

#

yeah there isn't

young knoll
#

Why would there be

rare rover
#

hmm

young knoll
#

If it’s client side it won’t tell the server that it happened

rare rover
#

wth is this

echo basalt
#

yeah so replace it with a resource pack

rare rover
#

wrong id??

#

yeah idk

#

i dont see sound anywhere

young knoll
#

Either replace it with a resource pack or implement an entire custom block breaking system

rare rover
#

i'm probably making a texture pack anyways

#

so ima go that route

#

thanks

topaz panther
#

is custom codes are prone to duping? like GUI or smth

lilac dagger
#

Uhm?

#

Explain more

echo basalt
#

bio does not check out

vital sandal
#

how can I adjust maven for multiversion :l?

#

I want to be abled to do something like this

echo basalt
#

Use modules

vital sandal
#

my project is already modules :l

#

so like I will need to do modules in a module :l?

opal juniper
#

you need different modules for each nms version you use

vital sandal
#

this is my files structure

#

will that need to be changed ?

opal juniper
#

essentially that v1-20-1 package needs to become a whole module

vital sandal
#

so how may I do it?

#

add a new pom into it and include it into the <modules>:l?

opal juniper
#

that is not a module, errm @tender shard has a guide somewhere but not entirely sure

shell robin
#

How do I check if the player has removed the asd helmet

clear panther
#

upper version is upgrade

#

unless md_5 remove smth

vital sandal
clear panther
#

o

upper hazel
#

how to make it possible to change incoming parameters during override

smoky anchor
upper hazel
#

in abstract classes it is not provided change of input parameters at desire of overwriting?

vital sandal
#

If you want to do it change it in the parent class

#

Or may be try overloading

ivory sleet
empty pilot
#

How do I allow to permission in minecraft Vanilla?

sullen marlin
#

Vanilla doesn't have permissions

tender shard
tender shard
# vital sandal will that need to be changed ?

Hi there! Today I’m going to explain how to setup a multi-module project using maven to support different NMS versions. Important notes about this tutorial: Every step will have detailled screenshots using IntelliJ. I explicitly chose not to include everything as copy/pastable source code, but normal screenshots (you can click on them to show th...

#

it'S a bit long lol. If you got any question, feel free to ping

#

i'mma upload the ArmorEquipEvent to maven central ig

grizzled oasis
#

Hi, something about Inventories i save them in base64 and to import them i use the Inventory class, there's a method to import it over to a player or i need to loop for the inventory saved and add them to the player (found)

livid dove
livid dove
tender shard
tender shard
#

i only saw star wars 3 and I did not like it 🥲

livid dove
#

....

tender shard
#

I also saw the first one (4th) and I didnt like that either

livid dove
orchid trout
#

cat

livid dove
# orchid trout cat

Legit question, where does the cat close up to the camera thing come from like?

orchid trout
#

i took it

clear panther
tender shard
#

?paste

undone axleBOT
tender shard
#

I get this whenever I try to upload stuff to maven central from within IntelliJ ^

#

it does work fine if I run mvn deploy from console though

#

anybody knows why?

vapid grove
tender shard
#

yes, that's bad

echo basalt
vapid grove
tender shard
#

also what is getClassesInPackage doing?

#

does it Class.forName the classes?

vapid grove
# tender shard also what is getClassesInPackage doing?
public static ArrayList<Class<?>> getClassesInPackage(String packageName) {
        ArrayList<Class<?>> classes = new ArrayList<>();
        Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
        Set<Class<?>> allClasses = reflections.getSubTypesOf(Object.class);

        for (Class<?> cls : allClasses) {
            if (cls.getPackage() != null && packageName.equals(cls.getPackage().getName())) {
                classes.add(cls);
            }
        }

        return classes;
    }
#

its reflections

#

just grabbing all classes in a package

tender shard
#

why aren't you at least using Enchantment.class

vapid grove
tender shard
#

it would only return classes that extend Enchantment

#

but, now there's a caveat: you should NEVER extend Enchantment yourself anyway

vapid grove
#

like Items or Commands

#

so i just set it as object so it works with any

tender shard
#

the javadocs already tell you not to implement or extend bukkit classes

vapid grove
tender shard
#

oh ok my bad then

#

yeah well if your stuff works, it works

vapid grove
#

however if thats an issue, ill need to recode my items then as they are implimenting listener

tender shard
#

however I think that scanning the .jar is bad practice

vapid grove
#

which does extend bukkit classes then

tender shard
#

you should rather keep a List<YourCustomEnchantment> and use that instead of scanning all classes

vapid grove
#

so i dont ahve to manually add them to the list

tender shard
#

I know, I've also done stuff like this years ago, but it's kinda bad practice

vapid grove
#

i see

tender shard
#

on the other hand, I cannot really give an argument on WHY I think its bad lol

#

so as said, it would ofc work fine but I still think it's bad haha

vapid grove
#

fair

#

im just tryna find the best way to handle this

#

but either way i will have to recode items in this case as

tender shard
#

I would hardcode the list of classes and call it a day

vapid grove
#

alright ty ill do that then instead

tender shard
#

also can somebody tell me what the hell is this

vapid grove
tender shard
#

yeah but what is this for lol

vapid grove
#

well from what i can tell somehow your armor equip event class is generating that

#

did you make it do that or is it doing it on its own

#

either way it seems to be a list of items that cant be used as armor perhaps?

#

why a txt tho, better yet why generate that

tender shard
#

my ArmorEquipEvent is a fork of the original author's github repo. The list is hardcoded but I wonder what the purpose is

vapid grove
#

and made a list of all items that cant be equipepd

tender shard
#

well nobody has complained so far, so I guess it's working haha

vapid grove
#

if its working dont break it
unless you want to make something more efficient lol

tender shard
vapid grove
#

til i thought well maybe they dont wanna add new equippables all the time

#

then again i still think its odd

tender shard
vapid grove
#

wait a sec.. arent you that guy who gave me that blockpersisantdata thingy

#

i swear i remember you

#

couple months ago or smth

tender shard
#

?blockpdc

undone axleBOT
tender shard
#

this?

vapid grove
#

yes

tender shard
#

Yeah I made that, I had the idea in a dream

vapid grove
tender shard
#

was it useful for you at least lol

vapid grove
#

thats actually one of the most helpful things ever lol

vapid grove
tender shard
#

:3

#

maybe you'll also like MorePDC:

#

?morepdc

undone axleBOT
vapid grove
#

oh damn

#

i had to manually learn to do taht

#
package me.emerald.gooberplugin.core.objs;

import com.google.gson.Gson;
import org.bukkit.persistence.PersistentDataAdapterContext;
import org.bukkit.persistence.PersistentDataType;

public class StringListTagType implements PersistentDataType<byte[], String[]> {
    @Override
    public Class<byte[]> getPrimitiveType() {
        return byte[].class;
    }

    @Override
    public Class<String[]> getComplexType() {
        return String[].class;
    }

    @Override
    public byte[] toPrimitive(String[] complex, PersistentDataAdapterContext context) {
        Gson gson = new Gson();
        return gson.toJson(complex).getBytes();
    }

    @Override
    public String[] fromPrimitive(byte[] primitive, PersistentDataAdapterContext context) {
        Gson gson = new Gson();
        return gson.fromJson(new String(primitive), String[].class);
    }
}
#

created another class for ints as well

tender shard
#

oh damn yeah you could just do DataType.asList(DataType.STRING) with MorePDC

flint coyote
vapid grove
#

yeah im 100% saving these for later LOL

tender shard
#

it also allows maps, nested collections etc
e.g. Map<String,ItemStack> map = pdc.get(someKey, DataType.asMap(DataType.STRING, DataType.ITEM_STACK));

vapid grove
#

once i finish sorting out my first issue

tender shard
#

what is your issue?

vapid grove
#

and how thats really bad for bukkit api

tender shard
#

white item?

vapid grove
#

i love autocorrect

#

the whole

tender shard
#

oh lol

#

I would indeed just keep a hardcoded list

List<Class<? extends MyCustomEnchantment> myEnchantments = List.of(
  MyCustomEnchantment1.class,
  MyAnotherEnchtnantment.class,
  // etc
);

This might seem annoying to do but relying on reflection to scan your own .jar seems very dirty

#

idk but it feels like a dirty hack

vapid grove
#
if(!cls.getName().contains("$2") && !cls.getName().contains("$1")) {
#

had to make a hacky fix for

#

these types of classes

#

so they wouldnt attempt to run and break the code

tender shard
#

oh haha why don't you just check if it contains "$"

#

you probably don't use $ normally in your class names

vapid grove
#

the first time i saw it i was like

#

"ok ill just check for $1"

tender shard
#

haha

vapid grove
#

a week later "$2" shows up so

tender shard
#

😄

vapid grove
#

i just added an extra check ig

tender shard
#

just say you were tired and call it a day

#

isn't there even isAnonymousClass() or sth 😄

vapid grove
tender shard
#

yeah anyway, even though "$$$" is a valid class name, I'm sure you're not actually using that, so just do if(clazzName.contains("$"))

#

or you could check whether that clazz.isAssignableFrom(YourCustomEnchantment.class)

simple schooner
#

How would I make a minion generate items even if the owner is offline?

vapid grove
vapid grove
#

then when they log in use math to calculate how much they earned offline

tender shard
#

use an IntStream

vapid grove
tender shard
#

Stream<String> illegalClassSuffixes = IntStream.range(1, Integer.MAX_VALUE).map(i -> "$" + i);

#

lmao

simple schooner
tender shard
#

i am not sure

vapid grove
#

until today i had 0 clue about super, for like the past couple months ive been doing stuff without it

north nova
#

whats super

tender shard
vapid grove
#

so now im backtracking tryna use it lol

vapid grove
tender shard
vapid grove
#

an extension if you will

north nova
#

what is superclass

vapid grove
#

they will help you out

tender shard
north nova
#

Ok Thx

#

Can i Use it here

#

shit

#

nvm

vapid grove
#

if you find a way to impliment an extension in it yeah

#

ItemStack in an item class goes hard

#

extend ItemStack 💪

tender shard
#

a call to super is required if the class extends an abstract class that doesnt have a no-args constructor

north nova
#

ah ok thx

vapid grove
#

is cause i cant use super or extends

#

it litterally crashes my server

#

since its infintely loops that

#

getClassesInPackage function

tender shard
#

example for why super() is sometimes needed

#

java 21 will allow to run arbitrary code BEFORE calling super btw

#

great addition

#

because rn super() has to be the first statement

#

(which makes little sense)

north nova
#

mfw virtual threads

smoky anchor
north nova
#

444

#

iirc

tender shard
#

maybe it won't be added in java 21 but there's definitely a "preview feature" thing for that existing

simple schooner
#

I was just asking

tender shard
#

well probably your "minion" thing requires chunks to be loaded

#

idk what a minion is though

#

but you could save a List<...> of whatever it requires to work

#

and then when it gets unloaded, save the current time

#

when it gets laoded again, do some math and figure out what it would have produced during that time

smoky anchor
simple schooner
#

That's what the other dude suggested

simple schooner
tender shard
#

maybe you could explain what this minion does, in the first place

smoky anchor
#

don't got one, never done anything like this

#

I have Hypixel Skyblock minions in mind
You might have a different minion in mind, so explaining what you mean would be good

simple schooner
tender shard
#

so they place blocks and mine them

#

so you would know "it places 1 block per second and mines 2 blocks per second" so you know the average output would be 1/2 = 0.5 blocks per second

simple schooner
#

Well I wouldn't do it that way, what I have in mind is. If a minion is placed under a block, it would constantly generate the block type under it

#

My vocabulary is limited

#

I can't explain it well

#

I learned english in roblox l0l

tender shard
#

but still, you'd know at which rate it does that. So you can keep a Date object of when it was unloaded, then a Date when it was loaded again, then you get the difference in seconds between both and calculate what it would have generated in that time difference

tender shard
smoky anchor
tender shard
#

still, fancy new addition that's long overdue

#

as a workaround one can currently just declare a method that returns whatever input it got, to avoid this issue

simple schooner
tender shard
#

np

tender shard
sterile breach
#

hello, how to display above the cat bar a pettite anotatino? with acf you have to add @named but in native spigot library?

ivory sleet
#

What exactly do you mean?

#

cat bar?

sterile breach
#

when you tape your command argument. At the top of your words/argument we can see for exemple <amount>

tender shard
#

oh you're asking about Brigadier's command completion

smoky anchor
#

I assume this

tender shard
#

ACF >>

ivory sleet
#

Spigot api doesn’t allow argument tooltips

#

Or well there is no way to add those thru the api

#

Many command third party libs such as acf, cloud, triumph command do have that support

tender shard
#

^

ivory sleet
#

I don’t like annotations (hence I dont use acf) personally so i use brigadier which works fine although its definitely not beginner friendly in the slightest

sterile breach
tender shard
#

well you already got the answers. Use ACF or similar, or directly use Brigadier. Spigot itself doesn'tsupport it

ivory sleet
#

You can cast the server instance to craft server i think and grab the brig command dispatcher there

#

Havent touched spigot in a while but yea

tender shard
#

maven central's error messages are kinda useless

drowsy helm
#

400 bad request

#

Just ask nicely next time smh

tender shard
#

the actual issue was "wrong group id"

#

I#ve shot myself into the own leg with this

#

oh no wait, actually I didn't

#

it's actually genius

#

at first I thought that it'll be stuck in the while loop if there is only one record

#

but then I noticed the switch lol

misty current
#

can anyone tell if i'm locking the correct lock in the correct places? this method basically loads a player's data from a database in case it is not in memory

    @NotNull
    public CompletableFuture<CitadelPlayer> getOrLoadPlayer(@NotNull UUID uuid) {
        try {
            lock.readLock().lock();
            CitadelPlayer player = getPlayerNullable(uuid);
            if(player != null) return CompletableFuture.completedFuture(player);

            return CompletableFuture.supplyAsync(() -> {
                try {
                    lock.writeLock().lock();
                    CitadelPlayer cPlayer = new CitadelPlayer(this, uuid);
                    uuidPlayerMap.put(uuid, cPlayer);
                    return cPlayer;
                } finally {
                    lock.writeLock().unlock();
                }
            }, executor).exceptionally(throwable -> {
                throw new PlayerdataException(String.format("Failed to create new CitadelPlayer. (player: %s)", this), throwable);
            });
        } finally {
            lock.readLock().unlock();
        }
    }
lilac dagger
misty current
#

i'm also locking the other part because getOrLoadPlayer can also be called from another thread so the part that is not in the completable future might also be executed async

lilac dagger
#

And instead of getplayer nullable you can use @nullable annotation

misty current
#

i've already done that, but i think nullable in the name makes it clearer

misty current
#
    @EventHandler
    public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
        try {
            playerController.getOrLoadPlayer(event.getUniqueId()).get();
        } catch (Throwable e) {
            event.setKickMessage(ChatColor.RED + "Failed to load user data. If this issue persists, please contact an admin.");
            event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
            playerController.unloadPlayer(event.getUniqueId());
            Citadel.log(Level.WARNING, String.format("Failed to load playerdata. (uuid: %s)", event.getUniqueId()), e);
        }
    }
lilac dagger
#

Well an intellij annotation would warn you if you try to use null

chrome beacon
#

You could also use optionals

#

If you don't think it's clear enough with nullable annotation

misty current
#

in this case i'm blocking the thread handling the connection to not allow the player to login until their data is loaded

lilac dagger
#

Optionals are a bit ugly for me personally

misty current
chrome beacon
tender shard
#

Optionals - ugly, yes. Bloat, no

tender shard
chrome beacon
#

Yeah I was about to say

#

That's a bad practice

lilac dagger
#

It catches nulls too

#

Not a good idea

misty current
#

i had not noticed that, i've copied that part from an old project

tender shard
#

and why is that method called "get..." if it doesn't get anything?

misty current
#

it loads the player profile if not in memory and returns the profile

#

in this case i don't need the returned value

tender shard
#

oh ok

lilac dagger
#

Oh and also, methods should generally do one thing

misty current
#

anyways what's the difference between catching exceptions and throwables?

tender shard
#

Throwable has 2 subtypes: Exception and Error

lilac dagger
#

Exceptions are of a higher hierarchy

tender shard
#

Errors generally should not be caught

misty current
#

stuff like assertion errors i guess

#

yea that makes sense

tender shard
#

e.g.it makes little sense (usually) to catch an OutOfMemoryError

misty current
tender shard
#
        while(true) {
            List<Object> list = new ArrayList<>();
            try {
                list.add(new Object());
            } catch (OutOfMemoryError error) {
                System.out.println("Your RAM is now completely used. You can buy more RAM on amazon.com.");
            }
        }
chrome beacon
#

Don't forget to catch stack overflow

tender shard
#

fun fact - the method I sent above does not print anything

tender shard
simple schooner
smoky anchor
tender shard
simple schooner
#

Oh its a joke websitr

tender shard
#

obv yes lol

ivory sleet
smoky anchor
rough pumice
#

so i've got a problem where when i change the players gameprofile the player is vanished to everyone. but when they change it back to themselfs the player appears but the player who ran the command isnt able to do anything, and if they try and interact they get kicked for interacting with themselfs. My code is below (it does the same regardless if i send the packets or not):

boolean _ApplyNickname(Player player, String nickname, String texture, String signature) {
        EntityHuman eh = ((CraftPlayer) player).getHandle();
        UUID newUUID = Bukkit.getOfflinePlayer(nickname).getUniqueId();

        //PacketPlayOutEntityDestroy spawnPacket3 = new PacketPlayOutEntityDestroy(player.getEntityId());

        //Bukkit.getOnlinePlayers().forEach(p -> {
        //    ReflectionUtils.sendPacket(p, spawnPacket3);
        //});

        // set the new uuid
        GameProfile gameProfile = new GameProfile(newUUID, nickname);
        gameProfile.getProperties()
                .put("textures",
                        new Property(
                                "textures",
                                texture,
                                signature
                        ));

        try {
            Field uuidField = gameProfile.getClass().getDeclaredField("id");
            uuidField.setAccessible(true);
            uuidField.set(gameProfile, newUUID);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            return false;
        }

        // set the new game profile
        try {
            Field profileField = eh.getClass().getSuperclass().getDeclaredField("cp");
            profileField.setAccessible(true);
            profileField.set(eh, gameProfile);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            return false;
        }

        CraftPlayer newPlayer = new CraftPlayer(((CraftServer) Bukkit.getServer()), (EntityPlayer) eh);
        EntityPlayer newEntityPlayer = newPlayer.getHandle();
        Player newBukkitPlayer = newPlayer.getPlayer();

        // send spawn packet
        PacketPlayOutNamedEntitySpawn spawnPacket1 = new PacketPlayOutNamedEntitySpawn(newEntityPlayer);
        ClientboundPlayerInfoUpdatePacket spawnPacket2 = new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.a.a, newPlayer.getHandle());
        PacketPlayOutNamedEntitySpawn spawnPacket4 = new PacketPlayOutNamedEntitySpawn(newPlayer.getHandle());
        PacketPlayOutEntityStatus spawnPacket5 = new PacketPlayOutEntityStatus(newEntityPlayer, (byte) 35);

        Bukkit.getOnlinePlayers().forEach((p) -> {
            p.showPlayer(plugin, newBukkitPlayer);
            p.showEntity(plugin, newBukkitPlayer);
            //ReflectionUtils.sendPacket(p, spawnPacket4);
            //ReflectionUtils.sendPacket(p, spawnPacket1);
            //ReflectionUtils.sendPacket(p, spawnPacket2);
            p.showEntity(plugin, newBukkitPlayer);
            p.showPlayer(plugin, newBukkitPlayer);
        });

        return true;
    }
tender shard
#

ooh you're right

undone axleBOT
rough pumice
#

mb

tender shard
#

?nms

rough pumice
#

wait that exists?

tender shard
#

yes, see link above

rough pumice
#

dammn

#

oh ive tried to run build tools with --remapped but i get an error about not being able to find sh because i use windows

tender shard
#

it should still work fine

chrome beacon
#

BuildTools works fine on Windows

rough pumice
#

ill try it again ig

tender shard
#

if it doesn't, your buildtools is maybe outdated

chrome beacon
#

If it stops working do what it tells you and send the log in a paste

lilac dagger
#

Buildtools has a gui now? 😄

lost jewel
#

can anyone help me to programm a plugin?

smoky anchor
#

?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!

grim hound
#

Yo, so PlayerSpawnLocationEvent is invoked before the PlayerJoinEvent but in the same circumstances (only at a server join)?

north nova
#

Called when player is about to spawn in a world after joining the server.

grim hound
#

yooo that's dope

lilac dagger
#

But what do you use the event for?

rough pumice
torn shuttle
#

hey quick question, does anyone know if minecraft has a weird limitation on scoreboards to where if the text is the same on two lines it will only display one of the two lines?

lilac dagger
#

Yes

#

But that's only true for scores

torn shuttle
#

uh

lilac dagger
#

If you use teams you can have the prefix/suffix to whatever

torn shuttle
#

as long as the scores are different right

vale tinsel
#

hi all
I am a beginner for plugin
Recently I encountered a strange bug when practicing
The following is the code of the main logic

public class SignEvents implements Listener {
    private final JavaPlugin plugin;

    public SignEvents(JavaPlugin plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent e) {
        if (e.getClickedBlock() == null || !(e.getClickedBlock().getState() instanceof Sign)) {
            return;
        }

        Sign sign = (Sign) e.getClickedBlock().getState();
        String text = sign.getSide(Side.FRONT).getLine(0);
        
        if (text.equalsIgnoreCase("test")) {
            BukkitTask task = new BukkitRunnable() {

                @Override
                public void run() {
                    Inventory inv = e.getPlayer().getInventory();
                    final ItemStack testItem = new ItemStack(Material.DIAMOND_BLOCK, 10);
                    inv.clear();
                    inv.addItem(new ItemStack(Material.DIAMOND_BLOCK, 60));
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException exception) {
                        throw new RuntimeException(exception);
                    }

                    inv.addItem(testItem);

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException exception) {
                        throw new RuntimeException(exception);
                    }
                    inv.removeItem(testItem);
                }
            }.runTaskTimer(this.plugin, 5 * 20L, 5 * 20L);
        }
    }
}
north nova
#

oh yeah the bug

#

the cucaracha

rough pumice
vale tinsel
#

I don't know why removeItem Incorrect

rough pumice
#

?remap

#

?nms

lilac dagger
#

Thread sleep should be removed, no reason to keep it

#

I mean there are reasons but people misuse it

rough pumice
#
operable program or batch file.
Error compiling Spigot. Please check the wiki for FAQs.
If this does not resolve your issue then please pastebin the entire BuildTools.log.txt file when seeking support.
java.lang.RuntimeException: Error running command, return status !=0: [C:\WINDOWS\system32\cmd.exe, /D, /C, sh, applyPatches.sh]
        at org.spigotmc.builder.Builder.runProcess0(Builder.java:1062)
        at org.spigotmc.builder.Builder.runProcess(Builder.java:993)
        at org.spigotmc.builder.Builder.main(Builder.java:738)
        at org.spigotmc.builder.Bootstrap.main(Bootstrap.java:27)```
this is happening when i run build tools with the `--remapped` flag.
I'm using Windows 10 and never had this problem with buildtools before.
lilac dagger
#

Show the whole command

#

And are you on the latest buildtools?

rough pumice
#

yup pretty sure

north nova
#

do u have git bash

rough pumice
#

lemmie use baste bin

#

i do have git bash

north nova
#

try running it in git bash

#

oh

rough pumice
#

thats what im using

north nova
#

that's freaky then

rough pumice
#

wait nv it was git cmd

#

mb

north nova
#

try running it in git bash even tho iirc bt used to work in powershell as well

rough pumice
#

alr im trying now

chrome beacon
#

Bt should work in cmd too

north nova
#

i remember i had this issue on ltsc

chrome beacon
#

It would download a portable git bash and use that

north nova
#

¯_(ツ)_/¯

chrome beacon
#

¯_(ツ)_/¯

rough pumice
#

it is weird tho bc i've already built it with the nms mappings using the gui but maven is saying that it cant find it

chrome beacon
#

(If you're using Intellij)

lilac dagger
#

I usually run the command as java -jar BuildTools.jar --remapped from windows cmd

#

And it works

chrome beacon
#

Yeah as I said it's supposed to use portable

native bramble
#

what will be if im using Bukkit.getOfflinePlayer() on player which is online?

hazy parrot
chrome beacon
#

You can use isOnline and then getPlayer

#

Or instanceof if you'd perfer that

native bramble
#

i need only to get uuid by player name

hazy parrot
#

If u sure he will be online just use Bukkit.getPlayer

native bramble
#

im not sure

fluid river
#

Bukkit.getOfflinePlayer(String)#getUniqueId()?

native bramble
#

yeah

#

im trying this

lilac dagger
#

You can cast it to Player if isOnline is true

#

Btw

chrome beacon
#

Don't forget that might do an api lookup to mojangs server

chrome beacon
rough pumice
# chrome beacon Did you reload maven

yeah it works when i dont add the classifier remapped-mojang for ther spigot dependency but when i add it it just says Cannot resolve org.spigotmc:spigot:1.20-R0.1-SNAPSHOT

chrome beacon
lilac dagger
#

Sometimes it makes sense to do it if you want to do extra for online players

chrome beacon
#

Also show pom

#

?paste

undone axleBOT
lilac dagger
#

Try to restart intellij

young knoll
#

Using rev 1.20 will build 1.20.1

rough pumice
chrome beacon
native bramble
#
public static UUID getUUIDbyName(String name){
        OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name);
        if(offlinePlayer.isOnline()){
            return Bukkit.getPlayer(name).getUniqueId();
        }
        return offlinePlayer.getUniqueId();
    }```
#

smth like this?

fluid river
#

bruh

#

why

#

just Bukkit.getOfflinePlayer(String).getUniqueId()

#

it would return uuid anyways

young knoll
#

Also consider doing it async because of the potential web request

native bramble
#

so OfflinePlayer exist anyways if player has logged in server once?

native bramble
chrome beacon
native bramble
#

ohh

#

understand

fluid river
#

will just look up for uuid of given player on server data or on mojang server

young knoll
native bramble
#

ok

#

because runTaskAsynchronously have this comment: Asynchronous tasks should never access any API in Bukkit

charred blaze
remote swallow
#

dont follow that

young knoll
#

GC will get it if it no longer is referenced

remote swallow
charred blaze
#

wish i had that link at start

charred blaze
grim hound
#

it's a static method

#

and it throws an error whenever I input null, as there is no instance

remote swallow
#

"Object is null"

#

it wants to get something from the object

#

you pass null

#

it now cant

grim hound
#

ye no shit

#

but that's how you invoke a static method

#

using reflections

remote swallow
#

is it actually static

grim hound
#

so I dunno what to really do now

grim hound
#

also if it wasn't another error would be thrown instead

remote swallow
#

oh

grim hound
#

yeee, is it perhaps java's fault?

#

I tested it on the newest version

remote swallow
#

java 21?

smoky anchor
grim hound
#

I have no idea which version minecraft 1.20.1 uses

remote swallow
#

java 17

remote swallow
eternal night
#

can you share your reflections util class

grim hound
#

sure

eternal night
#

?paste

undone axleBOT
grim hound
#

there's a lot of unnecessary stuff

#

so here's the relevant stuff:

charred blaze
grim hound
#

Other stuff works, just this is the only time I need a static method

eternal night
#

yea ehm

grim hound
eternal night
#

your method fetching seems scuffed at best

remote swallow
eternal night
#

like

#

getMethodByReturnType ??

grim hound
#

what's wrong with that?

#

You can't get it by name - it's obfuscated

eternal night
#

what are you going to do if there are two methods ?

#

with the same return type

#

in a class

grim hound
young knoll
#

lol

charred blaze
grim hound
#

and add like parameter type checks

remote swallow
grim hound
#

Anyway, that's not the issue

charred blaze
eternal night
#

that are not static

#

and return a MobEffectList

#

so

grim hound
#

the issue is that I can't invoke a static method

remote swallow
eternal night
#

your logic is probably just fucking up

#

you got the wrong method

remote swallow
#

if you have to write it out you get a better understanding

#

if you really need sourcecode theres a githuyb linked

grim hound
eternal night
#

I mean

#

I hope you can see how this is a rather dangerous way to retrieve a method

grim hound
#

maybe I should update it fr

fluid river
#

var meta = item.getItemMeta()
meta.setDisplayName()
item.setItemMeta(meta);

paste item to gui slot

#

is dat so hard?

eternal night
#

Well, that at least is your issue

#

so, use a way to get the correct method

#

then you can invoke it with null passed to invoke as param0

fluid river
#

or write itembuilder which adds meta in the process

rough pumice
#

im still getting the error Cannot resolve org.spigotmc:spigot:1.20-R0.1-SNAPSHOT
yet i just built buildtools again now

eternal night
#

are you using gradle ?

rough pumice
#

nope maven

eternal night
#

have you checked your local .m2

#

if the artefact is there

rough pumice
#

its definatly there

#

i can find the .pom file for it

#

intelij can find it but for some reason ig maven can't?

opal carbon
#

send ur maven depend

rough pumice
#
<dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot</artifactId>
            <version>1.20-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
            <classifier>remapped-mojang</classifier>
</dependency>
remote swallow
#

did you run with --remapped

opal carbon
#

and you can find the remapped one

#

specifically

rough pumice
young knoll
#

use 1.20.1

#

You can't build 1.20 anymore

opal carbon
#

not sure abt that one chief

eternal night
rough pumice
young knoll
#

Exactly

opal carbon
#

they the same nms version

eternal night
rough pumice
eternal night
#

no

rough pumice
#

its definatly there

eternal night
#

as if KEKW

young knoll
#

what

rough pumice
opal carbon
#

it doesnt look like its there

#

i see a .lastupdated for remapped mojang

rough pumice
#

oh

opal carbon
#

but not the actual jar

rough pumice
#

thats weird bc i definatly built it

opal carbon
#

check ur spigot folder in .m2 again

young knoll
#

You are building 1.20.1

eternal night
#

(just use 1.20.1 as a dep)

young knoll
#

^

rough pumice
#

the command java -jar BuildTools.jar --rev 1.20 --remapped and 1.20.1 im both using

rough pumice
#

i am

eternal night
#

no

young knoll
#

No you aren't

rough pumice
#

oh mb

eternal night
#

your pom says 1.20-R0

rough pumice
#

i realized

eternal night
#

ye

rough pumice
#

i see it now

#

im so sorry

opal carbon
#

its chill oopsie poopsie

rough pumice
#

yeah im pretty sure its working now ty for helping me realize that

#

i wouldnt have spotted it lmao

#

wait this is weird i can't import EntityHuman

#

nor any packets

eternal night
#

Remapped means mojang mapped

#

the names of things are different

remote swallow
#

?mappings

undone axleBOT
rough pumice
#

oh

eternal night
#

under mojang mappings

rough pumice
#

oh okay

remote swallow
rough pumice
#

ty

grim hound
#

Does the UUID change for players depending on the "online-mode" value?

#

Like is it different in offline and online mode for the same players?

young knoll
#

yes

#

Offline mode UUID is based on name

grim hound
young knoll
#

Online mode UUID is from mojangs servers

grim hound
#

hmm so I have to save users based on their name only?

young knoll
#

Names can change

grim hound
#

what?

#

No.

#

like

#

no

young knoll
#

Yes

#

Mojang lets you change names

grim hound
#

you're a different player, don't know you

young knoll
#

This is why you don't do offline mode

grim hound
young knoll
#

In online mode UUID is fine

misty current
grim hound
#

hmm

#

the server saves you as a different player when you have a different name, right?

misty current
#

if you run offline mode yes

grim hound
proper notch
#

They still save you by UUID though - just in offline mode your UUID is based on your name. Therefore, when your username changes in offline mode, your UUID changes

vital sandal
#

about maven modules
it is possible to have modules in module right?

misty current
#

but if you run offline mode and someone changed name, the server has no way of knowing the previous username for that player

#

if you don't use offline mode, the uuid and name is based on your minecraft account and so the uuid is always the same for the same user

vital sandal
misty current
#

so something like username and password not based on the actual minecraft username to login and get your profile?

#

that could work

grim hound
#

Okay then another question:
Suppose the main bukkit thread adds and removes a certain list's elements.
However, the iteration through it is async.
Would clonening the ArrayList make it impossible to have the threads interfere with one another?

misty current
#

but you can't tell the difference between two different accounts in offline mode

#

the name is the only thing that makes two accounts the same

eternal night
#

Ah damn slow internet sorry XD

vital sandal
grim hound
misty current
#

however you won't see the changes on the other list

grim hound
#

sure, array copying is fast, but it isn't impossible to have an error from that, correct?

misty current
#

if you need to see the changes on both threads use a syncronized list

grim hound
misty current
#

so you write on the main thread and read from another thread?

grim hound
#

yes

#

async on repeating

#

custom scheduler

misty current
#

the only issue i can see with that is if you try to read while the main thread is writing you might pull wrong informations

#

is the list immutable?

#

ie do you need to modify the contents of the list after creating it?

#

if the list is immutable you don't need to clone it

#

immutable objects are thread safe

grim hound
grim hound
misty current
#

i am asking if you need the list to change

misty current
grim hound
#

That's how the code looks

misty current
#

also there's no need to copy it

#

use a syncronized list

grim hound
grim hound
misty current
#

Collections.syncronizedList(new ArrayList<>(Bukkit.getMaxPlayers()))

worldly ingot
#

If you're adding to/removing from that array on another thread, you'll want some sort of thread-safe list

grim hound
#

nope.

misty current
#

why would you not use a thread safe list?

grim hound
worldly ingot
#

Then honestly you're probably fine

grim hound
worldly ingot
#

A simple ArrayList will suffice

grim hound
worldly ingot
#

Idk why you're cloning it

grim hound
misty current
misty current
#

in this case it is

grim hound
#

In this case it aint'

misty current
#

also an iterator won't throw a ConcurrentModificationException

worldly ingot
#

idk why you're shooting down suggestions without having tried them first. The performance hit you'll take from a synchronized list isn't going to bring your server from 20 to 5tps lol

misty current
#

that happens when you use enhanced for loops and modify the contents of the object being iterated

grim hound
#

Collections.synchronizedList does not sync the iterator

#

Iterators do throw ConcurrentModificationException

misty current
#

i'd rather have thread safety and predictable results from my code and lose on a bit (a VERY small bit) of performance than have hard to trace issues later on the line

grim hound
#

The ArrayList can be modified and is not blocked by the extra actions to make the list thread-safe, which are unnecessary. It's only reading it, no modifications are made

vital sandal
#

why this is marked as ignored :l?

worldly ingot
#

It's ignored because the parent already defines that version

#

If you want to define a more specific version for that module, move that version tag outside the <parent> block

remote swallow
#

Why do you have q file scope

misty current
worldly ingot
#

A synchronized collection will prevent multiple threads from adding to/removing from the list simultaneously by imposing a lock on its operations so you're really not going to get any benefit here from one. I think you're totally fine using a regular ArrayList and using a foreach loop

#

I think you're overthinking this and creating a problem that doesn't yet exist

vital sandal
#

here is its parent

misty current
#

anyways i agree with choco and you can just use a normal list, as long as you make sure to not write and read at the same time with different threads

grim hound
#

no changes can be made when the list is iterated through

misty current
#

i'd use a syncronized list anyways or wrap some actions on the list with a lock

misty current
small current
#

guys what is the return value of player.getInventory().getSize()

#

i cant try and see

worldly ingot
#

Should be 36

vital sandal
#

I thought it is 41?

small current
#

is it 36?

worldly ingot
#

Armour slots aren't part of the inventory

grim hound
#

synchronized list src

small current
#

public void setChestplate(ItemStack chestplate) {
this.setItem(this.getSize() - 3, chestplate);
}

#

i need the size for this

#

because config files

worldly ingot
#

Player#getInventory() is only the container slots, which armour slots and the off hand are not

worldly ingot
#

Those are separate slots

small current
worldly ingot
#

I don't know. Did you write it?

#

Or is this CraftBukkit?

small current
#

no

#

CraftInventoryPlayer

misty current
vital sandal
worldly ingot
#

Right, okay. So setItem() is used internally to change the contents of the inventory

misty current
#

ah i see

small current
#

im trying to make a config file

misty current
#

you're basically storing the contents of an inventory to configs

small current
#

for kits

vital sandal
#

@tender shard

misty current
#

you can store armor contents and inventory contents separately

worldly ingot
#

I don't know why you're not storing these contents separately in your config

grim hound
worldly ingot
#

"41" is far less descriptive than "chest"

grim hound
#

and list them

small current
misty current
sterile token
misty current
#

i'm coding something to serialize inventories right now and that's how i'll do that

rough pumice
#

what jar do i need to use after i build my plugin (i am using the nms remapped class stuff)?? because right now im getting an error saying it cant find the property gameProfile??

worldly ingot
#
    @Override
    public int getContainerSize() {
        return this.items.size() + this.armor.size() + this.offhand.size();
    }```
#

It's all slots

#

My mistake

#

So 41

small current
#

so 41 - 3

#

is chestplate

worldly ingot
#

I still think your config should very clearly outline armour and off hand slots as strings, not numbers

small current
#

it would get messy in the code

worldly ingot
#

not really?

#

It's like 5 extra lines

small current
#

no no no

#

its like a kit

worldly ingot
#

I know

small current
#

i could do one thing

worldly ingot
#

You can write it so it's not messy lol

#

Vanilla also stores armour and off hand slots separately

small current
#

if it was slot: CHESTPLATE

#

i would get it

#

and turn it to 38

#

so i always store ints in the code

vital sandal
#

why this appears red :l?

worldly ingot
#

Might just need a project refresh. IJ is very particular about maven

ancient plank
#

Or files not added to GitHub repo

#

If you're using GitHub integration

vital sandal
rough pumice
#

what jar do I use as the plugin?

eternal oxide
#

2nd

rough pumice
#

but that gives me an error saying that it can't find the gameProfile property on the player when i use reflections

worldly ingot
#

Well yeah, because that field doesn't exist at runtime

#

Your reflective calls aren't remapped

rough pumice
#

dammn

#

so i still have to use the names that arent mapped?

worldly ingot
#

For reflection, yes

eternal oxide
#

Why use reflection for GameProfile?

rough pumice
#

to set it

eternal oxide
#

what are you using it for?

rough pumice
#

a nickname system

eternal oxide
#

PlayerProfile is teh API version of it

ancient plank
#

🤔

rough pumice
#

oh okay

vital sandal
#

hmmm why this appear that surfixes

ancient plank
#

iml name different from project name iirc

rough pumice
eternal oxide
#

Which API version?

rough pumice
#

1.20.1

eternal oxide
#

no need to use CraftPlayerProfile

rough pumice
misty current
#

i'd rather change this stuff at a packet level because i'm unsure whether this might affect some internal code leading to unpredictable behaviour

eternal oxide
#

?paste

undone axleBOT
eternal oxide
rough pumice
#

alr ill try it out now

rough pumice
eternal oxide
rough pumice
#

tysm!

edgy crystal
#

how can i sort my tablist? ever player has a permissionlevel, it should be sorted this way. the highest permlevel is 100, so this needs to be at the top, any ideas?

eternal oxide
#

Skins is just an Interface

rough pumice
eternal oxide
#
public interface Skins {

    /**
     * Set a new skin on the Player and update all clients.
     * 
     * @param player    the Player to have his skin changed.
     * @param skin        a String[] skin to apply.
     */
    public void changeSkin(Player player, String[] skin);
    
    /**
     * Change a Players name.
     * This name is transient. It will be reset if you change the players skin.
     * 
     * @param player    the Player who's name we will change.
     * @param newName    the new name for this Player.
     */
    public void changeName(Player player, String newName);
}```
tender shard
rough pumice
#

ty!! @eternal oxide

vital sandal
#

working with modules and stuffs :l

tender shard
#

so you got everything working?

rough pumice
eternal oxide
#

returns the ServerLevel

rough pumice
#

do you know how I could do that in 1.20.1 because the ServerPlayer class doesnt have a getLevel() function anymore

tender shard
#

it should be level()

rough pumice
tender shard
#

they did many weird things

#

don't ask me but serverLevel() is just a casted level()

vital sandal
rough pumice
#

oh dammn they changed the constructor for ClientboundRespawnPacket, anyone know how I can figure out how to see what it needs to take in now?

rough pumice
#

mb i was just looking at the names of the variables it took in

eternal oxide
#

it changed for every version of 1.19 and 1.20 but not by much

tender shard
#

why the hell does the client get notified about the seed

eternal oxide
#

for the debug I guess

rough pumice
#

what do i put as dataToKeep and portalCooldown??

eternal oxide
#

true

tender shard
#

an overriding method can only return the same type or a narrowed down one

lilac dagger
#

i wonder what made spigot's jar be so large in the later updates

eternal oxide
#

its probably still a byte

lilac dagger
#

it's not like mojang wrote double their code in that time

eternal oxide
#

look at teh code I gave you, it is all commented

tender shard
#

you would have to create a Holder class

#

or you could just return object and do instanceof

rough pumice
#

wait what do i put for portalcooldown???/

#

nv

tender shard
#

0

#

or 1 if you're brave

rough pumice
#

whats the difference?

tender shard
#

the player's portal cooldown

#

no clue what that is but I'm 100% sure that 0 will work fine lol

#

if you really care, I'll check CB source and check what it does

#

when a player dies and it sends the respawn packet, they just use the value of Player#getPortalCooldown()

#

the portal cooldown is used to not teleport a player straight away when they enter a portal, but only after 100 ticks

#

I wonder what you're using the Respawn packet for

eternal oxide
#

its used to update teh client skin

tender shard
#

I see

#

interesting

eternal oxide
#

So the player can see their own skin change

#

other clients see it by just sending the meta

#

but your client won't as it expects it when the client joins

tender shard
#

oh FFS don't ask me a for an artifact ID if I'm not allowed to change it

lilac dagger
#

i wonder what is proguard doing to trigger a

#

in a non nms context

tender shard
#

why are you using proguard in the first place?

lilac dagger
#

i'm trying to get the optimization going

#

it's a good obfuscator

tender shard
#

it's a pretty bad obfuscator imho

#

I'd use allatori

lilac dagger
#

it works well for some things

#

yeah but it's paid

tender shard
#

"it works well for some things" isn't exactly the definition for a "good" thing though lol

#

show the full stacktrace

lilac dagger
#

i'll figure it out

#

it's triggering awhere i select the nms target for the output

wet breach
lilac dagger
#

but mojang released the mappings

wet breach
#

only to be nice, wasn't needed

lilac dagger
#

so i guess obfuscation wasn't their top priority

#

and neither is mine

tender shard
#

mojang only uses proguard to lower the .jar size, I guess that's everything proguard is capable of anyway

lilac dagger
#

stopping the copy pasters here

#

and yeah, lower file sizes

wet breach
#

the jar for mc isn't that large even without proguard

lilac dagger
#

from 900 to 600 kb

#

that's pretty good

wet breach
#

doesn't make a difference ?

lilac dagger
#

and with optimization is 580kb

#

if i get it working

tender shard
#

a properly obfuscated .jar looks like this lol

wet breach
#

if you are worrying about your jar size being under 1mb then you are doing something wrong

#

because at 1mb no one cares and it isn't going to do anything

tender shard
#

true, nobody cares about the .jar size

lilac dagger
#

i'm pretty sure that i can use a dictionary of variables

vital sandal
#

why this happened :l? some is .java and some not?

tender shard
#

they are .java if the whole code is commented out

wet breach
#

if your jar was creeping to like 300 or 400mb then I would probably say it would be worth doing some optimizing to lower that size down closer to 100mb

vital sandal
#

it show nothing in there ;-;

tender shard
#

then the file is empty

#

hence it's not a class

#

hence it's "only" a normal .java file

wet breach
#

but anything below 100mb isn't worth worrying about because even a 56k modem would still download it just fine

lilac dagger
#

proguard has an option that does overload fields

tender shard
#

wdym with "overloading" fields

harsh totem
#

Why am I not able to delete the latest update of my plugin from the spigot website?
I can delete any update except the last one

tender shard
#

why are you obfsucating? just to get a lower file size?

lilac dagger
#

this is overloading

#

like how you overload methods

tender shard
tender shard
lilac dagger
#

yes

harsh totem
lilac dagger
#

so i don't need a dictionary of keywords

tender shard
harsh totem
#

Ok

#

I just made a mistake in my update and wanted to reupload

tender shard
#

no need to delete it though tbh, just reupload a fixed version

#

nobody's gonna think "yeah let's download the second latest version"

wet breach
#

or you can just make a comment to not have people download it by mistake

tender shard
#

nobody reads descriptions

harsh totem
#

You're right. I would just rather if there weren't unnececery updates

tender shard
#

next time, don't upload broken versions 😛

wet breach
#

unfortunately unnecessary necessary updates are a thing of development

tender shard
#

but yeah it's weird that you cannot delete latest, but that's the way it is

harsh totem
wet breach
#

it happens you just try to not make it a common thing

tender shard
#

I literally have no clue what my own plugin is doing

#

how is it even possible to call super() in bytecode as not-first statement

harsh totem
#

is this something you worked on a long time ago?

tender shard
#

no, it's just hte obfuscated version

#

allatori is doing a good job

lilac dagger
#

i think i got it, it tries to pre init something and fails

#

because of the multi module aspect

#

this is the code to select the nms

#

for the specific version

#

i guess is best to disable optimizations, not worth it

opal carbon
#

proposal talking abt something similar

#

but basically that proposes allowing it officially in the language specificafion since right now it basically works in the bytecode specification fine anyways

#

(which is what ur seeing rn)

wet breach
rough pumice
#

Caused by: java.lang.NullPointerException: Cannot invoke "net.minecraft.server.network.PlayerConnection.a(net.minecraft.network.protocol.Packet)" because "nmsPlayerToAdd.c" is null i have no clue how to figure out whats causing it because of mappings

#

if someeone could help me work it out i would greatly appriciate it

opal carbon
torn shuttle
#

ah yes I remember now

tender shard
torn shuttle
#

python is a bad programming language

#

man I nearly forgot

tender shard
#

ofc python sucks, everything that's not strictily typed sucks big time

rough pumice
opal carbon
#

im assuming nmsPlayerToAdd is the serverPlayer you are sending packet to though

opal carbon
#

yeah the connection is null i assume from that

tender shard
#

it's the "connection" field

#

the player is probably offline

rough pumice
#

alr

wet breach
# opal carbon https://openjdk.org/jeps/447

hopefully they incorporate it because its an old standard thing from way back when before more complex things were necessary or needed in Java. Its original intention was to provide a small bit of safety by ensuring that the parent class is setup before calling anything from the parent and wasn't really a thing or a need back then to have some pre-logic before calling super or this

rare rover
#

how would one fix this?:
[08:14:17 INFO]: [org.mongodb.driver.cluster] Exception in monitor thread while connecting to server ac-1ym0zt6-shard-00-01.twcxqhy.mongodb.net:27017 com.mongodb.MongoSocketReadException: Prematurely reached end of stream

opal carbon
#

is this actually where the error is

rare rover
#

yes

tender shard
#

or show the full stacktrace

rough pumice
#

how do i re-add a player to the tablist after removing them?????

rare rover
torn shuttle
tender shard
#

where's the "Caused by" part

opal carbon
rare rover
#

doesn't give me a caused by

smoky oak
#

on a different topic

#

is it possible to /data get on offline players from native minecraft?

tender shard
smoky oak
# wet breach yes

could you be a bit more precise? /data get entity name doesnt do it

torn shuttle
#

for that you use something like oobabooga

smoky oak
#

fair

torn shuttle
#

and I am plenty aware it exists

tender shard
#

lunar landing modules?

smoky oak
#

large language models

#

gpt

tender shard
#

what is this, appollo 69?

rare rover