From f3a170d9482e82e35ec2d71da75e53604552b171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E9=9B=A8=E8=90=BD?= Date: Fri, 6 Oct 2023 09:56:23 +0800 Subject: [PATCH] :sparkles: Fix fatal bug before 5.0.0. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- README.md | 10 +- build.gradle | 2 + common/build.gradle | 8 + .../2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac | 2 + .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 2 + .../resources/assets/nbtedit/lang/en_us.json | 1 + .../resources/assets/nbtedit/lang/zh_cn.json | 5 +- .../mc/nbtedit/api/config/INBTEditConfig.java | 2 + .../api/netowrking/INBTEditNetworking.java | 3 +- .../mc/nbtedit/command/NBTEditCommand.java | 11 +- .../gui/component/NBTNodeComponent.java | 3 - .../component/button/NBTOperatorButton.java | 1 - .../networking/NBTEditEditingHelper.java | 83 ++++++++ .../networking/NBTEditNetworkingHelper.java | 40 ++++ .../networking/NBTEditSavingHelper.java | 197 ++++++++++++++++++ .../cx/rain/mc/nbtedit/utility/Constants.java | 1 + .../mc/nbtedit/fabric/config/ConfigBean.java | 1 + .../fabric/config/NBTEditConfigImpl.java | 5 + .../networking/NBTEditNetworkingImpl.java | 5 +- .../networking/NBTEditNetworkingServer.java | 95 +++------ .../C2SBlockEntityEditingRequestPacket.java | 12 +- .../packet/C2SBlockEntitySavingPacket.java | 50 +---- .../packet/C2SEntityEditingRequestPacket.java | 12 +- .../packet/C2SEntitySavingPacket.java | 73 +------ .../C2SItemStackEditingRequestPacket.java | 12 +- .../packet/C2SItemStackSavingPacket.java | 33 +-- .../S2COpenBlockEntityEditingGuiPacket.java | 7 +- .../packet/S2COpenEntityEditingGuiPacket.java | 6 +- .../S2COpenItemStackEditingGuiPacket.java | 7 +- forge/build.gradle | 10 + .../rain/mc/nbtedit/forge/NBTEditForge.java | 3 - .../forge/config/NBTEditConfigImpl.java | 10 + .../data/provider/LanguageProviderENUS.java | 13 +- .../data/provider/LanguageProviderZHCN.java | 13 +- .../networking/NBTEditNetworkingImpl.java | 164 ++++----------- .../C2SBlockEntityEditingRequestPacket.java | 19 +- .../packet/C2SBlockEntitySavingPacket.java | 60 +----- .../packet/C2SEntityEditingRequestPacket.java | 19 +- .../packet/C2SEntitySavingPacket.java | 82 +------- .../C2SItemStackEditingRequestPacket.java | 19 +- .../packet/C2SItemStackSavingPacket.java | 42 +--- .../S2COpenBlockEntityEditingGuiPacket.java | 11 +- .../packet/S2COpenEntityEditingGuiPacket.java | 10 +- .../S2COpenItemStackEditingGuiPacket.java | 9 +- .../networking/packet/S2CRayTracePacket.java | 7 +- gradle.properties | 2 +- 46 files changed, 507 insertions(+), 675 deletions(-) create mode 100644 common/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac create mode 100644 common/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 rename common/src/{main => generated}/resources/assets/nbtedit/lang/en_us.json (97%) rename common/src/{main => generated}/resources/assets/nbtedit/lang/zh_cn.json (90%) create mode 100644 common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditEditingHelper.java create mode 100644 common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditNetworkingHelper.java create mode 100644 common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditSavingHelper.java diff --git a/README.md b/README.md index c551fde..fa0199d 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,13 @@ A Minecraft mod allows you to edit any NBT tags of the game content with a GUI while in-game. Such as TileEntities, Entities. It may help map creators to make custom items or help mod creators to debug. 本模组可以用于在游戏内编辑物品、实体或方块的 NBT ,可能会对地图制作者制作自定义物品或模组开发者 Debug 有所帮助。 +**There was a fatal bug before NBTEdit 5.0.0, please update it immediately.** +**所有 NBTEdit 5.0.0 以前的版本都存在严重漏洞,请立即更新。** + ## Usage(食用方法) ### Shortcuts(快捷键) -Press `N` (by default) to edit your target BlockEntity, Entity or ItemStack in main hand(if target is missing). +Press `N` (by default) to edit your target BlockEntity, Entity or ItemStack in main hand (if target is missing). 使用 `N` 键(默认情况下)打开编辑界面。编辑的目标为十字准星指向的方块实体或者实体,如果没有指向则编辑主手上的物品。 ### Commands(命令) @@ -41,6 +44,7 @@ Location(位置): `./config/nbtedit.toml` | Settings(配置选项) | Description | 说明 | |------------------------|-----------------------------------------|-------------------------| | can_edit_other_players | Allow edit other player in multiplayer. | 是否允许对其他玩家使用 NBTEdit 编辑。 | +| debug | Enable debug logs. | 是否启用 Debug 日志。 | #### Fabric Location(位置): `./config/nbtedit.json` @@ -49,6 +53,8 @@ Location(位置): `./config/nbtedit.json` |-----------------|-----------------------------------------|-------------------------| | canEditOthers | Allow edit other player in multiplayer. | 是否允许对其他玩家使用 NBTEdit 编辑。 | | permissionLevel | Permission level to use NBTEdit. | 使用 NBTEdit 所需的权限等级。 | +| debug | Enable debug logs. | 是否启用 Debug 日志。 | + ## Origin(原帖地址) http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1286750-in-game-nbtedit-edit-mob-spawners-attributes-in @@ -61,7 +67,7 @@ http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1286750- - I was kicked when I tried to save my edit(在尝试保存时被服务器踢出): If it shows `Payload may not be larger than 32767 bytes`, please use [Packet Fixer](https://www.curseforge.com/minecraft/mc-mods/packet-fixer) by [TonimatasDEV](https://github.com/TonimatasDEV) to fix it. 如果客户端显示 `Payload may not be larger than 32767 bytes`,请使用 [TonimatasDEV](https://github.com/TonimatasDEV) 的 [Packet Fixer](https://www.curseforge.com/minecraft/mc-mods/packet-fixer) 修复。 - + ## Bug report(Bug反馈/催更) Please go to the issues page. diff --git a/build.gradle b/build.gradle index 816066f..e90e521 100644 --- a/build.gradle +++ b/build.gradle @@ -83,5 +83,7 @@ allprojects { filesMatching(resourcesToReplace) { expand replaceTokens } + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } } diff --git a/common/build.gradle b/common/build.gradle index 8c9c160..79257ba 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -21,3 +21,11 @@ publishing { repositories { } } + +sourceSets { + main { + resources { + srcDir file('src/generated/resources') + } + } +} diff --git a/common/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac b/common/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac new file mode 100644 index 0000000..5fc70f6 --- /dev/null +++ b/common/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac @@ -0,0 +1,2 @@ +// 1.20.1 2023-10-01T21:16:50.0633302 Languages: zh_cn +b1886b14eefc7f775e9036becb02204f0de4034b assets/nbtedit/lang/zh_cn.json diff --git a/common/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/common/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 new file mode 100644 index 0000000..e42d8ac --- /dev/null +++ b/common/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -0,0 +1,2 @@ +// 1.20.1 2023-10-01T21:16:50.0663481 Languages: en_us +51fa5556855fd781a16c10497a93dc0bcc2cf4aa assets/nbtedit/lang/en_us.json diff --git a/common/src/main/resources/assets/nbtedit/lang/en_us.json b/common/src/generated/resources/assets/nbtedit/lang/en_us.json similarity index 97% rename from common/src/main/resources/assets/nbtedit/lang/en_us.json rename to common/src/generated/resources/assets/nbtedit/lang/en_us.json index 5f7e379..36b7153 100644 --- a/common/src/main/resources/assets/nbtedit/lang/en_us.json +++ b/common/src/generated/resources/assets/nbtedit/lang/en_us.json @@ -22,6 +22,7 @@ "message.editing.item_stack": "Editing ItemStack named %1$s.", "message.no_permission": "You have no permission to use NBTEdit.", "message.not_a_player": "Only players can use this command.", + "message.not_loaded": "Block pos was not loaded.", "message.nothing_to_edit": "There is no any target for editing.", "message.saved.successful": "Saved successfully!", "message.saving.failed.block_entity_not_exists": "Save failed. the BlockEntity is no longer exists.", diff --git a/common/src/main/resources/assets/nbtedit/lang/zh_cn.json b/common/src/generated/resources/assets/nbtedit/lang/zh_cn.json similarity index 90% rename from common/src/main/resources/assets/nbtedit/lang/zh_cn.json rename to common/src/generated/resources/assets/nbtedit/lang/zh_cn.json index 669ab64..0fb2bf9 100644 --- a/common/src/main/resources/assets/nbtedit/lang/zh_cn.json +++ b/common/src/generated/resources/assets/nbtedit/lang/zh_cn.json @@ -12,7 +12,7 @@ "gui.narration.button.special_character": "插入特殊符号", "gui.narration.sub_window.value_editor": "数值编辑子窗口", "gui.title.nbtedit_block_entity": "正在编辑位于 %1$s %2$s %3$s 的方块实体", - "gui.title.nbtedit_entity": "正在编辑实体 ID:%1$s", + "gui.title.nbtedit_entity": "正在编辑实体 ID: %1$s", "gui.title.nbtedit_item_stack": "正在编辑名为 %1$s 的物品", "key.category.nbtedit": "游戏内 NBT 修改器 (重制版)", "key.nbtedit.shortcut": "修改所指向内容的 NBT", @@ -22,11 +22,12 @@ "message.editing.item_stack": "正在编辑名为 %1$s 的物品。", "message.no_permission": "你没有权限使用 NBTEdit!", "message.not_a_player": "只有在游戏中的玩家可以使用这个命令!", + "message.not_loaded": "方块还未加载!", "message.nothing_to_edit": "没有任何目标可供编辑。", "message.saved.successful": "保存成功!", "message.saving.failed.block_entity_not_exists": "保存失败。目标方块实体已经不存在了!", "message.saving.failed.entity_not_exists": "保存失败。目标实体不存在了!", "message.saving.failed.invalid_nbt": "保存失败。无效的 NBT!", - "message.target_is_not_block_entity": "目标没有方块实体可供编辑。", + "message.target_is_not_block_entity": "没有目标方块实体可供编辑。", "message.unknown_entity_id": "无效的实体 ID!" } \ No newline at end of file diff --git a/common/src/main/java/cx/rain/mc/nbtedit/api/config/INBTEditConfig.java b/common/src/main/java/cx/rain/mc/nbtedit/api/config/INBTEditConfig.java index c48be0a..d7991df 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/api/config/INBTEditConfig.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/api/config/INBTEditConfig.java @@ -2,4 +2,6 @@ public interface INBTEditConfig { boolean canEditOthers(); + + boolean isDebug(); } diff --git a/common/src/main/java/cx/rain/mc/nbtedit/api/netowrking/INBTEditNetworking.java b/common/src/main/java/cx/rain/mc/nbtedit/api/netowrking/INBTEditNetworking.java index 46b2356..4ac2abd 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/api/netowrking/INBTEditNetworking.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/api/netowrking/INBTEditNetworking.java @@ -5,6 +5,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; public interface INBTEditNetworking { void serverRayTraceRequest(ServerPlayer player); @@ -14,7 +15,7 @@ public interface INBTEditNetworking { void clientOpenGuiRequest(ItemStack stack); void serverOpenClientGui(ServerPlayer player, Entity entity); - void serverOpenClientGui(ServerPlayer player, BlockPos pos); + void serverOpenClientGui(ServerPlayer player, BlockPos pos, BlockEntity blockEntity); void serverOpenClientGui(ServerPlayer player); void serverOpenClientGui(ServerPlayer player, ItemStack stack); diff --git a/common/src/main/java/cx/rain/mc/nbtedit/command/NBTEditCommand.java b/common/src/main/java/cx/rain/mc/nbtedit/command/NBTEditCommand.java index 612b5cd..14f6a23 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/command/NBTEditCommand.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/command/NBTEditCommand.java @@ -3,16 +3,15 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import cx.rain.mc.nbtedit.NBTEdit; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import cx.rain.mc.nbtedit.utility.Constants; import com.mojang.brigadier.context.CommandContext; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; import static net.minecraft.commands.Commands.argument; import static net.minecraft.commands.Commands.literal; @@ -53,7 +52,7 @@ private static int onEntity(final CommandContext context) th NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " issued command /nbtedit with an entity."); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, entity); + NBTEditEditingHelper.editEntity(player, entity.getUUID()); return 1; } @@ -68,7 +67,7 @@ private static int onBlockEntity(final CommandContext contex NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " issued command /nbtedit with an block at XYZ: " + pos.getX() + " " + pos.getY() + " " + pos.getZ() + "."); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, pos); + NBTEditEditingHelper.editBlockEntity(player, pos); return 1; } @@ -81,7 +80,7 @@ private static int onEntityMe(final CommandContext context) NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " issued command /nbtedit to edit itself."); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player); + NBTEditEditingHelper.editEntity(player, player.getUUID()); return 1; } @@ -95,7 +94,7 @@ private static int onItemHand(final CommandContext context) " issued command /nbtedit to edit hand."); var stack = player.getMainHandItem(); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, stack); + NBTEditEditingHelper.editItemStack(player, stack); return 1; } diff --git a/common/src/main/java/cx/rain/mc/nbtedit/gui/component/NBTNodeComponent.java b/common/src/main/java/cx/rain/mc/nbtedit/gui/component/NBTNodeComponent.java index 52c1a42..c8da3ff 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/gui/component/NBTNodeComponent.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/gui/component/NBTNodeComponent.java @@ -1,13 +1,10 @@ package cx.rain.mc.nbtedit.gui.component; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.gui.NBTEditGui; import cx.rain.mc.nbtedit.nbt.NBTTree; import cx.rain.mc.nbtedit.nbt.NBTHelper; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarratedElementType; diff --git a/common/src/main/java/cx/rain/mc/nbtedit/gui/component/button/NBTOperatorButton.java b/common/src/main/java/cx/rain/mc/nbtedit/gui/component/button/NBTOperatorButton.java index ca1b638..d1623b1 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/gui/component/button/NBTOperatorButton.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/gui/component/button/NBTOperatorButton.java @@ -1,6 +1,5 @@ package cx.rain.mc.nbtedit.gui.component.button; -import com.mojang.blaze3d.systems.RenderSystem; import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.gui.NBTEditGui; import cx.rain.mc.nbtedit.nbt.NBTHelper; diff --git a/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditEditingHelper.java b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditEditingHelper.java new file mode 100644 index 0000000..8dca700 --- /dev/null +++ b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditEditingHelper.java @@ -0,0 +1,83 @@ +package cx.rain.mc.nbtedit.networking; + +import cx.rain.mc.nbtedit.NBTEdit; +import cx.rain.mc.nbtedit.utility.Constants; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import java.util.UUID; + +public class NBTEditEditingHelper { + public static void editBlockEntity(ServerPlayer player, BlockPos pos) { + if (!NBTEditNetworkingHelper.checkPermission(player)) { + return; + } + + if (!NBTEditNetworkingHelper.checkPosLoaded(player, pos)) { + return; + } + + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " requested BlockEntity at " + + pos.getX() + " " + pos.getY() + " " + pos.getZ() + "."); + + var blockEntity = player.serverLevel().getBlockEntity(pos); + if (blockEntity == null) { + player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY) + .withStyle(ChatFormatting.RED)); + return; + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_BLOCK_ENTITY, + pos.getX(), pos.getY(), pos.getZ()).withStyle(ChatFormatting.GREEN)); + NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, pos, blockEntity); + } + + public static void editEntity(ServerPlayer player, UUID entityUuid) { + if (!NBTEditNetworkingHelper.checkPermission(player)) { + return; + } + + var entity = player.serverLevel().getEntity(entityUuid); + + assert entity != null; // XXX: qyl27: will it work? + + if (entity instanceof Player + && entity != player + && !NBTEdit.getInstance().getConfig().canEditOthers()) { + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " tried to use /nbtedit on a player. But config is not allow that."); + player.createCommandSourceStack().sendFailure(Component + .translatable(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER) + .withStyle(ChatFormatting.RED)); + return; + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ENTITY, entityUuid) + .withStyle(ChatFormatting.GREEN)); + + if (player == entity) { + NBTEdit.getInstance().getNetworking().serverOpenClientGui(player); + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " is editing itself."); + } else { + NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, entity); + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " is editing entity " + entity.getUUID() + "."); + } + } + + public static void editItemStack(ServerPlayer player, ItemStack stack) { + if (!NBTEditNetworkingHelper.checkPermission(player)) { + return; + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ITEM_STACK, + stack.getDisplayName().getString()).withStyle(ChatFormatting.GREEN)); + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " is editing ItemStack named " + stack.getDisplayName().getString() + "."); + NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, stack); + } +} diff --git a/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditNetworkingHelper.java b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditNetworkingHelper.java new file mode 100644 index 0000000..23b57db --- /dev/null +++ b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditNetworkingHelper.java @@ -0,0 +1,40 @@ +package cx.rain.mc.nbtedit.networking; + +import cx.rain.mc.nbtedit.NBTEdit; +import cx.rain.mc.nbtedit.utility.Constants; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +public class NBTEditNetworkingHelper { + public static boolean checkPermission(ServerPlayer player) { + var result = NBTEdit.getInstance().getPermission().hasPermission(player); + + if (!result) { + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_NO_PERMISSION) + .withStyle(ChatFormatting.RED)); + } + + return result; + } + + public static boolean checkPosLoaded(ServerPlayer player, BlockPos pos) { + var result = player.serverLevel().isLoaded(pos); + + if (!result) { + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_NOT_LOADED) + .withStyle(ChatFormatting.RED)); + } + + return result; + } + + public static boolean isDebug() { + return NBTEdit.getInstance().getConfig().isDebug(); + } + + public static boolean canEditOthers() { + return NBTEdit.getInstance().getConfig().canEditOthers(); + } +} diff --git a/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditSavingHelper.java b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditSavingHelper.java new file mode 100644 index 0000000..ccdada2 --- /dev/null +++ b/common/src/main/java/cx/rain/mc/nbtedit/networking/NBTEditSavingHelper.java @@ -0,0 +1,197 @@ +package cx.rain.mc.nbtedit.networking; + +import cx.rain.mc.nbtedit.NBTEdit; +import cx.rain.mc.nbtedit.utility.Constants; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; +import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameType; + +import java.util.UUID; + +public class NBTEditSavingHelper { + public static void saveBlockEntity(ServerPlayer player, BlockPos pos, CompoundTag tag) { + if (!NBTEditNetworkingHelper.checkPermission(player)) { + return; + } + + if (!NBTEditNetworkingHelper.checkPosLoaded(player, pos)) { + return; + } + + var server = player.getServer(); + var level = player.serverLevel(); + server.execute(() -> { + var blockEntity = level.getBlockEntity(pos); + if (blockEntity != null) { + try { + blockEntity.load(tag); + blockEntity.setChanged(); // Ensure changes gets saved to disk later on. (qyl27: In MCP it is markDirty.) + if (blockEntity.hasLevel() && blockEntity.getLevel() instanceof ServerLevel) { + ((ServerLevel) blockEntity.getLevel()).getChunkSource().blockChanged(pos); // Broadcast changes. + } + + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " successfully edited the tag of a BlockEntity at " + + pos.getX() + " " + + pos.getY() + " " + + pos.getZ() + "."); + + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().debug(tag.getAsString()); + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) + .withStyle(ChatFormatting.GREEN)); + } catch (Exception ex) { + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) + .withStyle(ChatFormatting.RED)); + + NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + + " edited the tag of BlockEntity at XYZ " + + pos.getX() + " " + + pos.getY() + " " + + pos.getZ() + " and caused an exception!"); + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().error("NBT data: " + tag.getAsString()); + NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); + } + } + } else { + NBTEdit.getInstance().getLogger().info("Player " + player.getName() + + " tried to edit a non-existent BlockEntity at " + + pos.getX() + " " + + pos.getY() + " " + + pos.getZ() + "."); + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_BLOCK_ENTITY_NOT_EXISTS) + .withStyle(ChatFormatting.RED)); + } + }); + } + + public static void saveEntity(ServerPlayer player, UUID entityUuid, CompoundTag tag) { + if (!NBTEditNetworkingHelper.checkPermission(player)) { + return; + } + + var server = player.getServer(); + var level = player.serverLevel(); + server.execute(() -> { + var entity = level.getEntity(entityUuid); + + if (entity != null) { + if (entity instanceof ServerPlayer + && entity != player + && !NBTEditNetworkingHelper.canEditOthers()) { + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " tried to use /nbtedit on a player. But server config is not allow that."); + player.createCommandSourceStack().sendFailure(Component + .translatable(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER) + .withStyle(ChatFormatting.RED)); + return; + } + + try { + GameType prevGameMode = null; + if (entity instanceof ServerPlayer) { + prevGameMode = ((ServerPlayer) entity).gameMode.getGameModeForPlayer(); + } + entity.load(tag); + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " edited the tag of Entity with UUID " + entityUuid + " ."); + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().debug("New NBT of entity " + entityUuid + + " is " + tag.getAsString()); + } + + if (entity instanceof ServerPlayer) { + // qyl27: if anyone found bugs with it, please open an issue. + // Update player info + // This is fairly hacky. + // Consider swapping to an event driven system, where classes can register to + // receive entity edit events and provide feedback/send packets as necessary. + var targetPlayer = (ServerPlayer) entity; + targetPlayer.initMenu(targetPlayer.inventoryMenu); + var gameMode = targetPlayer.gameMode.getGameModeForPlayer(); + if (prevGameMode != gameMode) { + targetPlayer.setGameMode(gameMode); + } + targetPlayer.connection.send(new ClientboundSetHealthPacket(targetPlayer.getHealth(), + targetPlayer.getFoodData().getFoodLevel(), + targetPlayer.getFoodData().getSaturationLevel())); + targetPlayer.connection.send(new ClientboundSetExperiencePacket( + targetPlayer.experienceProgress, + targetPlayer.totalExperience, + targetPlayer.experienceLevel)); + + targetPlayer.onUpdateAbilities(); + targetPlayer.setPos(targetPlayer.getX(), targetPlayer.getY(), targetPlayer.getZ()); + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) + .withStyle(ChatFormatting.GREEN)); + } catch (Exception ex) { + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) + .withStyle(ChatFormatting.RED)); + + NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + + " edited the tag of entity " + entityUuid + " and caused an exception!"); + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().error("NBT data: " + tag.getAsString()); + NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); + } + } + } else { + NBTEdit.getInstance().getLogger().info("Player " + player.getName() + + " tried to edit a non-existent entity " + entityUuid + "."); + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_ENTITY_NOT_EXISTS) + .withStyle(ChatFormatting.RED)); + } + }); + } + + public static void saveItemStack(ServerPlayer player, ItemStack itemStack, CompoundTag tag) { + var server = player.getServer(); + + server.execute(() -> { + try { + var item = ItemStack.of(tag); + player.setItemInHand(InteractionHand.MAIN_HAND, item); + + NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + + " successfully edited the tag of a ItemStack named " + + itemStack.getDisplayName().getString() + "."); + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().debug(tag.getAsString()); + } + + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) + .withStyle(ChatFormatting.GREEN)); + } catch (Exception ex) { + player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) + .withStyle(ChatFormatting.RED)); + + NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + + " edited the tag of ItemStack named " + + itemStack.getDisplayName().getString() +" and caused an exception!"); + + if (NBTEditNetworkingHelper.isDebug()) { + NBTEdit.getInstance().getLogger().error("NBT data: " + tag.getAsString()); + NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); + } + } + }); + } +} diff --git a/common/src/main/java/cx/rain/mc/nbtedit/utility/Constants.java b/common/src/main/java/cx/rain/mc/nbtedit/utility/Constants.java index f634098..683afe3 100644 --- a/common/src/main/java/cx/rain/mc/nbtedit/utility/Constants.java +++ b/common/src/main/java/cx/rain/mc/nbtedit/utility/Constants.java @@ -7,6 +7,7 @@ public class Constants { public static final String MESSAGE_NOT_PLAYER = "message.not_a_player"; public static final String MESSAGE_NO_PERMISSION = "message.no_permission"; + public static final String MESSAGE_NOT_LOADED = "message.not_loaded"; public static final String MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY = "message.target_is_not_block_entity"; public static final String MESSAGE_NOTHING_TO_EDIT = "message.nothing_to_edit"; public static final String MESSAGE_CANNOT_EDIT_OTHER_PLAYER = "message.cannot_edit_other_player"; diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/ConfigBean.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/ConfigBean.java index 71fd9f0..4ec4606 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/ConfigBean.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/ConfigBean.java @@ -3,4 +3,5 @@ public class ConfigBean { public boolean canEditOthers = false; public int permissionLevel = 2; + public boolean debug = false; } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/NBTEditConfigImpl.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/NBTEditConfigImpl.java index b8f8bff..4af699a 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/NBTEditConfigImpl.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/config/NBTEditConfigImpl.java @@ -51,6 +51,11 @@ public boolean canEditOthers() { return config.canEditOthers; } + @Override + public boolean isDebug() { + return config.debug; + } + public int getPermissionLevel() { return config.permissionLevel; } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingImpl.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingImpl.java index b0dec1f..9eef6f3 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingImpl.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingImpl.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; public class NBTEditNetworkingImpl implements INBTEditNetworking { public static final ResourceLocation S2C_RAY_TRACE_REQUEST_PACKET_ID = new ResourceLocation(NBTEdit.MODID, "s2c_ray_trace_request"); @@ -71,8 +72,8 @@ public void serverOpenClientGui(ServerPlayer player, Entity entity) { } @Override - public void serverOpenClientGui(ServerPlayer player, BlockPos pos) { - server.serverOpenClientGui(player, pos); + public void serverOpenClientGui(ServerPlayer player, BlockPos pos, BlockEntity blockEntity) { + server.serverOpenClientGui(player, pos, blockEntity); } @Override diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingServer.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingServer.java index cc0f540..bd2a74b 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingServer.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/NBTEditNetworkingServer.java @@ -1,20 +1,14 @@ package cx.rain.mc.nbtedit.fabric.networking; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.api.netowrking.INBTEditNetworking; import cx.rain.mc.nbtedit.fabric.networking.packet.*; -import cx.rain.mc.nbtedit.utility.Constants; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; public class NBTEditNetworkingServer { @@ -32,78 +26,37 @@ public void serverRayTraceRequest(ServerPlayer player) { } public void serverOpenClientGui(ServerPlayer player, Entity entity) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - if (entity instanceof Player - && !NBTEdit.getInstance().getConfig().canEditOthers()) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " tried to use /nbtedit on a player. But config is not allow that."); - player.createCommandSourceStack().sendFailure(Component - .translatable(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER) - .withStyle(ChatFormatting.RED)); - return; + player.getServer().execute(() -> { + var tag = new CompoundTag(); + if (entity instanceof Player) { + entity.saveWithoutId(tag); + } else { + entity.save(tag); } - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing entity " + entity.getUUID() + "."); - player.getServer().execute(() -> { - var tag = new CompoundTag(); - if (entity instanceof Player) { - entity.saveWithoutId(tag); - } else { - entity.save(tag); - } - ServerPlayNetworking.send(player, new S2COpenEntityEditingGuiPacket(entity.getUUID(), entity.getId(), tag, false)); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + ServerPlayNetworking.send(player, new S2COpenEntityEditingGuiPacket(entity.getUUID(), entity.getId(), tag, false)); + }); } - public void serverOpenClientGui(ServerPlayer player, BlockPos pos) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing block at XYZ " + pos.getX() + " " + pos.getY() + " " + pos.getZ() + "."); - var blockEntity = player.serverLevel().getBlockEntity(pos); - if (blockEntity != null) { - var tag = blockEntity.saveWithFullMetadata(); - ServerPlayNetworking.send(player, new S2COpenBlockEntityEditingGuiPacket(pos, tag)); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY) - .withStyle(ChatFormatting.RED)); - } - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + public void serverOpenClientGui(ServerPlayer player, BlockPos pos, BlockEntity blockEntity) { + player.getServer().execute(() -> { + var tag = blockEntity.saveWithFullMetadata(); + ServerPlayNetworking.send(player, new S2COpenBlockEntityEditingGuiPacket(pos, tag)); + }); } public void serverOpenClientGui(ServerPlayer player) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " is editing itself."); - player.getServer().execute(() -> { - var tag = new CompoundTag(); - player.saveWithoutId(tag); - ServerPlayNetworking.send(player, new S2COpenEntityEditingGuiPacket(player.getUUID(), player.getId(), tag, true)); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + player.getServer().execute(() -> { + var tag = new CompoundTag(); + player.saveWithoutId(tag); + ServerPlayNetworking.send(player, new S2COpenEntityEditingGuiPacket(player.getUUID(), player.getId(), tag, true)); + }); } public void serverOpenClientGui(ServerPlayer player, ItemStack stack) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing ItemStack named " + stack.getDisplayName().getString() + "."); - player.getServer().execute(() -> { - var tag = new CompoundTag(); - stack.save(tag); - ServerPlayNetworking.send(player, new S2COpenItemStackEditingGuiPacket(stack, tag)); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + player.getServer().execute(() -> { + var tag = new CompoundTag(); + stack.save(tag); + ServerPlayNetworking.send(player, new S2COpenItemStackEditingGuiPacket(stack, tag)); + }); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntityEditingRequestPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntityEditingRequestPacket.java index c8c9a4d..71ff0ff 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntityEditingRequestPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntityEditingRequestPacket.java @@ -1,15 +1,12 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; public class C2SBlockEntityEditingRequestPacket implements FabricPacket { @@ -40,11 +37,6 @@ public PacketType getType() { public static void serverHandle(C2SBlockEntityEditingRequestPacket packet, ServerPlayer player, PacketSender responseSender) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " requested BlockEntity at " + - packet.pos.getX() + " " + packet.pos.getY() + " " + packet.pos.getZ() + "."); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_BLOCK_ENTITY, - packet.pos.getX(), packet.pos.getY(), packet.pos.getZ()).withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, packet.pos); + NBTEditEditingHelper.editBlockEntity(player, packet.pos); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntitySavingPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntitySavingPacket.java index cf41c6b..c2051b2 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntitySavingPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SBlockEntitySavingPacket.java @@ -1,17 +1,13 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; public class C2SBlockEntitySavingPacket implements FabricPacket { @@ -49,48 +45,6 @@ public PacketType getType() { public static void serverHandle(C2SBlockEntitySavingPacket packet, ServerPlayer player, PacketSender responseSender) { - var server = player.getServer(); - var level = player.serverLevel(); - server.execute(() -> { - var blockEntity = level.getBlockEntity(packet.blockPos); - if (blockEntity != null) { - try { - blockEntity.load(packet.compoundTag); - blockEntity.setChanged(); // Ensure changes gets saved to disk later on. (qyl27: In MCP it is markDirty.) - if (blockEntity.hasLevel() && blockEntity.getLevel() instanceof ServerLevel) { - ((ServerLevel) blockEntity.getLevel()).getChunkSource().blockChanged(packet.blockPos); // Broadcast changes. - } - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " successfully edited the tag of a BlockEntity at " + - packet.blockPos.getX() + " " + - packet.blockPos.getY() + " " + - packet.blockPos.getZ() + "."); - NBTEdit.getInstance().getLogger().debug(packet.compoundTag.getAsString()); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of BlockEntity at XYZ " + - packet.blockPos.getX() + " " + - packet.blockPos.getY() + " " + - packet.blockPos.getZ() + " and caused an exception!"); - NBTEdit.getInstance().getLogger().error("NBT data: " + packet.compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - } else { - NBTEdit.getInstance().getLogger().info("Player " + player.getName() + - " tried to edit a non-existent BlockEntity at " + - packet.blockPos.getX() + " " + - packet.blockPos.getY() + " " + - packet.blockPos.getZ() + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_BLOCK_ENTITY_NOT_EXISTS) - .withStyle(ChatFormatting.RED)); - } - }); + NBTEditSavingHelper.saveBlockEntity(player, packet.blockPos, packet.compoundTag); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntityEditingRequestPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntityEditingRequestPacket.java index 5507f75..523ad70 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntityEditingRequestPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntityEditingRequestPacket.java @@ -1,14 +1,11 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import java.util.UUID; @@ -39,12 +36,7 @@ public C2SEntityEditingRequestPacket(FriendlyByteBuf buf) { public static void serverHandle(C2SEntityEditingRequestPacket packet, ServerPlayer player, PacketSender responseSender) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " requested entity with UUID " + packet.entityUuid + "."); - var entity = player.serverLevel().getEntity(packet.entityUuid); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ENTITY, packet.entityUuid) - .withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, entity); + NBTEditEditingHelper.editEntity(player, packet.entityUuid); } @Override diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntitySavingPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntitySavingPacket.java index c291ac6..bdfb1f3 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntitySavingPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SEntitySavingPacket.java @@ -1,19 +1,13 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; -import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.GameType; import java.util.UUID; @@ -61,69 +55,6 @@ public PacketType getType() { public static void serverHandle(C2SEntitySavingPacket packet, ServerPlayer player, PacketSender responseSender) { - var server = player.getServer(); - var level = player.serverLevel(); - server.execute(() -> { - var entity = level.getEntity(packet.entityUuid); - if (!NBTEdit.getInstance().getPermission().hasPermission(player)) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } - - if (entity != null) { - try { - GameType prevGameMode = null; - if (entity instanceof ServerPlayer) { - prevGameMode = ((ServerPlayer) entity).gameMode.getGameModeForPlayer(); - } - entity.load(packet.compoundTag); - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " edited the tag of Entity with UUID " + packet.entityUuid + " ."); - NBTEdit.getInstance().getLogger().debug("New NBT of entity " + packet.entityUuid + - " is " + packet.compoundTag.getAsString()); - - if (entity instanceof ServerPlayer) { - // Todo: qyl27: this is a very legacy todo. - // qyl27: if anyone found bugs with it, please open an issue. - // Update player info - // This is fairly hacky. - // Consider swapping to an event driven system, where classes can register to - // receive entity edit events and provide feedback/send packets as necessary. - var targetPlayer = (ServerPlayer) entity; - targetPlayer.initMenu(targetPlayer.inventoryMenu); - var gameMode = targetPlayer.gameMode.getGameModeForPlayer(); - if (prevGameMode != gameMode) { - targetPlayer.setGameMode(gameMode); - } - targetPlayer.connection.send(new ClientboundSetHealthPacket(targetPlayer.getHealth(), - targetPlayer.getFoodData().getFoodLevel(), - targetPlayer.getFoodData().getSaturationLevel())); - targetPlayer.connection.send(new ClientboundSetExperiencePacket( - targetPlayer.experienceProgress, - targetPlayer.totalExperience, - targetPlayer.experienceLevel)); - - targetPlayer.onUpdateAbilities(); - targetPlayer.setPos(targetPlayer.getX(), targetPlayer.getY(), targetPlayer.getZ()); - } - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of entity " + packet.entityUuid + " and caused an exception!"); - NBTEdit.getInstance().getLogger().error("NBT data: " + packet.compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - } else { - NBTEdit.getInstance().getLogger().info("Player " + player.getName() + - " tried to edit a non-existent entity " + packet.entityUuid + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_ENTITY_NOT_EXISTS) - .withStyle(ChatFormatting.RED)); - } - }); + NBTEditSavingHelper.saveEntity(player, packet.entityUuid, packet.compoundTag); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackEditingRequestPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackEditingRequestPacket.java index 7f761e5..2db1628 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackEditingRequestPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackEditingRequestPacket.java @@ -1,14 +1,11 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; @@ -37,11 +34,6 @@ public PacketType getType() { public static void serverHandle(C2SItemStackEditingRequestPacket packet, ServerPlayer player, PacketSender responseSender) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " requested to edit ItemStack named " + packet.itemStack.getDisplayName().getString() + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ITEM_STACK, - packet.itemStack.getDisplayName().getString()) - .withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, packet.itemStack); + NBTEditEditingHelper.editItemStack(player, packet.itemStack); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackSavingPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackSavingPacket.java index c0ac512..65abdae 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackSavingPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/C2SItemStackSavingPacket.java @@ -1,17 +1,13 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; -import cx.rain.mc.nbtedit.utility.Constants; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; -import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; public class C2SItemStackSavingPacket implements FabricPacket { @@ -44,31 +40,6 @@ public PacketType getType() { public static void serverHandle(C2SItemStackSavingPacket packet, ServerPlayer player, PacketSender responseSender) { - var server = player.getServer(); - - server.execute(() -> { - try { - var item = ItemStack.of(packet.compoundTag); - player.setItemInHand(InteractionHand.MAIN_HAND, item); - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " successfully edited the tag of a ItemStack named " - + packet.itemStack.getDisplayName().getString() + "."); - NBTEdit.getInstance().getLogger().debug(packet.compoundTag.getAsString()); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of ItemStack named " - + packet.itemStack.getDisplayName().getString() +" and caused an exception!"); - - NBTEdit.getInstance().getLogger().error("NBT data: " + packet.compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - }); + NBTEditSavingHelper.saveItemStack(player, packet.itemStack, packet.compoundTag); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenBlockEntityEditingGuiPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenBlockEntityEditingGuiPacket.java index 054aa2f..1f1d7bb 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenBlockEntityEditingGuiPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenBlockEntityEditingGuiPacket.java @@ -1,6 +1,5 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; import cx.rain.mc.nbtedit.utility.ScreenHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; @@ -44,10 +43,6 @@ public static void clientHandle(Minecraft client, ClientPacketListener handler, var blockPos = buf.readBlockPos(); var compoundTag = buf.readNbt(); - NBTEdit.getInstance().getLogger().info("Editing BlockEntity at XYZ " + - blockPos.getX() + " " + blockPos.getY() + " " + blockPos.getZ() + "."); - client.execute(() -> { - ScreenHelper.showNBTEditScreen(blockPos, compoundTag); - }); + client.execute(() -> ScreenHelper.showNBTEditScreen(blockPos, compoundTag)); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenEntityEditingGuiPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenEntityEditingGuiPacket.java index c9b7c1c..e3153bd 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenEntityEditingGuiPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenEntityEditingGuiPacket.java @@ -1,6 +1,5 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; import cx.rain.mc.nbtedit.utility.ScreenHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; @@ -55,9 +54,6 @@ public static void clientHandle(Minecraft client, ClientPacketListener handler, var compoundTag = buf.readNbt(); var isSelf = buf.readBoolean(); - NBTEdit.getInstance().getLogger().info("Editing entity with UUID " + entityUuid + "."); - client.execute(() -> { - ScreenHelper.showNBTEditScreen(entityUuid, entityId, compoundTag, isSelf); - }); + client.execute(() -> ScreenHelper.showNBTEditScreen(entityUuid, entityId, compoundTag, isSelf)); } } diff --git a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenItemStackEditingGuiPacket.java b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenItemStackEditingGuiPacket.java index 93b430d..8b7f4b2 100644 --- a/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenItemStackEditingGuiPacket.java +++ b/fabric/src/main/java/cx/rain/mc/nbtedit/fabric/networking/packet/S2COpenItemStackEditingGuiPacket.java @@ -1,6 +1,5 @@ package cx.rain.mc.nbtedit.fabric.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.fabric.networking.NBTEditNetworkingImpl; import cx.rain.mc.nbtedit.utility.ScreenHelper; import net.fabricmc.fabric.api.networking.v1.FabricPacket; @@ -44,10 +43,6 @@ public static void clientHandle(Minecraft client, ClientPacketListener handler, var itemStack = buf.readItem(); var compoundTag = buf.readNbt(); - NBTEdit.getInstance().getLogger().info("Editing ItemStack " - + itemStack.getDisplayName().getString() + "in hand."); - client.execute(() -> { - ScreenHelper.showNBTEditScreen(itemStack, compoundTag); - }); + client.execute(() -> ScreenHelper.showNBTEditScreen(itemStack, compoundTag)); } } diff --git a/forge/build.gradle b/forge/build.gradle index 3456069..7e9019f 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -13,6 +13,16 @@ loom { forge { convertAccessWideners = true extraAccessWideners.add loom.accessWidenerPath.get().asFile.name + + runs { + data { + data() + + programArgs "--all", "--mod", "nbtedit" + programArgs "--output", file('../common/src/generated/resources').absolutePath + programArgs "--existing", file('../common/src/main/resources').absolutePath + } + } } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/NBTEditForge.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/NBTEditForge.java index e890a50..7473edc 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/NBTEditForge.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/NBTEditForge.java @@ -43,9 +43,6 @@ private void setup(FMLCommonSetupEvent event) { } private void setupClient(FMLClientSetupEvent event) { -// nbtedit.getLogger().info("Initializing client."); -// client = new NBTEditClient(); -// nbtedit.getLogger().info("Client initialized."); } @Override diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/config/NBTEditConfigImpl.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/config/NBTEditConfigImpl.java index f4ff9a6..7e9d6b4 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/config/NBTEditConfigImpl.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/config/NBTEditConfigImpl.java @@ -7,6 +7,7 @@ public class NBTEditConfigImpl implements INBTEditConfig { public static ForgeConfigSpec CONFIG; public static ForgeConfigSpec.BooleanValue CAN_EDIT_OTHER_PLAYERS; + public static ForgeConfigSpec.BooleanValue DEBUG; static { var builder = new ForgeConfigSpec.Builder(); @@ -18,6 +19,10 @@ public class NBTEditConfigImpl implements INBTEditConfig { .comment("If true, allows you edit the nbt tags of other players. USE AT YOUR OWN RISK!") .define("can_edit_other_players", false); + DEBUG = builder + .comment("If true, show more debug info.") + .define("debug", false); + builder.pop(); CONFIG = builder.build(); @@ -27,4 +32,9 @@ public class NBTEditConfigImpl implements INBTEditConfig { public boolean canEditOthers() { return CAN_EDIT_OTHER_PLAYERS.get(); } + + @Override + public boolean isDebug() { + return DEBUG.get(); + } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderENUS.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderENUS.java index f0e0dfc..829daf7 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderENUS.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderENUS.java @@ -17,23 +17,24 @@ protected void addTranslations() { add(Constants.MESSAGE_NOT_PLAYER, "Only players can use this command."); add(Constants.MESSAGE_NO_PERMISSION, "You have no permission to use NBTEdit."); + add(Constants.MESSAGE_NOT_LOADED, "Block pos was not loaded."); add(Constants.MESSAGE_NOTHING_TO_EDIT, "There is no any target for editing."); add(Constants.MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY, "There is no BlockEntity to edit."); add(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER, "Sorry, but you cannot edit other player."); add(Constants.MESSAGE_UNKNOWN_ENTITY_ID, "Unknown Entity ID."); - add(Constants.MESSAGE_EDITING_ENTITY, "Editing Entity {0}."); - add(Constants.MESSAGE_EDITING_BLOCK_ENTITY, "Editing BlockEntity at {0} {1} {2}."); - add(Constants.MESSAGE_EDITING_ITEM_STACK, "Editing ItemStack named {0}."); + add(Constants.MESSAGE_EDITING_ENTITY, "Editing Entity %1$s."); + add(Constants.MESSAGE_EDITING_BLOCK_ENTITY, "Editing BlockEntity at %1$s %2$s %3$s."); + add(Constants.MESSAGE_EDITING_ITEM_STACK, "Editing ItemStack named %1$s."); add(Constants.MESSAGE_SAVING_SUCCESSFUL, "Saved successfully!"); add(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT, "Save failed. Invalid NBT."); add(Constants.MESSAGE_SAVING_FAILED_BLOCK_ENTITY_NOT_EXISTS, "Save failed. the BlockEntity is no longer exists."); add(Constants.MESSAGE_SAVING_FAILED_ENTITY_NOT_EXISTS, "Save failed. the Entity is no longer exists."); - add(Constants.GUI_TITLE_NBTEDIT_ENTITY, "Editing Entity {0}"); - add(Constants.GUI_TITLE_NBTEDIT_BLOCK_ENTITY, "Editing BlockEntity in {0} {1} {2}"); - add(Constants.GUI_TITLE_NBTEDIT_ITEM_STACK, "Editing ItemStack named {0}"); + add(Constants.GUI_TITLE_NBTEDIT_ENTITY, "Editing Entity %1$s"); + add(Constants.GUI_TITLE_NBTEDIT_BLOCK_ENTITY, "Editing BlockEntity in %1$s %2$s %3$s"); + add(Constants.GUI_TITLE_NBTEDIT_ITEM_STACK, "Editing ItemStack named %1$s"); add(Constants.GUI_BUTTON_SAVE, "Save"); add(Constants.GUI_BUTTON_LOAD, "Load"); add(Constants.GUI_BUTTON_QUIT, "Quit"); diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderZHCN.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderZHCN.java index d8ddc45..da3edbf 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderZHCN.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/data/provider/LanguageProviderZHCN.java @@ -17,23 +17,24 @@ protected void addTranslations() { add(Constants.MESSAGE_NOT_PLAYER, "只有在游戏中的玩家可以使用这个命令!"); add(Constants.MESSAGE_NO_PERMISSION, "你没有权限使用 NBTEdit!"); + add(Constants.MESSAGE_NOT_LOADED, "方块还未加载!"); add(Constants.MESSAGE_NOTHING_TO_EDIT, "没有任何目标可供编辑。"); add(Constants.MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY, "没有目标方块实体可供编辑。"); add(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER, "你不能编辑其他玩家!"); add(Constants.MESSAGE_UNKNOWN_ENTITY_ID, "无效的实体 ID!"); - add(Constants.MESSAGE_EDITING_ENTITY, "正在编辑实体 {0}。"); - add(Constants.MESSAGE_EDITING_BLOCK_ENTITY, "正在编辑位于 {0} {1} {2} 的方块实体。"); - add(Constants.MESSAGE_EDITING_ITEM_STACK, "正在编辑名为 {0} 的物品。"); + add(Constants.MESSAGE_EDITING_ENTITY, "正在编辑实体 %1$s。"); + add(Constants.MESSAGE_EDITING_BLOCK_ENTITY, "正在编辑位于 %1$s %2$s %3$s 的方块实体。"); + add(Constants.MESSAGE_EDITING_ITEM_STACK, "正在编辑名为 %1$s 的物品。"); add(Constants.MESSAGE_SAVING_SUCCESSFUL, "保存成功!"); add(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT, "保存失败。无效的 NBT!"); add(Constants.MESSAGE_SAVING_FAILED_BLOCK_ENTITY_NOT_EXISTS, "保存失败。目标方块实体已经不存在了!"); add(Constants.MESSAGE_SAVING_FAILED_ENTITY_NOT_EXISTS, "保存失败。目标实体不存在了!"); - add(Constants.GUI_TITLE_NBTEDIT_ENTITY, "正在编辑实体 ID: {0}"); - add(Constants.GUI_TITLE_NBTEDIT_BLOCK_ENTITY, "正在编辑位于 {0} {1} {2} 的方块实体"); - add(Constants.GUI_TITLE_NBTEDIT_ITEM_STACK, "正在编辑名为 {0} 的物品"); + add(Constants.GUI_TITLE_NBTEDIT_ENTITY, "正在编辑实体 ID: %1$s"); + add(Constants.GUI_TITLE_NBTEDIT_BLOCK_ENTITY, "正在编辑位于 %1$s %2$s %3$s 的方块实体"); + add(Constants.GUI_TITLE_NBTEDIT_ITEM_STACK, "正在编辑名为 %1$s 的物品"); add(Constants.GUI_BUTTON_SAVE, "保存"); add(Constants.GUI_BUTTON_LOAD, "加载"); add(Constants.GUI_BUTTON_QUIT, "退出"); diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/NBTEditNetworkingImpl.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/NBTEditNetworkingImpl.java index e2bd42a..df5509f 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/NBTEditNetworkingImpl.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/NBTEditNetworkingImpl.java @@ -3,16 +3,13 @@ import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.api.netowrking.INBTEditNetworking; import cx.rain.mc.nbtedit.forge.networking.packet.*; -import cx.rain.mc.nbtedit.utility.Constants; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.network.NetworkDirection; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; @@ -43,70 +40,19 @@ private static synchronized int nextId() { } private void registerMessages() { - NBTEdit.getInstance().getLogger().info("Register networking."); - - CHANNEL.messageBuilder(S2CRayTracePacket.class, nextId()) - .encoder(S2CRayTracePacket::toBytes) - .decoder(S2CRayTracePacket::new) - .consumerMainThread(S2CRayTracePacket::clientHandleOnMain) - .add(); - - - CHANNEL.messageBuilder(C2SEntityEditingRequestPacket.class, nextId()) - .encoder(C2SEntityEditingRequestPacket::toBytes) - .decoder(C2SEntityEditingRequestPacket::new) - .consumerMainThread(C2SEntityEditingRequestPacket::serverHandleOnMain) - .add(); - - CHANNEL.messageBuilder(C2SBlockEntityEditingRequestPacket.class, nextId()) - .encoder(C2SBlockEntityEditingRequestPacket::toBytes) - .decoder(C2SBlockEntityEditingRequestPacket::new) - .consumerMainThread(C2SBlockEntityEditingRequestPacket::serverHandleOnMain) - .add(); - - CHANNEL.messageBuilder(C2SItemStackEditingRequestPacket.class, nextId()) - .encoder(C2SItemStackEditingRequestPacket::toBytes) - .decoder(C2SItemStackEditingRequestPacket::new) - .consumerMainThread(C2SItemStackEditingRequestPacket::serverHandleOnMain) - .add(); - - - CHANNEL.messageBuilder(S2COpenEntityEditingGuiPacket.class, nextId()) - .encoder(S2COpenEntityEditingGuiPacket::toBytes) - .decoder(S2COpenEntityEditingGuiPacket::new) - .consumerMainThread(S2COpenEntityEditingGuiPacket::clientHandleOnMain) - .add(); - - CHANNEL.messageBuilder(S2COpenBlockEntityEditingGuiPacket.class, nextId()) - .encoder(S2COpenBlockEntityEditingGuiPacket::toBytes) - .decoder(S2COpenBlockEntityEditingGuiPacket::new) - .consumerMainThread(S2COpenBlockEntityEditingGuiPacket::clientHandleOnMain) - .add(); - - CHANNEL.messageBuilder(S2COpenItemStackEditingGuiPacket.class, nextId()) - .encoder(S2COpenItemStackEditingGuiPacket::toBytes) - .decoder(S2COpenItemStackEditingGuiPacket::new) - .consumerMainThread(S2COpenItemStackEditingGuiPacket::clientHandleOnMain) - .add(); - - - CHANNEL.messageBuilder(C2SEntitySavingPacket.class, nextId()) - .encoder(C2SEntitySavingPacket::toBytes) - .decoder(C2SEntitySavingPacket::new) - .consumerMainThread(C2SEntitySavingPacket::serverHandleOnMain) - .add(); - - CHANNEL.messageBuilder(C2SBlockEntitySavingPacket.class, nextId()) - .encoder(C2SBlockEntitySavingPacket::toBytes) - .decoder(C2SBlockEntitySavingPacket::new) - .consumerMainThread(C2SBlockEntitySavingPacket::serverHandleOnMain) - .add(); - - CHANNEL.messageBuilder(C2SItemStackSavingPacket.class, nextId()) - .encoder(C2SItemStackSavingPacket::toBytes) - .decoder(C2SItemStackSavingPacket::new) - .consumerMainThread(C2SItemStackSavingPacket::serverHandleOnMain) - .add(); + CHANNEL.messageBuilder(S2CRayTracePacket.class, nextId()).encoder(S2CRayTracePacket::toBytes).decoder(S2CRayTracePacket::new).consumerMainThread(S2CRayTracePacket::clientHandleOnMain).add(); + + CHANNEL.messageBuilder(C2SEntityEditingRequestPacket.class, nextId()).encoder(C2SEntityEditingRequestPacket::toBytes).decoder(C2SEntityEditingRequestPacket::new).consumerMainThread(C2SEntityEditingRequestPacket::serverHandleOnMain).add(); + CHANNEL.messageBuilder(C2SBlockEntityEditingRequestPacket.class, nextId()).encoder(C2SBlockEntityEditingRequestPacket::toBytes).decoder(C2SBlockEntityEditingRequestPacket::new).consumerMainThread(C2SBlockEntityEditingRequestPacket::serverHandleOnMain).add(); + CHANNEL.messageBuilder(C2SItemStackEditingRequestPacket.class, nextId()).encoder(C2SItemStackEditingRequestPacket::toBytes).decoder(C2SItemStackEditingRequestPacket::new).consumerMainThread(C2SItemStackEditingRequestPacket::serverHandleOnMain).add(); + + CHANNEL.messageBuilder(S2COpenEntityEditingGuiPacket.class, nextId()).encoder(S2COpenEntityEditingGuiPacket::toBytes).decoder(S2COpenEntityEditingGuiPacket::new).consumerMainThread(S2COpenEntityEditingGuiPacket::clientHandleOnMain).add(); + CHANNEL.messageBuilder(S2COpenBlockEntityEditingGuiPacket.class, nextId()).encoder(S2COpenBlockEntityEditingGuiPacket::toBytes).decoder(S2COpenBlockEntityEditingGuiPacket::new).consumerMainThread(S2COpenBlockEntityEditingGuiPacket::clientHandleOnMain).add(); + CHANNEL.messageBuilder(S2COpenItemStackEditingGuiPacket.class, nextId()).encoder(S2COpenItemStackEditingGuiPacket::toBytes).decoder(S2COpenItemStackEditingGuiPacket::new).consumerMainThread(S2COpenItemStackEditingGuiPacket::clientHandleOnMain).add(); + + CHANNEL.messageBuilder(C2SEntitySavingPacket.class, nextId()).encoder(C2SEntitySavingPacket::toBytes).decoder(C2SEntitySavingPacket::new).consumerMainThread(C2SEntitySavingPacket::serverHandleOnMain).add(); + CHANNEL.messageBuilder(C2SBlockEntitySavingPacket.class, nextId()).encoder(C2SBlockEntitySavingPacket::toBytes).decoder(C2SBlockEntitySavingPacket::new).consumerMainThread(C2SBlockEntitySavingPacket::serverHandleOnMain).add(); + CHANNEL.messageBuilder(C2SItemStackSavingPacket.class, nextId()).encoder(C2SItemStackSavingPacket::toBytes).decoder(C2SItemStackSavingPacket::new).consumerMainThread(C2SItemStackSavingPacket::serverHandleOnMain).add(); } @Override @@ -131,78 +77,38 @@ public void clientOpenGuiRequest(ItemStack stack) { @Override public void serverOpenClientGui(ServerPlayer player, Entity entity) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - if (entity instanceof Player && !NBTEdit.getInstance().getConfig().canEditOthers()) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " tried to use /nbtedit on a player. But config is not allow that."); - player.createCommandSourceStack().sendFailure(Component - .translatable(Constants.MESSAGE_CANNOT_EDIT_OTHER_PLAYER) - .withStyle(ChatFormatting.RED)); - return; - } - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing entity " + entity.getUUID() + "."); - player.getServer().execute(() -> { - var tag = entity.serializeNBT(); - CHANNEL.sendTo(new S2COpenEntityEditingGuiPacket(entity.getUUID(), entity.getId(), tag, false), - player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + player.getServer().execute(() -> { + var tag = entity.serializeNBT(); + CHANNEL.sendTo(new S2COpenEntityEditingGuiPacket(entity.getUUID(), entity.getId(), tag, false), + player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); + }); } @Override - public void serverOpenClientGui(ServerPlayer player, BlockPos pos) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing block at XYZ " + pos.getX() + " " + pos.getY() + " " + pos.getZ() + "."); - var blockEntity = player.serverLevel().getBlockEntity(pos); - if (blockEntity != null) { - var tag = blockEntity.serializeNBT(); - CHANNEL.sendTo(new S2COpenBlockEntityEditingGuiPacket(pos, tag), - player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_TARGET_IS_NOT_BLOCK_ENTITY) - .withStyle(ChatFormatting.RED)); - } - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + public void serverOpenClientGui(ServerPlayer player, BlockPos pos, BlockEntity blockEntity) { + player.getServer().execute(() -> { + var tag = blockEntity.serializeNBT(); + CHANNEL.sendTo(new S2COpenBlockEntityEditingGuiPacket(pos, tag), + player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); + }); } @Override public void serverOpenClientGui(ServerPlayer player) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " is editing itself."); - player.getServer().execute(() -> { - var tag = player.serializeNBT(); - CHANNEL.sendTo(new S2COpenEntityEditingGuiPacket(player.getUUID(), player.getId(), tag, true), - player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + player.getServer().execute(() -> { + var tag = player.serializeNBT(); + CHANNEL.sendTo(new S2COpenEntityEditingGuiPacket(player.getUUID(), player.getId(), tag, true), + player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); + }); } @Override public void serverOpenClientGui(ServerPlayer player, ItemStack stack) { - if (NBTEdit.getInstance().getPermission().hasPermission(player)) { - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " is editing ItemStack named " + stack.getDisplayName().getString() + "."); - player.getServer().execute(() -> { - var tag = stack.serializeNBT(); - CHANNEL.sendTo(new S2COpenItemStackEditingGuiPacket(stack, tag), - player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); - }); - } else { - player.createCommandSourceStack().sendFailure(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } + player.getServer().execute(() -> { + var tag = stack.serializeNBT(); + CHANNEL.sendTo(new S2COpenItemStackEditingGuiPacket(stack, tag), + player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); + }); } @Override diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntityEditingRequestPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntityEditingRequestPacket.java index 773730e..80ad172 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntityEditingRequestPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntityEditingRequestPacket.java @@ -1,12 +1,8 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; @@ -18,8 +14,7 @@ public class C2SBlockEntityEditingRequestPacket { */ private BlockPos pos; - public C2SBlockEntityEditingRequestPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SBlockEntityEditingRequestPacket(FriendlyByteBuf buf) { pos = buf.readBlockPos(); } @@ -27,18 +22,12 @@ public C2SBlockEntityEditingRequestPacket(BlockPos posIn) { pos = posIn; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeBlockPos(pos); } public void serverHandleOnMain(Supplier context) { ServerPlayer player = context.get().getSender(); - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + " requested BlockEntity at " + - pos.getX() + " " + pos.getY() + " " + pos.getZ() + "."); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_BLOCK_ENTITY, - pos.getX(), pos.getY(), pos.getZ()).withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, pos); + NBTEditEditingHelper.editBlockEntity(player, pos); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntitySavingPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntitySavingPacket.java index e9a09fc..2877731 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntitySavingPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SBlockEntitySavingPacket.java @@ -1,18 +1,10 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.network.NetworkEvent; -import org.apache.logging.log4j.Level; import java.util.function.Supplier; @@ -27,8 +19,7 @@ public class C2SBlockEntitySavingPacket { */ protected CompoundTag compoundTag; - public C2SBlockEntitySavingPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SBlockEntitySavingPacket(FriendlyByteBuf buf) { blockPos = buf.readBlockPos(); compoundTag = buf.readNbt(); } @@ -38,56 +29,13 @@ public C2SBlockEntitySavingPacket(BlockPos pos, CompoundTag tag) { compoundTag = tag; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeBlockPos(blockPos); buf.writeNbt(compoundTag); } public void serverHandleOnMain(Supplier context) { var player = context.get().getSender(); - var server = player.getServer(); - var level = player.serverLevel(); - server.execute(() -> { - var blockEntity = level.getBlockEntity(blockPos); - if (blockEntity != null) { - try { - blockEntity.load(compoundTag); - blockEntity.setChanged(); // Ensure changes gets saved to disk later on. (qyl27: In MCP it is markDirty.) - if (blockEntity.hasLevel() && blockEntity.getLevel() instanceof ServerLevel) { - ((ServerLevel) blockEntity.getLevel()).getChunkSource().blockChanged(blockPos); // Broadcast changes. - } - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " successfully edited the tag of a BlockEntity at " + - blockPos.getX() + " " + - blockPos.getY() + " " + - blockPos.getZ() + "."); - NBTEdit.getInstance().getLogger().debug(compoundTag.getAsString()); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of BlockEntity at XYZ " + - blockPos.getX() + " " + - blockPos.getY() + " " + - blockPos.getZ() + " and caused an exception!"); - NBTEdit.getInstance().getLogger().error("NBT data: " + compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - } else { - NBTEdit.getInstance().getLogger().info("Player " + player.getName() + - " tried to edit a non-existent BlockEntity at " + - blockPos.getX() + " " + - blockPos.getY() + " " + - blockPos.getZ() + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_BLOCK_ENTITY_NOT_EXISTS) - .withStyle(ChatFormatting.RED)); - } - }); + NBTEditSavingHelper.saveBlockEntity(player, blockPos, compoundTag); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntityEditingRequestPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntityEditingRequestPacket.java index e0567d0..d6d4914 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntityEditingRequestPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntityEditingRequestPacket.java @@ -1,11 +1,7 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraftforge.network.NetworkEvent; import java.util.UUID; @@ -27,15 +23,13 @@ public C2SEntityEditingRequestPacket(UUID uuid, int id, boolean self) { isSelf = self; } - public C2SEntityEditingRequestPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SEntityEditingRequestPacket(FriendlyByteBuf buf) { entityUuid = buf.readUUID(); entityId = buf.readInt(); isSelf = buf.readBoolean(); } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeUUID(entityUuid); buf.writeInt(entityId); buf.writeBoolean(isSelf); @@ -43,11 +37,6 @@ public void toBytes(ByteBuf byteBuf) { public void serverHandleOnMain(Supplier context) { var player = context.get().getSender(); - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " requested entity with UUID " + entityUuid + "."); - var entity = player.serverLevel().getEntity(entityUuid); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ENTITY, entityUuid) - .withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, entity); + NBTEditEditingHelper.editEntity(player, entityUuid); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntitySavingPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntitySavingPacket.java index a96ced0..bd3c984 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntitySavingPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SEntitySavingPacket.java @@ -1,17 +1,8 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.forge.command.NBTEditPermissionImpl; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundSetExperiencePacket; -import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.GameType; import net.minecraftforge.network.NetworkEvent; import java.util.UUID; @@ -30,8 +21,7 @@ public class C2SEntitySavingPacket { protected int entityId; protected boolean isSelf; - public C2SEntitySavingPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SEntitySavingPacket(FriendlyByteBuf buf) { entityUuid = buf.readUUID(); entityId = buf.readInt(); compoundTag = buf.readNbt(); @@ -45,8 +35,7 @@ public C2SEntitySavingPacket(UUID uuid, int id, CompoundTag tag, boolean self) { isSelf = self; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeUUID(entityUuid); buf.writeInt(entityId); buf.writeNbt(compoundTag); @@ -55,69 +44,6 @@ public void toBytes(ByteBuf byteBuf) { public void serverHandleOnMain(Supplier context) { var player = context.get().getSender(); - var server = player.getServer(); - var level = player.serverLevel(); - server.execute(() -> { - var entity = level.getEntity(entityUuid); - if (!NBTEdit.getInstance().getPermission().hasPermission(player)) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_NO_PERMISSION) - .withStyle(ChatFormatting.RED)); - } - - if (entity != null) { - try { - GameType prevGameMode = null; - if (entity instanceof ServerPlayer) { - prevGameMode = ((ServerPlayer) entity).gameMode.getGameModeForPlayer(); - } - entity.load(compoundTag); - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " edited the tag of Entity with UUID " + entityUuid + " ."); - NBTEdit.getInstance().getLogger().debug("New NBT of entity " + entityUuid + - " is " + compoundTag.getAsString()); - - if (entity instanceof ServerPlayer) { - // Todo: qyl27: this is a very legacy todo. - // qyl27: if anyone found bugs with it, please open an issue. - // Update player info - // This is fairly hacky. - // Consider swapping to an event driven system, where classes can register to - // receive entity edit events and provide feedback/send packets as necessary. - var targetPlayer = (ServerPlayer) entity; - targetPlayer.initMenu(targetPlayer.inventoryMenu); - var gameMode = targetPlayer.gameMode.getGameModeForPlayer(); - if (prevGameMode != gameMode) { - targetPlayer.setGameMode(gameMode); - } - targetPlayer.connection.send(new ClientboundSetHealthPacket(targetPlayer.getHealth(), - targetPlayer.getFoodData().getFoodLevel(), - targetPlayer.getFoodData().getSaturationLevel())); - targetPlayer.connection.send(new ClientboundSetExperiencePacket( - targetPlayer.experienceProgress, - targetPlayer.totalExperience, - targetPlayer.experienceLevel)); - - targetPlayer.onUpdateAbilities(); - targetPlayer.setPos(targetPlayer.getX(), targetPlayer.getY(), targetPlayer.getZ()); - } - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of entity " + entityUuid + " and caused an exception!"); - NBTEdit.getInstance().getLogger().error("NBT data: " + compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - } else { - NBTEdit.getInstance().getLogger().info("Player " + player.getName() + - " tried to edit a non-existent entity " + entityUuid + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_ENTITY_NOT_EXISTS) - .withStyle(ChatFormatting.RED)); - } - }); + NBTEditSavingHelper.saveEntity(player, entityUuid, compoundTag); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackEditingRequestPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackEditingRequestPacket.java index 3339f1c..0c82332 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackEditingRequestPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackEditingRequestPacket.java @@ -1,11 +1,7 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; +import cx.rain.mc.nbtedit.networking.NBTEditEditingHelper; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; @@ -18,23 +14,16 @@ public C2SItemStackEditingRequestPacket(ItemStack stack) { itemStack = stack; } - public C2SItemStackEditingRequestPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SItemStackEditingRequestPacket(FriendlyByteBuf buf) { itemStack = buf.readItem(); } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeItem(itemStack); } public void serverHandleOnMain(Supplier context) { var player = context.get().getSender(); - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " requested to edit ItemStack named " + itemStack.getDisplayName().getString() + "."); - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_EDITING_ITEM_STACK, - itemStack.getDisplayName().getString()) - .withStyle(ChatFormatting.GREEN)); - NBTEdit.getInstance().getNetworking().serverOpenClientGui(player, itemStack); + NBTEditEditingHelper.editItemStack(player, itemStack); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackSavingPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackSavingPacket.java index 1748499..d42ee0c 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackSavingPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/C2SItemStackSavingPacket.java @@ -1,15 +1,8 @@ package cx.rain.mc.nbtedit.forge.networking.packet; -import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.utility.Constants; -import io.netty.buffer.ByteBuf; -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; +import cx.rain.mc.nbtedit.networking.NBTEditSavingHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; @@ -20,8 +13,7 @@ public class C2SItemStackSavingPacket { protected CompoundTag compoundTag; - public C2SItemStackSavingPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public C2SItemStackSavingPacket(FriendlyByteBuf buf) { itemStack = buf.readItem(); compoundTag = buf.readNbt(); } @@ -31,39 +23,13 @@ public C2SItemStackSavingPacket(ItemStack stack, CompoundTag tag) { compoundTag = tag; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeItem(itemStack); buf.writeNbt(compoundTag); } public void serverHandleOnMain(Supplier context) { var player = context.get().getSender(); - var server = player.getServer(); - - server.execute(() -> { - try { - var item = ItemStack.of(compoundTag); - player.setItemInHand(InteractionHand.MAIN_HAND, item); - - NBTEdit.getInstance().getLogger().info("Player " + player.getName().getString() + - " successfully edited the tag of a ItemStack named " - + itemStack.getDisplayName().getString() + "."); - NBTEdit.getInstance().getLogger().debug(compoundTag.getAsString()); - - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_SUCCESSFUL) - .withStyle(ChatFormatting.GREEN)); - } catch (Exception ex) { - player.sendSystemMessage(Component.translatable(Constants.MESSAGE_SAVING_FAILED_INVALID_NBT) - .withStyle(ChatFormatting.RED)); - - NBTEdit.getInstance().getLogger().error("Player " + player.getName().getString() + - " edited the tag of ItemStack named " - + itemStack.getDisplayName().getString() +" and caused an exception!"); - - NBTEdit.getInstance().getLogger().error("NBT data: " + compoundTag.getAsString()); - NBTEdit.getInstance().getLogger().error(new RuntimeException(ex).toString()); - } - }); + NBTEditSavingHelper.saveItemStack(player, itemStack, compoundTag); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenBlockEntityEditingGuiPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenBlockEntityEditingGuiPacket.java index 7365c14..870b243 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenBlockEntityEditingGuiPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenBlockEntityEditingGuiPacket.java @@ -1,10 +1,7 @@ package cx.rain.mc.nbtedit.forge.networking.packet; import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.gui.screen.NBTEditScreen; import cx.rain.mc.nbtedit.utility.ScreenHelper; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -16,8 +13,7 @@ public class S2COpenBlockEntityEditingGuiPacket { private BlockPos blockPos; private CompoundTag compoundTag; - public S2COpenBlockEntityEditingGuiPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public S2COpenBlockEntityEditingGuiPacket(FriendlyByteBuf buf) { blockPos = buf.readBlockPos(); compoundTag = buf.readNbt(); } @@ -27,15 +23,12 @@ public S2COpenBlockEntityEditingGuiPacket(BlockPos pos, CompoundTag tag) { compoundTag = tag; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeBlockPos(blockPos); buf.writeNbt(compoundTag); } public void clientHandleOnMain(Supplier context) { - NBTEdit.getInstance().getLogger().info("Editing BlockEntity at XYZ " + - blockPos.getX() + " " + blockPos.getY() + " " + blockPos.getZ() + "."); ScreenHelper.showNBTEditScreen(blockPos, compoundTag); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenEntityEditingGuiPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenEntityEditingGuiPacket.java index 45ec7a7..c877ec7 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenEntityEditingGuiPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenEntityEditingGuiPacket.java @@ -1,10 +1,7 @@ package cx.rain.mc.nbtedit.forge.networking.packet; import cx.rain.mc.nbtedit.NBTEdit; -import cx.rain.mc.nbtedit.gui.screen.NBTEditScreen; import cx.rain.mc.nbtedit.utility.ScreenHelper; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; @@ -18,8 +15,7 @@ public class S2COpenEntityEditingGuiPacket { protected CompoundTag compoundTag; protected boolean isSelf; - public S2COpenEntityEditingGuiPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public S2COpenEntityEditingGuiPacket(FriendlyByteBuf buf) { entityUuid = buf.readUUID(); entityId = buf.readInt(); compoundTag = buf.readNbt(); @@ -33,8 +29,7 @@ public S2COpenEntityEditingGuiPacket(UUID uuid, int id, CompoundTag tag, boolean isSelf = self; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeUUID(entityUuid); buf.writeInt(entityId); buf.writeNbt(compoundTag); @@ -42,7 +37,6 @@ public void toBytes(ByteBuf byteBuf) { } public void clientHandleOnMain(Supplier context) { - NBTEdit.getInstance().getLogger().info("Editing entity with UUID " + entityUuid + "."); ScreenHelper.showNBTEditScreen(entityUuid, entityId, compoundTag, isSelf); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenItemStackEditingGuiPacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenItemStackEditingGuiPacket.java index 91abaea..9ffc3ab 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenItemStackEditingGuiPacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2COpenItemStackEditingGuiPacket.java @@ -2,7 +2,6 @@ import cx.rain.mc.nbtedit.NBTEdit; import cx.rain.mc.nbtedit.utility.ScreenHelper; -import io.netty.buffer.ByteBuf; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; @@ -14,8 +13,7 @@ public class S2COpenItemStackEditingGuiPacket { private ItemStack itemStack; private CompoundTag compoundTag; - public S2COpenItemStackEditingGuiPacket(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public S2COpenItemStackEditingGuiPacket(FriendlyByteBuf buf) { itemStack = buf.readItem(); compoundTag = buf.readNbt(); } @@ -25,15 +23,12 @@ public S2COpenItemStackEditingGuiPacket(ItemStack stack, CompoundTag tag) { compoundTag = tag; } - public void toBytes(ByteBuf byteBuf) { - var buf = new FriendlyByteBuf(byteBuf); + public void toBytes(FriendlyByteBuf buf) { buf.writeItemStack(itemStack, true); buf.writeNbt(compoundTag); } public void clientHandleOnMain(Supplier context) { - NBTEdit.getInstance().getLogger().info("Editing ItemStack " - + itemStack.getDisplayName().getString() + "in hand."); ScreenHelper.showNBTEditScreen(itemStack, compoundTag); } } diff --git a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2CRayTracePacket.java b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2CRayTracePacket.java index 65728db..0145cfc 100644 --- a/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2CRayTracePacket.java +++ b/forge/src/main/java/cx/rain/mc/nbtedit/forge/networking/packet/S2CRayTracePacket.java @@ -1,8 +1,7 @@ package cx.rain.mc.nbtedit.forge.networking.packet; import cx.rain.mc.nbtedit.utility.RayTraceHelper; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; @@ -11,10 +10,10 @@ public class S2CRayTracePacket { public S2CRayTracePacket() { } - public S2CRayTracePacket(ByteBuf buf) { + public S2CRayTracePacket(FriendlyByteBuf buf) { } - public void toBytes(ByteBuf buf) { + public void toBytes(FriendlyByteBuf buf) { } public void clientHandleOnMain(Supplier context) { diff --git a/gradle.properties b/gradle.properties index ce761d0..2f976c4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ archives_base_name=nbtedit mod_id=nbtedit mod_name=NBTEdit mod_full_name=In-game NBTEdit Reborn -mod_version=1.20.1-4.4.3 +mod_version=1.20.1-5.0.0 minecraft_version=1.20.1