From b1a79157b317cc3675708f8be07196b95d2ab489 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 14 Jul 2025 00:44:46 +0800 Subject: [PATCH] =?UTF-8?q?when=E7=9A=84=E5=80=BC=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=98=AFjsonelement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/item/AbstractItemManager.java | 61 +++++++++++-------- .../core/pack/model/SelectItemModel.java | 41 +++++++------ .../CrossBowPullingRangeDispatchProperty.java | 4 +- .../CustomModelDataRangeDispatchProperty.java | 4 +- .../DamageRangeDispatchProperty.java | 4 +- .../UseDurationRangeDispatchProperty.java | 4 +- 6 files changed, 65 insertions(+), 53 deletions(-) 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 28a8a599e..9d277e9fd 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 @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.item; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; import net.momirealms.craftengine.core.attribute.AttributeModifier; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; @@ -768,35 +770,44 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl ) { if (model.property() instanceof LegacyModelPredicate predicate) { String predicateId = predicate.legacyPredicateId(materialId); - for (Map.Entry>, ItemModel> entry : model.whenMap().entrySet()) { - List cases = entry.getKey().fallbackOrMapPrimary(List::of); - for (String caseValue : cases) { - Number legacyValue = predicate.toLegacyValue(caseValue); - if (predicate instanceof TrimMaterialSelectProperty) { - if (legacyValue.floatValue() > 1f) { - continue; + for (Map.Entry>, ItemModel> entry : model.whenMap().entrySet()) { + List cases = entry.getKey().fallbackOrMapPrimary(List::of); + for (JsonElement caseValue : cases) { + if (caseValue instanceof JsonPrimitive primitive) { + Number legacyValue; + if (primitive.isBoolean()) { + legacyValue = predicate.toLegacyValue(primitive.getAsBoolean()); + } else if (primitive.isString()) { + legacyValue = predicate.toLegacyValue(primitive.getAsString()); + } else { + legacyValue = predicate.toLegacyValue(primitive.getAsNumber()); } - } - Map merged = mergePredicates( - parentPredicates, - predicateId, - legacyValue - ); - // Additional check for crossbow - if (predicate instanceof ChargeTypeSelectProperty && materialId.equals(ItemKeys.CROSSBOW)) { - merged = mergePredicates( + if (predicate instanceof TrimMaterialSelectProperty) { + if (legacyValue.floatValue() > 1f) { + continue; + } + } + Map merged = mergePredicates( + parentPredicates, + predicateId, + legacyValue + ); + // Additional check for crossbow + if (predicate instanceof ChargeTypeSelectProperty && materialId.equals(ItemKeys.CROSSBOW)) { + merged = mergePredicates( + merged, + "charged", + 1 + ); + } + processModelRecursively( + entry.getValue(), merged, - "charged", - 1 + resultList, + materialId, + customModelData ); } - processModelRecursively( - entry.getValue(), - merged, - resultList, - materialId, - customModelData - ); } } // Additional check for crossbow diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java index 8f449f423..cfbe2c7e8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.pack.model.select.SelectProperties; import net.momirealms.craftengine.core.pack.model.select.SelectProperty; import net.momirealms.craftengine.core.pack.revision.Revision; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.GsonHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MinecraftVersion; import net.momirealms.craftengine.core.util.MiscUtils; @@ -25,11 +26,11 @@ public class SelectItemModel implements ItemModel { public static final Factory FACTORY = new Factory(); public static final Reader READER = new Reader(); private final SelectProperty property; - private final Map>, ItemModel> whenMap; + private final Map>, ItemModel> whenMap; private final ItemModel fallBack; public SelectItemModel(@NotNull SelectProperty property, - @NotNull Map>, ItemModel> whenMap, + @NotNull Map>, ItemModel> whenMap, @Nullable ItemModel fallBack) { this.property = property; this.whenMap = whenMap; @@ -40,7 +41,7 @@ public class SelectItemModel implements ItemModel { return this.property; } - public Map>, ItemModel> whenMap() { + public Map>, ItemModel> whenMap() { return this.whenMap; } @@ -55,17 +56,17 @@ public class SelectItemModel implements ItemModel { this.property.accept(json); JsonArray array = new JsonArray(); json.add("cases", array); - for (Map.Entry>, ItemModel> entry : this.whenMap.entrySet()) { + for (Map.Entry>, ItemModel> entry : this.whenMap.entrySet()) { JsonObject item = new JsonObject(); ItemModel itemModel = entry.getValue(); item.add("model", itemModel.apply(version)); - Either> either = entry.getKey(); + Either> either = entry.getKey(); if (either.primary().isPresent()) { - item.addProperty("when", either.primary().get()); + item.add("when", either.primary().get()); } else { - List list = either.fallback().get(); + List list = either.fallback().get(); JsonArray whens = new JsonArray(); - for (String e : list) { + for (JsonElement e : list) { whens.add(e); } item.add("when", whens); @@ -118,21 +119,21 @@ public class SelectItemModel implements ItemModel { if (casesObj instanceof List list) { List> cases = (List>) list; if (!cases.isEmpty()) { - Map>, ItemModel> whenMap = new HashMap<>(); + Map>, ItemModel> whenMap = new HashMap<>(); for (Map c : cases) { Object when = c.get("when"); if (when == null) { throw new LocalizedResourceConfigException("warning.config.item.model.select.case.missing_when"); } - Either> either; + Either> either; if (when instanceof List whenList) { - List whens = new ArrayList<>(whenList.size()); + List whens = new ArrayList<>(whenList.size()); for (Object o : whenList) { - whens.add(o.toString()); + whens.add(GsonHelper.get().toJsonTree(o)); } either = Either.ofFallback(whens); } else { - either = Either.ofPrimary(when.toString()); + either = Either.ofPrimary(GsonHelper.get().toJsonTree(when)); } Object model = c.get("model"); if (model == null) { @@ -158,22 +159,22 @@ public class SelectItemModel implements ItemModel { if (cases == null) { throw new IllegalArgumentException("cases is expected to be a JsonArray"); } - Map>, ItemModel> whenMap = new HashMap<>(cases.size()); + Map>, ItemModel> whenMap = new HashMap<>(cases.size()); for (JsonElement e : cases) { if (e instanceof JsonObject caseObj) { ItemModel model = ItemModels.fromJson(caseObj.getAsJsonObject("model")); JsonElement whenObj = caseObj.get("when"); - Either> either; + Either> either; if (whenObj instanceof JsonArray array) { - List whens = new ArrayList<>(array.size()); + List whens = new ArrayList<>(array.size()); for (JsonElement o : array) { - whens.add(o.getAsString()); + whens.add(o); } either = Either.ofFallback(whens); - } else if (whenObj instanceof JsonPrimitive primitive) { - either = Either.ofPrimary(primitive.getAsString()); + } else if (whenObj != null) { + either = Either.ofPrimary(whenObj); } else { - throw new IllegalArgumentException("when is expected to be either JsonPrimitive or JsonArray"); + throw new IllegalArgumentException("'when' should not be null"); } whenMap.put(either, model); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java index ab6acc9b4..e32a42e1f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.Key; import java.util.Map; -public class CrossBowPullingRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { +public class CrossBowPullingRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { public static final Factory FACTORY = new Factory(); public static final Reader READER = new Reader(); public static final CrossBowPullingRangeDispatchProperty INSTANCE = new CrossBowPullingRangeDispatchProperty(); @@ -29,7 +29,7 @@ public class CrossBowPullingRangeDispatchProperty implements RangeDispatchProper } @Override - public Number toLegacyValue(Float value) { + public Number toLegacyValue(Number value) { return value; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java index b31ac63f0..aeeb2dcc5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class CustomModelDataRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { +public class CustomModelDataRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { public static final Factory FACTORY = new Factory(); public static final Reader READER = new Reader(); private final int index; @@ -33,7 +33,7 @@ public class CustomModelDataRangeDispatchProperty implements RangeDispatchProper } @Override - public Number toLegacyValue(Float value) { + public Number toLegacyValue(Number value) { return value.intValue(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java index 4ae98cfda..a37939865 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class DamageRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { +public class DamageRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { public static final Factory FACTORY = new Factory(); public static final Reader READER = new Reader(); private final boolean normalize; @@ -36,7 +36,7 @@ public class DamageRangeDispatchProperty implements RangeDispatchProperty, Legac } @Override - public Number toLegacyValue(Float value) { + public Number toLegacyValue(Number value) { if (this.normalize) return value; throw new RuntimeException("Enable 'normalize' option if you want to use 'damage' on 1.21.3 and below"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java index 65f8b8b53..a8f17ff84 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.Map; -public class UseDurationRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { +public class UseDurationRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { public static final Factory FACTORY = new Factory(); public static final Reader READER = new Reader(); private final boolean remaining; @@ -37,7 +37,7 @@ public class UseDurationRangeDispatchProperty implements RangeDispatchProperty, } @Override - public Number toLegacyValue(Float value) { + public Number toLegacyValue(Number value) { return value; }