From 729cba32b05ff4e1bf8fe6ec988baa79109054ec Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 29 Jun 2025 01:11:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A=E7=9A=84eq?= =?UTF-8?q?uipment=20layer=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/util/FeatureUtils.java | 1 - .../core/item/AbstractItemManager.java | 22 +-- .../craftengine/core/item/ItemManager.java | 4 +- .../craftengine/core/item/ItemSettings.java | 40 ++-- .../core/item/setting/ItemEquipment.java | 101 ++++++++++ .../core/pack/AbstractPackManager.java | 27 ++- .../craftengine/core/pack/misc/Equipment.java | 50 +++++ .../core/pack/misc/EquipmentGeneration.java | 177 ------------------ .../core/pack/misc/EquipmentLayerType.java | 44 +++++ 9 files changed, 236 insertions(+), 230 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/setting/ItemEquipment.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/misc/Equipment.java delete mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentGeneration.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentLayerType.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java index e40450582..6b6f53ea5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.core.util.Key; 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 928cfa75e..62bf5eb1e 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 @@ -4,10 +4,11 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; import net.momirealms.craftengine.core.item.modifier.*; import net.momirealms.craftengine.core.item.setting.EquipmentData; +import net.momirealms.craftengine.core.item.setting.ItemEquipment; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.pack.ResourceLocation; -import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; +import net.momirealms.craftengine.core.pack.misc.Equipment; import net.momirealms.craftengine.core.pack.model.*; import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; @@ -50,7 +51,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl protected final Map> modernItemModels1_21_2; protected final Map> legacyOverrides; protected final Map> modernOverrides; - protected final Set equipmentsToGenerate; + protected final Map equipmentsToGenerate; // Cached command suggestions protected final List cachedSuggestions = new ArrayList<>(); protected final List cachedTotemSuggestions = new ArrayList<>(); @@ -65,7 +66,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl this.cmdConflictChecker = new HashMap<>(); this.modernItemModels1_21_4 = new HashMap<>(); this.modernItemModels1_21_2 = new HashMap<>(); - this.equipmentsToGenerate = new HashSet<>(); + this.equipmentsToGenerate = new HashMap<>(); } @Override @@ -151,14 +152,11 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl this.customItemTags.computeIfAbsent(tag, k -> new ArrayList<>()).add(customItem.idHolder()); } // equipment generation - EquipmentGeneration equipment = customItem.settings().equipment(); + ItemEquipment equipment = customItem.settings().equipment(); if (equipment != null) { - EquipmentData modern = equipment.modernData(); - // 1.21.2+ - if (modern != null) { - this.equipmentsToGenerate.add(equipment); - } - // TODO 1.20 + EquipmentData data = equipment.data(); + Equipment equipmentJson = this.equipmentsToGenerate.computeIfAbsent(data.assetId(), k -> new Equipment()); + equipmentJson.addAll(equipment); } return true; } @@ -250,8 +248,8 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } @Override - public Collection equipmentsToGenerate() { - return Collections.unmodifiableCollection(this.equipmentsToGenerate); + public Map equipmentsToGenerate() { + return Collections.unmodifiableMap(this.equipmentsToGenerate); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index 9dac60b32..aa1821802 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; -import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; +import net.momirealms.craftengine.core.pack.misc.Equipment; import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.model.ModernItemModel; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; @@ -27,7 +27,7 @@ public interface ItemManager extends Manageable, ModelGenerator { Map> modernItemOverrides(); - Collection equipmentsToGenerate(); + Map equipmentsToGenerate(); Map modernItemModels1_21_4(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index 7e416fc79..936a84e84 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -7,11 +7,8 @@ import net.momirealms.craftengine.core.entity.projectile.ProjectileType; import net.momirealms.craftengine.core.item.modifier.EquippableModifier; import net.momirealms.craftengine.core.item.modifier.FoodModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; -import net.momirealms.craftengine.core.item.setting.AnvilRepairItem; -import net.momirealms.craftengine.core.item.setting.EquipmentData; -import net.momirealms.craftengine.core.item.setting.FoodData; -import net.momirealms.craftengine.core.item.setting.Helmet; -import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; +import net.momirealms.craftengine.core.item.setting.*; +import net.momirealms.craftengine.core.pack.misc.EquipmentLayerType; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.util.*; @@ -26,7 +23,7 @@ public class ItemSettings { int fuelTime; Set tags = Set.of(); @Nullable - EquipmentGeneration equipment; + ItemEquipment equipment; boolean canRepair = true; List anvilRepairItems = List.of(); boolean renameable = true; @@ -45,8 +42,8 @@ public class ItemSettings { public List> modifiers() { ArrayList> modifiers = new ArrayList<>(); - if (VersionHelper.isOrAbove1_21_2() && this.equipment != null && this.equipment.modernData() != null) { - modifiers.add(new EquippableModifier<>(this.equipment.modernData())); + if (VersionHelper.isOrAbove1_21_2() && this.equipment != null) { + modifiers.add(new EquippableModifier<>(this.equipment.data())); } if (VersionHelper.isOrAbove1_20_5() && this.foodData != null) { modifiers.add(new FoodModifier<>(this.foodData.nutrition(), this.foodData.saturation(), false)); @@ -153,7 +150,7 @@ public class ItemSettings { } @Nullable - public EquipmentGeneration equipment() { + public ItemEquipment equipment() { return equipment; } @@ -225,7 +222,7 @@ public class ItemSettings { return this; } - public ItemSettings equipment(EquipmentGeneration equipment) { + public ItemSettings equipment(ItemEquipment equipment) { this.equipment = equipment; return this; } @@ -302,20 +299,15 @@ public class ItemSettings { })); registerFactory("equippable", (value -> { Map args = MiscUtils.castToMap(value, false); - EquipmentData data; - if (VersionHelper.isOrAbove1_21_2() && args.containsKey("slot")) data = EquipmentData.fromMap(args); - else data = null; - EquipmentGeneration equipment = new EquipmentGeneration( - EquipmentGeneration.Layer.fromConfig(args.get("humanoid")), - EquipmentGeneration.Layer.fromConfig(args.get("humanoid-leggings")), - EquipmentGeneration.Layer.fromConfig(args.get("llama-body")), - EquipmentGeneration.Layer.fromConfig(args.get("horse-body")), - EquipmentGeneration.Layer.fromConfig(args.get("wolf-body")), - EquipmentGeneration.Layer.fromConfig(args.get("wings")), - data, - ResourceConfigUtils.getAsInt(args.getOrDefault("trim", -1), "trim") - ); - return settings -> settings.equipment(equipment); + EquipmentData data = EquipmentData.fromMap(args); + ItemEquipment itemEquipment = new ItemEquipment(data); + for (Map.Entry entry : args.entrySet()) { + EquipmentLayerType layerType = EquipmentLayerType.byId(entry.getKey()); + if (layerType != null) { + itemEquipment.addLayer(layerType, ItemEquipment.Layer.fromConfig(entry.getValue())); + } + } + return settings -> settings.equipment(itemEquipment); })); registerFactory("can-place", (value -> { boolean bool = ResourceConfigUtils.getAsBoolean(value, "can-place"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/setting/ItemEquipment.java b/core/src/main/java/net/momirealms/craftengine/core/item/setting/ItemEquipment.java new file mode 100644 index 000000000..0341afe7d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/setting/ItemEquipment.java @@ -0,0 +1,101 @@ +package net.momirealms.craftengine.core.item.setting; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.misc.EquipmentLayerType; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +public class ItemEquipment { + private final EquipmentData data; + private final EnumMap> layers; + + public ItemEquipment(EquipmentData data) { + this.data = data; + this.layers = new EnumMap<>(EquipmentLayerType.class); + } + + public void addLayer(EquipmentLayerType layerType, List layer) { + this.layers.put(layerType, layer); + } + + public EnumMap> layers() { + return layers; + } + + public EquipmentData data() { + return data; + } + + public record Layer(String texture, DyeableData data, boolean usePlayerTexture) implements Supplier { + + @NotNull + public static List fromConfig(Object obj) { + switch (obj) { + case String texture -> { + return List.of(new Layer(texture, null, false)); + } + case Map map -> { + Map data = MiscUtils.castToMap(map, false); + String texture = data.get("texture").toString(); + return List.of(new Layer(texture, + DyeableData.fromObj(data.get("dyeable")), + ResourceConfigUtils.getAsBoolean(data.getOrDefault("use-player-texture", false), "use-player-texture") + )); + } + case List list -> { + List layers = new ArrayList<>(); + for (Object inner : list) { + layers.addAll(fromConfig(inner)); + } + return layers; + } + case null, default -> { + return List.of(); + } + } + } + + @Override + public JsonObject get() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("texture", texture); + if (this.data != null) { + jsonObject.add("dyeable", this.data.get()); + } + if (this.usePlayerTexture) { + jsonObject.addProperty("use_player_texture", true); + } + return jsonObject; + } + + public record DyeableData(@Nullable Integer colorWhenUndyed) implements Supplier { + + public static DyeableData fromObj(Object obj) { + if (obj instanceof Map map) { + Map data = MiscUtils.castToMap(map, false); + if (data.containsKey("color-when-undyed")) { + return new DyeableData(ResourceConfigUtils.getAsInt(data.get("color-when-undyed"), "color-when-undyed")); + } + } + return new DyeableData(null); + } + + @Override + public JsonObject get() { + JsonObject dyeData = new JsonObject(); + if (this.colorWhenUndyed != null) { + dyeData.addProperty("color_when_undyed", this.colorWhenUndyed); + } + return dyeData; + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index dc44a8138..674dd47df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -10,13 +10,12 @@ import dev.dejvokep.boostedyaml.block.implementation.Section; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.momirealms.craftengine.core.font.BitmapImage; import net.momirealms.craftengine.core.font.Font; -import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.pack.conflict.PathContext; import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionConditional; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.pack.host.impl.NoneHost; -import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; +import net.momirealms.craftengine.core.pack.misc.Equipment; import net.momirealms.craftengine.core.pack.model.ItemModel; import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.model.ModernItemModel; @@ -1053,14 +1052,14 @@ public abstract class AbstractPackManager implements PackManager { } private void generateEquipments(Path generatedPackPath) { - for (EquipmentGeneration generator : this.plugin.itemManager().equipmentsToGenerate()) { - EquipmentData equipmentData = generator.modernData(); - if (equipmentData != null && Config.packMaxVersion().isAtOrAbove(MinecraftVersions.V1_21_4)) { + for (Map.Entry entry : this.plugin.itemManager().equipmentsToGenerate().entrySet()) { + Key assetId = entry.getKey(); + if (Config.packMaxVersion().isAtOrAbove(MinecraftVersions.V1_21_4)) { Path equipmentPath = generatedPackPath .resolve("assets") - .resolve(equipmentData.assetId().namespace()) + .resolve(assetId.namespace()) .resolve("equipment") - .resolve(equipmentData.assetId().value() + ".json"); + .resolve(assetId.value() + ".json"); JsonObject equipmentJson = null; if (Files.exists(equipmentPath)) { @@ -1072,9 +1071,9 @@ public abstract class AbstractPackManager implements PackManager { } } if (equipmentJson != null) { - equipmentJson = GsonHelper.deepMerge(equipmentJson, generator.get()); + equipmentJson = GsonHelper.deepMerge(equipmentJson, entry.getValue().get()); } else { - equipmentJson = generator.get(); + equipmentJson = entry.getValue().get(); } try { Files.createDirectories(equipmentPath.getParent()); @@ -1088,13 +1087,13 @@ public abstract class AbstractPackManager implements PackManager { this.plugin.logger().severe("Error writing equipment file", e); } } - if (equipmentData != null && Config.packMaxVersion().isAtOrAbove(MinecraftVersions.V1_21_2) && Config.packMinVersion().isBelow(MinecraftVersions.V1_21_4)) { + if (Config.packMaxVersion().isAtOrAbove(MinecraftVersions.V1_21_2) && Config.packMinVersion().isBelow(MinecraftVersions.V1_21_4)) { Path equipmentPath = generatedPackPath .resolve("assets") - .resolve(equipmentData.assetId().namespace()) + .resolve(assetId.namespace()) .resolve("models") .resolve("equipment") - .resolve(equipmentData.assetId().value() + ".json"); + .resolve(assetId.value() + ".json"); JsonObject equipmentJson = null; if (Files.exists(equipmentPath)) { @@ -1106,9 +1105,9 @@ public abstract class AbstractPackManager implements PackManager { } } if (equipmentJson != null) { - equipmentJson = GsonHelper.deepMerge(equipmentJson, generator.get()); + equipmentJson = GsonHelper.deepMerge(equipmentJson, entry.getValue().get()); } else { - equipmentJson = generator.get(); + equipmentJson = entry.getValue().get(); } try { Files.createDirectories(equipmentPath.getParent()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/misc/Equipment.java b/core/src/main/java/net/momirealms/craftengine/core/pack/misc/Equipment.java new file mode 100644 index 000000000..0feb0f17e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/misc/Equipment.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.pack.misc; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.setting.ItemEquipment; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +public class Equipment implements Supplier { + private final EnumMap> layers; + + public Equipment() { + this.layers = new EnumMap<>(EquipmentLayerType.class); + } + + public void addAll(ItemEquipment equipment) { + for (Map.Entry> entry : equipment.layers().entrySet()) { + List layers = entry.getValue(); + List previous = this.layers.put(entry.getKey(), layers); + if (previous != null && !previous.equals(layers)) { + // todo 是否异常 + } + } + } + + @Override + public JsonObject get() { + JsonObject jsonObject = new JsonObject(); + JsonObject layersJson = new JsonObject(); + jsonObject.add("layers", layersJson); + for (Map.Entry> entry : layers.entrySet()) { + EquipmentLayerType type = entry.getKey(); + List layerList = entry.getValue(); + setLayers(layersJson, layerList, type.id()); + } + return jsonObject; + } + + private void setLayers(JsonObject layersJson, List layers, String key) { + if (layers == null || layers.isEmpty()) return; + JsonArray layersArray = new JsonArray(); + for (ItemEquipment.Layer layer : layers) { + layersArray.add(layer.get()); + } + layersJson.add(key, layersArray); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentGeneration.java b/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentGeneration.java deleted file mode 100644 index e353e28c5..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentGeneration.java +++ /dev/null @@ -1,177 +0,0 @@ -package net.momirealms.craftengine.core.pack.misc; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import net.momirealms.craftengine.core.item.setting.EquipmentData; -import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Supplier; - -public class EquipmentGeneration implements Supplier { - private final List humanoid; - private final List humanoidLeggings; - private final List llamaBody; - private final List horseBody; - private final List wolfBody; - private final List wings; - - private final EquipmentData modernData; - private final int trim; - - public EquipmentGeneration(List humanoid, - List humanoidLeggings, - List llamaBody, - List horseBody, - List wolfBody, - List wings, - EquipmentData modernData, - int trim) { - this.humanoid = humanoid; - this.humanoidLeggings = humanoidLeggings; - this.llamaBody = llamaBody; - this.horseBody = horseBody; - this.wolfBody = wolfBody; - this.wings = wings; - this.trim = trim; - this.modernData = modernData; - } - - public EquipmentData modernData() { - return modernData; - } - - public int trim() { - return trim; - } - - public List humanoid() { - return humanoid; - } - - public List humanoidLeggings() { - return humanoidLeggings; - } - - public List llamaBody() { - return llamaBody; - } - - public List horseBody() { - return horseBody; - } - - public List wolfBody() { - return wolfBody; - } - - public List wings() { - return wings; - } - - @Override - public boolean equals(Object object) { - if (this == object) return true; - if (!(object instanceof EquipmentGeneration that)) return false; - return trim == that.trim && Objects.equals(humanoid, that.humanoid) && Objects.equals(humanoidLeggings, that.humanoidLeggings) && Objects.equals(llamaBody, that.llamaBody) && Objects.equals(horseBody, that.horseBody) && Objects.equals(wolfBody, that.wolfBody) && Objects.equals(wings, that.wings) && Objects.equals(modernData, that.modernData); - } - - @Override - public int hashCode() { - return Objects.hash(humanoid, humanoidLeggings, llamaBody, horseBody, wolfBody, wings, modernData, trim); - } - - @Override - public JsonObject get() { - JsonObject jsonObject = new JsonObject(); - JsonObject layersJson = new JsonObject(); - jsonObject.add("layers", layersJson); - setLayerJson(layersJson, humanoid(), "humanoid"); - setLayerJson(layersJson, humanoidLeggings(), "humanoid_leggings"); - setLayerJson(layersJson, llamaBody(), "llama_body"); - setLayerJson(layersJson, horseBody(), "horse_body"); - setLayerJson(layersJson, wolfBody(), "wolf_body"); - setLayerJson(layersJson, wings(), "wings"); - return jsonObject; - } - - private void setLayerJson(JsonObject layersJson, List layers, String key) { - if (layers.isEmpty()) return; - JsonArray layersArray = new JsonArray(); - for (Layer layer : layers) { - layersArray.add(layer.get()); - } - layersJson.add(key, layersArray); - } - - public record Layer(String texture, DyeableData data, boolean usePlayerTexture) implements Supplier { - - @NotNull - public static List fromConfig(Object obj) { - switch (obj) { - case String texture -> { - return List.of(new Layer(texture, null, false)); - } - case Map map -> { - Map data = MiscUtils.castToMap(map, false); - String texture = data.get("texture").toString(); - return List.of(new Layer(texture, - DyeableData.fromObj(data.get("dyeable")), - ResourceConfigUtils.getAsBoolean(data.getOrDefault("use-player-texture", false), "use-player-texture") - )); - } - case List list -> { - List layers = new ArrayList<>(); - for (Object inner : list) { - layers.addAll(fromConfig(inner)); - } - return layers; - } - case null, default -> { - return List.of(); - } - } - } - - @Override - public JsonObject get() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("texture", texture); - if (this.data != null) { - jsonObject.add("dyeable", this.data.get()); - } - if (this.usePlayerTexture) { - jsonObject.addProperty("use_player_texture", true); - } - return jsonObject; - } - - public record DyeableData(@Nullable Integer colorWhenUndyed) implements Supplier { - - public static DyeableData fromObj(Object obj) { - if (obj instanceof Map map) { - Map data = MiscUtils.castToMap(map, false); - if (data.containsKey("color-when-undyed")) { - return new DyeableData(ResourceConfigUtils.getAsInt(data.get("color-when-undyed"), "color-when-undyed")); - } - } - return new DyeableData(null); - } - - @Override - public JsonObject get() { - JsonObject dyeData = new JsonObject(); - if (this.colorWhenUndyed != null) { - dyeData.addProperty("color_when_undyed", this.colorWhenUndyed); - } - return dyeData; - } - } - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentLayerType.java b/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentLayerType.java new file mode 100644 index 000000000..80ea4cf54 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/misc/EquipmentLayerType.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.pack.misc; + +import java.util.HashMap; +import java.util.Map; + +public enum EquipmentLayerType { + WOLF_BODY("wolf_body"), + HORSE_BODY("horse_body"), + LLAMA_BODY("llama_body"), + HUMANOID("humanoid"), + HUMANOID_LEGGINGS("humanoid_leggings"), + WINGS("wings"), + PIG_SADDLE("pig_saddle"), + STRIDER_SADDLE("strider_saddle"), + CAMEL_SADDLE("camel_saddle"), + HORSE_SADDLE("horse_saddle"), + DONKEY_SADDLE("donkey_saddle"), + MULE_SADDLE("mule_saddle"), + SKELETON_HORSE_SADDLE("skeleton_horse_saddle"), + ZOMBIE_HORSE_SADDLE("zombie_horse_saddle"), + HAPPY_GHAST_BODY("happy_ghast_body"); + + private final String id; + + EquipmentLayerType(String id) { + this.id = id; + } + + public String id() { + return id; + } + + public static final Map BY_ID = new HashMap<>(); + static { + for (EquipmentLayerType type : EquipmentLayerType.values()) { + BY_ID.put(type.id(), type); + BY_ID.put(type.id().replace("_", "-"), type); + } + } + + public static EquipmentLayerType byId(String id) { + return BY_ID.get(id); + } +}