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 241646d22..80b45ab79 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 @@ -21,12 +21,12 @@ import java.util.Map; public class BukkitCustomItem extends AbstractCustomItem { private final Material material; - public BukkitCustomItem(Holder id, Key materialKey, Material material, + public BukkitCustomItem(Holder id, Material material, Key materialKey, Key clientBoundMaterialKey, List behaviors, List> modifiers, List> clientBoundModifiers, ItemSettings settings, Map>> events) { - super(id, materialKey, behaviors, modifiers, clientBoundModifiers, settings, events); + super(id, materialKey, clientBoundMaterialKey, behaviors, modifiers, clientBoundModifiers, settings, events); this.material = material; } @@ -57,8 +57,9 @@ public class BukkitCustomItem extends AbstractCustomItem { public static class BuilderImpl implements Builder { private Holder id; - private Key materialKey; + private final Key materialKey; private final Material material; + private Key clientBoundMaterialKey; private final Map>> events = new EnumMap<>(EventTrigger.class); private final List behaviors = new ArrayList<>(4); private final List> modifiers = new ArrayList<>(4); @@ -77,8 +78,8 @@ public class BukkitCustomItem extends AbstractCustomItem { } @Override - public Builder material(Key material) { - this.materialKey = material; + public Builder clientBoundMaterial(Key clientBoundMaterialKey) { + this.clientBoundMaterialKey = clientBoundMaterialKey; return this; } @@ -133,7 +134,7 @@ public class BukkitCustomItem extends AbstractCustomItem { @Override public CustomItem build() { this.modifiers.addAll(this.settings.modifiers()); - return new BukkitCustomItem(this.id, this.materialKey, this.material, List.copyOf(this.behaviors), + return new BukkitCustomItem(this.id, this.material, this.materialKey, this.clientBoundMaterialKey, 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 627e1071a..450cf2d45 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 @@ -200,9 +200,12 @@ public class BukkitItemManager extends AbstractItemManager { } @Override - protected CustomItem.Builder createPlatformItemBuilder(Holder id, Key materialId) { + 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())); - return BukkitCustomItem.builder(material).material(materialId).id(id); + if (!clientBoundMaterialId.equals(materialId)) { + ResourceConfigUtils.requireNonNullOrThrow(Registry.MATERIAL.get(KeyUtils.toNamespacedKey(clientBoundMaterialId)), () -> new LocalizedResourceConfigException("warning.config.item.invalid_material", clientBoundMaterialId.toString())); + } + return BukkitCustomItem.builder(material).id(id).clientBoundMaterial(clientBoundMaterialId); } @SuppressWarnings("unchecked") diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java index c325fcb4c..85a1a4ce8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -29,7 +29,20 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { @Override public Optional> c2s(Item wrapped) { - if (!wrapped.hasTag(NETWORK_ITEM_TAG)) return Optional.empty(); + Optional> optionalCustomItem = wrapped.getCustomItem(); + boolean hasDifferentMaterial = false; + if (optionalCustomItem.isPresent()) { + CustomItem customItem = optionalCustomItem.get(); + if (!customItem.material().equals(wrapped.vanillaId())) { + wrapped = wrapped.transmuteCopy(customItem.material()); + hasDifferentMaterial = true; + } + } + if (!wrapped.hasTag(NETWORK_ITEM_TAG)) { + if (hasDifferentMaterial) { + return Optional.of(wrapped); + } + } CompoundTag networkData = (CompoundTag) wrapped.getNBTTag(NETWORK_ITEM_TAG); if (networkData == null) return Optional.empty(); wrapped.removeTag(NETWORK_ITEM_TAG); @@ -46,12 +59,16 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) { if (!Config.interceptItem()) return Optional.empty(); - return new OtherItem(wrapped).process(); + return new OtherItem(wrapped, false).process(); } else { CustomItem customItem = optionalCustomItem.get(); + boolean hasDifferentMaterial = !wrapped.vanillaId().equals(customItem.clientBoundMaterial()); + if (hasDifferentMaterial) { + wrapped = wrapped.transmuteCopy(customItem.clientBoundMaterial()); + } if (!customItem.hasClientBoundDataModifier()) { - if (!Config.interceptItem()) return Optional.empty(); - return new OtherItem(wrapped).process(); + if (!Config.interceptItem() && !hasDifferentMaterial) return Optional.empty(); + return new OtherItem(wrapped, hasDifferentMaterial).process(); } else { CompoundTag tag = new CompoundTag(); Tag argumentTag = wrapped.getNBTTag(ArgumentModifier.ARGUMENTS_TAG); @@ -77,7 +94,12 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { processLore(wrapped, tag::put); } } - if (tag.isEmpty()) return Optional.empty(); + if (tag.isEmpty()) { + if (hasDifferentMaterial) { + return Optional.of(wrapped); + } + return Optional.empty(); + } wrapped.setTag(tag, NETWORK_ITEM_TAG); return Optional.of(wrapped); } @@ -130,9 +152,11 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { private final Item item; private boolean globalChanged = false; private CompoundTag networkTag; + private final boolean forceReturn; - public OtherItem(Item item) { + public OtherItem(Item item, boolean forceReturn) { this.item = item; + this.forceReturn = forceReturn; } public Optional> process() { @@ -145,6 +169,8 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { if (this.globalChanged) { this.item.setTag(this.networkTag, NETWORK_ITEM_TAG); return Optional.of(this.item); + } else if (this.forceReturn) { + return Optional.of(this.item); } else { return Optional.empty(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java index 353cf9d6f..460deddcd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -30,8 +30,22 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler> c2s(Item wrapped) { Tag customData = wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA); if (!(customData instanceof CompoundTag compoundTag)) return Optional.empty(); + Optional> optionalCustomItem = wrapped.getCustomItem(); + boolean hasDifferentMaterial = false; + if (optionalCustomItem.isPresent()) { + CustomItem customItem = optionalCustomItem.get(); + if (!customItem.material().equals(wrapped.vanillaId())) { + wrapped = wrapped.transmuteCopy(customItem.material()); + hasDifferentMaterial = true; + } + } CompoundTag networkData = compoundTag.getCompound(NETWORK_ITEM_TAG); - if (networkData == null) return Optional.empty(); + if (networkData == null) { + if (hasDifferentMaterial) { + return Optional.of(wrapped); + } + return Optional.empty(); + } compoundTag.remove(NETWORK_ITEM_TAG); for (Map.Entry entry : networkData.entrySet()) { if (entry.getValue() instanceof CompoundTag tag) { @@ -48,12 +62,16 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) { if (!Config.interceptItem()) return Optional.empty(); - return new OtherItem(wrapped).process(); + return new OtherItem(wrapped, false).process(); } else { CustomItem customItem = optionalCustomItem.get(); + boolean hasDifferentMaterial = !wrapped.vanillaId().equals(customItem.clientBoundMaterial()); + if (hasDifferentMaterial) { + wrapped = wrapped.transmuteCopy(customItem.clientBoundMaterial()); + } if (!customItem.hasClientBoundDataModifier()) { - if (!Config.interceptItem()) return Optional.empty(); - return new OtherItem(wrapped).process(); + if (!Config.interceptItem() && !hasDifferentMaterial) return Optional.empty(); + return new OtherItem(wrapped, hasDifferentMaterial).process(); } else { CompoundTag customData = Optional.ofNullable(wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag()); CompoundTag arguments = customData.getCompound(ArgumentModifier.ARGUMENTS_TAG); @@ -86,7 +104,10 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler tag); } } - if (tag.isEmpty()) return Optional.empty(); + if (tag.isEmpty()) { + if (hasDifferentMaterial) return Optional.of(wrapped); + return Optional.empty(); + } customData.put(NETWORK_ITEM_TAG, tag); wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, customData); return Optional.of(wrapped); @@ -203,11 +224,13 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler item; + private final boolean forceReturn; private boolean globalChanged = false; private CompoundTag tag; - public OtherItem(Item item) { + public OtherItem(Item item, boolean forceReturn) { this.item = item; + this.forceReturn = forceReturn; } public Optional> process() { @@ -231,6 +254,8 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler { // update wrapped item item1.update(); } + + @Override + protected LegacyItemWrapper transmuteCopy(LegacyItemWrapper item, Key newItem, int amount) { + Object newItemStack = FastNMS.INSTANCE.constructor$ItemStack(FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(newItem)), amount); + ItemObject.setCustomDataTag(newItemStack, TagCompound.clone(ItemObject.getCustomDataTag(item.getLiteralObject()))); + return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(newItemStack)), amount); + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index e13f6b558..a2bc98eee 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -791,6 +791,7 @@ public class RecipeEventListener implements Listener { return new Pair<>(first, second); } + // 不是完美的解决方案,仍然需要更多的探讨 @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onCraft(CraftItemEvent event) { org.bukkit.inventory.Recipe recipe = event.getRecipe(); 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 index e774f409a..06b87e5b2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java @@ -18,6 +18,7 @@ import java.util.Optional; public abstract class AbstractCustomItem implements CustomItem { protected final Holder id; protected final Key material; + protected final Key clientBoundMaterial; protected final ItemDataModifier[] modifiers; protected final Map> modifierMap; protected final ItemDataModifier[] clientBoundModifiers; @@ -27,7 +28,7 @@ public abstract class AbstractCustomItem implements CustomItem { protected final Map>> events; @SuppressWarnings("unchecked") - public AbstractCustomItem(Holder id, Key material, + public AbstractCustomItem(Holder id, Key material, Key clientBoundMaterial, List behaviors, List> modifiers, List> clientBoundModifiers, @@ -35,6 +36,7 @@ public abstract class AbstractCustomItem implements CustomItem { Map>> events) { this.id = id; this.material = material; + this.clientBoundMaterial = clientBoundMaterial; this.events = events; // unchecked cast this.modifiers = modifiers.toArray(new ItemDataModifier[0]); @@ -74,6 +76,11 @@ public abstract class AbstractCustomItem implements CustomItem { return this.material; } + @Override + public Key clientBoundMaterial() { + return this.clientBoundMaterial; + } + @Override public ItemDataModifier[] dataModifiers() { return this.modifiers; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index 6cd95e248..a0945a5ab 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -424,6 +424,11 @@ public class AbstractItem, I> implements Item { return new AbstractItem<>(this.factory, this.factory.mergeCopy(this.item, (W) ((AbstractItem) another).item)); } + @Override + public AbstractItem transmuteCopy(Key another, int count) { + return new AbstractItem<>(this.factory, this.factory.transmuteCopy(this.item, another, count)); + } + @SuppressWarnings({"unchecked", "rawtypes"}) @Override public void merge(Item another) { 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 0522776f5..39d2189ef 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 @@ -259,7 +259,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return VANILLA_ITEMS.contains(item); } - protected abstract CustomItem.Builder createPlatformItemBuilder(Holder id, Key material); + protected abstract CustomItem.Builder createPlatformItemBuilder(Holder id, Key material, Key clientBoundMaterial); public class ItemParser implements ConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[] {"items", "item"}; @@ -297,6 +297,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl boolean isVanillaItem = isVanillaItem(id); Key material = Key.from(isVanillaItem ? id.value() : ResourceConfigUtils.requireNonEmptyStringOrThrow(section.get("material"), "warning.config.item.missing_material").toLowerCase(Locale.ENGLISH)); + Key clientBoundMaterial = section.containsKey("client-bound-material") ? Key.from(section.get("client-bound-material").toString().toLowerCase(Locale.ENGLISH)) : material; int customModelData = ResourceConfigUtils.getAsInt(section.getOrDefault("custom-model-data", 0), "custom-model-data"); if (customModelData < 0) { throw new LocalizedResourceConfigException("warning.config.item.invalid_custom_model_data", String.valueOf(customModelData)); @@ -307,7 +308,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl Key itemModelKey = null; - CustomItem.Builder itemBuilder = createPlatformItemBuilder(holder, material); + CustomItem.Builder itemBuilder = createPlatformItemBuilder(holder, material, clientBoundMaterial); boolean hasItemModelSection = section.containsKey("item-model"); // To get at least one model provider @@ -392,7 +393,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl legacyOverridesModels = new TreeSet<>(legacyItemModel.overrides()); } else { legacyOverridesModels = new TreeSet<>(); - processModelRecursively(modernModel, new LinkedHashMap<>(), legacyOverridesModels, material, customModelData); + processModelRecursively(modernModel, new LinkedHashMap<>(), legacyOverridesModels, clientBoundMaterial, customModelData); if (legacyOverridesModels.isEmpty()) { TranslationManager.instance().log("warning.config.item.legacy_model.cannot_convert", path.toString(), id.asString()); } @@ -403,18 +404,18 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl if (customModelData != 0) { // use custom model data // check conflict - Map conflict = AbstractItemManager.this.cmdConflictChecker.computeIfAbsent(material, k -> new HashMap<>()); + Map conflict = AbstractItemManager.this.cmdConflictChecker.computeIfAbsent(clientBoundMaterial, k -> new HashMap<>()); if (conflict.containsKey(customModelData)) { throw new LocalizedResourceConfigException("warning.config.item.custom_model_data_conflict", String.valueOf(customModelData), conflict.get(customModelData).toString()); } conflict.put(customModelData, id); // Parse models if (isModernFormatRequired() && modernModel != null) { - TreeMap map = AbstractItemManager.this.modernOverrides.computeIfAbsent(material, k -> new TreeMap<>()); + TreeMap map = AbstractItemManager.this.modernOverrides.computeIfAbsent(clientBoundMaterial, k -> new TreeMap<>()); map.put(customModelData, modernModel); } if (needsLegacyCompatibility() && legacyOverridesModels != null && !legacyOverridesModels.isEmpty()) { - TreeSet lom = AbstractItemManager.this.legacyOverrides.computeIfAbsent(material, k -> new TreeSet<>()); + TreeSet lom = AbstractItemManager.this.legacyOverrides.computeIfAbsent(clientBoundMaterial, k -> new TreeSet<>()); lom.addAll(legacyOverridesModels); } } 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 89078fb27..217b7066f 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 @@ -9,6 +9,7 @@ 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.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -21,6 +22,8 @@ public interface CustomItem extends BuildableItem { Key material(); + Key clientBoundMaterial(); + ItemDataModifier[] dataModifiers(); Map> dataModifierMap(); @@ -51,7 +54,7 @@ public interface CustomItem extends BuildableItem { interface Builder { Builder id(Holder id); - Builder material(Key material); + Builder clientBoundMaterial(Key clientBoundMaterialKey); Builder dataModifier(ItemDataModifier modifier); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index 3943a7e5a..8953777a7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.item; import com.google.gson.JsonElement; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.util.Key; import net.momirealms.sparrow.nbt.Tag; @@ -178,7 +179,17 @@ public interface Item { Item mergeCopy(Item another); + Item transmuteCopy(Key another, int count); + + default Item transmuteCopy(Key another) { + return transmuteCopy(another, this.count()); + } + void merge(Item another); + default Item apply(ItemDataModifier modifier, ItemBuildContext context) { + return modifier.apply(this, context); + } + byte[] toByteArray(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java index 51384810d..4c19ce8ef 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -194,4 +194,6 @@ public abstract class ItemFactory, I> { protected abstract void setJsonComponent(W item, Object type, JsonElement value); protected abstract void setNBTComponent(W item, Object type, Tag value); + + protected abstract W transmuteCopy(W item, Key newItem, int amount); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java index 19b4f6af7..a3ec03e7d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java @@ -26,7 +26,7 @@ public class ArgumentModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { if (VersionHelper.isOrAbove1_20_5()) { CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getNBTComponent(ComponentKeys.CUSTOM_DATA)).orElse(new CompoundTag()); CompoundTag argumentTag = new CompoundTag(); @@ -42,5 +42,6 @@ public class ArgumentModifier implements ItemDataModifier { } item.setTag(processed, ARGUMENTS_TAG); } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java index 5c769b2bc..5fb24fa13 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java @@ -63,7 +63,7 @@ public class ComponentModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { for (Pair entry : this.arguments) { item.setComponent(entry.left(), entry.right()); } @@ -75,10 +75,11 @@ public class ComponentModifier implements ItemDataModifier { item.setComponent(ComponentKeys.CUSTOM_DATA, this.customData); } } + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { for (Pair entry : this.arguments) { Tag previous = item.getNBTComponent(entry.left()); if (previous != null) { @@ -87,5 +88,6 @@ public class ComponentModifier implements ItemDataModifier { networkData.put(entry.left().asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java index fb6ec08d1..9634a56c1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java @@ -21,12 +21,13 @@ public class CustomModelDataModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.customModelData(argument); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.CUSTOM_MODEL_DATA); if (previous != null) { @@ -42,5 +43,6 @@ public class CustomModelDataModifier implements ItemDataModifier { networkData.put("CustomModelData", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java index 6d72273dd..ae46ebae5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomNameModifier.java @@ -22,12 +22,13 @@ public class CustomNameModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.customNameComponent(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers())); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.CUSTOM_NAME); if (previous != null) { @@ -43,5 +44,6 @@ public class CustomNameModifier implements ItemDataModifier { networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DyedColorModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DyedColorModifier.java index 7b640c69a..d85b3133e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DyedColorModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DyedColorModifier.java @@ -21,12 +21,13 @@ public class DyedColorModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.dyedColor(this.color); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.DYED_COLOR); if (previous != null) { @@ -42,5 +43,6 @@ public class DyedColorModifier implements ItemDataModifier { networkData.put("display.color", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java index 60c57efb0..01e8d92be 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DynamicLoreModifier.java @@ -28,17 +28,18 @@ public class DynamicLoreModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { String displayContext = Optional.ofNullable(item.getJavaTag("craftengine:display_context")).orElse(this.defaultContext).toString(); List lore = this.displayContexts.get(displayContext); if (lore == null) { lore = this.displayContexts.get(this.defaultContext); } item.loreComponent(lore.stream().map(it -> AdventureHelper.miniMessage().deserialize(it, context.tagResolvers())).toList()); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.LORE); if (previous != null) { @@ -54,5 +55,6 @@ public class DynamicLoreModifier implements ItemDataModifier { networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java index 88a06c183..5c617a814 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java @@ -20,16 +20,17 @@ public class EnchantmentModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) { item.setStoredEnchantments(this.enchantments); } else { item.setEnchantments(this.enchantments); } + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.STORED_ENCHANTMENTS); @@ -63,5 +64,6 @@ public class EnchantmentModifier implements ItemDataModifier { } } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java index fd989e090..9851c1141 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java @@ -17,7 +17,8 @@ public class EquippableModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.equippable(this.data); + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java index 0cf95a6e1..95c52bd45 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java @@ -21,13 +21,14 @@ public class ExternalModifier implements ItemDataModifier { @SuppressWarnings("unchecked") @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { I another = this.provider.build(id, context); if (another == null) { CraftEngine.instance().logger().warn("'" + id + "' could not be found in " + provider.plugin()); - return; + return item; } Item anotherWrapped = (Item) CraftEngine.instance().itemManager().wrap(another); item.merge(anotherWrapped); + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/FoodModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/FoodModifier.java index 7f862f1cb..38fc4232b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/FoodModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/FoodModifier.java @@ -26,21 +26,23 @@ public class FoodModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.setJavaComponent(ComponentKeys.FOOD, Map.of( "nutrition", this.nutrition, "saturation", this.saturation, "can_always_eat", this.canAlwaysEat )); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { Tag previous = item.getNBTComponent(ComponentKeys.FOOD); if (previous != null) { networkData.put(ComponentKeys.FOOD.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); } else { networkData.put(ComponentKeys.FOOD.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java index e82c960dc..690236b87 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java @@ -18,7 +18,8 @@ public class IdModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.customId(this.argument); + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java index 73720c53a..2ffe87f59 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifier.java @@ -8,8 +8,9 @@ public interface ItemDataModifier { String name(); - void apply(Item item, ItemBuildContext context); + Item apply(Item item, ItemBuildContext context); - default void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + default Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java index 537ed5aee..0d4cea04d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java @@ -21,17 +21,19 @@ public class ItemModelModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.itemModel(this.data.toString()); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { Tag previous = item.getNBTComponent(ComponentKeys.ITEM_MODEL); if (previous != null) { networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); } else { networkData.put(ComponentKeys.ITEM_MODEL.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java index 081d11a75..0171474e1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java @@ -22,12 +22,13 @@ public class ItemNameModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.itemNameComponent(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers())); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.ITEM_NAME); if (previous != null) { @@ -43,5 +44,6 @@ public class ItemNameModifier implements ItemDataModifier { networkData.put("display.Name", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java index b8523edd2..2513d6f3a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java @@ -17,7 +17,8 @@ public class JukeboxSongModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.jukeboxSong(this.song); + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java index faeed738c..dd5816861 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java @@ -24,12 +24,13 @@ public class LoreModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.loreComponent(this.argument.stream().map(it -> AdventureHelper.miniMessage().deserialize(it, context.tagResolvers())).toList()); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.LORE); if (previous != null) { @@ -45,5 +46,6 @@ public class LoreModifier implements ItemDataModifier { networkData.put("display.Lore", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java index 90dbb508c..f6461e772 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/RemoveComponentModifier.java @@ -26,19 +26,21 @@ public class RemoveComponentModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { for (String argument : this.arguments) { item.removeComponent(argument); } + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { for (String component : this.arguments) { Tag previous = item.getNBTComponent(component); if (previous != null) { networkData.put(component, NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java index 582fce937..34aaa3ffa 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java @@ -28,17 +28,18 @@ public class TagsModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { for (Map.Entry entry : this.arguments.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); item.setTag(value, key); } + return item; } // TODO NOT PERFECT @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { for (Map.Entry entry : this.arguments.entrySet()) { Tag previous = item.getNBTTag(entry.getKey()); if (previous != null) { @@ -47,6 +48,7 @@ public class TagsModifier implements ItemDataModifier { networkData.put(entry.getKey(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } private static Map mapToMap(final Map source) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java index de060f05d..af066a977 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java @@ -21,17 +21,19 @@ public class TooltipStyleModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.tooltipStyle(argument.toString()); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { Tag previous = item.getNBTComponent(ComponentKeys.TOOLTIP_STYLE); if (previous != null) { networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); } else { networkData.put(ComponentKeys.TOOLTIP_STYLE.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java index 4d8a4facd..99ac6a9df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TrimModifier.java @@ -20,12 +20,13 @@ public class TrimModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.trim(new Trim(this.material, this.pattern)); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.TRIM); if (previous != null) { @@ -41,5 +42,6 @@ public class TrimModifier implements ItemDataModifier { networkData.put("Trim", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java index 34c58ed56..756152329 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java @@ -21,12 +21,13 @@ public class UnbreakableModifier implements ItemDataModifier { } @Override - public void apply(Item item, ItemBuildContext context) { + public Item apply(Item item, ItemBuildContext context) { item.unbreakable(this.argument); + return item; } @Override - public void prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { if (VersionHelper.isOrAbove1_20_5()) { Tag previous = item.getNBTComponent(ComponentKeys.UNBREAKABLE); if (previous != null) { @@ -42,5 +43,6 @@ public class UnbreakableModifier implements ItemDataModifier { networkData.put("Unbreakable", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); } } + return item; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java index 1706684c2..c320f80df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java @@ -253,7 +253,6 @@ public class SelfHostHttpServer { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - CraftEngine.instance().logger().warn("Channel error", cause); ctx.close(); } } diff --git a/gradle.properties b/gradle.properties index 796031ea2..743d06f81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.7 +nms_helper_version=0.67.9 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23