diff --git a/src/main/java/malte0811/nbtedit/command/CommandNbtEdit.java b/src/main/java/malte0811/nbtedit/command/CommandNbtEdit.java index 79c1631..71014da 100644 --- a/src/main/java/malte0811/nbtedit/command/CommandNbtEdit.java +++ b/src/main/java/malte0811/nbtedit/command/CommandNbtEdit.java @@ -72,6 +72,11 @@ public static void register(CommandDispatcher disp) { .then(Commands.argument("hand", new HandArgument()) .executes(data -> editHand(data.getSource(), data.getArgument("hand", Hand.class)))) ) + .then(Commands.literal("player") + .then(Commands.literal("me") + .executes(data -> editPlayer(data.getSource()))) + .then(Commands.argument("target", EntityArgument.player()) + .executes(data -> editPlayer(data.getSource(), EntityArgument.getPlayer(data, "target"))))) ); } @@ -80,6 +85,16 @@ public static void registerSerializers() { new ArgumentSerializer<>(HandArgument::new)); } + private static int editPlayer(CommandSource source) throws CommandSyntaxException { + return editPlayer(source, source.asPlayer()); + } + + private static int editPlayer(CommandSource source, ServerPlayerEntity player) throws CommandSyntaxException { + ServerPlayerEntity playerSource = source.asPlayer(); + openEditWindow(playerSource, new EditPosKey(playerSource.getUniqueID(), player.getUniqueID())); + return 0; + } + private static int editHand(CommandSource source, Hand hand) throws CommandSyntaxException { ServerPlayerEntity player = source.asPlayer(); openEditWindow(player, new EditPosKey(player.getUniqueID(), hand)); @@ -97,14 +112,14 @@ private static int editHand(CommandSource source, Hand hand) throws CommandSynta ); public static int editRaytrace(CommandSource src) throws CommandSyntaxException { - PlayerEntity player = src.asPlayer(); + ServerPlayerEntity player = src.asPlayer(); RayTraceResult mop = Utils.rayTrace(player); if (mop != null && mop.getType() == Type.BLOCK) { BlockPos bPos = ((BlockRayTraceResult) mop).getPos(); return editPos(src, bPos); } else if (mop != null && mop.getType() == Type.ENTITY) { Entity e = ((EntityRayTraceResult) mop).getEntity(); - return editEntity(src, e); + return e instanceof ServerPlayerEntity ? editPlayer(src, (ServerPlayerEntity) e) : editEntity(src, e); } else { throw new CommandSyntaxException(NO_OBJECT_TYPE, NO_OBJECT_MSG); } diff --git a/src/main/java/malte0811/nbtedit/gui/NBTFrame.java b/src/main/java/malte0811/nbtedit/gui/NBTFrame.java index 62fb760..0f9d31b 100644 --- a/src/main/java/malte0811/nbtedit/gui/NBTFrame.java +++ b/src/main/java/malte0811/nbtedit/gui/NBTFrame.java @@ -8,7 +8,7 @@ import malte0811.nbtedit.nbt.*; import net.minecraft.client.Minecraft; import net.minecraft.nbt.*; -import net.minecraftforge.common.util.Constants; +import net.minecraft.util.Hand; import net.minecraftforge.common.util.Constants.NBT; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -29,7 +29,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import java.util.function.BiConsumer; import java.util.function.Consumer; public class NBTFrame extends JFrame { @@ -46,9 +45,10 @@ public class NBTFrame extends JFrame { private JMenuBar bar; //TODO choosing from GUI private INBTEditingProvider provider = NBTEdit.proxy;//new VanillaNBTProvider();// + private static final String defaultTitle = "NBTEdit"; public NBTFrame(EditPosKey pos) { - super("NBTEdit"); + super(defaultTitle); editPos = pos; add(panel); initGUI(); @@ -59,6 +59,7 @@ public NBTFrame(EditPosKey pos) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); addWindowListener(new CloseListener()); setSize(500, 500); + setTitle(buildTitle()); setVisible(true); } @@ -70,6 +71,35 @@ public void pullNbt() { }); } + private String buildTitle() { + if (editPos == null) + return defaultTitle; + StringBuilder builder = new StringBuilder(defaultTitle); + builder.append(" - "); + switch (editPos.type){ + case PLAYER: + builder.append("Player ").append(editPos.entity); + break; + case HAND: + builder.append("Hand Item (") + .append(editPos.hand == Hand.MAIN_HAND ? "Main" : "Off") + .append(")"); + break; + case ENTITY: + builder.append("Entity ").append(editPos.entity); + break; + case TILEENTITY: + builder.append("TileEntity at ") + .append(editPos.tilePos.getX()) + .append("/") + .append(editPos.tilePos.getY()) + .append("/") + .append(editPos.tilePos.getZ()); + break; + } + return builder.toString(); + } + private void initGUI() { tree = new JTree(new DefaultMutableTreeNode(new ImmutablePair<>("nbtroot", new CompoundNBT()))); tree.setCellRenderer(new NBTTreeCellRenderer()); diff --git a/src/main/java/malte0811/nbtedit/nbt/EditPosKey.java b/src/main/java/malte0811/nbtedit/nbt/EditPosKey.java index 5fc8342..e2df75f 100644 --- a/src/main/java/malte0811/nbtedit/nbt/EditPosKey.java +++ b/src/main/java/malte0811/nbtedit/nbt/EditPosKey.java @@ -52,6 +52,15 @@ public EditPosKey(@Nonnull UUID player, RegistryKey dim) { hand = Hand.MAIN_HAND; } + public EditPosKey(@Nonnull UUID player, @Nonnull UUID target) { + this.player = player; //command sender + entity = target; //target player + this.dim = World.OVERWORLD; + tilePos = BlockPos.ZERO; + type = ObjectType.PLAYER; + hand = Hand.MAIN_HAND; + } + public EditPosKey(@Nonnull UUID p, RegistryKey dim, @Nonnull BlockPos pos) { player = p; tilePos = pos; @@ -77,8 +86,10 @@ public static EditPosKey fromBytes(PacketBuffer pBuf) { byte typeId = pBuf.readByte(); ObjectType type = ObjectType.VALUES[typeId]; switch (type) { - case ENTITY: case PLAYER: + UUID p = pBuf.readUniqueId(); + return new EditPosKey(user, p); + case ENTITY: UUID e = pBuf.readUniqueId(); return new EditPosKey(user, dimension, e); case TILEENTITY: @@ -96,6 +107,7 @@ public void toBytes(PacketBuffer pBuf) { pBuf.writeString(dim.getLocation().toString()); pBuf.writeByte(type.ordinal()); switch (type) { + case PLAYER: case ENTITY: //entity pBuf.writeUniqueId(entity); diff --git a/src/main/java/malte0811/nbtedit/nbt/VanillaNBTProvider.java b/src/main/java/malte0811/nbtedit/nbt/VanillaNBTProvider.java index c1ae820..6d49bb7 100644 --- a/src/main/java/malte0811/nbtedit/nbt/VanillaNBTProvider.java +++ b/src/main/java/malte0811/nbtedit/nbt/VanillaNBTProvider.java @@ -91,6 +91,7 @@ public void requestNBT(EditPosKey k, @Nonnull Consumer out) { Minecraft.getInstance().player.sendChatMessage("/data get block " + k.tilePos.getX() + " " + k.tilePos.getY() + " " + k.tilePos.getZ()); break; + case PLAYER: case ENTITY: Minecraft.getInstance().player.sendChatMessage("/data get entity " + k.entity); break; diff --git a/src/main/java/malte0811/nbtedit/network/MessagePushNBT.java b/src/main/java/malte0811/nbtedit/network/MessagePushNBT.java index 2f7dafb..e262892 100644 --- a/src/main/java/malte0811/nbtedit/network/MessagePushNBT.java +++ b/src/main/java/malte0811/nbtedit/network/MessagePushNBT.java @@ -37,7 +37,7 @@ public void onMessage(Supplier ctxSupplier) { if (player.hasPermissionLevel(2)) { Utils.setNBTAtPos(pos, value, player.server); } else { - NBTEdit.logger.error("Player " + player.getName() + + NBTEdit.logger.error("Player " + player.getName().getUnformattedComponentText() + " tried to push NBT data to the server but isn't permitted to do so!"); } }); diff --git a/src/main/java/malte0811/nbtedit/network/MessageRequestNBT.java b/src/main/java/malte0811/nbtedit/network/MessageRequestNBT.java index 56f536b..b129751 100644 --- a/src/main/java/malte0811/nbtedit/network/MessageRequestNBT.java +++ b/src/main/java/malte0811/nbtedit/network/MessageRequestNBT.java @@ -37,7 +37,7 @@ public void onMessage(Supplier ctx) { CompoundNBT val = Utils.getNBTForPos(pos, server); NBTEdit.packetHandler.reply(new MessageNBTSync(pos, val), ctx.get()); } else { - NBTEdit.logger.error("Player " + player.getName() + + NBTEdit.logger.error("Player " + player.getName().getUnformattedComponentText() + " tried to request NBT data from the server but isn't permitted to do so!"); } }); diff --git a/src/main/java/malte0811/nbtedit/util/Utils.java b/src/main/java/malte0811/nbtedit/util/Utils.java index 0ba34a6..51a68d3 100644 --- a/src/main/java/malte0811/nbtedit/util/Utils.java +++ b/src/main/java/malte0811/nbtedit/util/Utils.java @@ -5,6 +5,7 @@ import malte0811.nbtedit.network.MessageBlockUpdate; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -18,9 +19,7 @@ import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.fml.server.ServerLifecycleHooks; -import java.lang.reflect.Method; import java.util.List; -import java.util.Objects; import java.util.Optional; @@ -83,12 +82,25 @@ public static RayTraceResult rayTrace(Entity entity) { } public static CompoundNBT getNBTForPos(EditPosKey k, MinecraftServer server) { - ServerWorld world = server.getWorld(k.dim); if (world == null) { return null; } switch (k.type) { + case PLAYER: + Entity ent = world.getEntityByUuid(k.entity); + if (ent != null && !ent.removed) { + String entityString = EntityType.getKey(ent.getType()).toString(); //minecraft:player + if (entityString != null) { + CompoundNBT ret = new CompoundNBT(); + //manually write data (like writeUnlessRemoved(...)), because serialization check + //returns false for players -> so no nbt data is returned when treating as entity + ret.putString("id", entityString); + ent.writeWithoutTypeId(ret); + return ret; + } + } + break; case ENTITY: Entity e = world.getEntityByUuid(k.entity); if (e != null) { @@ -119,6 +131,7 @@ public static void setNBTAtPos(EditPosKey k, CompoundNBT newNbt, MinecraftServer ServerWorld world = server.getWorld(k.dim); if (world != null) { switch (k.type) { + case PLAYER: case ENTITY: Entity e = world.getEntityByUuid(k.entity); if (e != null) {