From f0842bddb586998b628742b0b57a14f514f50265 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 10 Jul 2025 01:51:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E6=96=B9=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E5=8C=85=E6=89=80=E9=9C=80=E7=9A=84=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitItemManager.java | 16 +++-- .../craftengine/core/item/ItemManager.java | 5 ++ .../network/display/FurnaceRecipeDisplay.java | 28 ++++++++ .../network/display/RecipeDisplays.java | 30 +++++++++ .../display/ShapedCraftingRecipeDisplay.java | 15 +++-- .../ShapelessCraftingRecipeDisplay.java | 24 +++++++ .../recipe/network/display/SlotDisplay.java | 8 --- .../display/SmithingRecipeDisplay.java | 28 ++++++++ .../display/StonecutterRecipeDisplay.java | 28 ++++++++ .../network/display/slot/AnyFuelDisplay.java | 15 +++++ .../display/slot/CompositeSlotDisplay.java | 28 ++++++++ .../display/slot/EmptySlotDisplay.java | 15 +++++ .../network/display/slot/ItemSlotDisplay.java | 25 ++++++++ .../display/slot/ItemStackSlotDisplay.java | 28 ++++++++ .../network/display/slot/SlotDisplay.java | 22 +++++++ .../network/display/slot/SlotDisplays.java | 36 +++++++++++ .../slot/SmithingTrimDemoSlotDisplay.java | 64 +++++++++++++++++++ .../network/display/slot/TagSlotDisplay.java | 21 ++++++ .../slot/WithRemainderSlotDisplay.java | 25 ++++++++ .../craftengine/core/plugin/CraftEngine.java | 4 ++ .../core/registry/BuiltInRegistries.java | 4 +- .../craftengine/core/registry/Registries.java | 4 +- .../core/util/FriendlyByteBuf.java | 17 +++++ 23 files changed, 470 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/FurnaceRecipeDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplays.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapelessCraftingRecipeDisplay.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SmithingRecipeDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/StonecutterRecipeDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/AnyFuelDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/CompositeSlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/EmptySlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemSlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemStackSlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplays.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SmithingTrimDemoSlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/TagSlotDisplay.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/WithRemainderSlotDisplay.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 59648daf9..4e222efdc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -28,10 +28,7 @@ import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; -import net.momirealms.craftengine.core.util.GsonHelper; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.ResourceKey; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -83,6 +80,17 @@ public class BukkitItemManager extends AbstractItemManager { Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.javaPlugin()); } + @Override + public Item decode(FriendlyByteBuf byteBuf) { + Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf); + return this.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf)); + } + + @Override + public void encode(FriendlyByteBuf byteBuf, Item item) { + FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf), item.getItem()); + } + @Override public NetworkItemHandler networkItemHandler() { return this.networkItemHandler; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index 6033ad68f..bc44c0b78 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.Key; import org.incendo.cloud.suggestion.Suggestion; import org.jetbrains.annotations.Nullable; @@ -92,4 +93,8 @@ public interface ItemManager extends Manageable, ModelGenerator { Collection cachedTotemSuggestions(); boolean isVanillaItem(Key item); + + Item decode(FriendlyByteBuf byteBuf); + + void encode(FriendlyByteBuf byteBuf, Item item); } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/FurnaceRecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/FurnaceRecipeDisplay.java new file mode 100644 index 000000000..95995e8b2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/FurnaceRecipeDisplay.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public record FurnaceRecipeDisplay(SlotDisplay ingredient, SlotDisplay result, SlotDisplay craftingStation, int duration, float experience) implements RecipeDisplay { + + public static FurnaceRecipeDisplay read(FriendlyByteBuf buffer) { + SlotDisplay ingredient = SlotDisplay.read(buffer); + SlotDisplay result = SlotDisplay.read(buffer); + SlotDisplay craftingStation = SlotDisplay.read(buffer); + int duration = buffer.readVarInt(); + float experience = buffer.readFloat(); + return new FurnaceRecipeDisplay(ingredient, result, craftingStation, duration, experience); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.ingredient.write(buf); + this.result.write(buf); + this.craftingStation.write(buf); + buf.writeVarInt(this.duration); + buf.writeFloat(this.experience); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplays.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplays.java new file mode 100644 index 000000000..94d14b958 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/RecipeDisplays.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public final class RecipeDisplays { + public static final Key CRAFTING_SHAPELESS = Key.of("crafting_shapeless"); + public static final Key CRAFTING_SHAPED = Key.of("crafting_shaped"); + public static final Key FURNACE = Key.of("furnace"); + public static final Key STONECUTTER = Key.of("stonecutter"); + public static final Key SMITHING = Key.of("smithing"); + + public static void register() { + register(CRAFTING_SHAPELESS, new RecipeDisplay.Type(ShapelessCraftingRecipeDisplay::read)); + register(CRAFTING_SHAPED, new RecipeDisplay.Type(ShapedCraftingRecipeDisplay::read)); + register(FURNACE, new RecipeDisplay.Type(FurnaceRecipeDisplay::read)); + register(STONECUTTER, new RecipeDisplay.Type(SmithingRecipeDisplay::read)); + register(SMITHING, new RecipeDisplay.Type(SmithingRecipeDisplay::read)); + } + + public static void register(Key key, RecipeDisplay.Type type) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RECIPE_DISPLAY_TYPE) + .registerForHolder(new ResourceKey<>(Registries.RECIPE_DISPLAY_TYPE.location(), key)); + holder.bindValue(type); + } +} 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 index 2afe25cdf..16a129674 100644 --- 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 @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.item.recipe.network.display; +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay; +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplays; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.util.FriendlyByteBuf; @@ -11,13 +13,18 @@ public record ShapedCraftingRecipeDisplay(int width, int height, List ingredients = buffer.readCollection(ArrayList::new, friendlyByteBuf -> friendlyByteBuf.readById(BuiltInRegistries.SLOT_DISPLAY)); - return null; + List ingredients = buffer.readCollection(ArrayList::new, SlotDisplay::read); + SlotDisplay result = SlotDisplay.read(buffer); + SlotDisplay craftingStation = SlotDisplay.read(buffer); + return new ShapedCraftingRecipeDisplay(width, height, ingredients, result, craftingStation); } @Override public void write(FriendlyByteBuf buf) { - + buf.writeVarInt(this.width); + buf.writeVarInt(this.height); + buf.writeCollection(this.ingredients, (byteBuf, slotDisplay) -> slotDisplay.write(buf)); + this.result.write(buf); + this.craftingStation.write(buf); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapelessCraftingRecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapelessCraftingRecipeDisplay.java new file mode 100644 index 000000000..a344b1815 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/ShapelessCraftingRecipeDisplay.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public record ShapelessCraftingRecipeDisplay(List ingredients, SlotDisplay result, SlotDisplay craftingStation) implements RecipeDisplay { + + public static ShapelessCraftingRecipeDisplay read(FriendlyByteBuf buffer) { + List ingredients = buffer.readCollection(ArrayList::new, SlotDisplay::read); + SlotDisplay result = SlotDisplay.read(buffer); + SlotDisplay craftingStation = SlotDisplay.read(buffer); + return new ShapelessCraftingRecipeDisplay(ingredients, result, craftingStation); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeCollection(this.ingredients, (byteBuf, slotDisplay) -> slotDisplay.write(buf)); + this.result.write(buf); + this.craftingStation.write(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 deleted file mode 100644 index 196ea53ce..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SlotDisplay.java +++ /dev/null @@ -1,8 +0,0 @@ -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/item/recipe/network/display/SmithingRecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SmithingRecipeDisplay.java new file mode 100644 index 000000000..2fb29df2a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/SmithingRecipeDisplay.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public record SmithingRecipeDisplay(SlotDisplay template, SlotDisplay base, SlotDisplay addition, SlotDisplay result, SlotDisplay craftingStation) implements RecipeDisplay { + + public static SmithingRecipeDisplay read(FriendlyByteBuf buffer) { + SlotDisplay template = SlotDisplay.read(buffer); + SlotDisplay base = SlotDisplay.read(buffer); + SlotDisplay addition = SlotDisplay.read(buffer); + SlotDisplay result = SlotDisplay.read(buffer); + SlotDisplay craftingStation = SlotDisplay.read(buffer); + return new SmithingRecipeDisplay(template, base, addition, result, craftingStation); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.template.write(buf); + this.base.write(buf); + this.addition.write(buf); + this.result.write(buf); + this.craftingStation.write(buf); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/StonecutterRecipeDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/StonecutterRecipeDisplay.java new file mode 100644 index 000000000..2fb29df2a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/StonecutterRecipeDisplay.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.recipe.network.display; + +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplay; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public record SmithingRecipeDisplay(SlotDisplay template, SlotDisplay base, SlotDisplay addition, SlotDisplay result, SlotDisplay craftingStation) implements RecipeDisplay { + + public static SmithingRecipeDisplay read(FriendlyByteBuf buffer) { + SlotDisplay template = SlotDisplay.read(buffer); + SlotDisplay base = SlotDisplay.read(buffer); + SlotDisplay addition = SlotDisplay.read(buffer); + SlotDisplay result = SlotDisplay.read(buffer); + SlotDisplay craftingStation = SlotDisplay.read(buffer); + return new SmithingRecipeDisplay(template, base, addition, result, craftingStation); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.template.write(buf); + this.base.write(buf); + this.addition.write(buf); + this.result.write(buf); + this.craftingStation.write(buf); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/AnyFuelDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/AnyFuelDisplay.java new file mode 100644 index 000000000..ad1e3ea31 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/AnyFuelDisplay.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class AnyFuelDisplay implements SlotDisplay { + public static final AnyFuelDisplay INSTANCE = new AnyFuelDisplay(); + + public static AnyFuelDisplay read(FriendlyByteBuf buf) { + return INSTANCE; + } + + @Override + public void write(FriendlyByteBuf buf) { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/CompositeSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/CompositeSlotDisplay.java new file mode 100644 index 000000000..5b09ea544 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/CompositeSlotDisplay.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.List; + +public class CompositeSlotDisplay implements SlotDisplay { + private final List slots; + + public CompositeSlotDisplay(List slots) { + this.slots = slots; + } + + public static CompositeSlotDisplay read(FriendlyByteBuf buf) { + List slots = buf.readCollection(ArrayList::new, SlotDisplay::read); + return new CompositeSlotDisplay(slots); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeCollection(this.slots, (byteBuf, slotDisplay) -> slotDisplay.write(buf)); + } + + public List slots() { + return this.slots; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/EmptySlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/EmptySlotDisplay.java new file mode 100644 index 000000000..61580f8a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/EmptySlotDisplay.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class EmptySlotDisplay implements SlotDisplay { + public static final EmptySlotDisplay INSTANCE = new EmptySlotDisplay(); + + public static EmptySlotDisplay read(FriendlyByteBuf buf) { + return INSTANCE; + } + + @Override + public void write(FriendlyByteBuf buf) { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemSlotDisplay.java new file mode 100644 index 000000000..37366ccb1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemSlotDisplay.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class ItemSlotDisplay implements SlotDisplay { + private final int item; + + public ItemSlotDisplay(int item) { + this.item = item; + } + + public static ItemSlotDisplay read(FriendlyByteBuf buf) { + int item = buf.readVarInt(); + return new ItemSlotDisplay(item); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeVarInt(this.item); + } + + public int item() { + return item; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemStackSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemStackSlotDisplay.java new file mode 100644 index 000000000..a40250f71 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/ItemStackSlotDisplay.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class ItemStackSlotDisplay implements SlotDisplay { + private final Item item; + + public ItemStackSlotDisplay(Item item) { + this.item = item; + } + + public static ItemStackSlotDisplay read(FriendlyByteBuf buf) { + Item itemStack = CraftEngine.instance().itemManager().decode(buf); + return new ItemStackSlotDisplay(itemStack); + } + + @SuppressWarnings("unchecked") + @Override + public void write(FriendlyByteBuf buf) { + CraftEngine.instance().itemManager().encode(buf, (Item) this.item); + } + + public Item item() { + return item; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplay.java new file mode 100644 index 000000000..da629bafa --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplay.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.function.Function; + +public interface SlotDisplay { + + void write(FriendlyByteBuf buf); + + static SlotDisplay read(FriendlyByteBuf buf) { + return buf.readById(BuiltInRegistries.SLOT_DISPLAY_TYPE).read(buf); + } + + record Type(Function reader) { + + public SlotDisplay read(final FriendlyByteBuf buf) { + return this.reader.apply(buf); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplays.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplays.java new file mode 100644 index 000000000..b7928c4d5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SlotDisplays.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public final class SlotDisplays { + public static final Key EMPTY = Key.of("empty"); + public static final Key ANY_FUEL = Key.of("any_fuel"); + public static final Key ITEM = Key.of("item"); + public static final Key ITEM_STACK = Key.of("item_stack"); + public static final Key TAG = Key.of("tag"); + public static final Key SMITHING_TRIM = Key.of("smithing_trim"); + public static final Key WITH_REMAINDER = Key.of("with_remainder"); + public static final Key COMPOSITE = Key.of("composite"); + + public static void register() { + register(EMPTY, new SlotDisplay.Type(EmptySlotDisplay::read)); + register(ANY_FUEL, new SlotDisplay.Type(AnyFuelDisplay::read)); + register(ITEM, new SlotDisplay.Type(ItemSlotDisplay::read)); + register(ITEM_STACK, new SlotDisplay.Type(ItemStackSlotDisplay::read)); + register(TAG, new SlotDisplay.Type(TagSlotDisplay::read)); + register(SMITHING_TRIM, new SlotDisplay.Type(SmithingTrimDemoSlotDisplay::read)); + register(WITH_REMAINDER, new SlotDisplay.Type(WithRemainderSlotDisplay::read)); + register(COMPOSITE, new SlotDisplay.Type(CompositeSlotDisplay::read)); + } + + public static void register(Key key, SlotDisplay.Type type) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SLOT_DISPLAY_TYPE) + .registerForHolder(new ResourceKey<>(Registries.SLOT_DISPLAY_TYPE.location(), key)); + holder.bindValue(type); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SmithingTrimDemoSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SmithingTrimDemoSlotDisplay.java new file mode 100644 index 000000000..cfc72cd7c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/SmithingTrimDemoSlotDisplay.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import com.mojang.datafixers.util.Either; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; + +public class SmithingTrimDemoSlotDisplay implements SlotDisplay { + private final SlotDisplay base; + private final SlotDisplay material; + // 1.21.2-1.21.4 + private SlotDisplay trimPattern; + // 1.21.5 + private Either either; + + public SmithingTrimDemoSlotDisplay(SlotDisplay base, SlotDisplay material, SlotDisplay trimPattern) { + this.base = base; + this.material = material; + this.trimPattern = trimPattern; + } + + public SmithingTrimDemoSlotDisplay(SlotDisplay base, SlotDisplay material, Either either) { + this.base = base; + this.either = either; + this.material = material; + } + + public static SmithingTrimDemoSlotDisplay read(FriendlyByteBuf buf) { + SlotDisplay base = SlotDisplay.read(buf); + SlotDisplay material = SlotDisplay.read(buf); + if (VersionHelper.isOrAbove1_21_5()) { + Either either = buf.readHolder(byteBuf -> { + Key assetId = buf.readKey(); + Component component = AdventureHelper.nbtToComponent(buf.readNbt(false)); + boolean decal = buf.readBoolean(); + return new TrimPattern(assetId, component, decal); + }); + return new SmithingTrimDemoSlotDisplay(base, material, either); + } else { + SlotDisplay trimPattern = SlotDisplay.read(buf); + return new SmithingTrimDemoSlotDisplay(base, material, trimPattern); + } + } + + @Override + public void write(FriendlyByteBuf buf) { + this.base.write(buf); + this.material.write(buf); + if (VersionHelper.isOrAbove1_21_5()) { + buf.writeHolder(this.either, (byteBuf, pattern) -> { + byteBuf.writeKey(pattern.assetId); + byteBuf.writeNbt(AdventureHelper.componentToNbt(pattern.description), false); + byteBuf.writeBoolean(pattern.decal); + }); + } else { + this.trimPattern.write(buf); + } + } + + public record TrimPattern(Key assetId, Component description, boolean decal) { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/TagSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/TagSlotDisplay.java new file mode 100644 index 000000000..26753bee7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/TagSlotDisplay.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.Key; + +public class TagSlotDisplay implements SlotDisplay { + private final Key tag; + + public TagSlotDisplay(Key tag) { + this.tag = tag; + } + + public static TagSlotDisplay read(FriendlyByteBuf buf) { + return new TagSlotDisplay(buf.readKey()); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeKey(this.tag); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/WithRemainderSlotDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/WithRemainderSlotDisplay.java new file mode 100644 index 000000000..a5eeb4086 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/display/slot/WithRemainderSlotDisplay.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.recipe.network.display.slot; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class WithRemainderSlotDisplay implements SlotDisplay { + private final SlotDisplay input; + private final SlotDisplay remainder; + + public WithRemainderSlotDisplay(SlotDisplay input, SlotDisplay remainder) { + this.input = input; + this.remainder = remainder; + } + + public static WithRemainderSlotDisplay read(FriendlyByteBuf buf) { + SlotDisplay input = SlotDisplay.read(buf); + SlotDisplay remainder = SlotDisplay.read(buf); + return new WithRemainderSlotDisplay(input, remainder); + } + + @Override + public void write(FriendlyByteBuf buf) { + this.input.write(buf); + this.remainder.write(buf); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 1b46513f7..288864ba3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -7,6 +7,8 @@ import net.momirealms.craftengine.core.entity.projectile.ProjectileManager; import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.item.recipe.RecipeManager; +import net.momirealms.craftengine.core.item.recipe.network.display.RecipeDisplays; +import net.momirealms.craftengine.core.item.recipe.network.display.slot.SlotDisplays; import net.momirealms.craftengine.core.loot.VanillaLootManager; import net.momirealms.craftengine.core.pack.PackManager; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; @@ -93,6 +95,8 @@ public abstract class CraftEngine implements Plugin { } protected void onPluginLoad() { + RecipeDisplays.register(); + SlotDisplays.register(); ((Logger) LogManager.getRootLogger()).addFilter(new LogFilter()); ((Logger) LogManager.getRootLogger()).addFilter(new DisconnectLogFilter()); } 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 a4df3b644..a400b032a 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 @@ -9,7 +9,7 @@ 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.item.recipe.network.display.slot.SlotDisplay; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; @@ -72,7 +72,7 @@ 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 SLOT_DISPLAY_TYPE = createRegistry(Registries.SLOT_DISPLAY_TYPE); public static final Registry RECIPE_DISPLAY_TYPE = createRegistry(Registries.RECIPE_DISPLAY_TYPE); private static Registry createRegistry(ResourceKey> 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 37897fbcd..e957cfb3f 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 @@ -9,7 +9,7 @@ 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.item.recipe.network.display.slot.SlotDisplay; import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; @@ -73,6 +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> SLOT_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display_type")); public static final ResourceKey> RECIPE_DISPLAY_TYPE = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type")); } 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 244858169..1629fda95 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 @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.util; import com.google.common.collect.Maps; +import com.mojang.datafixers.util.Either; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufInputStream; @@ -396,6 +397,22 @@ public class FriendlyByteBuf extends ByteBuf { return this; } + public Either readHolder(Reader reader) { + int id = this.readVarInt(); + if (id == 0) { + return Either.right(reader.apply(this)); + } else { + return Either.left(id - 1); + } + } + + public void writeHolder(Either holder, Writer writer) { + holder.ifLeft(i -> writeVarInt(i + 1)).ifRight(t -> { + writeVarInt(0); + writer.accept(this, t); + }); + } + public FriendlyByteBuf writeVarLong(long value) { while ((value & -128L) != 0L) { this.writeByte((int) (value & 127L) | 128);