From 2c0a073f189724b765a6f5d80a7c791a1cbe269d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 16 Mar 2025 04:11:22 +0800 Subject: [PATCH] anvil repair system --- .../default/configuration/blocks.yml | 2 +- .../default/configuration/fairy_flower.yml | 2 +- .../default/configuration/furniture.yml | 6 +- .../resources/default/configuration/items.yml | 18 ++-- .../resources/default/configuration/ores.yml | 6 +- .../default/configuration/palm_tree.yml | 14 +-- .../resources/internal/configuration/gui.yml | 10 +- .../bukkit/util/LegacyInventoryUtils.java | 16 +++ .../item/factory/ComponentItemFactory.java | 19 +++- .../item/factory/UniversalItemFactory.java | 19 +++- .../item/recipe/RecipeEventListener.java | 100 +++++++++++++++--- .../bukkit/util/ComponentUtils.java | 4 + .../craftengine/bukkit/util/Reflections.java | 6 ++ .../craftengine/core/item/AbstractItem.java | 19 +++- .../core/item/AbstractItemManager.java | 12 +-- .../craftengine/core/item/ComponentKeys.java | 1 + .../craftengine/core/item/Item.java | 12 ++- .../craftengine/core/item/ItemFactory.java | 8 +- .../item/modifier/DisplayNameModifier.java | 2 +- .../gui/category/ItemBrowserManagerImpl.java | 4 +- .../core/util/AdventureHelper.java | 2 +- 21 files changed, 212 insertions(+), 70 deletions(-) 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 c807b25e2..49e05743b 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml @@ -3,7 +3,7 @@ items: material: paper custom-model-data: 3001 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/chinese_lantern" diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml index c1484240c..190e39b8d 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml @@ -3,7 +3,7 @@ items: material: paper custom-model-data: 3000 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/fairy_flower" diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml b/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml index f34ff47b4..3e3a2092a 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml @@ -3,7 +3,7 @@ items: material: paper custom-model-data: 2000 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/bench" @@ -49,7 +49,7 @@ items: material: paper custom-model-data: 2001 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/table_lamp" @@ -93,7 +93,7 @@ items: material: paper custom-model-data: 2002 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/wooden_chair" 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 ba4034232..616781886 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/items.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/items.yml @@ -6,7 +6,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz model: template: models:fishing_rod_2d @@ -22,7 +22,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz model: template: models:bow_2d @@ -42,7 +42,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz model: template: models:crossbow_2d @@ -66,7 +66,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz components: minecraft:max_damage: 64 @@ -84,7 +84,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz components: minecraft:max_damage: 64 @@ -102,7 +102,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz components: minecraft:max_damage: 64 @@ -120,7 +120,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz components: minecraft:max_damage: 64 @@ -138,7 +138,7 @@ items: tags: - "topaz_tools" data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz components: minecraft:max_damage: 64 @@ -175,7 +175,7 @@ templates: material: "chainmail_{part}" custom-model-data: 1000 data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" tooltip-style: minecraft:topaz settings: tags: 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 f1bdfb981..d5d84bf86 100644 --- a/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml +++ b/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml @@ -3,7 +3,7 @@ items: material: paper custom-model-data: 1010 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/topaz_ore" @@ -16,7 +16,7 @@ items: material: paper custom-model-data: 1011 data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/deepslate_topaz_ore" @@ -34,7 +34,7 @@ items: - "#topaz_tools" percent: 0.25 data: - display-name: "<#FF8C00>" + item-name: "<#FF8C00>" model: template: models:generated arguments: 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 a17becf3a..3a33da954 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 @@ -9,7 +9,7 @@ items: - "minecraft:logs" - "minecraft:logs_that_burn" data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/palm_log" @@ -55,7 +55,7 @@ items: - "minecraft:logs" - "minecraft:logs_that_burn" data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/stripped_palm_log" @@ -98,7 +98,7 @@ items: - "minecraft:logs" - "minecraft:logs_that_burn" data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/palm_wood" @@ -144,7 +144,7 @@ items: - "minecraft:logs" - "minecraft:logs_that_burn" data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/stripped_palm_wood" @@ -186,7 +186,7 @@ items: - "minecraft:planks" - "minecraft:wooden_tool_materials" data: - display-name: "" + item-name: "" model: type: "minecraft:model" path: "minecraft:item/custom/palm_planks" @@ -218,7 +218,7 @@ items: settings: fuel-time: 100 data: - display-name: "" + item-name: "" model: template: models:generated arguments: @@ -271,7 +271,7 @@ items: material: oak_leaves custom-model-data: 1000 data: - display-name: "" + item-name: "" components: minecraft:block_state: distance: "1" diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml b/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml index f2627ecd0..2101ee69c 100644 --- a/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml +++ b/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml @@ -65,7 +65,7 @@ templates: material: arrow custom-model-data: "{model_data}" data: - display-name: "{name}" + item-name: "{name}" lore: "{lore}" model: template: models:generated @@ -117,28 +117,28 @@ items: material: arrow custom-model-data: 1000 data: - display-name: "<#FAFAD2>" + item-name: "<#FAFAD2>" lore: - "<#F5F5F5>/" internal:next_recipe_1: material: arrow custom-model-data: 1001 data: - display-name: "<#808080>" + item-name: "<#808080>" lore: - "<#696969>/" internal:previous_recipe_0: material: arrow custom-model-data: 1002 data: - display-name: "<#FAFAD2>" + item-name: "<#FAFAD2>" lore: - "<#F5F5F5>/" internal:previous_recipe_1: material: arrow custom-model-data: 1003 data: - display-name: "<#808080>" + item-name: "<#808080>" lore: - "<#696969>/" internal:get_item: diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java index ddbad77d5..980d68725 100644 --- a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java @@ -1,8 +1,11 @@ package net.momirealms.craftengine.bukkit.util; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.inventory.AnvilInventory; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.jetbrains.annotations.Nullable; public class LegacyInventoryUtils { @@ -14,4 +17,17 @@ public class LegacyInventoryUtils { anvilInventory.setRepairCost(repairCost); anvilInventory.setRepairCostAmount(amount); } + + @Nullable + public static String getRenameText(AnvilInventory anvilInventory) { + return anvilInventory.getRenameText(); + } + + public static int getMaxRepairCost(AnvilInventory anvilInventory) { + return anvilInventory.getMaximumRepairCost(); + } + + public static InventoryView getView(PrepareAnvilEvent event) { + return event.getView(); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java index ed459d03a..95d371115 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java @@ -62,7 +62,7 @@ public class ComponentItemFactory extends BukkitItemFactory { } @Override - protected void displayName(ItemWrapper item, String json) { + protected void customName(ItemWrapper item, String json) { if (json == null) { item.removeComponent(ComponentKeys.CUSTOM_NAME); } else { @@ -71,7 +71,7 @@ public class ComponentItemFactory extends BukkitItemFactory { } @Override - protected Optional displayName(ItemWrapper item) { + protected Optional customName(ItemWrapper item) { if (!item.hasComponent(ComponentKeys.CUSTOM_NAME)) return Optional.empty(); return Optional.ofNullable( (String) ComponentType.encodeJava( @@ -272,4 +272,19 @@ public class ComponentItemFactory extends BukkitItemFactory { item.setComponent(ComponentKeys.MAX_STACK_SIZE, maxStackSize); } } + + @Override + protected void repairCost(ItemWrapper item, Integer data) { + if (data == null) { + item.removeComponent(ComponentKeys.REPAIR_COST); + } else { + item.setComponent(ComponentKeys.REPAIR_COST, data); + } + } + + @Override + protected Optional repairCost(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.REPAIR_COST)) return Optional.empty(); + return Optional.ofNullable((Integer) ComponentType.encodeJava(ComponentKeys.REPAIR_COST, item.getComponent(ComponentKeys.REPAIR_COST)).orElse(null)); + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index a404a5bc5..9be055d2f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -23,7 +23,7 @@ public class UniversalItemFactory extends BukkitItemFactory { } @Override - protected void displayName(ItemWrapper item, String json) { + protected void customName(ItemWrapper item, String json) { if (json != null) { item.set(json, "display", "Name"); } else { @@ -32,19 +32,19 @@ public class UniversalItemFactory extends BukkitItemFactory { } @Override - protected Optional displayName(ItemWrapper item) { + protected Optional customName(ItemWrapper item) { if (!item.hasTag("display", "Name")) return Optional.empty(); return Optional.of(item.get("display", "Name")); } @Override protected void itemName(ItemWrapper item, String json) { - throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + customName(item, json); } @Override protected Optional itemName(ItemWrapper item) { - throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + return customName(item); } @Override @@ -218,4 +218,15 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected void maxStackSize(ItemWrapper item, Integer maxStackSize) { } + + @Override + protected void repairCost(ItemWrapper item, Integer data) { + item.set(data, "RepairCost"); + } + + @Override + protected Optional repairCost(ItemWrapper item) { + if (!item.hasTag("RepairCost")) return Optional.empty(); + return Optional.of(item.get("RepairCost")); + } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index e6106e8d3..68315e3a2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -1,10 +1,13 @@ package net.momirealms.craftengine.bukkit.item.recipe; import com.destroystokyo.paper.event.inventory.PrepareResultEvent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils; import net.momirealms.craftengine.bukkit.util.Reflections; @@ -15,10 +18,10 @@ import net.momirealms.craftengine.core.item.recipe.Recipe; import net.momirealms.craftengine.core.item.recipe.RecipeTypes; import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; -import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Pair; import net.momirealms.craftengine.core.util.VersionHelper; @@ -459,21 +462,19 @@ public class RecipeEventListener implements Listener { return; } - // one of them is vanilla item - if (!firstCustom || !secondCustom) { - // block "vanilla + custom" recipes - if (wrappedFirst.vanillaId().equals(wrappedSecond.vanillaId())) { - event.setResult(null); - } - return; - } - // both of them are custom items // if the second is an enchanted book, then apply it if (wrappedSecond.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) { return; } + // one of them is vanilla item + if (!firstCustom || !secondCustom) { + // block "vanilla + custom" recipes + event.setResult(null); + return; + } + // not the same item if (!wrappedFirst.customId().equals(wrappedSecond.customId())) { event.setResult(null); @@ -511,10 +512,12 @@ public class RecipeEventListener implements Listener { } Item wrappedFirst = BukkitItemManager.instance().wrap(first); - int damage = wrappedFirst.damage().orElse(0); + int maxDamage = wrappedFirst.maxDamage().orElse(0); // not a repairable item - if (maxDamage == 0 || damage == 0) return; + if (maxDamage == 0) return; + + int damage = wrappedFirst.damage().orElse(0); Key firstId = wrappedFirst.id(); Optional> optionalCustomTool = wrappedFirst.getCustomItem(); @@ -548,20 +551,85 @@ public class RecipeEventListener implements Listener { return; } + boolean hasResult = true; + int realDurabilityPerItem = (int) (repairItem.amount() + repairItem.percent() * maxDamage); - int consumeMaxAmount = damage / realDurabilityPerItem + 1; + int consumeMaxAmount = damage == 0 ? 0 : damage / realDurabilityPerItem + 1; int actualConsumedAmount = Math.min(consumeMaxAmount, wrappedSecond.count()); int actualRepairAmount = actualConsumedAmount * realDurabilityPerItem; int damageAfter = Math.max(damage - actualRepairAmount, 0); wrappedFirst.damage(damageAfter); - event.setResult(wrappedFirst.loadCopy()); + + String renameText; + int maxRepairCost; + if (VersionHelper.isVersionNewerThan1_21_2()) { + AnvilView anvilView = event.getView(); + renameText = anvilView.getRenameText(); + maxRepairCost = anvilView.getMaximumRepairCost(); + } else { + renameText = LegacyInventoryUtils.getRenameText(inventory); + maxRepairCost = LegacyInventoryUtils.getMaxRepairCost(inventory); + } + + int repairCost = actualConsumedAmount; + int repairPenalty = wrappedFirst.repairCost().orElse(0) + wrappedSecond.repairCost().orElse(0); + + if (renameText != null && !renameText.isBlank()) { + try { + if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverName().orElse(AdventureHelper.EMPTY_COMPONENT))))) { + wrappedFirst.customName(AdventureHelper.componentToJson(Component.text(renameText))); + repairCost += 1; + } else if (repairCost == 0) { + hasResult = false; + System.out.println("1"); + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get hover name", e); + } + } else if (VersionHelper.isVersionNewerThan1_20_5() && wrappedFirst.hasComponent(ComponentKeys.CUSTOM_NAME)) { + repairCost += 1; + wrappedFirst.customName(null); + } else if (!VersionHelper.isVersionNewerThan1_20_5() && wrappedFirst.hasTag("display", "Name")) { + repairCost += 1; + wrappedFirst.customName(null); + } + + int finalCost = repairCost + repairPenalty; + if (VersionHelper.isVersionNewerThan1_21()) { AnvilView anvilView = event.getView(); - anvilView.setRepairCost(10); + anvilView.setRepairCost(finalCost); anvilView.setRepairItemCountCost(actualConsumedAmount); } else { - LegacyInventoryUtils.setRepairCost(inventory, 10, actualRepairAmount); + LegacyInventoryUtils.setRepairCost(inventory, finalCost, actualRepairAmount); } + + Player player; + try { + player = (Player) Reflections.method$InventoryView$getPlayer.invoke(VersionHelper.isVersionNewerThan1_21() ? event.getView() : LegacyInventoryUtils.getView(event)); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get inventory viewer", e); + return; + } + + if (finalCost >= maxRepairCost && !plugin.adapt(player).canInstabuild()) { + hasResult = false; + } + + if (hasResult) { + int afterPenalty = wrappedFirst.repairCost().orElse(0); + int anotherPenalty = wrappedSecond.repairCost().orElse(0); + if (afterPenalty < anotherPenalty) { + afterPenalty = anotherPenalty; + } + afterPenalty = calculateIncreasedRepairCost(afterPenalty); + wrappedFirst.repairCost(afterPenalty); + event.setResult(wrappedFirst.loadCopy()); + } + } + + public static int calculateIncreasedRepairCost(int cost) { + return (int) Math.min((long) cost * 2L + 1L, 2147483647L); } // only handle repair items for the moment diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java index ac86735e0..a691c8871 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -10,6 +10,10 @@ public class ComponentUtils { public static Object adventureToMinecraft(Component component) { String json = AdventureHelper.componentToJson(component); + return jsonToMinecraft(json); + } + + public static Object jsonToMinecraft(String json) { if (VersionHelper.isVersionNewerThan1_20_5()) { try { return Reflections.method$Component$Serializer$fromJson.invoke(null, json, Reflections.instance$MinecraftRegistry); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index b4787d9e5..afc934521 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -72,6 +72,12 @@ public class Reflections { ) ); + public static final Method method$Component$getString = requireNonNull( + ReflectionUtils.getMethod( + clazz$Component, String.class, new String[]{"getString", "a"} + ) + ); + public static final Class clazz$RandomSource = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleMCClass("util.RandomSource") diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index e3edb3355..eda369c0c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -26,6 +26,17 @@ public class AbstractItem, I> implements Item { return this.factory.damage(this.item); } + @Override + public Item repairCost(Integer data) { + this.factory.repairCost(this.item, data); + return this; + } + + @Override + public Optional repairCost() { + return this.factory.repairCost(this.item); + } + @Override public Item maxDamage(Integer data) { this.factory.maxDamage(this.item, data); @@ -96,8 +107,8 @@ public class AbstractItem, I> implements Item { } @Override - public Optional displayName() { - return this.factory.displayName(this.item); + public Optional customName() { + return this.factory.customName(this.item); } @Override @@ -128,8 +139,8 @@ public class AbstractItem, I> implements Item { } @Override - public Item displayName(String displayName) { - this.factory.displayName(this.item, displayName); + public Item customName(String displayName) { + this.factory.customName(this.item, displayName); return this; } @Override 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 6969a9cd5..baa2330b1 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 @@ -168,7 +168,11 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl registerDataFunction((obj) -> { String name = obj.toString(); return new DisplayNameModifier<>(name); - }, "name", "display-name", "custom-name"); + }, "custom-name"); + registerDataFunction((obj) -> { + String name = obj.toString(); + return new ItemNameModifier<>(name); + }, "item-name", "display-name"); registerDataFunction((obj) -> { List name = MiscUtils.getAsStringList(obj); return new LoreModifier<>(name); @@ -197,12 +201,6 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl String pattern = data.get("pattern").toString().toLowerCase(Locale.ENGLISH); return new TrimModifier<>(material, pattern); }, "trim"); - if (VersionHelper.isVersionNewerThan1_20_5()) { - registerDataFunction((obj) -> { - String name = obj.toString(); - return new ItemNameModifier<>(name); - }, "item-name"); - } if (VersionHelper.isVersionNewerThan1_20_5()) { registerDataFunction((obj) -> { Map data = MiscUtils.castToMap(obj, false); 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 baa33752b..07779468a 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 @@ -19,4 +19,5 @@ public class ComponentKeys { public static final String TOOLTIP_STYLE = Key.key("minecraft", "tooltip_style").asString(); public static final String JUKEBOX_PLAYABLE = Key.key("minecraft", "jukebox_playable").asString(); public static final String TRIM = Key.key("minecraft", "trim").asString(); + public static final String REPAIR_COST = Key.key("minecraft", "repair_cost").asString(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index 478f741b3..8d734326d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -41,13 +41,21 @@ public interface Item { Optional damage(); + Item repairCost(Integer data); + + Optional repairCost(); + Item maxDamage(Integer data); Optional maxDamage(); - Item displayName(String displayName); + Item customName(String displayName); - Optional displayName(); + Optional customName(); + + default Optional hoverName() { + return customName().or(this::itemName); + } Item itemName(String itemName); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java index 5a497afd4..d35dc1042 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -49,9 +49,9 @@ public abstract class ItemFactory

, I> protected abstract Optional customModelData(ItemWrapper item); - protected abstract void displayName(ItemWrapper item, String json); + protected abstract void customName(ItemWrapper item, String json); - protected abstract Optional displayName(ItemWrapper item); + protected abstract Optional customName(ItemWrapper item); protected abstract void itemName(ItemWrapper item, String json); @@ -104,4 +104,8 @@ public abstract class ItemFactory

, I> protected abstract boolean is(ItemWrapper item, Key itemTag); protected abstract boolean isBlockItem(ItemWrapper item); + + protected abstract void repairCost(ItemWrapper item, Integer data); + + protected abstract Optional repairCost(ItemWrapper item); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java index 47763231f..e73503bbb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java @@ -19,6 +19,6 @@ public class DisplayNameModifier implements ItemModifier { @Override public void apply(Item item, ItemBuildContext context) { - item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); + item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index 178af26ec..5cbbbd786 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -135,7 +135,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { this.plugin.logger().warn("Can't not find item " + it.icon() + " for category icon"); return null; } - item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(it.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); + item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(it.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); item.lore(it.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList()); item.load(); return new ItemWithAction(item, (element, click) -> { @@ -217,7 +217,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { this.plugin.logger().warn("Can't not find item " + subCategory.icon() + " for category icon"); return null; } - item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); + item.customName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); item.lore(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList()); item.load(); return new ItemWithAction(item, (element, click) -> { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 9cb93b0ba..d75919cbc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -17,7 +17,7 @@ import java.util.concurrent.TimeUnit; * Helper class for handling Adventure components and related functionalities. */ public class AdventureHelper { - + public static final String EMPTY_COMPONENT = componentToJson(Component.empty()); private final MiniMessage miniMessage; private final MiniMessage miniMessageStrict; private final GsonComponentSerializer gsonComponentSerializer;