From 0f6f5a5bef740bd63da8325697e7701878d1a180 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 13 Jun 2025 03:12:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=89=A9=E5=93=81=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BD=BF=E7=94=A8Bukkit=20?= =?UTF-8?q?ItemStack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitCustomItem.java | 53 ++++++++++++------- .../bukkit/item/BukkitItemManager.java | 16 ++++-- .../craftengine/core/item/CustomItem.java | 2 + 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java index 80b45ab79..7586e1919 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.bukkit.item; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; @@ -10,7 +10,6 @@ import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; -import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -19,22 +18,23 @@ import java.util.List; import java.util.Map; public class BukkitCustomItem extends AbstractCustomItem { - private final Material material; + private final Object item; + private final Object clientItem; - public BukkitCustomItem(Holder id, Material material, Key materialKey, Key clientBoundMaterialKey, + public BukkitCustomItem(Holder id, Object item, Object clientItem, Key materialKey, Key clientBoundMaterialKey, List behaviors, List> modifiers, List> clientBoundModifiers, ItemSettings settings, Map>> events) { super(id, materialKey, clientBoundMaterialKey, behaviors, modifiers, clientBoundModifiers, settings, events); - this.material = material; + this.item = item; + this.clientItem = clientItem; } @Override public ItemStack buildItemStack(ItemBuildContext context, int count) { - ItemStack item = new ItemStack(this.material); + ItemStack item = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.constructor$ItemStack(this.item, count)); Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); - wrapped.count(count); for (ItemDataModifier modifier : this.modifiers) { modifier.apply(wrapped, context); } @@ -43,7 +43,7 @@ public class BukkitCustomItem extends AbstractCustomItem { @Override public Item buildItem(ItemBuildContext context) { - ItemStack item = new ItemStack(this.material); + ItemStack item = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.constructor$ItemStack(this.item, 1)); Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); for (ItemDataModifier modifier : dataModifiers()) { modifier.apply(wrapped, context); @@ -51,24 +51,33 @@ public class BukkitCustomItem extends AbstractCustomItem { return BukkitCraftEngine.instance().itemManager().wrap(wrapped.load()); } - public static Builder builder(Material material) { - return new BuilderImpl(material); + public Object clientItem() { + return clientItem; + } + + public Object item() { + return item; + } + + public static Builder builder(Object item, Object clientBoundItem) { + return new BuilderImpl(item, clientBoundItem); } public static class BuilderImpl implements Builder { private Holder id; - private final Key materialKey; - private final Material material; - private Key clientBoundMaterialKey; + private Key itemKey; + private final Object item; + private Key clientBoundItemKey; + private final Object clientBoundItem; private final Map>> events = new EnumMap<>(EventTrigger.class); private final List behaviors = new ArrayList<>(4); private final List> modifiers = new ArrayList<>(4); private final List> clientBoundModifiers = new ArrayList<>(4); private ItemSettings settings; - public BuilderImpl(Material material) { - this.material = material; - this.materialKey = KeyUtils.namespacedKey2Key(material.getKey()); + public BuilderImpl(Object item, Object clientBoundItem) { + this.item = item; + this.clientBoundItem = clientBoundItem; } @Override @@ -78,8 +87,14 @@ public class BukkitCustomItem extends AbstractCustomItem { } @Override - public Builder clientBoundMaterial(Key clientBoundMaterialKey) { - this.clientBoundMaterialKey = clientBoundMaterialKey; + public Builder clientBoundMaterial(Key clientBoundMaterial) { + this.clientBoundItemKey = clientBoundMaterial; + return this; + } + + @Override + public Builder material(Key material) { + this.itemKey = material; return this; } @@ -134,7 +149,7 @@ public class BukkitCustomItem extends AbstractCustomItem { @Override public CustomItem build() { this.modifiers.addAll(this.settings.modifiers()); - return new BukkitCustomItem(this.id, this.material, this.materialKey, this.clientBoundMaterialKey, List.copyOf(this.behaviors), + return new BukkitCustomItem(this.id, this.item, this.clientBoundItem, this.itemKey, this.clientBoundItemKey, List.copyOf(this.behaviors), List.copyOf(this.modifiers), List.copyOf(this.clientBoundModifiers), this.settings, this.events); } } 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 450cf2d45..a74547ea7 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 @@ -13,6 +13,7 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.entity.player.Player; @@ -201,11 +202,18 @@ public class BukkitItemManager extends AbstractItemManager { @Override protected CustomItem.Builder createPlatformItemBuilder(Holder id, Key materialId, Key clientBoundMaterialId) { - Material material = ResourceConfigUtils.requireNonNullOrThrow(Registry.MATERIAL.get(KeyUtils.toNamespacedKey(materialId)), () -> new LocalizedResourceConfigException("warning.config.item.invalid_material", materialId.toString())); - if (!clientBoundMaterialId.equals(materialId)) { - ResourceConfigUtils.requireNonNullOrThrow(Registry.MATERIAL.get(KeyUtils.toNamespacedKey(clientBoundMaterialId)), () -> new LocalizedResourceConfigException("warning.config.item.invalid_material", clientBoundMaterialId.toString())); + Object item = FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(materialId)); + Object clientBoundItem = materialId == clientBoundMaterialId ? item : FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(clientBoundMaterialId)); + if (item == null) { + throw new LocalizedResourceConfigException("warning.config.item.invalid_material", materialId.toString()); } - return BukkitCustomItem.builder(material).id(id).clientBoundMaterial(clientBoundMaterialId); + if (clientBoundItem == null) { + throw new LocalizedResourceConfigException("warning.config.item.invalid_material", clientBoundMaterialId.toString()); + } + return BukkitCustomItem.builder(item, clientBoundItem) + .id(id) + .material(materialId) + .clientBoundMaterial(clientBoundMaterialId); } @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java index 217b7066f..01512fa5a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -56,6 +56,8 @@ public interface CustomItem extends BuildableItem { Builder clientBoundMaterial(Key clientBoundMaterialKey); + Builder material(Key material); + Builder dataModifier(ItemDataModifier modifier); Builder dataModifiers(List> modifiers);