diff --git a/common-files/src/main/resources/resources/legacy_armor/configuration/chainmail.yml b/common-files/src/main/resources/resources/legacy_armor/configuration/chainmail.yml index aefcab72b..49d041fcf 100644 --- a/common-files/src/main/resources/resources/legacy_armor/configuration/chainmail.yml +++ b/common-files/src/main/resources/resources/legacy_armor/configuration/chainmail.yml @@ -5,18 +5,26 @@ items: trim: pattern: chainmail material: custom + hide-tooltip: + - trim minecraft:chainmail_chestplate: client-bound-data: trim: pattern: chainmail material: custom + hide-tooltip: + - trim minecraft:chainmail_leggings: client-bound-data: trim: pattern: chainmail material: custom + hide-tooltip: + - trim minecraft:chainmail_boots: client-bound-data: trim: pattern: chainmail - material: custom \ No newline at end of file + material: custom + hide-tooltip: + - trim \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/LazyBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/LazyBlockState.java deleted file mode 100644 index 4e40bf470..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/block/LazyBlockState.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.momirealms.craftengine.core.block; - -import net.momirealms.craftengine.core.plugin.CraftEngine; - -public final class LazyBlockState { - private final String state; - private BlockStateWrapper packedBlockState; - - public LazyBlockState(String state) { - this.state = state; - } - - public BlockStateWrapper getState() { - if (this.packedBlockState == null) { - this.packedBlockState = CraftEngine.instance().blockManager().createPackedBlockState(state); - if (this.packedBlockState == null) { - CraftEngine.instance().logger().warn("Could not create block state: " + this.state); - } - } - return this.packedBlockState; - } -} \ No newline at end of file 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 3150379ae..c6691d78b 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 @@ -547,6 +547,10 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH); return new TrimModifier<>(material, pattern); }, "trim"); + registerDataType((obj) -> { + List components = MiscUtils.getAsStringList(obj).stream().map(Key::of).toList(); + return new HideTooltipModifier<>(components); + }, "hide-tooltip", "hide-flags"); registerDataType((obj) -> { Map data = MiscUtils.castToMap(obj, false); Map arguments = new HashMap<>(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java index d527aac2f..6b4e70569 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java @@ -5,27 +5,74 @@ import net.momirealms.craftengine.core.util.Key; public final class ComponentKeys { private ComponentKeys() {} + public static final Key ATTRIBUTE_MODIFIERS = Key.of("minecraft", "attribute_modifiers"); + public static final Key BANNER_PATTERN = Key.of("minecraft", "banner_patterns"); + public static final Key BASE_COLOR = Key.of("minecraft", "base_color"); + public static final Key BEES = Key.of("minecraft", "bees"); + public static final Key BLOCK_ENTITY_DATA = Key.of("minecraft", "block_entity_data"); + public static final Key BLOCK_STATE = Key.of("minecraft", "block_state"); + public static final Key BLOCKS_ATTACK = Key.of("minecraft", "blocks_attacks"); + public static final Key BREAK_SOUND = Key.of("minecraft", "break_sound"); + public static final Key BUCKET_ENTITY_DATA = Key.of("minecraft", "bucket_entity_data"); + public static final Key BUNDLE_CONTENTS = Key.of("minecraft", "bundle_contents"); + public static final Key CAN_BREAK = Key.of("minecraft", "can_break"); + public static final Key CAN_PLACE_ON = Key.of("minecraft", "can_place_on"); + public static final Key CHARGED_PROJECTILES = Key.of("minecraft", "charged_projectiles"); + public static final Key CONSUMABLE = Key.of("minecraft", "consumable"); + public static final Key CONTAINER = Key.of("minecraft", "container"); + public static final Key CONTAINER_LOOT = Key.of("minecraft", "container_loot"); + public static final Key CUSTOM_DATA = Key.of("minecraft", "custom_data"); public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft", "custom_model_data"); public static final Key CUSTOM_NAME = Key.of("minecraft", "custom_name"); - public static final Key ITEM_NAME = Key.of("minecraft", "item_name"); - public static final Key LORE = Key.of("minecraft", "lore"); public static final Key DAMAGE = Key.of("minecraft", "damage"); - public static final Key MAX_DAMAGE = Key.of("minecraft", "max_damage"); + public static final Key DAMAGE_RESISTANT = Key.of("minecraft", "damage_resistant"); + public static final Key DEBUG_STICK_STATE = Key.of("minecraft", "debug_stick_state"); + public static final Key DEATH_PROTECTION = Key.of("minecraft", "death_protection"); + public static final Key DYED_COLOR = Key.of("minecraft", "dyed_color"); + public static final Key ENCHANTABLE = Key.of("minecraft", "enchantable"); public static final Key ENCHANTMENT_GLINT_OVERRIDE = Key.of("minecraft", "enchantment_glint_override"); public static final Key ENCHANTMENTS = Key.of("minecraft", "enchantments"); - public static final Key STORED_ENCHANTMENTS = Key.of("minecraft", "stored_enchantments"); - public static final Key UNBREAKABLE = Key.of("minecraft", "unbreakable"); - public static final Key MAX_STACK_SIZE = Key.of("minecraft", "max_stack_size"); + public static final Key ENTITY_DATA = Key.of("minecraft", "entity_data"); public static final Key EQUIPPABLE = Key.of("minecraft", "equippable"); - public static final Key ITEM_MODEL = Key.of("minecraft", "item_model"); - public static final Key TOOLTIP_STYLE = Key.of("minecraft", "tooltip_style"); - public static final Key JUKEBOX_PLAYABLE = Key.of("minecraft", "jukebox_playable"); - public static final Key TRIM = Key.of("minecraft", "trim"); - public static final Key REPAIR_COST = Key.of("minecraft", "repair_cost"); - public static final Key CUSTOM_DATA = Key.of("minecraft", "custom_data"); - public static final Key PROFILE = Key.of("minecraft", "profile"); - public static final Key DYED_COLOR = Key.of("minecraft", "dyed_color"); - public static final Key DEATH_PROTECTION = Key.of("minecraft", "death_protection"); - public static final Key FOOD = Key.of("minecraft", "food"); public static final Key FIREWORK_EXPLOSION = Key.of("minecraft", "firework_explosion"); + public static final Key FIREWORKS = Key.of("minecraft", "fireworks"); + public static final Key FOOD = Key.of("minecraft", "food"); + public static final Key GLIDER = Key.of("minecraft", "glider"); + public static final Key INSTRUMENT = Key.of("minecraft", "instrument"); + public static final Key INTANGIBLE_PROJECTILE = Key.of("minecraft", "intangible_projectile"); + public static final Key ITEM_MODEL = Key.of("minecraft", "item_model"); + public static final Key ITEM_NAME = Key.of("minecraft", "item_name"); + public static final Key JUKEBOX_PLAYABLE = Key.of("minecraft", "jukebox_playable"); + public static final Key LOCK = Key.of("minecraft", "lock"); + public static final Key LODESTONE_TRACKER = Key.of("minecraft", "lodestone_tracker"); + public static final Key LORE = Key.of("minecraft", "lore"); + public static final Key MAP_COLOR = Key.of("minecraft", "map_color"); + public static final Key MAP_DECORATIONS = Key.of("minecraft", "map_decorations"); + public static final Key MAP_ID = Key.of("minecraft", "map_id"); + public static final Key MAX_DAMAGE = Key.of("minecraft", "max_damage"); + public static final Key MAX_STACK_SIZE = Key.of("minecraft", "max_stack_size"); + public static final Key NOTE_BLOCK_SOUND = Key.of("minecraft", "note_block_sound"); + public static final Key OMINOUS_BOTTLE_AMPLIFIER = Key.of("minecraft", "ominous_bottle_amplifier"); + public static final Key POT_DECORATIONS = Key.of("minecraft", "pot_decorations"); + public static final Key POTION_CONTENTS = Key.of("minecraft", "potion_contents"); + public static final Key POTION_DURATION_SCALE = Key.of("minecraft", "potion_duration_scale"); + public static final Key PROFILE = Key.of("minecraft", "profile"); + public static final Key PROVIDES_BANNER_PATTERN = Key.of("minecraft", "provides_banner_patterns"); + public static final Key PROVIDES_TRIM_MATERIAL = Key.of("minecraft", "provides_trim_material"); + public static final Key RARITY = Key.of("minecraft", "rarity"); + public static final Key RECIPES = Key.of("minecraft", "recipes"); + public static final Key REPAIRABLE = Key.of("minecraft", "repairable"); + public static final Key REPAIR_COST = Key.of("minecraft", "repair_cost"); + public static final Key STORED_ENCHANTMENTS = Key.of("minecraft", "stored_enchantments"); + public static final Key SUSPICIOUS_STEW_EFFECTS = Key.of("minecraft", "suspicious_stew_effects"); + public static final Key TOOL = Key.of("minecraft", "tool"); + public static final Key TOOLTIP_DISPLAY = Key.of("minecraft", "tooltip_display"); + public static final Key TOOLTIP_STYLE = Key.of("minecraft", "tooltip_style"); + public static final Key TRIM = Key.of("minecraft", "trim"); + public static final Key UNBREAKABLE = Key.of("minecraft", "unbreakable"); + public static final Key USE_COOLDOWN = Key.of("minecraft", "use_cooldown"); + public static final Key USE_REMAINDER = Key.of("minecraft", "use_remainder"); + public static final Key WEAPON = Key.of("minecraft", "weapon"); + public static final Key WRITABLE_BOOK_CONTENT = Key.of("minecraft", "writable_book_content"); + public static final Key WRITTEN_BOOK_CONTENT = Key.of("minecraft", "written_book_content"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/DelayedInitItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/DelayedInitItem.java deleted file mode 100644 index 2e6db264f..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/item/DelayedInitItem.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.momirealms.craftengine.core.item; - -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.Key; - -public class DelayedInitItem { - private final Key itemId; - private Item item; - - public DelayedInitItem(Key itemId) { - this.itemId = itemId; - } - - public Item getItem() { - if (this.item == null) { - this.item = CraftEngine.instance().itemManager().createWrappedItem(this.itemId, null); - if (this.item == null) { - CraftEngine.instance().logger().warn("Could not create item: " + this.itemId); - } - } - return this.item; - } -} 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 1a545b8bc..dba5abe21 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 @@ -51,7 +51,7 @@ public class ItemSettings { modifiers.add(new EquippableModifier<>(data)); } if (!this.equipment.clientBoundModel().asBoolean(Config.globalClientboundModel())) { - modifiers.add(this.equipment.equipment().modifier()); + modifiers.addAll(this.equipment.equipment().modifiers()); } } if (VersionHelper.isOrAbove1_20_5() && this.foodData != null) { @@ -64,7 +64,7 @@ public class ItemSettings { ArrayList> modifiers = new ArrayList<>(); if (this.equipment != null) { if (this.equipment.clientBoundModel().asBoolean(Config.globalClientboundModel())) { - modifiers.add(this.equipment.equipment().modifier()); + modifiers.addAll(this.equipment.equipment().modifiers()); } } return modifiers; 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 index 7c5075eb7..d8d52d807 100644 --- 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 @@ -31,8 +31,8 @@ public class ComponentBasedEquipment extends AbstractEquipment implements Suppli } @Override - public ItemDataModifier modifier() { - return new EquippableAssetIdModifier<>(this.assetId); + public List> modifiers() { + return List.of(new EquippableAssetIdModifier<>(this.assetId)); } public EnumMap> layers() { 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 index 82c26006a..d36d1a885 100644 --- 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 @@ -3,11 +3,13 @@ package net.momirealms.craftengine.core.item.equipment; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.util.Key; +import java.util.List; + public interface Equipment { Key assetId(); Key type(); - ItemDataModifier modifier(); + List> modifiers(); } 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 index e5f2513c3..46655c2ea 100644 --- 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 @@ -1,11 +1,14 @@ package net.momirealms.craftengine.core.item.equipment; +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.modifier.HideTooltipModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.item.modifier.TrimModifier; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -36,8 +39,11 @@ public class TrimBasedEquipment extends AbstractEquipment { } @Override - public ItemDataModifier modifier() { - return new TrimModifier<>(AbstractPackManager.NEW_TRIM_MATERIAL, this.assetId.toString()); + public List> modifiers() { + return List.of( + new TrimModifier<>(AbstractPackManager.NEW_TRIM_MATERIAL, this.assetId.toString()), + new HideTooltipModifier<>(List.of(ComponentKeys.TRIM)) + ); } public static class Factory implements EquipmentFactory { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/HideTooltipModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/HideTooltipModifier.java new file mode 100644 index 000000000..368862879 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/HideTooltipModifier.java @@ -0,0 +1,215 @@ +package net.momirealms.craftengine.core.item.modifier; + +import com.google.common.collect.ImmutableMap; +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.NetworkItemHandler; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class HideTooltipModifier implements ItemDataModifier { + public static final Map TO_LEGACY; + static { + ImmutableMap.Builder builder = ImmutableMap.builder(); + builder.put(ComponentKeys.ENCHANTMENTS, 1); + builder.put(ComponentKeys.ATTRIBUTE_MODIFIERS, 2); + builder.put(ComponentKeys.UNBREAKABLE, 4); + builder.put(ComponentKeys.CAN_BREAK, 8); + builder.put(ComponentKeys.CAN_PLACE_ON, 16); + builder.put(ComponentKeys.STORED_ENCHANTMENTS, 32); + builder.put(ComponentKeys.POTION_CONTENTS, 32); + builder.put(ComponentKeys.WRITTEN_BOOK_CONTENT, 32); + builder.put(ComponentKeys.FIREWORKS, 32); + builder.put(ComponentKeys.FIREWORK_EXPLOSION, 32); + builder.put(ComponentKeys.BUNDLE_CONTENTS, 32); + builder.put(ComponentKeys.MAP_ID, 32); + builder.put(ComponentKeys.MAP_COLOR, 32); + builder.put(ComponentKeys.MAP_DECORATIONS, 32); + builder.put(ComponentKeys.DYED_COLOR, 64); + builder.put(ComponentKeys.TRIM, 128); + TO_LEGACY = builder.build(); + } + + private final List components; + private final Applier applier; + + public HideTooltipModifier(List components) { + this.components = components; + if (VersionHelper.isOrAbove1_21_5()) { + this.applier = new ModernApplier<>(components); + } else if (VersionHelper.isOrAbove1_20_5()) { + if (components.isEmpty()) { + this.applier = new DummyApplier<>(); + } else if (components.size() == 1) { + this.applier = new SemiModernApplier<>(components.getFirst()); + } else { + List> appliers = new ArrayList<>(); + for (Key key : components) { + appliers.add(new SemiModernApplier<>(key)); + } + this.applier = new CompoundApplier<>(appliers); + } + } else { + this.applier = new LegacyApplier<>(components); + } + } + + public List components() { + return components; + } + + @Override + public Item apply(Item item, ItemBuildContext context) { + this.applier.apply(item); + return item; + } + + @Override + public Item prepareNetworkItem(Item item, ItemBuildContext context, CompoundTag networkData) { + if (VersionHelper.isOrAbove1_21_5()) { + Tag previous = item.getNBTComponent(ComponentKeys.TOOLTIP_DISPLAY); + if (previous != null) { + networkData.put(ComponentKeys.TOOLTIP_DISPLAY.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(ComponentKeys.TOOLTIP_DISPLAY.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } else if (VersionHelper.isOrAbove1_20_5()) { + for (Key component : this.components) { + Tag previous = item.getNBTComponent(component); + if (previous != null) { + networkData.put(component.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put(component.asString(), NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } + } else { + Tag previous = item.getNBTTag("HideFlags"); + if (previous != null) { + networkData.put("HideFlags", NetworkItemHandler.pack(NetworkItemHandler.Operation.ADD, previous)); + } else { + networkData.put("HideFlags", NetworkItemHandler.pack(NetworkItemHandler.Operation.REMOVE)); + } + } + return item; + } + + @Override + public String name() { + return "hide-tooltip"; + } + + public interface Applier { + + void apply(Item item); + } + + public static class DummyApplier implements Applier { + + @Override + public void apply(Item item) { + } + } + + public static class SemiModernApplier implements Applier { + private final Key component; + + public SemiModernApplier(Key component) { + this.component = component; + } + + @Override + public void apply(Item item) { + Tag previous = item.getNBTComponent(this.component); + if (previous instanceof CompoundTag compoundTag) { + compoundTag.putBoolean("show_in_tooltip", false); + item.setNBTComponent(this.component, compoundTag); + } else { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.putBoolean("show_in_tooltip", false); + item.setNBTComponent(this.component, compoundTag); + } + } + } + + public record CompoundApplier(List> appliers) implements Applier { + + @Override + public void apply(Item item) { + for (Applier applier : appliers) { + applier.apply(item); + } + } + } + + public static class LegacyApplier implements Applier { + private final int legacyValue; + + public LegacyApplier(List components) { + int i = 0; + for (Key key : components) { + Integer flag = TO_LEGACY.get(key); + if (flag != null) { + i += flag; + } + } + this.legacyValue = i; + } + + public int legacyValue() { + return legacyValue; + } + + @Override + public void apply(Item item) { + Integer previousFlags = (Integer) item.getJavaTag("HideFlags"); + if (previousFlags != null) { + item.setTag(this.legacyValue | previousFlags, "HideFlags"); + } else { + item.setTag(this.legacyValue, "HideFlags"); + } + } + } + + public static class ModernApplier implements Applier { + private final List components; + + public ModernApplier(List components) { + this.components = components.stream().map(Key::toString).collect(Collectors.toList()); + } + + public List components() { + return components; + } + + @Override + public void apply(Item item) { + Map data = MiscUtils.castToMap(item.getJavaComponent(ComponentKeys.TOOLTIP_DISPLAY), true); + if (data == null) { + item.setJavaComponent(ComponentKeys.TOOLTIP_DISPLAY, Map.of("hidden_components", this.components)); + } else { + if (data.get("hidden_components") instanceof List list) { + List hiddenComponents = list.stream().map(Object::toString).toList(); + List mergedComponents = Stream.concat( + hiddenComponents.stream(), + this.components.stream() + ).distinct().toList(); + Map newData = new HashMap<>(data); + newData.put("hidden_components", mergedComponents); + item.setJavaComponent(ComponentKeys.TOOLTIP_DISPLAY, newData); + } else { + Map newData = new HashMap<>(data); + newData.put("hidden_components", this.components); + item.setJavaComponent(ComponentKeys.TOOLTIP_DISPLAY, newData); + } + } + } + } +} 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 d222feb78..a4d5e8b6b 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 @@ -1280,6 +1280,12 @@ public abstract class AbstractPackManager implements PackManager { } catch (Exception ignored) { } } + + // 修复被干碎的原版盔甲 + Key vanillaFixTrimType = Key.of("minecraft", Config.sacrificedVanillaArmorType()); + collectedTrims.add(Tuple.of(vanillaFixTrimType, true, true)); + processTrimBasedEquipment(new TrimBasedEquipment(vanillaFixTrimType, Config.sacrificedHumanoid(), Config.sacrificedHumanoidLeggings()), generatedPackPath); + // 准备新版本atlas和覆盖纹理 JsonObject modernTrimAtlasJson = null; if (needModernCompatibility) { @@ -1329,11 +1335,6 @@ public abstract class AbstractPackManager implements PackManager { } } - // 修复被干碎的原版盔甲 - Key vanillaFixTrimType = Key.of("minecraft", Config.sacrificedVanillaArmorType()); - collectedTrims.add(Tuple.of(vanillaFixTrimType, true, true)); - processTrimBasedEquipment(new TrimBasedEquipment(vanillaFixTrimType, Config.sacrificedHumanoid(), Config.sacrificedHumanoidLeggings()), generatedPackPath); - // 准备旧版本atlas和覆盖纹理 JsonObject legacyTrimAtlasJson = null; if (needLegacyCompatibility) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java index d7c039825..bc65826b4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java @@ -1,7 +1,8 @@ package net.momirealms.craftengine.core.plugin.context.function; -import net.momirealms.craftengine.core.block.LazyBlockState; -import net.momirealms.craftengine.core.item.DelayedInitItem; +import net.momirealms.craftengine.core.block.BlockStateWrapper; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; @@ -9,6 +10,7 @@ import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.util.Color; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.LazyReference; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.Position; import net.momirealms.craftengine.core.world.Vec3d; @@ -20,13 +22,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Supplier; public class ParticleFunction extends AbstractConditionalFunction { public static final Map, ParticleData>> DATA_TYPES = new HashMap<>(); static { registerParticleData(map -> new BlockStateData( - new LazyBlockState(ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("block-state"), "warning.config.function.particle.missing_block_state"))), + LazyReference.lazyReference(new Supplier<>() { + final String blockState = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("block-state"), "warning.config.function.particle.missing_block_state"); + @Override + public BlockStateWrapper get() { + return CraftEngine.instance().blockManager().createPackedBlockState(this.blockState); + } + })), ParticleTypes.BLOCK, ParticleTypes.FALLING_DUST, ParticleTypes.DUST_PILLAR, ParticleTypes.BLOCK_CRUMBLE, ParticleTypes.BLOCK_MARKER); registerParticleData(map -> new ColorData( Color.fromString(ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("color"), "warning.config.function.particle.missing_color").split(","))), @@ -47,7 +56,14 @@ public class ParticleFunction extends AbstractConditionalFu ResourceConfigUtils.getAsFloat(map.getOrDefault("scale", 1), "scale")), ParticleTypes.DUST_COLOR_TRANSITION); registerParticleData(map -> new ItemStackData( - new DelayedInitItem(Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("item"), "warning.config.function.particle.missing_item")))), + LazyReference.lazyReference(new Supplier<>() { + final Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("item"), "warning.config.function.particle.missing_item")); + @Override + public Item get() { + return CraftEngine.instance().itemManager().createWrappedItem(this.itemId, null); + } + }) + ), ParticleTypes.ITEM); registerParticleData(map -> new VibrationData( NumberProviders.fromObject(map.getOrDefault("target-x", 0)), diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java index 892bb83e3..2efaf8877 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java @@ -1,13 +1,15 @@ package net.momirealms.craftengine.core.plugin.context.function; -import net.momirealms.craftengine.core.block.LazyBlockState; +import net.momirealms.craftengine.core.block.BlockStateWrapper; import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.LazyReference; import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.World; @@ -18,13 +20,13 @@ import java.util.Map; import java.util.Optional; public class PlaceBlockFunction extends AbstractConditionalFunction { - private final LazyBlockState lazyBlockState; + private final LazyReference lazyBlockState; private final NumberProvider x; private final NumberProvider y; private final NumberProvider z; private final NumberProvider updateFlags; - public PlaceBlockFunction(LazyBlockState lazyBlockState, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, List> predicates) { + public PlaceBlockFunction(LazyReference lazyBlockState, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, List> predicates) { super(predicates); this.lazyBlockState = lazyBlockState; this.x = x; @@ -38,7 +40,7 @@ public class PlaceBlockFunction extends AbstractConditional Optional optionalWorldPosition = ctx.getOptionalParameter(DirectContextParameters.POSITION); if (optionalWorldPosition.isPresent()) { World world = optionalWorldPosition.get().world(); - world.setBlockAt(MCUtils.fastFloor(this.x.getDouble(ctx)), MCUtils.fastFloor(this.y.getDouble(ctx)), MCUtils.fastFloor(this.z.getDouble(ctx)), this.lazyBlockState.getState(), this.updateFlags.getInt(ctx)); + world.setBlockAt(MCUtils.fastFloor(this.x.getDouble(ctx)), MCUtils.fastFloor(this.y.getDouble(ctx)), MCUtils.fastFloor(this.z.getDouble(ctx)), this.lazyBlockState.get(), this.updateFlags.getInt(ctx)); } } @@ -56,12 +58,11 @@ public class PlaceBlockFunction extends AbstractConditional @Override public Function create(Map arguments) { String state = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("block-state"), "warning.config.function.place_block.missing_block_state"); - LazyBlockState lazyBlockState = new LazyBlockState(state); NumberProvider x = NumberProviders.fromObject(arguments.getOrDefault("x", "")); NumberProvider y = NumberProviders.fromObject(arguments.getOrDefault("y", "")); NumberProvider z = NumberProviders.fromObject(arguments.getOrDefault("z", "")); NumberProvider flags = Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())); - return new PlaceBlockFunction<>(lazyBlockState, x, y, z, flags, getPredicates(arguments)); + return new PlaceBlockFunction<>(LazyReference.lazyReference(() -> CraftEngine.instance().blockManager().createPackedBlockState(state)), x, y, z, flags, getPredicates(arguments)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/LazyReference.java b/core/src/main/java/net/momirealms/craftengine/core/util/LazyReference.java new file mode 100644 index 000000000..1a1fcfe89 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/LazyReference.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.util; + +import java.util.function.Supplier; + +public interface LazyReference { + + T get(); + + static LazyReference lazyReference(final Supplier supplier) { + return new LazyReference<>() { + private T value; + + @Override + public T get() { + if (this.value == null) { + this.value = supplier.get(); + } + return this.value; + } + }; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/particle/BlockStateData.java b/core/src/main/java/net/momirealms/craftengine/core/world/particle/BlockStateData.java index 3f3ae7a3c..be5c7af95 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/particle/BlockStateData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/particle/BlockStateData.java @@ -1,16 +1,16 @@ package net.momirealms.craftengine.core.world.particle; import net.momirealms.craftengine.core.block.BlockStateWrapper; -import net.momirealms.craftengine.core.block.LazyBlockState; +import net.momirealms.craftengine.core.util.LazyReference; public class BlockStateData implements ParticleData { - private final LazyBlockState blockState; + private final LazyReference blockState; - public BlockStateData(LazyBlockState blockState) { + public BlockStateData(LazyReference blockState) { this.blockState = blockState; } public BlockStateWrapper blockState() { - return blockState.getState(); + return blockState.get(); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/particle/ItemStackData.java b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ItemStackData.java index 17eaa1fb9..a9b66f490 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/particle/ItemStackData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/particle/ItemStackData.java @@ -1,16 +1,16 @@ package net.momirealms.craftengine.core.world.particle; -import net.momirealms.craftengine.core.item.DelayedInitItem; import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.LazyReference; public class ItemStackData implements ParticleData { - private final DelayedInitItem item; + private final LazyReference> item; - public ItemStackData(DelayedInitItem item) { + public ItemStackData(LazyReference> item) { this.item = item; } public Item item() { - return item.getItem(); + return item.get(); } }