From 483df4c911751b85f52ba28fac048879843019db Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 31 May 2025 14:25:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=E7=94=B1?= =?UTF-8?q?=E4=BA=8Epapermc/paper#12347=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BukkitCompatibilityManager.java | 2 +- .../plugin/command/feature/TestCommand.java | 42 ++++++------------- .../plugin/network/PacketConsumers.java | 17 ++++---- .../plugin/user/BukkitServerPlayer.java | 18 ++++++-- .../craftengine/bukkit/util/Reflections.java | 11 +++++ .../core/plugin/network/NetWorkUser.java | 2 + .../core/util/FriendlyByteBuf.java | 24 ++++++++++- 7 files changed, 72 insertions(+), 44 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index af6afe670..ae907026a 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -176,7 +176,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager { } } - @SuppressWarnings("all") + @SuppressWarnings({"deprecation", "all"}) private void initFastAsyncWorldEditHook() { Plugin fastAsyncWorldEdit = Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit"); String version = VersionHelper.isPaper() ? fastAsyncWorldEdit.getPluginMeta().getVersion() : fastAsyncWorldEdit.getDescription().getVersion(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index ab1b59966..aa042ae50 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,34 +1,18 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.Command; -import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; -import org.incendo.cloud.context.CommandContext; -import org.incendo.cloud.context.CommandInput; import org.incendo.cloud.parser.standard.BooleanParser; -import org.incendo.cloud.parser.standard.StringParser; -import org.incendo.cloud.suggestion.Suggestion; -import org.incendo.cloud.suggestion.SuggestionProvider; +import org.incendo.cloud.parser.standard.FloatParser; -import java.util.Collection; -import java.util.HashSet; -import java.util.concurrent.CompletableFuture; +import java.lang.reflect.InvocationTargetException; public class TestCommand extends BukkitCommandFeature { - public static final Collection TARGET_BLOCK_SUGGESTIONS = new HashSet<>(); - - static { - for (Material material : Material.values()) { - TARGET_BLOCK_SUGGESTIONS.add(Suggestion.suggestion(material.getKey().toString())); - } - } public TestCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { super(commandManager, plugin); @@ -38,19 +22,17 @@ public class TestCommand extends BukkitCommandFeature { public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { return builder .senderType(Player.class) - .required("reset", BooleanParser.booleanParser()) - .required("setTag", NamespacedKeyParser.namespacedKeyParser()) - .required("targetBlock", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { - @Override - public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { - return CompletableFuture.completedFuture(TARGET_BLOCK_SUGGESTIONS); - } - })) + .required("tickRate", FloatParser.floatParser()) + .required("isFrozen", BooleanParser.booleanParser()) .handler(context -> { Player player = context.sender(); - player.sendMessage("开始测试"); - NamespacedKey key = context.get("setTag"); - player.sendMessage("结束测试"); + float tickRate = context.get("tickRate"); + boolean isFrozen = context.get("isFrozen"); + try { + plugin().adapt(player).sendPacket(Reflections.constructor$ClientboundTickingStatePacket.newInstance(tickRate, isFrozen), true); + } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { + player.sendMessage("发送失败"); + } }); } 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 3d79a637d..1f4a83efa 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 @@ -138,6 +138,13 @@ public class PacketConsumers { } } + private static BukkitNetworkManager.Handlers simpleAddEntityHandler(EntityPacketHandler handler) { + return (user, event) -> { + FriendlyByteBuf buf = event.getBuffer(); + user.entityPacketHandlers().putIfAbsent(buf.readVarInt(), handler); + }; + } + public static void initBlocks(Map map, int registrySize) { mappings = new int[registrySize]; for (int i = 0; i < registrySize; i++) { @@ -349,7 +356,7 @@ public class PacketConsumers { public static final BiConsumer BLOCK_UPDATE = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); - BlockPos pos = buf.readBlockPos(buf); + BlockPos pos = buf.readBlockPos(); int before = buf.readVarInt(); if (user.clientModEnabled() && !BlockStateUtils.isVanillaBlock(before)) { return; @@ -373,7 +380,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); int eventId = buf.readInt(); if (eventId != WorldEvents.BLOCK_BREAK_EFFECT) return; - BlockPos blockPos = buf.readBlockPos(buf); + BlockPos blockPos = buf.readBlockPos(); int state = buf.readInt(); boolean global = buf.readBoolean(); int newState = remap(state); @@ -2286,10 +2293,4 @@ public class PacketConsumers { } }; - private static BukkitNetworkManager.Handlers simpleAddEntityHandler(EntityPacketHandler handler) { - return (user, event) -> { - FriendlyByteBuf buf = event.getBuffer(); - user.entityPacketHandlers().putIfAbsent(buf.readVarInt(), handler); - }; - } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 9c6b7b5ef..d8dc6457f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.plugin.user; import com.google.common.collect.Lists; +import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; @@ -8,6 +9,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.gui.CraftEngineInventoryHolder; +import net.momirealms.craftengine.bukkit.plugin.network.payload.DiscardedPayload; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.BlockSettings; @@ -282,6 +284,11 @@ public class BukkitServerPlayer extends Player { platformPlayer().closeInventory(); } + @Override + public void sendPacket(Object packet) { + this.nettyChannel().writeAndFlush(packet); + } + @Override public void sendPacket(Object packet, boolean immediately) { this.plugin.networkManager().sendPacket(this, packet, immediately); @@ -291,9 +298,14 @@ public class BukkitServerPlayer extends Player { public void sendCustomPayload(Key channel, byte[] data) { try { Object channelKey = KeyUtils.toResourceLocation(channel); - Object dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, data); + Object dataPayload; + if (DiscardedPayload.useNewMethod) { + dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, data); + } else { + dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data)); + } Object responsePacket = Reflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload); - this.nettyChannel().writeAndFlush(responsePacket); + this.sendPacket(responsePacket); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to send custom payload to " + name(), e); } @@ -304,7 +316,7 @@ public class BukkitServerPlayer extends Player { try { Object reason = ComponentUtils.adventureToMinecraft(message); Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(reason); - this.nettyChannel().writeAndFlush(kickPacket); + this.sendPacket(kickPacket); this.nettyChannel().disconnect(); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to kick " + name(), e); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index f3847bb00..43002946a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -7005,4 +7005,15 @@ public class Reflections { clazz$AbstractContainerMenu, int.class, new String[]{"incrementStateId", "k"} ) ); + + public static final Class clazz$ClientboundTickingStatePacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass( + "network.protocol.game.ClientboundTickingStatePacket" + ) + ); + + public static final Constructor constructor$ClientboundTickingStatePacket = Optional.ofNullable(clazz$ClientboundTickingStatePacket) + .map(it -> ReflectionUtils.getConstructor(it, float.class, boolean.class)) + .orElse(null); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index d8fe6ec0c..a9d17c643 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -24,6 +24,8 @@ public interface NetWorkUser { void setUUID(UUID uuid); + void sendPacket(Object packet); + void sendPacket(Object packet, boolean immediately); void sendCustomPayload(Key channel, byte[] data); 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 a21cc9692..3d9baffca 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 @@ -44,8 +44,28 @@ public class FriendlyByteBuf extends ByteBuf { return source; } - public BlockPos readBlockPos(ByteBuf buf) { - return BlockPos.of(buf.readLong()); + public > C readCollection(IntFunction collectionFactory, Reader reader) { + int i = this.readVarInt(); + C c0 = (C)(collectionFactory.apply(i)); + + for(int j = 0; j < i; ++j) { + c0.add(reader.apply(this)); + } + + return c0; + } + + public void writeCollection(Collection collection, Writer writer) { + this.writeVarInt(collection.size()); + + for(T t0 : collection) { + writer.accept(this, t0); + } + + } + + public BlockPos readBlockPos() { + return BlockPos.of(this.readLong()); } public int readContainerId() {