From 8c7c529c63d26132819e22f2fd06d42a87a9d55d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 6 Apr 2025 13:20:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=B9=E5=99=A8=E5=8C=85?= =?UTF-8?q?=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../slimeworld/SlimeWorldDataStorage.java | 4 +- .../bukkit/plugin/gui/BukkitGuiManager.java | 21 +++-- .../plugin/network/BukkitNetworkManager.java | 3 +- .../plugin/network/PacketConsumers.java | 87 +++++++++++-------- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/impl/PacketIds1_20.java | 5 ++ .../plugin/network/impl/PacketIds1_20_2.java | 6 ++ .../plugin/network/impl/PacketIds1_20_3.java | 6 ++ .../plugin/network/impl/PacketIds1_20_5.java | 6 ++ .../plugin/network/impl/PacketIds1_21.java | 5 ++ .../plugin/network/impl/PacketIds1_21_2.java | 32 ------- .../core/util/FriendlyByteBuf.java | 9 +- .../storage/DefaultRegionFileStorage.java | 6 +- gradle.properties | 2 +- 14 files changed, 108 insertions(+), 86 deletions(-) delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java index feeb6505f..8e0a55696 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeWorldDataStorage.java @@ -8,8 +8,6 @@ import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.NBT; import org.jetbrains.annotations.Nullable; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.Map; @@ -35,7 +33,7 @@ public class SlimeWorldDataStorage implements WorldDataStorage { Object tag = slimeChunk.getExtraData().get("craftengine"); if (tag == null) return null; try { - return NBT.readCompound(new DataInputStream(new ByteArrayInputStream(adaptor.byteArrayTagToBytes(tag)))); + return NBT.fromBytes(adaptor.byteArrayTagToBytes(tag)); } catch (Exception e) { throw new RuntimeException("Failed to read chunk tag from slime world. " + pos, e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java index 904de8f1a..8358b965b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java @@ -28,7 +28,7 @@ public class BukkitGuiManager implements GuiManager, Listener { @Override public void delayedInit() { Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); - this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 20, 20); + this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 30, 30); } @Override @@ -40,10 +40,21 @@ public class BukkitGuiManager implements GuiManager, Listener { } public void timerTask() { - for (Player player : Bukkit.getOnlinePlayers()) { - org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory(); - if (top.getHolder() instanceof CraftEngineInventoryHolder holder) { - holder.gui().onTimer(); + if (VersionHelper.isFolia()) { + for (Player player : Bukkit.getOnlinePlayers()) { + this.plugin.scheduler().sync().run(() -> { + org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory(); + if (top.getHolder() instanceof CraftEngineInventoryHolder holder) { + holder.gui().onTimer(); + } + }, player.getWorld(), player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4); + } + } else { + for (Player player : Bukkit.getOnlinePlayers()) { + org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory(); + if (top.getHolder() instanceof CraftEngineInventoryHolder holder) { + holder.gui().onTimer(); + } } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 2c1a412a7..44bc64611 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -150,11 +150,12 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket); registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket); registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket); - registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket); +// registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); + registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); } public static BukkitNetworkManager instance() { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 112f8228a..7c5b4c1b0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -32,6 +32,8 @@ import net.momirealms.craftengine.core.world.chunk.PalettedContainer; import net.momirealms.craftengine.core.world.chunk.packet.MCSection; import net.momirealms.sparrow.nbt.NBT; import net.momirealms.sparrow.nbt.Tag; +import net.momirealms.sparrow.nbt.TagTypes; +import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; @@ -241,36 +243,47 @@ public class PacketConsumers { } }; - - -// public static final BiConsumer OPEN_SCREEN = (user, event) -> { -// try { -// if (VersionHelper.isVersionNewerThan1_20_3()) { -// FriendlyByteBuf buf = event.getBuffer(); -// } else { -// FriendlyByteBuf buf = event.getBuffer(); -// int containerId = buf.readVarInt(); -// int type = buf.readVarInt(); -// String json = buf.readUtf(); -// Map tokens = CraftEngine.instance().imageManager().matchTags(json); -// if (tokens.isEmpty()) return; -// event.setChanged(true); -// Component component = AdventureHelper.jsonToComponent(json); -// for (Map.Entry token : tokens.entrySet()) { -// component = component.replaceText(b -> { -// b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())); -// }); -// } -// buf.clear(); -// buf.writeVarInt(event.packetID()); -// buf.writeVarInt(containerId); -// buf.writeVarInt(type); -// buf.writeUtf(AdventureHelper.componentToJson(component)); -// } -// } catch (Exception e) { -// CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); -// } -// }; + public static final BiConsumer OPEN_SCREEN = (user, event) -> { + try { + if (VersionHelper.isVersionNewerThan1_20_3()) { + FriendlyByteBuf buf = event.getBuffer(); + int containerId = buf.readVarInt(); + int type = buf.readVarInt(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(containerId); + buf.writeVarInt(type); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } else { + FriendlyByteBuf buf = event.getBuffer(); + int containerId = buf.readVarInt(); + int type = buf.readVarInt(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(containerId); + buf.writeVarInt(type); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); + } + }; public static final BiConsumer LEVEL_PARTICLE = (user, event) -> { try { @@ -1026,11 +1039,11 @@ public class PacketConsumers { } }; - public static final TriConsumer OPEN_SCREEN = (user, event, packet) -> { - try { - - } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); - } - }; +// public static final TriConsumer OPEN_SCREEN = (user, event, packet) -> { +// try { +// +// } catch (Exception e) { +// CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); +// } +// }; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index bb457e96f..ca7338f6b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -11,4 +11,6 @@ public interface PacketIds { int clientboundLevelEventPacket(); int clientboundAddEntityPacket(); + + int clientboundOpenScreenPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index 6b46ed66b..e833e4d8c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -28,4 +28,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundAddEntityPacket() { return 1; } + + @Override + public int clientboundOpenScreenPacket() { + return 48; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index aca5b2d18..fc85ed504 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -28,4 +28,10 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundAddEntityPacket() { return 1; } + + //TODO TEST + @Override + public int clientboundOpenScreenPacket() { + return 48; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index cfbf46214..6f43942e6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -28,4 +28,10 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundAddEntityPacket() { return 1; } + + //TODO TEST + @Override + public int clientboundOpenScreenPacket() { + return 48; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index a09fd1392..782e3fa37 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -28,4 +28,10 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundAddEntityPacket() { return 1; } + + //TODO TEST + @Override + public int clientboundOpenScreenPacket() { + return 48; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 7bce73690..8d1417f2a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -28,4 +28,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundAddEntityPacket() { return PacketIdFinder.clientboundByName("minecraft:add_entity"); } + + @Override + public int clientboundOpenScreenPacket() { + return PacketIdFinder.clientboundByName("minecraft:open_screen"); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java deleted file mode 100644 index 8e86b6914..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.momirealms.craftengine.bukkit.plugin.network.impl; - -import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; - -@Deprecated -public class PacketIds1_21_2 implements PacketIds { - - @Override - public int clientboundBlockUpdatePacket() { - return 9; - } - - @Override - public int clientboundSectionBlocksUpdatePacket() { - return 78; - } - - @Override - public int clientboundLevelParticlesPacket() { - return 42; - } - - @Override - public int clientboundLevelEventPacket() { - return 41; - } - - @Override - public int clientboundAddEntityPacket() { - return 1; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java index e9b1c7de8..6fcfe3c16 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -13,6 +13,7 @@ import it.unimi.dsi.fastutil.ints.IntList; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.NBT; +import net.momirealms.sparrow.nbt.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -316,12 +317,12 @@ public class FriendlyByteBuf extends ByteBuf { return this; } - public FriendlyByteBuf writeNbt(@Nullable CompoundTag compound) { + public FriendlyByteBuf writeNbt(@Nullable Tag compound, boolean named) { if (compound == null) { this.writeByte(0); } else { try { - NBT.writeCompound(compound, new ByteBufOutputStream(this)); + NBT.writeUnnamedTag(compound, new ByteBufOutputStream(this), named); } catch (IOException e) { throw new EncoderException("Failed to write NBT compound: " + e.getMessage(), e); } @@ -330,7 +331,7 @@ public class FriendlyByteBuf extends ByteBuf { } @Nullable - public CompoundTag readNbt() { + public Tag readNbt(boolean named) { int initialIndex = this.readerIndex(); byte marker = this.readByte(); if (marker == 0) { @@ -338,7 +339,7 @@ public class FriendlyByteBuf extends ByteBuf { } else { this.readerIndex(initialIndex); try { - return NBT.readCompound(new ByteBufInputStream(this)); + return NBT.readUnnamedTag(new ByteBufInputStream(this), named); } catch (IOException e) { throw new EncoderException("Failed to read NBT compound: " + e.getMessage(), e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java index bf78eb1dd..d45b70ced 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java @@ -16,7 +16,7 @@ import java.nio.file.Files; import java.nio.file.Path; public class DefaultRegionFileStorage implements WorldDataStorage { - + private static final int FORMAT_VERSION = 1; private final Path folder; public static final String REGION_FILE_SUFFIX = ".mca"; @@ -127,7 +127,7 @@ public class DefaultRegionFileStorage implements WorldDataStorage { if (dataInputStream == null) { return null; } - tag = NBT.readCompound(dataInputStream); + tag = NBT.readCompound(dataInputStream, true); } catch (Throwable t1) { try { dataInputStream.close(); @@ -152,7 +152,7 @@ public class DefaultRegionFileStorage implements WorldDataStorage { } else { DataOutputStream dataOutputStream = regionFile.getChunkDataOutputStream(pos); try { - NBT.writeCompound(nbt, dataOutputStream); + NBT.writeCompound(nbt, dataOutputStream, true); } catch (Throwable t1) { if (dataOutputStream != null) { try { diff --git a/gradle.properties b/gradle.properties index c099f8f81..739463b8a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.3 +sparrow_nbt_version=0.4.6 sparrow_util_version=0.37 fastutil_version=8.5.15 netty_version=4.1.119.Final