From 0b57d08eca670af962ff7f9cc88cb4e88f2d2fae Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 30 Jul 2025 20:54:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0attribute-modifiers=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E5=8C=96=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/ComponentItemFactory1_20_5.java | 2 +- .../factory/ComponentItemFactory1_21_5.java | 2 +- .../core/item/AbstractItemManager.java | 1 - .../modifier/AttributeModifiersModifier.java | 52 ++++++++++++++----- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index 39c72457d..21f37ec25 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -606,6 +606,6 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory implements SimpleNetworkItemDataModif return CONVERTOR.getOrDefault(attributeName, attributeName); } - private final List modifiers; + private final List modifiers; - public AttributeModifiersModifier(List modifiers) { + public AttributeModifiersModifier(List modifiers) { this.modifiers = modifiers; } - public List modifiers() { + public List modifiers() { return this.modifiers; } @@ -103,7 +105,7 @@ public class AttributeModifiersModifier implements SimpleNetworkItemDataModif @Override public Item apply(Item item, ItemBuildContext context) { - return item.attributeModifiers(this.modifiers); + return item.attributeModifiers(this.modifiers.stream().map(it -> it.toAttributeModifier(context)).toList()); } @Override @@ -121,12 +123,40 @@ public class AttributeModifiersModifier implements SimpleNetworkItemDataModif return "AttributeModifiers"; } + public record PreModifier(String type, + AttributeModifier.Slot slot, + Key id, + NumberProvider amount, + AttributeModifier.Operation operation, + AttributeModifiersModifier.PreModifier.@Nullable PreDisplay display) { + + public PreModifier(String type, AttributeModifier.Slot slot, Key id, NumberProvider amount, AttributeModifier.Operation operation, @Nullable PreDisplay display) { + this.amount = amount; + this.type = type; + this.slot = slot; + this.id = id; + this.operation = operation; + this.display = display; + } + + public AttributeModifier toAttributeModifier(ItemBuildContext context) { + return new AttributeModifier(type, slot, id, amount.getDouble(context), operation, display == null ? null : display.toDisplay(context)); + } + + public record PreDisplay(AttributeModifier.Display.Type type, String value) { + + public AttributeModifier.Display toDisplay(ItemBuildContext context) { + return new AttributeModifier.Display(type, AdventureHelper.miniMessage().deserialize(value, context.tagResolvers())); + } + } + } + public static class Factory implements ItemDataModifierFactory { @Override public ItemDataModifier create(Object arg) { MutableInt mutableInt = new MutableInt(0); - List attributeModifiers = ResourceConfigUtils.parseConfigAsList(arg, (map) -> { + List attributeModifiers = ResourceConfigUtils.parseConfigAsList(arg, (map) -> { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.item.data.attribute_modifiers.missing_type"); Key nativeType = AttributeModifiersModifier.getNativeAttributeName(Key.of(type)); AttributeModifier.Slot slot = AttributeModifier.Slot.valueOf(map.getOrDefault("slot", "any").toString().toUpperCase(Locale.ENGLISH)); @@ -134,24 +164,22 @@ public class AttributeModifiersModifier implements SimpleNetworkItemDataModif mutableInt.add(1); return Key.of("craftengine", "modifier_" + mutableInt.intValue()); }); - double amount = ResourceConfigUtils.getAsDouble( - ResourceConfigUtils.requireNonNullOrThrow(map.get("amount"), "warning.config.item.data.attribute_modifiers.missing_amount"), "amount" - ); + NumberProvider amount = NumberProviders.fromObject(ResourceConfigUtils.requireNonNullOrThrow(map.get("amount"), "warning.config.item.data.attribute_modifiers.missing_amount")); AttributeModifier.Operation operation = AttributeModifier.Operation.valueOf( ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("operation"), "warning.config.item.data.attribute_modifiers.missing_operation").toUpperCase(Locale.ENGLISH) ); - AttributeModifier.Display display = null; + PreModifier.PreDisplay display = null; if (VersionHelper.isOrAbove1_21_6() && map.containsKey("display")) { Map displayMap = MiscUtils.castToMap(map.get("display"), false); AttributeModifier.Display.Type displayType = AttributeModifier.Display.Type.valueOf(ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("type"), "warning.config.item.data.attribute_modifiers.display.missing_type").toUpperCase(Locale.ENGLISH)); if (displayType == AttributeModifier.Display.Type.OVERRIDE) { String miniMessageValue = ResourceConfigUtils.requireNonEmptyStringOrThrow(displayMap.get("value"), "warning.config.item.data.attribute_modifiers.display.missing_value"); - display = new AttributeModifier.Display(displayType, AdventureHelper.miniMessage().deserialize(miniMessageValue)); + display = new PreModifier.PreDisplay(displayType, miniMessageValue); } else { - display = new AttributeModifier.Display(displayType, null); + display = new PreModifier.PreDisplay(displayType, null); } } - return new AttributeModifier(nativeType.value(), slot, id, + return new PreModifier(nativeType.value(), slot, id, amount, operation, display); }); return new AttributeModifiersModifier<>(attributeModifiers);