feat: 完成 nbt 指令

This commit is contained in:
2024-01-14 05:33:14 +08:00
parent 36e69e7f45
commit 94335fa17d

View File

@@ -2,13 +2,41 @@ package cn.hamster3.mc.plugin.core.bukkit.command.nbt;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin; import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ParentCommand; import cn.hamster3.mc.plugin.core.bukkit.command.ParentCommand;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
import de.tr7zw.changeme.nbtapi.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class NBTCommand extends ParentCommand { public class NBTCommand extends ParentCommand {
public static final NBTCommand INSTANCE = new NBTCommand(); public static final NBTCommand INSTANCE = new NBTCommand();
private final Map<NBTType, String> NBT_TYPE_NAME;
private NBTCommand() { private NBTCommand() {
NBT_TYPE_NAME = new HashMap<>();
NBT_TYPE_NAME.put(NBTType.NBTTagEnd, "end");
NBT_TYPE_NAME.put(NBTType.NBTTagByte, "byte");
NBT_TYPE_NAME.put(NBTType.NBTTagShort, "short");
NBT_TYPE_NAME.put(NBTType.NBTTagInt, "int");
NBT_TYPE_NAME.put(NBTType.NBTTagLong, "long");
NBT_TYPE_NAME.put(NBTType.NBTTagFloat, "float");
NBT_TYPE_NAME.put(NBTType.NBTTagDouble, "double");
NBT_TYPE_NAME.put(NBTType.NBTTagByteArray, "byte array");
NBT_TYPE_NAME.put(NBTType.NBTTagString, "string");
NBT_TYPE_NAME.put(NBTType.NBTTagList, "list");
NBT_TYPE_NAME.put(NBTType.NBTTagCompound, "compound");
NBT_TYPE_NAME.put(NBTType.NBTTagIntArray, "int array");
NBT_TYPE_NAME.put(NBTType.NBTTagLongArray, "long array");
} }
@Override @Override
@@ -20,4 +48,169 @@ public class NBTCommand extends ParentCommand {
public @NotNull String getName() { public @NotNull String getName() {
return "hamster-nbt"; return "hamster-nbt";
} }
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
Player player = (Player) sender;
PlayerInventory inventory = player.getInventory();
ItemStack stack = inventory.getItemInMainHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
sender.sendMessage("§c你的手持物品为空");
return true;
}
NBTItem nbtItem = new NBTItem(stack);
sendNBTCompound(nbtItem, sender, 0);
return true;
}
@SuppressWarnings("ForLoopReplaceableByForEach")
private void sendNBTCompound(NBTCompound compound, CommandSender sender, int level) {
StringBuilder prefixBuilder = new StringBuilder();
for (int i = 0; i < level; i++) {
prefixBuilder.append(" ");
}
String space = prefixBuilder.toString();
for (String key : compound.getKeys()) {
NBTType type = compound.getType(key);
switch (type) {
case NBTTagByte: {
sender.sendMessage(String.format("%s- %s:%d §e§l[%s]", space, key, compound.getByte(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagShort: {
sender.sendMessage(String.format("%s- %s:%d §e§l[%s]", space, key, compound.getShort(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagInt: {
sender.sendMessage(String.format("%s- %s:%d §e§l[%s]", space, key, compound.getInteger(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagLong: {
sender.sendMessage(String.format("%s- %s:%d §e§l[%s]", space, key, compound.getLong(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagFloat: {
sender.sendMessage(String.format("%s- %s:%f §e§l[%s]", space, key, compound.getFloat(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagDouble: {
sender.sendMessage(String.format("%s- %s:%f §e§l[%s]", space, key, compound.getDouble(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagString: {
sender.sendMessage(String.format("%s- %s:%s §e§l[%s]", space, key, compound.getString(key), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagCompound: {
sender.sendMessage(String.format("%s- %s §e§l[%s]", space, key, NBT_TYPE_NAME.get(type)));
sendNBTCompound(compound.getCompound(key), sender, level + 1);
break;
}
case NBTTagByteArray: {
byte[] array = compound.getByteArray(key);
sender.sendMessage(String.format("%s- %s:%s §e§l[%s]", space, key, Arrays.toString(array), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagIntArray: {
int[] array = compound.getIntArray(key);
sender.sendMessage(String.format("%s- %s:%s §e§l[%s]", space, key, Arrays.toString(array), NBT_TYPE_NAME.get(type)));
if (array != null && array.length == 4) {
sender.sendMessage(String.format("%s- %s:%s §e§l[uuid]", space, key, compound.getUUID(key)));
}
break;
}
case NBTTagLongArray: {
long[] array = compound.getLongArray(key);
sender.sendMessage(String.format("%s- %s:%s §e§l[%s]", space, key, Arrays.toString(array), NBT_TYPE_NAME.get(type)));
break;
}
case NBTTagList: {
NBTType listType = compound.getListType(key);
if (listType == null) {
break;
}
sender.sendMessage(String.format("%s- %s §e§l[%s %s]", space, key, NBT_TYPE_NAME.get(type), NBT_TYPE_NAME.get(listType)));
String listSpace = space + " ";
switch (listType) {
case NBTTagString: {
NBTList<String> list = compound.getStringList(key);
for (String string : list) {
sender.sendMessage(String.format("%s- %s", listSpace, string));
}
break;
}
case NBTTagIntArray: {
boolean all4Length = true;
NBTList<int[]> list = compound.getIntArrayList(key);
for (int[] intArray : list) {
if (intArray.length != 4) {
all4Length = false;
break;
}
}
if (all4Length) {
NBTList<UUID> uuidList = compound.getUUIDList(key);
for (int i = 0; i < list.size(); i++) {
int[] intArray = list.get(i);
UUID uuid = uuidList.get(i);
sender.sendMessage(String.format("%s- %s", listSpace, Arrays.toString(intArray)));
sender.sendMessage(String.format("%s- %s", listSpace, uuid));
}
} else {
for (int[] intArray : list) {
sender.sendMessage(String.format("%s- %s", listSpace, Arrays.toString(intArray)));
}
}
break;
}
case NBTTagInt: {
NBTList<Integer> list = compound.getIntegerList(key);
for (Integer value : list) {
sender.sendMessage(String.format("%s- %d", listSpace, value));
}
break;
}
case NBTTagLong: {
NBTList<Long> list = compound.getLongList(key);
for (Long value : list) {
sender.sendMessage(String.format("%s- %d", listSpace, value));
}
break;
}
case NBTTagFloat: {
NBTList<Float> list = compound.getFloatList(key);
for (Float value : list) {
sender.sendMessage(String.format("%s- %f", listSpace, value));
}
break;
}
case NBTTagDouble: {
NBTList<Double> list = compound.getDoubleList(key);
for (Double value : list) {
sender.sendMessage(String.format("%s- %f", listSpace, value));
}
break;
}
case NBTTagCompound: {
NBTCompoundList compoundList = compound.getCompoundList(key);
for (int i = 0; i < compoundList.size(); i++) {
NBTListCompound listCompound = compoundList.get(i);
sendNBTCompound(listCompound, sender, level + 1);
}
}
}
break;
}
case NBTTagEnd: {
sender.sendMessage(String.format("%s- %s §e§l[%s]", space, key, NBT_TYPE_NAME.get(type)));
return;
}
}
}
}
} }