From 37505c1575c7a876ca33e99fa0ad8c5e973339d4 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 2 Jul 2025 02:51:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reflection/minecraft/CoreReflections.java | 4 + .../minecraft/MAttributeHolders.java | 2 +- common-files/src/main/resources/config.yml | 13 +- .../furniture/AbstractFurnitureManager.java | 7 -- .../core/item/AbstractItemManager.java | 45 +++++-- .../craftengine/core/item/ItemManager.java | 2 +- .../craftengine/core/item/ItemSettings.java | 10 +- .../item/equipment/AbstractEquipment.java | 16 +++ .../equipment/ComponentBasedEquipment.java | 118 ++++++++++++++++++ .../core/item/equipment/Equipment.java | 10 ++ .../core/item/equipment/EquipmentFactory.java | 10 ++ .../core/item/equipment/Equipments.java | 23 ++++ .../item/equipment/TrimBasedEquipment.java | 42 +++++++ .../core/item/setting/ItemEquipment.java | 88 ++----------- .../core/pack/LoadingSequence.java | 21 ++-- .../craftengine/core/pack/misc/Equipment.java | 17 +-- .../craftengine/core/plugin/CraftEngine.java | 2 +- .../core/plugin/config/Config.java | 9 -- .../core/registry/BuiltInRegistries.java | 2 + .../craftengine/core/registry/Registries.java | 4 +- 20 files changed, 306 insertions(+), 139 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/AbstractEquipment.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/ComponentBasedEquipment.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipment.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/EquipmentFactory.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/equipment/TrimBasedEquipment.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index 390913541..789706233 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -3595,6 +3595,10 @@ public final class CoreReflections { ); public static final Constructor constructor$TrimPattern = requireNonNull( + VersionHelper.isOrAbove1_21_5() ? + ReflectionUtils.getConstructor(clazz$TrimPattern, clazz$ResourceLocation, clazz$Component, boolean.class) : + VersionHelper.isOrAbove1_20_2() ? + ReflectionUtils.getConstructor(clazz$TrimPattern, clazz$ResourceLocation, clazz$Holder, clazz$Component, boolean.class) : ReflectionUtils.getConstructor(clazz$TrimPattern, clazz$ResourceLocation, clazz$Holder, clazz$Component) ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MAttributeHolders.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MAttributeHolders.java index 1cfb050d0..451e77e70 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MAttributeHolders.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MAttributeHolders.java @@ -12,7 +12,7 @@ public final class MAttributeHolders { private static Object getById(String id) { Object rl = FastNMS.INSTANCE.method$ResourceLocation$fromNamespaceAndPath("minecraft", id); - return FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ATTRIBUTE, rl); + return FastNMS.INSTANCE.method$Registry$getHolderByResourceLocation(MBuiltInRegistries.ATTRIBUTE, rl); } static { diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 3c0309030..b4ac8a596 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -138,9 +138,16 @@ resource-pack: resolution: type: merge_atlas -item: - # Add a tag on item name and lore - non-italic-tag: false +equipment: + # The sacrificed-vanilla-armor argument determines which vanilla armor gets completely removed (loses all its trims) + # when you create new armor using trim types, freeing up a slot for your custom armor. + sacrificed-vanilla-armor: + type: chainmail + # CraftEngine repurposes a vanilla armor's texture slot for custom armor trims. + # To preserve the original look, it uses trim configurations to reconstruct the default appearance. + asset-id: minecraft:chainmail + humanoid: minecraft:trims/entity/humanoid/chainmail + humanoid-leggings: minecraft:trims/entity/humanoid_leggings/chainmail block: # Enables the sound system, which prevents the client from hearing some non-custom block sounds and improves the client experience. diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java index a5e2274bc..abc819e6a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java @@ -90,13 +90,6 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { } EnumMap placements = new EnumMap<>(AnchorType.class); Object placementObj = section.get("placement"); - if (placementObj == null) { - // 防呆 - if (section.containsKey("material")) { - plugin.itemManager().parser().parseSection(pack, path, id, section); - return; - } - } Map placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(placementObj, "warning.config.furniture.missing_placement"), false); if (placementMap.isEmpty()) { throw new LocalizedResourceConfigException("warning.config.furniture.missing_placement"); 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 2c26ca52c..6a6e57a04 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 @@ -22,6 +22,7 @@ import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.context.event.EventFunctions; import net.momirealms.craftengine.core.plugin.context.text.TextProvider; import net.momirealms.craftengine.core.plugin.context.text.TextProviders; +import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -44,6 +45,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl protected static final Map>> VANILLA_ITEM_TAGS = new HashMap<>(); private final ItemParser itemParser; + private final EquipmentParser equipmentParser; protected final Map> externalItemProviders = new HashMap<>(); protected final Map>> dataFunctions = new HashMap<>(); protected final Map> customItems = new HashMap<>(); @@ -61,6 +63,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl protected AbstractItemManager(CraftEngine plugin) { super(plugin); this.itemParser = new ItemParser(); + this.equipmentParser = new EquipmentParser(); this.registerFunctions(); this.legacyOverrides = new HashMap<>(); this.modernOverrides = new HashMap<>(); @@ -74,7 +77,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl @Override public void registerDataType(Function> factory, String... alias) { for (String a : alias) { - dataFunctions.put(a, factory); + this.dataFunctions.put(a, factory); } } @@ -87,11 +90,11 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl protected void applyDataFunctions(Map dataSection, Consumer> consumer) { if (dataSection != null) { for (Map.Entry dataEntry : dataSection.entrySet()) { - Optional.ofNullable(dataFunctions.get(dataEntry.getKey())).ifPresent(function -> { + Optional.ofNullable(this.dataFunctions.get(dataEntry.getKey())).ifPresent(function -> { try { consumer.accept(function.apply(dataEntry.getValue())); } catch (IllegalArgumentException e) { - plugin.logger().warn("Invalid data format", e); + this.plugin.logger().warn("Invalid data format", e); } }); } @@ -99,8 +102,8 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl } @Override - public ConfigParser parser() { - return this.itemParser; + public ConfigParser[] parsers() { + return new ConfigParser[]{this.itemParser, this.equipmentParser}; } @Override @@ -261,6 +264,26 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl protected abstract CustomItem.Builder createPlatformItemBuilder(Holder id, Key material, Key clientBoundMaterial); + public class EquipmentParser implements ConfigParser { + public static final String[] CONFIG_SECTION_NAME = new String[] {"equipments", "equipment"}; + + @Override + public String[] sectionId() { + return CONFIG_SECTION_NAME; + } + + @Override + public int loadingSequence() { + return LoadingSequence.EQUIPMENT; + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + + + } + } + public class ItemParser implements ConfigParser { public static final String[] CONFIG_SECTION_NAME = new String[] {"items", "item"}; @@ -312,7 +335,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl // To get at least one model provider // Sets some basic model info if (customModelData > 0) { - itemBuilder.dataModifier(new CustomModelDataModifier<>(customModelData)); + itemBuilder.clientBoundDataModifier(new CustomModelDataModifier<>(customModelData)); } // Requires the item to have model before apply item-model else if (!hasItemModelSection && section.containsKey("model") && VersionHelper.isOrAbove1_21_2()) { @@ -320,7 +343,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl // customize or use the id itemModelKey = Key.from(section.getOrDefault("item-model", id.toString()).toString()); if (ResourceLocation.isValid(itemModelKey.toString())) { - itemBuilder.dataModifier(new ItemModelModifier<>(itemModelKey)); + itemBuilder.clientBoundDataModifier(new ItemModelModifier<>(itemModelKey)); } else { itemModelKey = null; } @@ -328,7 +351,7 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl if (hasItemModelSection && VersionHelper.isOrAbove1_21_2()) { itemModelKey = Key.from(section.get("item-model").toString()); - itemBuilder.dataModifier(new ItemModelModifier<>(itemModelKey)); + itemBuilder.clientBoundDataModifier(new ItemModelModifier<>(itemModelKey)); } // Get item data @@ -449,14 +472,14 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl }, "external"); registerDataType((obj) -> { String name = obj.toString(); - return new CustomNameModifier<>(Config.nonItalic() ? "" + name : name); + return new CustomNameModifier<>(name); }, "custom-name"); registerDataType((obj) -> { String name = obj.toString(); - return new ItemNameModifier<>(Config.nonItalic() ? "" + name : name); + return new ItemNameModifier<>(name); }, "item-name", "display-name"); registerDataType((obj) -> { - List lore = MiscUtils.getAsStringList(obj).stream().map(it -> "" + it).toList(); + List lore = MiscUtils.getAsStringList(obj); return new LoreModifier<>(lore); }, "lore", "display-lore", "description"); registerDataType((obj) -> { 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 aa1821802..627b4279c 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 @@ -21,7 +21,7 @@ public interface ItemManager extends Manageable, ModelGenerator { void registerDataType(Function> factory, String... alias); - ConfigParser parser(); + ConfigParser[] parsers(); Map> legacyItemOverrides(); 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 936a84e84..76a4f9d6e 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 @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.entity.Billboard; import net.momirealms.craftengine.core.entity.ItemDisplayContext; import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; import net.momirealms.craftengine.core.entity.projectile.ProjectileType; +import net.momirealms.craftengine.core.item.equipment.ComponentBasedEquipment; import net.momirealms.craftengine.core.item.modifier.EquippableModifier; import net.momirealms.craftengine.core.item.modifier.FoodModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; @@ -300,13 +301,8 @@ public class ItemSettings { registerFactory("equippable", (value -> { Map args = MiscUtils.castToMap(value, false); 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())); - } - } + ComponentBasedEquipment componentBasedEquipment = ComponentBasedEquipment.FACTORY.create(data.assetId(), args); + ItemEquipment itemEquipment = new ItemEquipment(data, componentBasedEquipment); return settings -> settings.equipment(itemEquipment); })); registerFactory("can-place", (value -> { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/AbstractEquipment.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/AbstractEquipment.java new file mode 100644 index 000000000..19eba975e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/AbstractEquipment.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.equipment; + +import net.momirealms.craftengine.core.util.Key; + +public abstract class AbstractEquipment implements Equipment { + protected final Key assetId; + + protected AbstractEquipment(Key assetId) { + this.assetId = assetId; + } + + @Override + public Key assetId() { + return assetId; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/ComponentBasedEquipment.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/ComponentBasedEquipment.java new file mode 100644 index 000000000..1422814da --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/ComponentBasedEquipment.java @@ -0,0 +1,118 @@ +package net.momirealms.craftengine.core.item.equipment; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.misc.EquipmentLayerType; +import net.momirealms.craftengine.core.util.Key; +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 ComponentBasedEquipment extends AbstractEquipment { + public static final Factory FACTORY = new Factory(); + private final EnumMap> layers; + + public ComponentBasedEquipment(Key assetId) { + super(assetId); + this.layers = new EnumMap<>(EquipmentLayerType.class); + } + + @Override + public Key renderingMethod() { + return Equipments.COMPONENT; + } + + public EnumMap> layers() { + return layers; + } + + public void addLayer(EquipmentLayerType layerType, List layer) { + this.layers.put(layerType, layer); + } + + public static class Factory implements EquipmentFactory { + + @Override + public ComponentBasedEquipment create(Key id, Map args) { + ComponentBasedEquipment equipment = new ComponentBasedEquipment(id); + for (Map.Entry entry : args.entrySet()) { + EquipmentLayerType layerType = EquipmentLayerType.byId(entry.getKey()); + if (layerType != null) { + equipment.addLayer(layerType, Layer.fromConfig(entry.getValue())); + } + } + return equipment; + } + } + + 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/item/equipment/Equipment.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipment.java new file mode 100644 index 000000000..90d3cf4bf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipment.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.item.equipment; + +import net.momirealms.craftengine.core.util.Key; + +public interface Equipment { + + Key assetId(); + + Key renderingMethod(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/EquipmentFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/EquipmentFactory.java new file mode 100644 index 000000000..16fe7f862 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/EquipmentFactory.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.item.equipment; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public interface EquipmentFactory { + + Equipment create(Key id, Map args); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java new file mode 100644 index 000000000..a422fd881 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/Equipments.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.item.equipment; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public class Equipments { + public static final Key TRIM = Key.of("craftengine:trim"); + public static final Key COMPONENT = Key.of("craftengine:component"); + + static { + register(TRIM, TrimBasedEquipment.FACTORY); + } + + public static void register(Key key, EquipmentFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.EQUIPMENT_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.EQUIPMENT_FACTORY.location(), key)); + holder.bindValue(factory); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/equipment/TrimBasedEquipment.java b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/TrimBasedEquipment.java new file mode 100644 index 000000000..736315df7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/equipment/TrimBasedEquipment.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.item.equipment; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.Map; + +public class TrimBasedEquipment extends AbstractEquipment { + public static final Factory FACTORY = new Factory(); + private final Key humanoid; + private final Key humanoidLeggings; + + public TrimBasedEquipment(Key assetId, Key humanoid, Key humanoidLeggings) { + super(assetId); + this.humanoid = humanoid; + this.humanoidLeggings = humanoidLeggings; + } + + @Override + public Key renderingMethod() { + return Equipments.TRIM; + } + + public Key humanoid() { + return humanoid; + } + + public Key humanoidLeggings() { + return humanoidLeggings; + } + + public static class Factory implements EquipmentFactory { + @Override + public Equipment create(Key id, Map args) { + // todo node + String humanoidId = ResourceConfigUtils.requireNonEmptyStringOrThrow(args.get("humanoid"), ""); + String humanoidLeggingsId = ResourceConfigUtils.requireNonEmptyStringOrThrow(args.get("humanoid-leggings"), ""); + // todo 验证resource location + return new TrimBasedEquipment(id, Key.of(humanoidId), Key.of(humanoidLeggingsId)); + } + } +} 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 index 0341afe7d..da8e604b4 100644 --- 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 @@ -1,101 +1,29 @@ package net.momirealms.craftengine.core.item.setting; -import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.equipment.ComponentBasedEquipment; 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; + private final ComponentBasedEquipment equipment; - public ItemEquipment(EquipmentData data) { + public ItemEquipment(EquipmentData data, ComponentBasedEquipment equipment) { this.data = data; - this.layers = new EnumMap<>(EquipmentLayerType.class); + this.equipment = equipment; } - public void addLayer(EquipmentLayerType layerType, List layer) { - this.layers.put(layerType, layer); + public void addLayer(EquipmentLayerType layerType, List layer) { + this.equipment.addLayer(layerType, layer); } - public EnumMap> layers() { - return layers; + public EnumMap> layers() { + return this.equipment.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/LoadingSequence.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java index 496ce89e6..82604386c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java @@ -8,14 +8,15 @@ public final class LoadingSequence { public static final int LANG = 20; public static final int TRANSLATION = 30; public static final int BLOCK = 40; - public static final int ITEM = 50; - public static final int FURNITURE = 60; - public static final int IMAGE = 70; - public static final int RECIPE = 80; - public static final int CATEGORY = 90; - public static final int SOUND = 100; - public static final int JUKEBOX_SONG = 110; - public static final int VANILLA_LOOTS = 120; - public static final int EMOJI = 130; - public static final int ADVANCEMENT = 140; + public static final int EQUIPMENT = 50; + public static final int ITEM = 60; + public static final int FURNITURE = 70; + public static final int IMAGE = 80; + public static final int RECIPE = 90; + public static final int CATEGORY = 100; + public static final int SOUND = 110; + public static final int JUKEBOX_SONG = 120; + public static final int VANILLA_LOOTS = 130; + public static final int EMOJI = 140; + public static final int ADVANCEMENT = 150; } 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 index 0feb0f17e..eabdca9d9 100644 --- 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 @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.pack.misc; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.equipment.ComponentBasedEquipment; import net.momirealms.craftengine.core.item.setting.ItemEquipment; import java.util.EnumMap; @@ -10,16 +11,16 @@ import java.util.Map; import java.util.function.Supplier; public class Equipment implements Supplier { - private final EnumMap> layers; + 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); + 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 是否异常 } @@ -31,18 +32,18 @@ public class Equipment implements Supplier { JsonObject jsonObject = new JsonObject(); JsonObject layersJson = new JsonObject(); jsonObject.add("layers", layersJson); - for (Map.Entry> entry : layers.entrySet()) { + for (Map.Entry> entry : layers.entrySet()) { EquipmentLayerType type = entry.getKey(); - List layerList = entry.getValue(); + List layerList = entry.getValue(); setLayers(layersJson, layerList, type.id()); } return jsonObject; } - private void setLayers(JsonObject layersJson, List layers, String key) { + private void setLayers(JsonObject layersJson, List layers, String key) { if (layers == null || layers.isEmpty()) return; JsonArray layersArray = new JsonArray(); - for (ItemEquipment.Layer layer : layers) { + for (ComponentBasedEquipment.Layer layer : layers) { layersArray.add(layer.get()); } layersJson.add(key, layersArray); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 04c267afc..1ff4549c2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -263,7 +263,7 @@ public abstract class CraftEngine implements Plugin { // register font parser this.packManager.registerConfigSectionParsers(this.fontManager.parsers()); // register item parser - this.packManager.registerConfigSectionParser(this.itemManager.parser()); + this.packManager.registerConfigSectionParsers(this.itemManager.parsers()); // register furniture parser this.packManager.registerConfigSectionParser(this.furnitureManager.parser()); // register block parser diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 72259e56d..5980d5d42 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -123,8 +123,6 @@ public class Config { protected boolean recipe$disable_vanilla_recipes$all; protected Set recipe$disable_vanilla_recipes$list; - protected boolean item$non_italic_tag; - protected boolean image$illegal_characters_filter$command; protected boolean image$illegal_characters_filter$chat; protected boolean image$illegal_characters_filter$anvil; @@ -284,9 +282,6 @@ public class Config { resource_pack$duplicated_files_handler = List.of(); } - // item - item$non_italic_tag = config.getBoolean("item.non-italic-tag", false); - // performance performance$max_note_block_chain_update_limit = config.getInt("performance.max-note-block-chain-update-limit", 64); performance$max_tripwire_chain_update_limit = config.getInt("performance.max-tripwire-chain-update-limit", 128); @@ -456,10 +451,6 @@ public class Config { return instance.recipe$disable_vanilla_recipes$list; } - public static boolean nonItalic() { - return instance.item$non_italic_tag; - } - public static boolean restoreVanillaBlocks() { return instance.chunk_system$restore_vanilla_blocks_on_chunk_unload && instance.chunk_system$restore_custom_blocks_on_chunk_load; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 46c6061b6..f27fb9966 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -5,6 +5,7 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.PropertyFactory; import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory; import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.equipment.EquipmentFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; @@ -68,6 +69,7 @@ public class BuiltInRegistries { public static final Registry> EVENT_FUNCTION_FACTORY = createRegistry(Registries.EVENT_FUNCTION_FACTORY); public static final Registry> EVENT_CONDITION_FACTORY = createRegistry(Registries.EVENT_CONDITION_FACTORY); public static final Registry> PLAYER_SELECTOR_FACTORY = createRegistry(Registries.PLAYER_SELECTOR_FACTORY); + public static final Registry EQUIPMENT_FACTORY = createRegistry(Registries.EQUIPMENT_FACTORY); private static Registry createRegistry(ResourceKey> key) { return new MappedRegistry<>(key); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index c050b9642..219617529 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -5,6 +5,7 @@ import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.PropertyFactory; import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory; import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.equipment.EquipmentFactory; import net.momirealms.craftengine.core.item.recipe.CustomSmithingTransformRecipe; import net.momirealms.craftengine.core.item.recipe.RecipeFactory; import net.momirealms.craftengine.core.loot.LootContext; @@ -68,5 +69,6 @@ public class Registries { public static final ResourceKey> RESOURCE_PACK_HOST_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resource_pack_host_factory")); public static final ResourceKey>> EVENT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("event_function_factory")); public static final ResourceKey>> EVENT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("event_condition_factory")); - public static final ResourceKey>> PLAYER_SELECTOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_selector")); + public static final ResourceKey>> PLAYER_SELECTOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("player_selector_factory")); + public static final ResourceKey> EQUIPMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("equipment_factory")); }