From 43e8187a08512d43a4cf594ba3a35d44b384c553 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Jul 2025 19:43:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/PacketConsumers.java | 23 ++++++++++---- .../bukkit/util/ResourcePackUtils.java | 20 ------------- .../network/RecipeBookDisplayEntry.java | 30 +++++++++++++++++++ .../item/recipe/network/RecipeBookEntry.java | 18 +++++++++++ .../item/recipe/network/RecipeDisplayId.java | 14 +++++++++ .../recipe/network/display/RecipeDisplay.java | 17 +++++++++++ .../display/ShapedCraftingRecipeDisplay.java | 23 ++++++++++++++ .../recipe/network/display/SlotDisplay.java | 8 +++++ .../core/registry/BuiltInRegistries.java | 4 +++ .../craftengine/core/registry/Registries.java | 4 +++ 10 files changed, 136 insertions(+), 25 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookDisplayEntry.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookEntry.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeDisplayId.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapedCraftingRecipeDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java 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 d26ce8548..13bb3c846 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 @@ -2318,7 +2318,17 @@ public class PacketConsumers { Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) return; // 根据要求需要运行在主线程上 - CraftEngine.instance().scheduler().executeSync(() -> ResourcePackUtils.handleResourcePackResponse(packetListener, packet, action)); + CraftEngine.instance().scheduler().executeSync(() -> { + try { + NetworkReflections.methodHandle$ServerCommonPacketListener$handleResourcePackResponse.invokeExact(packetListener, packet); + if (action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$ACCEPTED + && action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$DOWNLOADED) { + CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask.invokeExact(packetListener, CoreReflections.instance$ServerResourcePackConfigurationTask$TYPE); + } + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket for " + user.name(), e); + } + }); } } catch (Throwable e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e); @@ -2401,7 +2411,12 @@ public class PacketConsumers { user.setShouldProcessFinishConfiguration(false); // 防止loop event.setCancelled(true); - ResourcePackUtils.finishCurrentTask(packetListener, CoreReflections.instance$JoinWorldTask$TYPE); + try { + CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask.invokeExact(packetListener, CoreReflections.instance$JoinWorldTask$TYPE); + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to finish current task for " + user.name(), e); + } + if (VersionHelper.isOrAbove1_20_5()) { // 1.20.5+开始会检查是否结束需要重新设置回去,不然不会发keepAlive包 CoreReflections.methodHandle$ServerCommonPacketListenerImpl$closedSetter.invokeExact(packetListener, false); @@ -2422,9 +2437,7 @@ public class PacketConsumers { return; } for (ResourcePackDownloadData data : dataList) { - configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask( - ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1())) - ); + configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); user.addResourcePackUUID(data.uuid()); } FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ResourcePackUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ResourcePackUtils.java index 5f7ca0c19..38513873b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ResourcePackUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ResourcePackUtils.java @@ -20,24 +20,4 @@ public final class ResourcePackUtils { public static Object createServerResourcePackInfo(UUID uuid, String url, String hash) { return FastNMS.INSTANCE.constructor$ServerResourcePackInfo(uuid, url, hash, Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt())); } - - public static void finishCurrentTask(Object packetListener, Object type) { - try { - CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask.invokeExact(packetListener, type); - } catch (Throwable e) { - CraftEngine.instance().logger().warn("Failed to finish current task", e); - } - } - - public static void handleResourcePackResponse(Object packetListener, Object packet, Object action) { - try { - NetworkReflections.methodHandle$ServerCommonPacketListener$handleResourcePackResponse.invokeExact(packetListener, packet); - if (action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$ACCEPTED - && action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$DOWNLOADED) { - ResourcePackUtils.finishCurrentTask(packetListener, CoreReflections.instance$ServerResourcePackConfigurationTask$TYPE); - } - } catch (Throwable e) { - CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e); - } - } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookDisplayEntry.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookDisplayEntry.java new file mode 100644 index 000000000..20bfc0fca --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookDisplayEntry.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.item.recipe.network; + +import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; + +public record RecipeBookDisplayEntry(RecipeDisplayId displayId, RecipeDisplay display, OptionalInt group, int category, Optional> ingredients) { + + public static RecipeBookDisplayEntry read(FriendlyByteBuf buffer) { + RecipeDisplayId displayId = RecipeDisplayId.read(buffer); + RecipeDisplay display = buffer.readById(BuiltInRegistries.RECIPE_DISPLAY_TYPE).read(buffer); + OptionalInt group = buffer.readOptionalVarInt(); + int category = buffer.readVarInt(); // simplify the registry lookup since we don't care about the category + Optional> requirements = buffer.readOptional(buf -> buf.readCollection(ArrayList::new, FriendlyByteBuf::readVarInt)); // simplify the registry lookup since we don't care about the ingredient ids + return new RecipeBookDisplayEntry(displayId, display, group, category, requirements); + } + + public void write(FriendlyByteBuf buffer) { + this.displayId.write(buffer); + this.display.write(buffer); + buffer.writeOptionalVarInt(this.group); + buffer.writeVarInt(this.category); + buffer.writeOptional(this.ingredients, (buf, recipeIngredients) -> buf.writeCollection(recipeIngredients, FriendlyByteBuf::writeVarInt)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookEntry.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookEntry.java new file mode 100644 index 000000000..e8b96ca23 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeBookEntry.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.item.recipe.network; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public record RecipeBookEntry(RecipeBookDisplayEntry entry, byte flags) { + + public static RecipeBookEntry read(FriendlyByteBuf buffer) { + RecipeBookDisplayEntry displayEntry = RecipeBookDisplayEntry.read(buffer); + byte flags = buffer.readByte(); + return new RecipeBookEntry(displayEntry, flags); + } + + public void write(FriendlyByteBuf buffer) { + this.entry.write(buffer); + buffer.writeByte(this.flags); + } +} + diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeDisplayId.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeDisplayId.java new file mode 100644 index 000000000..f35ec4e23 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/RecipeDisplayId.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.item.recipe.network; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public record RecipeDisplayId(int id) { + + public void write(FriendlyByteBuf buffer) { + buffer.writeVarInt(this.id); + } + + public static RecipeDisplayId read(FriendlyByteBuf buffer) { + return new RecipeDisplayId(buffer.readVarInt()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplay.java new file mode 100644 index 000000000..30d7c23a5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplay.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.function.Function; + +public interface RecipeDisplay { + + void write(FriendlyByteBuf buf); + + record Type(Function reader) { + + public RecipeDisplay read(final FriendlyByteBuf buf) { + return this.reader.apply(buf); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapedCraftingRecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapedCraftingRecipeDisplay.java new file mode 100644 index 000000000..2afe25cdf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapedCraftingRecipeDisplay.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public record ShapedCraftingRecipeDisplay(int width, int height, List ingredients, SlotDisplay result, SlotDisplay craftingStation) implements RecipeDisplay { + + public static ShapedCraftingRecipeDisplay read(FriendlyByteBuf buffer) { + int width = buffer.readVarInt(); + int height = buffer.readVarInt(); + + List ingredients = buffer.readCollection(ArrayList::new, friendlyByteBuf -> friendlyByteBuf.readById(BuiltInRegistries.SLOT_DISPLAY)); + return null; + } + + @Override + public void write(FriendlyByteBuf buf) { + + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java new file mode 100644 index 000000000..196ea53ce --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public interface SlotDisplay { + + void write(FriendlyByteBuf buf); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index f27fb9966..a4df3b644 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -8,6 +8,8 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; import net.momirealms.craftengine.core.item.equipment.EquipmentFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay; +import net.momirealms.craftengine.core.item.recipe.network.display.SlotDisplay; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; @@ -70,6 +72,8 @@ public class BuiltInRegistries { public static final Registry> EVENT_CONDITION_FACTORY = createRegistry(Registries.EVENT_CONDITION_FACTORY); public static final Registry> PLAYER_SELECTOR_FACTORY = createRegistry(Registries.PLAYER_SELECTOR_FACTORY); public static final Registry EQUIPMENT_FACTORY = createRegistry(Registries.EQUIPMENT_FACTORY); + public static final Registry SLOT_DISPLAY = createRegistry(Registries.SLOT_DISPLAY); + public static final Registry RECIPE_DISPLAY_TYPE = createRegistry(Registries.RECIPE_DISPLAY_TYPE); private static Registry createRegistry(ResourceKey> key) { return new MappedRegistry<>(key); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index 219617529..37897fbcd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -8,6 +8,8 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; import net.momirealms.craftengine.core.item.equipment.EquipmentFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplay; +import net.momirealms.craftengine.core.item.recipe.network.display.SlotDisplay; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; @@ -71,4 +73,6 @@ public class Registries { public static final ResourceKey>> EVENT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("event_condition_factory")); public static final ResourceKey>> PLAYER_SELECTOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_selector_factory")); public static final ResourceKey> EQUIPMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("equipment_factory")); + public static final ResourceKey> SLOT_DISPLAY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display")); + public static final ResourceKey> RECIPE_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type")); }