From e60a818331ccfa45862b8b8c7aa87c93f2b26ebd Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 19 May 2025 16:52:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=84=E9=80=A0=E6=8A=BD=E8=B1=A1=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=89=A9=E5=93=81=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitCustomItem.java | 122 ++--------------- .../bukkit/item/BukkitItemManager.java | 6 +- .../core/item/AbstractCustomItem.java | 128 ++++++++++++++++++ .../core/item/AbstractItemManager.java | 4 +- .../craftengine/core/loot/LootTable.java | 1 - .../parameter/DirectContextParameters.java | 1 + .../parameter/ItemParameterProvider.java | 1 + 7 files changed, 144 insertions(+), 119 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java 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 7e2559198..a0438f38c 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,6 +1,5 @@ package net.momirealms.craftengine.bukkit.item; -import com.google.common.collect.ImmutableMap; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.item.*; @@ -13,113 +12,19 @@ import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.util.Key; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import java.util.*; -public class BukkitCustomItem implements CustomItem { - private final Holder id; - private final Key materialKey; +public class BukkitCustomItem extends AbstractCustomItem { private final Material material; - private final ItemDataModifier[] modifiers; - private final Map> modifierMap; - private final ItemDataModifier[] clientBoundModifiers; - private final Map> clientBoundModifierMap; - private final NetworkItemDataProcessor[] networkItemDataProcessors; - private final List behaviors; - private final ItemSettings settings; - private final EnumMap>> events; - @SuppressWarnings("unchecked") - public BukkitCustomItem(Holder id, - Key materialKey, - Material material, - List> modifiers, - List> clientBoundModifiers, + public BukkitCustomItem(Holder id, Key materialKey, Material material, List behaviors, + List> modifiers, List> clientBoundModifiers, ItemSettings settings, EnumMap>> events) { - this.id = id; + super(id, materialKey, behaviors, modifiers, clientBoundModifiers, settings, events); this.material = material; - this.materialKey = materialKey; - this.events = events; - // unchecked cast - this.modifiers = modifiers.toArray(new ItemDataModifier[0]); - // unchecked cast - this.clientBoundModifiers = clientBoundModifiers.toArray(new ItemDataModifier[0]); - this.behaviors = List.copyOf(behaviors); - this.settings = settings; - ImmutableMap.Builder> modifierMapBuilder = ImmutableMap.builder(); - for (ItemDataModifier modifier : modifiers) { - modifierMapBuilder.put(modifier.name(), modifier); - } - this.modifierMap = modifierMapBuilder.build(); - ImmutableMap.Builder> clientSideModifierMapBuilder = ImmutableMap.builder(); - List> networkItemDataProcessors = new ArrayList<>(); - for (ItemDataModifier modifier : clientBoundModifiers) { - String name = modifier.name(); - clientSideModifierMapBuilder.put(name, modifier); - if (this.modifierMap.containsKey(name)) { - networkItemDataProcessors.add(NetworkItemDataProcessor.both(this.modifierMap.get(name), modifier)); - } else { - networkItemDataProcessors.add(NetworkItemDataProcessor.clientOnly(modifier)); - } - } - this.clientBoundModifierMap = clientSideModifierMapBuilder.build(); - // unchecked cast - this.networkItemDataProcessors = networkItemDataProcessors.toArray(new NetworkItemDataProcessor[0]); - } - - @Override - public void execute(PlayerOptionalContext context, EventTrigger trigger) { - for (Function function : Optional.ofNullable(this.events.get(trigger)).orElse(Collections.emptyList())) { - function.run(context); - } - } - - @Override - public Key id() { - return this.id.value(); - } - - @Override - public Holder idHolder() { - return this.id; - } - - @Override - public Key material() { - return this.materialKey; - } - - @Override - public NetworkItemDataProcessor[] networkItemDataProcessors() { - return this.networkItemDataProcessors; - } - - @Override - public ItemDataModifier[] dataModifiers() { - return this.modifiers; - } - - @Override - public Map> dataModifierMap() { - return this.modifierMap; - } - - @Override - public boolean hasClientBoundDataModifier() { - return this.clientBoundModifiers.length != 0; - } - - @Override - public ItemDataModifier[] clientBoundDataModifiers() { - return this.clientBoundModifiers; - } - - @Override - public Map> clientBoundDataModifierMap() { - return this.clientBoundModifierMap; } @Override @@ -133,11 +38,6 @@ public class BukkitCustomItem implements CustomItem { return wrapped.load(); } - @Override - public ItemSettings settings() { - return this.settings; - } - @Override public Item buildItem(ItemBuildContext context) { ItemStack item = new ItemStack(this.material); @@ -148,11 +48,6 @@ public class BukkitCustomItem implements CustomItem { return BukkitCraftEngine.instance().itemManager().wrap(wrapped.load()); } - @Override - public @NotNull List behaviors() { - return this.behaviors; - } - public static Builder builder(Material material) { return new BuilderImpl(material); } @@ -162,9 +57,9 @@ public class BukkitCustomItem implements CustomItem { private Key materialKey; private final Material material; private final EnumMap>> events = new EnumMap<>(EventTrigger.class); - private final List behaviors = new ArrayList<>(); - private final List> modifiers = new ArrayList<>(); - private final List> clientBoundModifiers = new ArrayList<>(); + 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) { @@ -235,7 +130,8 @@ public class BukkitCustomItem implements CustomItem { @Override public CustomItem build() { this.modifiers.addAll(this.settings.modifiers()); - return new BukkitCustomItem(this.id, this.materialKey, this.material, List.copyOf(this.modifiers), List.copyOf(this.clientBoundModifiers), List.copyOf(this.behaviors), this.settings, this.events); + return new BukkitCustomItem(this.id, this.materialKey, this.material, 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 175a35013..57fa33974 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 @@ -193,7 +193,7 @@ public class BukkitItemManager extends AbstractItemManager { @Override public Item createWrappedItem(Key id, @Nullable Player player) { - return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItem(player)).orElseGet(() -> { + return Optional.ofNullable(this.customItems.get(id)).map(it -> it.buildItem(player)).orElseGet(() -> { ItemStack itemStack = createVanillaItemStack(id); return wrap(itemStack); }); @@ -219,9 +219,9 @@ public class BukkitItemManager extends AbstractItemManager { } @Override - protected CustomItem.Builder createPlatformItemBuilder(Key materialId) { + protected CustomItem.Builder createPlatformItemBuilder(Holder id, Key materialId) { Material material = ResourceConfigUtils.requireNonNullOrThrow(Registry.MATERIAL.get(KeyUtils.toNamespacedKey(materialId)), () -> new LocalizedResourceConfigException("warning.config.item.invalid_material", materialId.toString())); - return BukkitCustomItem.builder(material); + return BukkitCustomItem.builder(material).material(materialId).id(id); } @SuppressWarnings("unchecked") diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java new file mode 100644 index 000000000..7d88df3ad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java @@ -0,0 +1,128 @@ +package net.momirealms.craftengine.core.item; + +import com.google.common.collect.ImmutableMap; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.function.Function; +import net.momirealms.craftengine.core.plugin.event.EventTrigger; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public abstract class AbstractCustomItem implements CustomItem { + protected final Holder id; + protected final Key material; + protected final ItemDataModifier[] modifiers; + protected final Map> modifierMap; + protected final ItemDataModifier[] clientBoundModifiers; + protected final Map> clientBoundModifierMap; + protected final NetworkItemDataProcessor[] networkItemDataProcessors; + protected final List behaviors; + protected final ItemSettings settings; + protected final EnumMap>> events; + protected final Item base; + + @SuppressWarnings("unchecked") + public AbstractCustomItem(Holder id, Key material, + List behaviors, + List> modifiers, + List> clientBoundModifiers, + ItemSettings settings, + EnumMap>> events) { + this.id = id; + this.material = material; + this.events = events; + // unchecked cast + this.modifiers = modifiers.toArray(new ItemDataModifier[0]); + // unchecked cast + this.clientBoundModifiers = clientBoundModifiers.toArray(new ItemDataModifier[0]); + this.behaviors = List.copyOf(behaviors); + this.settings = settings; + ImmutableMap.Builder> modifierMapBuilder = ImmutableMap.builder(); + for (ItemDataModifier modifier : modifiers) { + modifierMapBuilder.put(modifier.name(), modifier); + } + this.modifierMap = modifierMapBuilder.build(); + ImmutableMap.Builder> clientSideModifierMapBuilder = ImmutableMap.builder(); + List> networkItemDataProcessors = new ArrayList<>(); + for (ItemDataModifier modifier : clientBoundModifiers) { + String name = modifier.name(); + clientSideModifierMapBuilder.put(name, modifier); + if (this.modifierMap.containsKey(name)) { + networkItemDataProcessors.add(NetworkItemDataProcessor.both(this.modifierMap.get(name), modifier)); + } else { + networkItemDataProcessors.add(NetworkItemDataProcessor.clientOnly(modifier)); + } + } + this.clientBoundModifierMap = clientSideModifierMapBuilder.build(); + // unchecked cast + this.networkItemDataProcessors = networkItemDataProcessors.toArray(new NetworkItemDataProcessor[0]); + this.base = (Item) CraftEngine.instance().itemManager().wrap(CraftEngine.instance().itemManager().getVanillaItem(material).get().buildItemStack()); + } + + @Override + public void execute(PlayerOptionalContext context, EventTrigger trigger) { + for (Function function : Optional.ofNullable(this.events.get(trigger)).orElse(Collections.emptyList())) { + function.run(context); + } + } + + @Override + public Key id() { + return this.id.value(); + } + + @Override + public Holder idHolder() { + return this.id; + } + + @Override + public Key material() { + return this.material; + } + + @Override + public NetworkItemDataProcessor[] networkItemDataProcessors() { + return this.networkItemDataProcessors; + } + + @Override + public ItemDataModifier[] dataModifiers() { + return this.modifiers; + } + + @Override + public Map> dataModifierMap() { + return this.modifierMap; + } + + @Override + public boolean hasClientBoundDataModifier() { + return this.clientBoundModifiers.length != 0; + } + + @Override + public ItemDataModifier[] clientBoundDataModifiers() { + return this.clientBoundModifiers; + } + + @Override + public Map> clientBoundDataModifierMap() { + return this.clientBoundModifierMap; + } + + @Override + public ItemSettings settings() { + return this.settings; + } + + @Override + public @NotNull List behaviors() { + return this.behaviors; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index ab3693dda..2d746bd2b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -254,7 +254,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return VANILLA_ITEMS.contains(item); } - protected abstract CustomItem.Builder createPlatformItemBuilder(Key material); + protected abstract CustomItem.Builder createPlatformItemBuilder(Holder id, Key material); public class ItemParser implements ConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[] {"items", "item"}; @@ -302,7 +302,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl Key itemModelKey = null; - CustomItem.Builder itemBuilder = createPlatformItemBuilder(material).id(holder); + CustomItem.Builder itemBuilder = createPlatformItemBuilder(holder, material); boolean hasItemModelSection = section.containsKey("item-model"); // To get at least one model provider diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java index 3ea626c53..32d744ba0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -127,7 +127,6 @@ public class LootTable { } } - // TODO https://mo-mi.gitbook.io/xiaomomi-plugins/craftengine/plugin-wiki/craftengine/loot-system/flat-format public static LootPool readFlatFormatLootPool(String pool) { return null; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java index 151b69866..798c8e53d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java @@ -57,5 +57,6 @@ public final class DirectContextParameters { public static final ContextKey IS_FLYING = ContextKey.direct("is_flying"); public static final ContextKey IS_SNEAKING = ContextKey.direct("is_sneaking"); public static final ContextKey IS_CUSTOM = ContextKey.direct("is_custom"); + public static final ContextKey IS_BLOCK_ITEM = ContextKey.direct("is_block_item"); public static final ContextKey GAMEMODE = ContextKey.direct("gamemode"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java index a4709072f..f9d4617f6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java @@ -15,6 +15,7 @@ public class ItemParameterProvider implements ChainParameterProvider> { CONTEXT_FUNCTIONS.put(DirectContextParameters.ID, Item::id); CONTEXT_FUNCTIONS.put(DirectContextParameters.CUSTOM_MODEL_DATA, i -> i.customModelData().orElse(null)); CONTEXT_FUNCTIONS.put(DirectContextParameters.IS_CUSTOM, Item::isCustomItem); + CONTEXT_FUNCTIONS.put(DirectContextParameters.IS_BLOCK_ITEM, Item::isBlockItem); } @SuppressWarnings("unchecked")