mirror of
https://code.chipmunk.land/ChomeNS/chipmunkmod.git
synced 2025-11-13 22:16:14 +00:00
Compare commits
No commits in common. "27757485d1b29e5a36e294f8d91f81066ff95918" and "f602648f8851e9a44008a76b7230a1c3b4be4b31" have entirely different histories.
27757485d1
...
f602648f88
5 changed files with 65 additions and 112 deletions
|
|
@ -64,8 +64,6 @@ public class CoreCommand {
|
||||||
|
|
||||||
final CompletableFuture<NbtCompound> future = CommandCore.INSTANCE.runTracked(command);
|
final CompletableFuture<NbtCompound> future = CommandCore.INSTANCE.runTracked(command);
|
||||||
future.thenApply(tag -> {
|
future.thenApply(tag -> {
|
||||||
if (tag == null) return null;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
tag.get("LastOutput", TextCodecs.CODEC).ifPresent(source::sendFeedback);
|
tag.get("LastOutput", TextCodecs.CODEC).ifPresent(source::sendFeedback);
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ public class ReloadConfigCommand {
|
||||||
try {
|
try {
|
||||||
ChipmunkMod.CONFIG = ChipmunkMod.loadConfig();
|
ChipmunkMod.CONFIG = ChipmunkMod.loadConfig();
|
||||||
|
|
||||||
CommandCore.INSTANCE.reloadFromConfig();
|
CommandCore.INSTANCE.reloadRelativeArea();
|
||||||
CustomChat.INSTANCE.reloadFromConfig();
|
CustomChat.INSTANCE.reloadFromConfig();
|
||||||
|
|
||||||
source.sendFeedback(Text.literal("Successfully reloaded the config"));
|
source.sendFeedback(Text.literal("Successfully reloaded the config"));
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,10 @@ import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.Items;
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.network.ClientConnection;
|
import net.minecraft.network.ClientConnection;
|
||||||
import net.minecraft.network.packet.c2s.play.*;
|
import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket;
|
||||||
|
import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket;
|
||||||
|
import net.minecraft.network.packet.c2s.play.UpdateCommandBlockC2SPacket;
|
||||||
|
import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket;
|
||||||
import net.minecraft.registry.Registries;
|
import net.minecraft.registry.Registries;
|
||||||
import net.minecraft.registry.tag.BlockTags;
|
import net.minecraft.registry.tag.BlockTags;
|
||||||
import net.minecraft.state.property.Property;
|
import net.minecraft.state.property.Property;
|
||||||
|
|
@ -37,11 +40,14 @@ import net.minecraft.util.math.*;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraft.world.dimension.DimensionType;
|
import net.minecraft.world.dimension.DimensionType;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public class CommandCore implements Listener {
|
public class CommandCore implements Listener {
|
||||||
public static final CommandCore INSTANCE = new CommandCore(MinecraftClient.getInstance());
|
public static CommandCore INSTANCE = new CommandCore(MinecraftClient.getInstance());
|
||||||
|
|
||||||
private final MinecraftClient client;
|
private final MinecraftClient client;
|
||||||
|
|
||||||
|
|
@ -51,7 +57,6 @@ public class CommandCore implements Listener {
|
||||||
public BlockBox withPos;
|
public BlockBox withPos;
|
||||||
public BlockPos block;
|
public BlockPos block;
|
||||||
public boolean runFillCommand = true;
|
public boolean runFillCommand = true;
|
||||||
public boolean isSingleBlock = false;
|
|
||||||
public boolean alreadyFilled = false;
|
public boolean alreadyFilled = false;
|
||||||
|
|
||||||
private final Map<BlockPos, String> pendingSetBlockCommands = Collections.synchronizedMap(new Object2ObjectArrayMap<>());
|
private final Map<BlockPos, String> pendingSetBlockCommands = Collections.synchronizedMap(new Object2ObjectArrayMap<>());
|
||||||
|
|
@ -62,7 +67,7 @@ public class CommandCore implements Listener {
|
||||||
|
|
||||||
public CommandCore (final MinecraftClient client) {
|
public CommandCore (final MinecraftClient client) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
reloadFromConfig();
|
reloadRelativeArea();
|
||||||
ListenerManager.addListener(this);
|
ListenerManager.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,12 +97,11 @@ public class CommandCore implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadFromConfig();
|
reloadRelativeArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reloadFromConfig () {
|
public void reloadRelativeArea () {
|
||||||
noPos = ChipmunkMod.CONFIG.core.relativeArea;
|
noPos = ChipmunkMod.CONFIG.core.relativeArea;
|
||||||
isSingleBlock = noPos.getDimensions().equals(Vec3i.ZERO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -140,8 +144,6 @@ public class CommandCore implements Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void check () {
|
public void check () {
|
||||||
if (isSingleBlock) return;
|
|
||||||
|
|
||||||
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
||||||
|
|
||||||
if (networkHandler == null || withPos == null || !ready) return;
|
if (networkHandler == null || withPos == null || !ready) return;
|
||||||
|
|
@ -223,7 +225,7 @@ public class CommandCore implements Listener {
|
||||||
final ClientPlayerEntity player = client.player;
|
final ClientPlayerEntity player = client.player;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!runFillCommand || isSingleBlock
|
!runFillCommand
|
||||||
|| player == null
|
|| player == null
|
||||||
|| !player.isInCreativeMode()
|
|| !player.isInCreativeMode()
|
||||||
|| !player.hasPermissionLevel(2)
|
|| !player.hasPermissionLevel(2)
|
||||||
|
|
@ -252,7 +254,7 @@ public class CommandCore implements Listener {
|
||||||
networkHandler.sendChatCommand(command);
|
networkHandler.sendChatCommand(command);
|
||||||
refillTriesUsingPlaceBlock = 0;
|
refillTriesUsingPlaceBlock = 0;
|
||||||
} else {
|
} else {
|
||||||
runPlaceBlock(command, true, true);
|
runPlaceBlock(command);
|
||||||
refillTriesUsingPlaceBlock++;
|
refillTriesUsingPlaceBlock++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -282,12 +284,8 @@ public class CommandCore implements Listener {
|
||||||
public void run (final String command) {
|
public void run (final String command) {
|
||||||
if (command.length() > 32767) return;
|
if (command.length() > 32767) return;
|
||||||
|
|
||||||
if (isSingleBlock) {
|
|
||||||
runPlaceBlock(command, false, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
||||||
|
|
||||||
if (networkHandler == null) return;
|
if (networkHandler == null) return;
|
||||||
|
|
||||||
final ClientConnection connection = networkHandler.getConnection();
|
final ClientConnection connection = networkHandler.getConnection();
|
||||||
|
|
@ -337,17 +335,13 @@ public class CommandCore implements Listener {
|
||||||
public CompletableFuture<NbtCompound> runTracked (final String command) {
|
public CompletableFuture<NbtCompound> runTracked (final String command) {
|
||||||
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
||||||
|
|
||||||
if (networkHandler == null) return CompletableFuture.completedFuture(null);
|
if (networkHandler == null) return new CompletableFuture<>();
|
||||||
|
|
||||||
final ClientConnection connection = networkHandler.getConnection();
|
final ClientConnection connection = networkHandler.getConnection();
|
||||||
|
|
||||||
if (block == null) return CompletableFuture.completedFuture(null);
|
if (block == null) return new CompletableFuture<>();
|
||||||
|
|
||||||
final BlockPos oldBlock;
|
if (KaboomCheck.INSTANCE.isKaboom) {
|
||||||
|
|
||||||
if (isSingleBlock) {
|
|
||||||
oldBlock = runPlaceBlock(command, false, false);
|
|
||||||
} else if (KaboomCheck.INSTANCE.isKaboom) {
|
|
||||||
connection.send(
|
connection.send(
|
||||||
new UpdateCommandBlockC2SPacket(
|
new UpdateCommandBlockC2SPacket(
|
||||||
block,
|
block,
|
||||||
|
|
@ -358,8 +352,6 @@ public class CommandCore implements Listener {
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
oldBlock = block;
|
|
||||||
} else {
|
} else {
|
||||||
connection.send(
|
connection.send(
|
||||||
new UpdateCommandBlockC2SPacket(
|
new UpdateCommandBlockC2SPacket(
|
||||||
|
|
@ -382,24 +374,17 @@ public class CommandCore implements Listener {
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
oldBlock = block;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldBlock == null) return CompletableFuture.completedFuture(null);
|
|
||||||
|
|
||||||
final CompletableFuture<NbtCompound> future = new CompletableFuture<>();
|
final CompletableFuture<NbtCompound> future = new CompletableFuture<>();
|
||||||
|
|
||||||
final Timer timer = new Timer();
|
final Timer timer = new Timer();
|
||||||
|
|
||||||
|
final BlockPos oldBlock = block;
|
||||||
|
|
||||||
final TimerTask queryTask = new TimerTask() {
|
final TimerTask queryTask = new TimerTask() {
|
||||||
public void run () {
|
public void run () {
|
||||||
client.getNetworkHandler().getDataQueryHandler().queryBlockNbt(oldBlock, result -> {
|
client.getNetworkHandler().getDataQueryHandler().queryBlockNbt(oldBlock, future::complete);
|
||||||
future.complete(result);
|
|
||||||
if (isSingleBlock && client.interactionManager != null) {
|
|
||||||
client.interactionManager.breakBlock(oldBlock);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -410,21 +395,21 @@ public class CommandCore implements Listener {
|
||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockPos runPlaceBlock (final String command, final boolean fallbackToChat, final boolean replaceOldBlock) {
|
public void runPlaceBlock (final String command) {
|
||||||
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
final ClientPlayNetworkHandler networkHandler = client.getNetworkHandler();
|
||||||
if (networkHandler == null) return null;
|
if (networkHandler == null) return;
|
||||||
|
|
||||||
final ClientConnection connection = networkHandler.getConnection();
|
final ClientConnection connection = networkHandler.getConnection();
|
||||||
|
|
||||||
final ClientPlayerEntity player = client.player;
|
final ClientPlayerEntity player = client.player;
|
||||||
final ClientWorld world = client.world;
|
final ClientWorld world = client.world;
|
||||||
|
|
||||||
if (player == null || world == null || !player.isInCreativeMode()) return null;
|
if (player == null || world == null || !player.isInCreativeMode()) return;
|
||||||
|
|
||||||
final DimensionType dimensionType = world.getDimension();
|
final DimensionType dimensionType = world.getDimension();
|
||||||
|
|
||||||
final ClientPlayerInteractionManager interactionManager = client.interactionManager;
|
final ClientPlayerInteractionManager interactionManager = client.interactionManager;
|
||||||
if (interactionManager == null) return null;
|
if (interactionManager == null) return;
|
||||||
|
|
||||||
// stolen from two five hundred million dollars
|
// stolen from two five hundred million dollars
|
||||||
|
|
||||||
|
|
@ -435,8 +420,8 @@ public class CommandCore implements Listener {
|
||||||
|| pair.getLeft().getY() < dimensionType.minY()
|
|| pair.getLeft().getY() < dimensionType.minY()
|
||||||
|| pair.getLeft().getY() > dimensionType.height() + dimensionType.minY()
|
|| pair.getLeft().getY() > dimensionType.height() + dimensionType.minY()
|
||||||
) {
|
) {
|
||||||
if (fallbackToChat) networkHandler.sendChatCommand(command);
|
networkHandler.sendChatCommand(command);
|
||||||
return null;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final BlockPos position = pair.getLeft();
|
final BlockPos position = pair.getLeft();
|
||||||
|
|
@ -470,15 +455,8 @@ public class CommandCore implements Listener {
|
||||||
connection.send(new UpdateSelectedSlotC2SPacket(freeHotBarSlot));
|
connection.send(new UpdateSelectedSlotC2SPacket(freeHotBarSlot));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interactionManager.breakBlock(position);
|
||||||
try (final PendingUpdateManager pendingUpdateManager = ((ClientWorldAccessor) world).getPendingUpdateManager()) {
|
try (final PendingUpdateManager pendingUpdateManager = ((ClientWorldAccessor) world).getPendingUpdateManager()) {
|
||||||
connection.send(
|
|
||||||
new PlayerActionC2SPacket(
|
|
||||||
PlayerActionC2SPacket.Action.START_DESTROY_BLOCK,
|
|
||||||
position,
|
|
||||||
Direction.UP,
|
|
||||||
pendingUpdateManager.incrementSequence().getSequence()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
connection.send(
|
connection.send(
|
||||||
new PlayerInteractBlockC2SPacket(
|
new PlayerInteractBlockC2SPacket(
|
||||||
Hand.MAIN_HAND,
|
Hand.MAIN_HAND,
|
||||||
|
|
@ -491,56 +469,39 @@ public class CommandCore implements Listener {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
interactionManager.interactBlock(
|
||||||
|
player,
|
||||||
|
Hand.MAIN_HAND,
|
||||||
|
new BlockHitResult(
|
||||||
|
new Vec3d(position),
|
||||||
|
Direction.UP,
|
||||||
|
position,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
if (oldSelectedSlot != freeHotBarSlot) {
|
if (oldSelectedSlot != freeHotBarSlot) {
|
||||||
connection.send(new UpdateSelectedSlotC2SPacket(oldSelectedSlot));
|
connection.send(new UpdateSelectedSlotC2SPacket(oldSelectedSlot));
|
||||||
}
|
}
|
||||||
connection.send(new CreativeInventoryActionC2SPacket(slot, oldStack));
|
connection.send(new CreativeInventoryActionC2SPacket(slot, oldStack));
|
||||||
|
|
||||||
if (ChipmunkMod.CONFIG.core.logCommands)
|
final StringBuilder oldBlockString = new StringBuilder(Registries.BLOCK.getId(oldBlockState.getBlock()).toString());
|
||||||
ChipmunkMod.LOGGER.info("Executing place block core command: {}", command);
|
if (!oldBlockState.getProperties().isEmpty()) {
|
||||||
|
oldBlockString.append('[');
|
||||||
|
|
||||||
if (!replaceOldBlock) return position;
|
for (final Property<?> property : oldBlockState.getProperties()) {
|
||||||
|
oldBlockString.append(property.getName())
|
||||||
if (isSingleBlock) {
|
.append('=')
|
||||||
final Timer timer = new Timer();
|
.append(Util.getValueAsString(property, property.getValues().getLast())) // water[level=15] instead of water[level=0,level=1,....,level=15]
|
||||||
timer.schedule(new TimerTask() {
|
.append(',');
|
||||||
@Override
|
|
||||||
public void run () {
|
|
||||||
// we're gonna just only break the block for now
|
|
||||||
try (final PendingUpdateManager pendingUpdateManager = ((ClientWorldAccessor) world).getPendingUpdateManager()) {
|
|
||||||
connection.send(
|
|
||||||
new PlayerActionC2SPacket(
|
|
||||||
PlayerActionC2SPacket.Action.START_DESTROY_BLOCK,
|
|
||||||
position,
|
|
||||||
Direction.UP,
|
|
||||||
pendingUpdateManager.incrementSequence().getSequence()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 50 * 2);
|
|
||||||
} else {
|
|
||||||
final StringBuilder oldBlockString = new StringBuilder(Registries.BLOCK.getId(oldBlockState.getBlock()).toString());
|
|
||||||
if (!oldBlockState.getProperties().isEmpty()) {
|
|
||||||
oldBlockString.append('[');
|
|
||||||
|
|
||||||
for (final Property<?> property : oldBlockState.getProperties()) {
|
|
||||||
oldBlockString.append(property.getName())
|
|
||||||
.append('=')
|
|
||||||
.append(Util.getValueAsString(property, property.getValues().getLast())) // water[level=15] instead of water[level=0,level=1,....,level=15]
|
|
||||||
.append(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
oldBlockString.deleteCharAt(oldBlockString.length() - 1);
|
|
||||||
|
|
||||||
oldBlockString.append(']');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingSetBlockCommands.put(position, oldBlockString.toString());
|
oldBlockString.deleteCharAt(oldBlockString.length() - 1);
|
||||||
|
|
||||||
|
oldBlockString.append(']');
|
||||||
}
|
}
|
||||||
|
|
||||||
return position;
|
pendingSetBlockCommands.put(position, oldBlockString.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// also from two five hundred million dollars
|
// also from two five hundred million dollars
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.sound.SoundCategory;
|
import net.minecraft.sound.SoundCategory;
|
||||||
import net.minecraft.sound.SoundEvent;
|
import net.minecraft.sound.SoundEvent;
|
||||||
import net.minecraft.text.Text;
|
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -51,7 +50,6 @@ public class SongPlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Less duplicate code
|
// TODO: Less duplicate code
|
||||||
// TODO: Reduce the mess
|
|
||||||
|
|
||||||
public void loadSong (final Path location) {
|
public void loadSong (final Path location) {
|
||||||
final ClientPlayerEntity player = client.player;
|
final ClientPlayerEntity player = client.player;
|
||||||
|
|
@ -110,12 +108,10 @@ public class SongPlayer {
|
||||||
|
|
||||||
if (loaderThread != null && !loaderThread.isAlive() && client.player != null) {
|
if (loaderThread != null && !loaderThread.isAlive() && client.player != null) {
|
||||||
if (loaderThread.exception != null) {
|
if (loaderThread.exception != null) {
|
||||||
final Text exceptionMessage = loaderThread.exception.message;
|
client.player.sendMessage(Component.translatable("Failed to load song: %s", Component.text(loaderThread.exception.message.getString())).color(NamedTextColor.RED));
|
||||||
client.execute(() -> client.player.sendMessage(Component.translatable("Failed to load song: %s", Component.text(exceptionMessage.getString())).color(NamedTextColor.RED)));
|
|
||||||
} else {
|
} else {
|
||||||
songQueue.add(loaderThread.song);
|
songQueue.add(loaderThread.song);
|
||||||
final Component name = loaderThread.song.name;
|
client.player.sendMessage(Component.translatable("Added %s to the song queue", Component.empty().append(loaderThread.song.name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN));
|
||||||
client.execute(() -> client.player.sendMessage(Component.translatable("Added %s to the song queue", Component.empty().append(name).color(NamedTextColor.DARK_GREEN)).color(NamedTextColor.GREEN)));
|
|
||||||
}
|
}
|
||||||
loaderThread = null;
|
loaderThread = null;
|
||||||
}
|
}
|
||||||
|
|
@ -124,18 +120,16 @@ public class SongPlayer {
|
||||||
if (songQueue.isEmpty()) return;
|
if (songQueue.isEmpty()) return;
|
||||||
|
|
||||||
currentSong = songQueue.poll();
|
currentSong = songQueue.poll();
|
||||||
if (client.player != null) {
|
if (client.player != null) client.player.sendMessage(
|
||||||
client.execute(() -> client.player.sendMessage(
|
Component
|
||||||
Component
|
.translatable(
|
||||||
.translatable(
|
"Now playing %s",
|
||||||
"Now playing %s",
|
Component.empty()
|
||||||
Component.empty()
|
.append(currentSong.name)
|
||||||
.append(currentSong.name)
|
.color(NamedTextColor.DARK_GREEN)
|
||||||
.color(NamedTextColor.DARK_GREEN)
|
)
|
||||||
)
|
.color(NamedTextColor.GREEN)
|
||||||
.color(NamedTextColor.GREEN)
|
);
|
||||||
));
|
|
||||||
}
|
|
||||||
currentSong.play();
|
currentSong.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -151,7 +145,7 @@ public class SongPlayer {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentSong == null || currentSong.paused) return;
|
if (currentSong.paused) return;
|
||||||
|
|
||||||
handlePlaying();
|
handlePlaying();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,5 +20,5 @@ public class UUIDUtilities {
|
||||||
return "[I;" + array[0] + "," + array[1] + "," + array[2] + "," + array[3] + "]"; // TODO: improve lol
|
return "[I;" + array[0] + "," + array[1] + "," + array[2] + "," + array[3] + "]"; // TODO: improve lol
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String selector (final UUID uuid) { return "@p[nbt={UUID:" + snbt(uuid) + "}]"; }
|
public static String selector (final UUID uuid) { return "@a[limit=1,nbt={UUID:" + snbt(uuid) + "}]"; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue