9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

添加attribute-modifiers随机化支持

This commit is contained in:
XiaoMoMi
2025-07-30 20:54:33 +08:00
parent cd43273d4c
commit 0b57d08eca
4 changed files with 42 additions and 15 deletions

View File

@@ -606,6 +606,6 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory<ComponentItemW
modifierTag.putString("operation", modifier.operation().id());
modifiers.add(modifierTag);
}
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, compoundTag);
item.setSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, compoundTag);
}
}

View File

@@ -151,6 +151,6 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 {
}
modifiers.add(modifierTag);
}
item.setNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, modifiers);
item.setSparrowNBTComponent(ComponentKeys.ATTRIBUTE_MODIFIERS, modifiers);
}
}

View File

@@ -22,7 +22,6 @@ import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.event.EventFunctions;
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.*;
import org.incendo.cloud.suggestion.Suggestion;

View File

@@ -7,6 +7,8 @@ import net.momirealms.craftengine.core.item.ComponentKeys;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemDataModifierFactory;
import net.momirealms.craftengine.core.plugin.context.number.NumberProvider;
import net.momirealms.craftengine.core.plugin.context.number.NumberProviders;
import net.momirealms.craftengine.core.util.*;
import org.jetbrains.annotations.Nullable;
@@ -86,13 +88,13 @@ public class AttributeModifiersModifier<I> implements SimpleNetworkItemDataModif
return CONVERTOR.getOrDefault(attributeName, attributeName);
}
private final List<AttributeModifier> modifiers;
private final List<PreModifier> modifiers;
public AttributeModifiersModifier(List<AttributeModifier> modifiers) {
public AttributeModifiersModifier(List<PreModifier> modifiers) {
this.modifiers = modifiers;
}
public List<AttributeModifier> modifiers() {
public List<PreModifier> modifiers() {
return this.modifiers;
}
@@ -103,7 +105,7 @@ public class AttributeModifiersModifier<I> implements SimpleNetworkItemDataModif
@Override
public Item<I> apply(Item<I> 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<I> 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<I> implements ItemDataModifierFactory<I> {
@Override
public ItemDataModifier<I> create(Object arg) {
MutableInt mutableInt = new MutableInt(0);
List<AttributeModifier> attributeModifiers = ResourceConfigUtils.parseConfigAsList(arg, (map) -> {
List<PreModifier> 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<I> 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<String, Object> 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);