diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml index db308dcbc..4c1fbbc7d 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml @@ -13,9 +13,7 @@ items#misc: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:chinese_lantern + template: "default:loot_table/self" settings: template: - default:hardness/wool @@ -27,7 +25,6 @@ items#misc: instrument: HARP luminance: 15 map-color: 36 - item: default:chinese_lantern state: id: 15 state: note_block:15 @@ -52,9 +49,7 @@ items#misc: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:netherite_anvil + template: "default:loot_table/self" behavior: type: falling_block hurt-amount: 4 @@ -80,7 +75,6 @@ items#misc: fall: minecraft:block.anvil.fall land: minecraft:block.anvil.land destroy: minecraft:block.anvil.destroy - item: default:netherite_anvil map-color: 29 hardness: 10.0 resistance: 1200 @@ -137,9 +131,7 @@ items#misc: solid-block: default:solid_gunpowder_block - type: falling_block loot: - template: "default:loot_table/basic" - arguments: - item: default:gunpowder_block + template: "default:loot_table/self" settings: template: - default:sound/sand @@ -149,7 +141,6 @@ items#misc: resistance: 0.5 instrument: SNARE map-color: 45 - item: default:gunpowder_block state: id: 16 state: note_block:16 @@ -173,9 +164,7 @@ items#misc: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:solid_gunpowder_block + template: "default:loot_table/self" settings: template: - default:sound/sand @@ -186,7 +175,6 @@ items#misc: resistance: 1.8 instrument: BASEDRUM map-color: 45 - item: default:solid_gunpowder_block state: id: 17 state: note_block:17 @@ -210,9 +198,7 @@ items#misc: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:copper_coil + template: "default:loot_table/self" settings: template: - default:sound/metal @@ -225,7 +211,6 @@ items#misc: is-suffocating: true instrument: BASEDRUM map-color: 15 - item: default:copper_coil behavior: type: lamp_block states: diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml index d111185e9..c9ddaf5de 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/categories.yml @@ -67,4 +67,5 @@ categories: - default:gui_head_size_1 - default:gui_head_size_4 - minecraft:air - - default:copper_coil \ No newline at end of file + - default:copper_coil + - default:flame_elytra \ No newline at end of file diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml index 602c85f0f..fce29df5b 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/i18n.yml @@ -35,6 +35,7 @@ i18n: item.gunpowder_block: "GunPowder Block" item.solid_gunpowder_block: "Solid GunPowder Block" item.copper_coil: "Copper Coil" + item.flame_elytra: "Flame Elytra" category.default.name: "Default Assets" category.default.lore: "Contains the default configuration of CraftEngine" category.palm_tree: "Palm Tree" @@ -80,6 +81,7 @@ i18n: item.gunpowder_block: "火药粉末" item.solid_gunpowder_block: "凝固火药块" item.copper_coil: "铜线圈" + item.flame_elytra: "烈焰鞘翅" category.default.name: "默认资产" category.default.lore: "包含了CraftEngine的默认配置" category.palm_tree: "棕榈树" diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/items.yml b/bukkit/loader/src/main/resources/resources/default/configuration/items.yml index 923daec69..eb329e847 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/items.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/items.yml @@ -211,6 +211,22 @@ items#topaz_gears: on-false: type: minecraft:model path: minecraft:item/custom/topaz_trident_in_hand + default:flame_elytra: + material: elytra + custom-model-data: 1000 + settings: + equippable: + slot: chest + asset-id: flame + wings: flame_elytra + data: + item-name: "<#FF8C00>" + model: + template: default:model/simplified_elytra + arguments: + path: "minecraft:item/custom/flame_elytra" + broken_path: "minecraft:item/custom/broken_flame_elytra" + templates: default:armor/topaz: material: "chainmail_{part}" diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/ores.yml b/bukkit/loader/src/main/resources/resources/default/configuration/ores.yml index 0f46918fe..d7d21562f 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/ores.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/ores.yml @@ -51,8 +51,6 @@ blocks: max_exp: 7 settings: template: "default:settings/ore" - overrides: - item: default:topaz_ore arguments: break_power: 2 state: @@ -72,8 +70,6 @@ blocks: max_exp: 7 settings: template: "default:settings/deepslate_ore" - overrides: - item: default:deepslate_topaz_ore arguments: break_power: 2 state: diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml b/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml index de1ec717e..766a471d9 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/palm_tree.yml @@ -22,13 +22,9 @@ items: type: strippable_block stripped: default:stripped_palm_log loot: - template: "default:loot_table/basic" - arguments: - item: default:palm_log + template: "default:loot_table/self" settings: template: "default:settings/wood" - overrides: - item: default:palm_log states: template: "default:block_state/pillar" arguments: @@ -65,13 +61,9 @@ items: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:stripped_palm_log + template: "default:loot_table/self" settings: template: "default:settings/wood" - overrides: - item: default:stripped_palm_log states: template: "default:block_state/pillar" arguments: @@ -111,13 +103,9 @@ items: type: strippable_block stripped: default:stripped_palm_wood loot: - template: "default:loot_table/basic" - arguments: - item: default:palm_wood + template: "default:loot_table/self" settings: template: "default:settings/wood" - overrides: - item: default:palm_wood states: template: "default:block_state/pillar" arguments: @@ -154,13 +142,9 @@ items: type: block_item block: loot: - template: "default:loot_table/basic" - arguments: - item: default:stripped_palm_wood + template: "default:loot_table/self" settings: template: "default:settings/wood" - overrides: - item: default:stripped_palm_wood states: template: "default:block_state/pillar" arguments: @@ -197,12 +181,8 @@ items: block: settings: template: "default:settings/planks" - overrides: - item: default:palm_planks loot: - template: "default:loot_table/basic" - arguments: - item: default:palm_planks + template: "default:loot_table/self" state: model: template: "default:model/simplified_cube_all" @@ -227,8 +207,6 @@ items: block: settings: template: "default:settings/sapling" - overrides: - item: default:palm_sapling behaviors: - type: bush_block bottom-block-tags: @@ -241,9 +219,7 @@ items: feature: minecraft:fancy_oak bone-meal-success-chance: 0.45 loot: - template: "default:loot_table/basic" - arguments: - item: default:palm_sapling + template: "default:loot_table/self" states: properties: stage: @@ -297,8 +273,6 @@ items: sapling: default:palm_sapling settings: template: "default:settings/leaves" - overrides: - item: default:palm_leaves states: template: "default:block_state/leaves" arguments: diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml index 09e8cce5f..0fec00087 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml @@ -63,9 +63,7 @@ blocks: - minecraft:dirt - minecraft:farmland loot: - template: "default:loot_table/basic" - arguments: - item: default:fairy_flower + template: "default:loot_table/self" state: id: 0 state: sugar_cane:0 @@ -96,7 +94,6 @@ blocks: - default:hardness/none - default:sound/grass overrides: - item: default:reed push-reaction: DESTROY map-color: 60 behavior: @@ -105,9 +102,7 @@ blocks: positions: - 0,-1,0 loot: - template: "default:loot_table/basic" - arguments: - item: default:reed + template: "default:loot_table/self" state: id: 1 state: sugar_cane:1 @@ -119,7 +114,6 @@ blocks: - default:hardness/none - default:sound/grass overrides: - item: default:flame_cane push-reaction: DESTROY map-color: 15 is-randomly-ticking: true @@ -149,9 +143,7 @@ blocks: - 0,-1,-1 - 0,-1,1 loot: - template: "default:loot_table/basic" - arguments: - item: default:flame_cane + template: "default:loot_table/self" states: properties: age: diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml b/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml index 4f0314a4e..094899b23 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/templates.yml @@ -14,7 +14,7 @@ templates#models#block: "all": "{texture}" # template: default:model/simplified_cube_all # arguments: - # path: model/texture_path + # path: [model/texture]_path default:model/simplified_cube_all: path: "{path}" generation: @@ -71,7 +71,7 @@ templates#models#2d: "layer0": "{texture}" # template: default:model/simplified_generated # arguments: - # path: model_path/texture_path + # path: [model/texture]_path default:model/simplified_generated: type: "minecraft:model" path: "{path}" @@ -105,7 +105,7 @@ templates#models#2d: "layer0": "{texture}" # template: default:model/simplified_handheld # arguments: - # path: model_path/texture_path + # path: [model/texture]_path default:model/simplified_handheld: type: "minecraft:model" path: "{path}" @@ -113,6 +113,36 @@ templates#models#2d: parent: "minecraft:item/handheld" textures: "layer0": "{path}" + # template: default:model/elytra + # arguments: + # model: model_path + # broken_model: broken_model_path + # texture: texture_path + # broken_texture: broken_texture_path + default:model/elytra: + type: "minecraft:condition" + property: minecraft:broken + on-false: + template: default:model/generated + arguments: + model: "{model}" + texture: "{texture}" + on-true: + template: default:model/generated + arguments: + model: "{broken_model}" + texture: "{broken_texture}" + # template: default:model/simplified_elytra + # arguments: + # path: [model/texture]_path + # broken_path: broken_[model/texture]_path + default:model/simplified_elytra: + template: default:model/elytra + arguments: + model: "{path}" + broken_model: "{broken_path}" + texture: "{path}" + broken_texture: "{broken_path}" # shield templates#models#shield: @@ -170,8 +200,8 @@ templates#models#fishing_rod: "layer0": "{cast_texture}" # template: default:model/simplified_fishing_rod_2d # arguments: - # path: rod_model/texture_path - # cast_path: rod_cast_model/texture_path + # path: rod_[model/texture]_path + # cast_path: rod_cast_[model/texture]_path default:model/simplified_fishing_rod_2d: template: default:model/fishing_rod_2d arguments: @@ -260,10 +290,10 @@ templates#models#bow: "layer0": "{pulling_0_texture}" # template: default:model/simplified_bow_2d # arguments: - # path: bow_model/texture_path - # pulling_0_path: bow_pulling_0_model/texture_path - # pulling_1_path: bow_pulling_1_model/texture_path - # pulling_2_path: bow_pulling_2_model/texture_path + # path: bow_[model/texture]_path + # pulling_0_path: bow_pulling_0_[model/texture]_path + # pulling_1_path: bow_pulling_1_[model/texture]_path + # pulling_2_path: bow_pulling_2_[model/texture]_path default:model/simplified_bow_2d: template: default:model/bow_2d arguments: @@ -392,12 +422,12 @@ templates#models#crossbow: "layer0": "{pulling_0_texture}" # template: default:model/simplified_crossbow_2d # arguments: - # path: crossbow_model/texture_path - # arrow_path: crossbow_arrow_model/texture_path - # firework_path: crossbow_firework_model/texture_path - # pulling_0_path: crossbow_pulling_0_model/texture_path - # pulling_1_path: crossbow_pulling_1_model/texture_path - # pulling_2_path: crossbow_pulling_2_model/texture_path + # path: crossbow_[model/texture]_path + # arrow_path: crossbow_arrow_[model/texture]_path + # firework_path: crossbow_firework_[model/texture]_path + # pulling_0_path: crossbow_pulling_0_[model/texture]_path + # pulling_1_path: crossbow_pulling_1_[model/texture]_path + # pulling_2_path: crossbow_pulling_2_[model/texture]_path default:model/simplified_crossbow_2d: template: default:model/crossbow_2d arguments: @@ -581,6 +611,8 @@ templates#settings#break_level: # block settings templates#settings#blocks: + default:settings/middle_click_pick_itself: + item: "{__NAMESPACE__}:{__ID__}" default:settings/solid_1x1x1: is-suffocating: true replaceable: false @@ -957,6 +989,18 @@ templates#recipes: # loot tables templates#loot_tables: + # drop itself + + # template: default:loot_table/self + default:loot_table/self: + pools: + - rolls: 1 + conditions: + - type: survives_explosion + entries: + - type: item + item: "{__NAMESPACE__}:{__ID__}" + # drop one item # template: default:loot_table/basic diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/wings/flame_elytra.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/wings/flame_elytra.png new file mode 100644 index 000000000..ddf790029 Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/entity/equipment/wings/flame_elytra.png differ diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/broken_flame_elytra.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/broken_flame_elytra.png new file mode 100644 index 000000000..c94833fb2 Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/broken_flame_elytra.png differ diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_elytra.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_elytra.png new file mode 100644 index 000000000..d5d33651c Binary files /dev/null and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_elytra.png differ diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 03b8034aa..0da59b896 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -366,7 +366,7 @@ public class BukkitBlockManager extends AbstractBlockManager { private void parseCustomBlock(Pack pack, Path path, Key id, Map section) { // read block settings - BlockSettings settings = BlockSettings.fromMap(MiscUtils.castToMap(section.get("settings"), true)); + BlockSettings settings = BlockSettings.fromMap(id, MiscUtils.castToMap(section.get("settings"), true)); // read states Map> properties; Map appearances; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index ad0671248..1875f3338 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -79,11 +79,11 @@ public class BukkitItemManager extends AbstractItemManager { return instance; } - public Optional s2c(ItemStack itemStack, ItemBuildContext context) { + public Optional s2c(ItemStack itemStack, Player player) { try { Item wrapped = wrap(itemStack); if (wrapped == null) return Optional.empty(); - return this.networkItemHandler.s2c(wrapped, context).map(Item::load); + return this.networkItemHandler.s2c(wrapped, player).map(Item::load); } catch (Throwable e) { if (Config.debug()) { this.plugin.logger().warn("Failed to handle s2c items.", e); @@ -92,11 +92,11 @@ public class BukkitItemManager extends AbstractItemManager { } } - public Optional c2s(ItemStack itemStack, ItemBuildContext context) { + public Optional c2s(ItemStack itemStack) { try { Item wrapped = wrap(itemStack); if (wrapped == null) return Optional.empty(); - return this.networkItemHandler.c2s(wrapped, context).map(Item::load); + return this.networkItemHandler.c2s(wrapped).map(Item::load); } catch (Throwable e) { if (Config.debug()) { this.plugin.logger().warn("Failed to handle c2s items.", e); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java index 452cf8cb1..145e3c235 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java @@ -1,20 +1,11 @@ package net.momirealms.craftengine.bukkit.item; import com.saicone.rtag.RtagItem; -import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.ItemWrapper; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.sparrow.nbt.NBT; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.inventory.ItemStack; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.Arrays; - public class LegacyItemWrapper implements ItemWrapper { private final RtagItem rtagItem; private int count; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java index 01e7a45cb..c325fcb4c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -1,13 +1,17 @@ package net.momirealms.craftengine.bukkit.item; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.CustomItem; 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.item.modifier.ArgumentModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.sparrow.nbt.CompoundTag; import net.momirealms.sparrow.nbt.ListTag; @@ -24,7 +28,7 @@ import java.util.function.BiConsumer; public class LegacyNetworkItemHandler implements NetworkItemHandler { @Override - public Optional> c2s(Item wrapped, ItemBuildContext context) { + public Optional> c2s(Item wrapped) { if (!wrapped.hasTag(NETWORK_ITEM_TAG)) return Optional.empty(); CompoundTag networkData = (CompoundTag) wrapped.getNBTTag(NETWORK_ITEM_TAG); if (networkData == null) return Optional.empty(); @@ -38,7 +42,7 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { } @Override - public Optional> s2c(Item wrapped, ItemBuildContext context) { + public Optional> s2c(Item wrapped, Player player) { Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) { if (!Config.interceptItem()) return Optional.empty(); @@ -50,6 +54,17 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { return new OtherItem(wrapped).process(); } else { CompoundTag tag = new CompoundTag(); + Tag argumentTag = wrapped.getNBTTag(ArgumentModifier.ARGUMENTS_TAG); + ItemBuildContext context; + if (argumentTag instanceof CompoundTag arguments) { + ContextHolder.Builder builder = ContextHolder.builder(); + for (Map.Entry entry : arguments.entrySet()) { + builder.withParameter(ContextKey.direct(entry.getKey()), entry.getValue().getAsString()); + } + context = ItemBuildContext.of(player, builder); + } else { + context = ItemBuildContext.of(player); + } for (ItemDataModifier modifier : customItem.clientBoundDataModifiers()) { modifier.prepareNetworkItem(wrapped, context, tag); modifier.apply(wrapped, context); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java index 75b09c21c..353cf9d6f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -1,10 +1,14 @@ package net.momirealms.craftengine.bukkit.item; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.*; +import net.momirealms.craftengine.core.item.modifier.ArgumentModifier; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.ContextKey; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.CompoundTag; @@ -23,7 +27,7 @@ import java.util.function.Supplier; public final class ModernNetworkItemHandler implements NetworkItemHandler { @Override - public Optional> c2s(Item wrapped, ItemBuildContext context) { + public Optional> c2s(Item wrapped) { Tag customData = wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA); if (!(customData instanceof CompoundTag compoundTag)) return Optional.empty(); CompoundTag networkData = compoundTag.getCompound(NETWORK_ITEM_TAG); @@ -34,14 +38,13 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler> s2c(Item wrapped, ItemBuildContext context) { + public Optional> s2c(Item wrapped, Player player) { Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isEmpty()) { if (!Config.interceptItem()) return Optional.empty(); @@ -53,6 +56,17 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler entry : arguments.entrySet()) { + builder.withParameter(ContextKey.direct(entry.getKey()), entry.getValue().getAsString()); + } + context = ItemBuildContext.of(player, builder); + } CompoundTag tag = new CompoundTag(); for (ItemDataModifier modifier : customItem.clientBoundDataModifiers()) { modifier.prepareNetworkItem(wrapped, context, tag); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 9b2deba0c..3d79a637d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -34,7 +34,6 @@ import net.momirealms.craftengine.core.font.FontManager; import net.momirealms.craftengine.core.font.IllegalCharacterProcessResult; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.context.UseOnContext; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; @@ -1954,17 +1953,17 @@ public class PacketConsumers { public static final BiConsumer CONTAINER_SET_CONTENT = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readContainerId(); int stateId = buf.readVarInt(); int listSize = buf.readVarInt(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); List items = new ArrayList<>(listSize); boolean changed = false; Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); for (int i = 0; i < listSize; i++) { ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - Optional optional = BukkitItemManager.instance().s2c(itemStack, context); + Optional optional = BukkitItemManager.instance().s2c(itemStack, serverPlayer); if (optional.isPresent()) { items.add(optional.get()); changed = true; @@ -1974,7 +1973,7 @@ public class PacketConsumers { } ItemStack carriedItem = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); ItemStack newCarriedItem = carriedItem; - Optional optional = BukkitItemManager.instance().s2c(carriedItem, context); + Optional optional = BukkitItemManager.instance().s2c(carriedItem, serverPlayer); if (optional.isPresent()) { changed = true; newCarriedItem = optional.get(); @@ -1998,14 +1997,14 @@ public class PacketConsumers { public static final BiConsumer CONTAINER_SET_SLOT = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); int containerId = buf.readContainerId(); int stateId = buf.readVarInt(); int slot = buf.readShort(); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> { + BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); @@ -2022,11 +2021,11 @@ public class PacketConsumers { public static final BiConsumer SET_CURSOR_ITEM = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> { + BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); @@ -2040,9 +2039,9 @@ public class PacketConsumers { public static final BiConsumer SET_EQUIPMENT = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); boolean changed = false; - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); int entity = buf.readVarInt(); List> slots = Lists.newArrayList(); @@ -2051,7 +2050,7 @@ public class PacketConsumers { slotMask = buf.readByte(); Object equipmentSlot = Reflections.instance$EquipmentSlot$values[slotMask & 127]; ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - Optional optional = BukkitItemManager.instance().s2c(itemStack, context); + Optional optional = BukkitItemManager.instance().s2c(itemStack, serverPlayer); if (optional.isPresent()) { changed = true; itemStack = optional.get(); @@ -2081,12 +2080,12 @@ public class PacketConsumers { public static final BiConsumer SET_PLAYER_INVENTORY_1_21_2 = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); int slot = buf.readVarInt(); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> { + BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); @@ -2101,13 +2100,13 @@ public class PacketConsumers { public static final BiConsumer SET_CREATIVE_MODE_SLOT = (user, event) -> { try { + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); short slotNum = buf.readShort(); ItemStack itemStack = VersionHelper.isOrAbove1_20_5() ? FastNMS.INSTANCE.method$FriendlyByteBuf$readUntrustedItem(friendlyBuf) : FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); - BukkitItemManager.instance().c2s(itemStack, context).ifPresent((newItemStack) -> { + BukkitItemManager.instance().c2s(itemStack).ifPresent((newItemStack) -> { event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); @@ -2127,9 +2126,9 @@ public class PacketConsumers { public static final BiConsumer CONTAINER_CLICK_1_20 = (user, event) -> { try { if (VersionHelper.isOrAbove1_21_5()) return; // 1.21.5+需要其他办法解决同步问题 + if (!(user instanceof BukkitServerPlayer serverPlayer)) return; FriendlyByteBuf buf = event.getBuffer(); boolean changed = false; - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); int containerId = buf.readContainerId(); int stateId = buf.readVarInt(); @@ -2141,7 +2140,7 @@ public class PacketConsumers { for (int j = 0; j < i; ++j) { int k = buf.readShort(); ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - Optional optional = BukkitItemManager.instance().c2s(itemStack, context); + Optional optional = BukkitItemManager.instance().c2s(itemStack); if (optional.isPresent()) { changed = true; itemStack = optional.get(); @@ -2149,7 +2148,7 @@ public class PacketConsumers { changedSlots.put(k, itemStack); } ItemStack carriedItem = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf); - Optional optional = BukkitItemManager.instance().c2s(carriedItem, context); + Optional optional = BukkitItemManager.instance().c2s(carriedItem); if (optional.isPresent()) { changed = true; carriedItem = optional.get(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java index a17a53691..52359827c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.EntityDataUtils; -import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; @@ -20,7 +19,6 @@ public class CommonItemPacketHandler implements EntityPacketHandler { @Override public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); int id = buf.readVarInt(); boolean isChanged = false; List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); @@ -30,7 +28,7 @@ public class CommonItemPacketHandler implements EntityPacketHandler { if (entityDataId == EntityDataUtils.ITEM_DATA_ID) { Object nmsItemStack = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack); - Optional optional = BukkitItemManager.instance().s2c(itemStack, context); + Optional optional = BukkitItemManager.instance().s2c(itemStack, (BukkitServerPlayer) user); if (optional.isPresent()) { isChanged = true; itemStack = optional.get(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java index 3ffba123c..0cd4d4417 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java @@ -4,7 +4,6 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.EntityDataUtils; -import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; @@ -20,7 +19,6 @@ public class ItemDisplayPacketHandler implements EntityPacketHandler { @Override public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) { FriendlyByteBuf buf = event.getBuffer(); - ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user); int id = buf.readVarInt(); boolean isChanged = false; List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); @@ -30,7 +28,7 @@ public class ItemDisplayPacketHandler implements EntityPacketHandler { if (entityDataId == EntityDataUtils.DISPLAYED_ITEM_DATA_ID) { Object nmsItemStack = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack); - Optional optional = BukkitItemManager.instance().s2c(itemStack, context); + Optional optional = BukkitItemManager.instance().s2c(itemStack, (BukkitServerPlayer) user); if (optional.isPresent()) { isChanged = true; itemStack = optional.get(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java index 366474dcf..3ee4b9b8f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java @@ -16,7 +16,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import java.sql.Ref; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java index aefe694fb..f18c96914 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java @@ -48,6 +48,11 @@ public class BlockSettings { return applyModifiers(BlockSettings.of(), map); } + public static BlockSettings fromMap(Key id, Map map) { + if (map == null || map.isEmpty()) return BlockSettings.of().itemId(id); + return applyModifiers(BlockSettings.of().itemId(id), map); + } + public static BlockSettings ofFullCopy(BlockSettings settings, Map map) { return applyModifiers(ofFullCopy(settings), map); } 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 cf3df095b..1615d4fcb 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 @@ -16,6 +16,8 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; 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.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -443,7 +445,6 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl String name = obj.toString(); return new ItemNameModifier<>(name); }, "item-name", "display-name"); - registerDataFunction((obj) -> { List name = MiscUtils.getAsStringList(obj); return new LoreModifier<>(name); @@ -500,6 +501,14 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return new EquippableModifier<>(EquipmentData.fromMap(data)); }, "equippable"); } + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + Map arguments = new HashMap<>(); + for (Map.Entry entry : data.entrySet()) { + arguments.put(entry.getKey(), TextProviders.fromString(entry.getValue().toString())); + } + return new ArgumentModifier<>(arguments); + }, "args", "argument", "arguments"); } protected void processModelRecursively( diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java index 09635b18d..529bd293e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/NetworkItemHandler.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.item; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.util.StringUtils; import net.momirealms.craftengine.core.util.TriConsumer; import net.momirealms.craftengine.core.util.VersionHelper; @@ -17,9 +18,9 @@ public interface NetworkItemHandler { String NETWORK_OPERATION = "type"; String NETWORK_VALUE = "value"; - Optional> s2c(Item itemStack, ItemBuildContext context); + Optional> s2c(Item itemStack, Player player); - Optional> c2s(Item itemStack, ItemBuildContext context); + Optional> c2s(Item itemStack); static CompoundTag pack(Operation operation, @Nullable Tag value) { if (value == null) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java new file mode 100644 index 000000000..19b4f6af7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ArgumentModifier.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.item.modifier; + +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.plugin.context.text.TextProvider; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.StringTag; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class ArgumentModifier implements ItemDataModifier { + public static final String ARGUMENTS_TAG = "craftengine:arguments"; + private final Map arguments; + + public ArgumentModifier(Map arguments) { + this.arguments = arguments; + } + + @Override + public String name() { + return "arguments"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + if (VersionHelper.isOrAbove1_20_5()) { + CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getNBTComponent(ComponentKeys.CUSTOM_DATA)).orElse(new CompoundTag()); + CompoundTag argumentTag = new CompoundTag(); + for (Map.Entry entry : this.arguments.entrySet()) { + argumentTag.put(entry.getKey(), new StringTag(entry.getValue().get(context))); + } + customData.put(ARGUMENTS_TAG, argumentTag); + item.setNBTComponent(ComponentKeys.CUSTOM_DATA, customData); + } else { + Map processed = new HashMap<>(); + for (Map.Entry entry : this.arguments.entrySet()) { + processed.put(entry.getKey(), entry.getValue().get(context)); + } + item.setTag(processed, ARGUMENTS_TAG); + } + } +} 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 bad5c544c..1a50ef672 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 @@ -377,6 +377,9 @@ public abstract class AbstractPackManager implements PackManager { plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_" + item + ".png"); plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_" + item + ".png.mcmeta"); } + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/flame_elytra.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/broken_flame_elytra.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/entity/equipment/wings/flame_elytra.png"); // ores plugin.saveResource("resources/default/configuration/ores.yml"); @@ -494,7 +497,7 @@ public abstract class AbstractPackManager implements PackManager { if (configEntry.getValue() instanceof Map configSection0) { Map configSection1 = castToMap(configSection0, false); if ((boolean) configSection1.getOrDefault("enable", true)) { - parser.parseSection(cached.pack(), cached.filePath(), id, plugin.templateManager().applyTemplates(configSection1)); + parser.parseSection(cached.pack(), cached.filePath(), id, plugin.templateManager().applyTemplates(id, configSection1)); } } else { TranslationManager.instance().log("warning.config.structure.not_section", cached.filePath().toString(), cached.prefix() + "." + key, configEntry.getValue().getClass().getSimpleName()); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java index 341a7f001..a8017fcf5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java @@ -12,6 +12,10 @@ public class PlainStringTemplateArgument implements TemplateArgument { this.value = value; } + public static PlainStringTemplateArgument plain(final String value) { + return new PlainStringTemplateArgument(value); + } + @Override public String get() { return value; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java index 01f24d80e..4cf87fed6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.plugin.config.template; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigParser; +import net.momirealms.craftengine.core.util.Key; import java.util.Map; import java.util.regex.Pattern; @@ -16,5 +17,5 @@ public interface TemplateManager extends Manageable { ConfigParser parser(); - Map applyTemplates(Map input); + Map applyTemplates(Key id, Map input); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java index 8eda9774e..1141f6083 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -62,10 +62,11 @@ public class TemplateManagerImpl implements TemplateManager { } @Override - public Map applyTemplates(Map input) { + public Map applyTemplates(Key id, Map input) { Objects.requireNonNull(input, "Input must not be null"); Map result = new LinkedHashMap<>(); - processMap(input, Collections.emptyMap(), (obj) -> { + processMap(input, Map.of("{__ID__}", PlainStringTemplateArgument.plain(id.value()), + "{__NAMESPACE__}", PlainStringTemplateArgument.plain(id.namespace())), (obj) -> { // 当前位于根节点下,如果下一级就是模板,则应把模板结果与当前map合并 // 如果模板结果不是map,则为非法值,因为不可能出现类似于下方的配置 // items: diff --git a/gradle.properties b/gradle.properties index a14fbf0fd..997049669 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.55.1 +project_version=0.0.55.3 config_version=34 lang_version=14 project_group=net.momirealms