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 408028da7..1e15c76dd 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 @@ -81,6 +81,26 @@ public class ComponentItemFactory extends BukkitItemFactory { ); } + @Override + protected void itemName(ItemWrapper item, String json) { + if (json == null) { + item.removeComponent(ComponentKeys.ITEM_NAME); + } else { + item.setComponent(ComponentKeys.ITEM_NAME, json); + } + } + + @Override + protected Optional itemName(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.ITEM_NAME)) return Optional.empty(); + return Optional.ofNullable( + (String) ComponentType.encodeJava( + ComponentKeys.ITEM_NAME, + item.getComponent(ComponentKeys.ITEM_NAME) + ).orElse(null) + ); + } + @Override protected void skull(ItemWrapper item, String skullData) { final Map profile = Map.of( 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 de10e57d6..ac62f0f81 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 @@ -35,6 +35,21 @@ public class UniversalItemFactory extends BukkitItemFactory { return Optional.of(item.get("display", "Name")); } + @Override + protected void itemName(ItemWrapper item, String json) { + if (json != null) { + item.set(json, "item", "Name"); + } else { + item.remove("item", "Name"); + } + } + + @Override + protected Optional itemName(ItemWrapper item) { + if (!item.hasTag("item", "Name")) return Optional.empty(); + return Optional.of(item.get("item", "Name")); + } + @Override protected void customModelData(ItemWrapper item, Integer data) { if (data == null) { 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 7828c3f72..4945216ba 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 @@ -84,6 +84,11 @@ public class AbstractItem, I> implements Item { return this.factory.displayName(this.item); } + @Override + public Optional itemName() { + return this.factory.itemName(this.item); + } + @Override public Item lore(List lore) { this.factory.lore(this.item, lore); @@ -111,6 +116,11 @@ public class AbstractItem, I> implements Item { this.factory.displayName(this.item, displayName); return this; } + @Override + public Item itemName(String itemName) { + this.factory.itemName(this.item, itemName); + return this; + } @Override public Item skull(String data) { 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 591e5faae..6c406726c 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 @@ -49,6 +49,14 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl String name = TypeUtils.checkType(obj, String.class); return new DisplayNameModifier<>(name); }, "name", "display-name", "custom-name"); + registerDataFunction((obj) -> { + String name = TypeUtils.checkType(obj, String.class); + return new ItemNameModifier<>(name); + }, "item-name"); + registerDataFunction((obj) -> { + String name = TypeUtils.checkType(obj, String.class); + return new ItemNameModifier<>(name); + }, "item-name"); registerDataFunction((obj) -> { @SuppressWarnings("unchecked") List name = (List) TypeUtils.checkType(obj, List.class); 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 0651ad559..44bd5fa74 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,6 +5,7 @@ import net.kyori.adventure.key.Key; public class ComponentKeys { public static final String CUSTOM_MODEL_DATA = Key.key("minecraft", "custom_model_data").asString(); public static final String CUSTOM_NAME = Key.key("minecraft", "custom_name").asString(); + public static final String ITEM_NAME = Key.key("minecraft", "item_name").asString(); public static final String LORE = Key.key("minecraft", "lore").asString(); public static final String DAMAGE = Key.key("minecraft", "damage").asString(); public static final String MAX_DAMAGE = Key.key("minecraft", "max_damage").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 5ea7e299a..61564aa14 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 @@ -42,6 +42,10 @@ public interface Item { Optional displayName(); + Item itemName(String itemName); + + Optional itemName(); + Item lore(List lore); Optional> lore(); 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 345257250..98d7396b1 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 @@ -53,6 +53,10 @@ public abstract class ItemFactory

, I> protected abstract Optional displayName(ItemWrapper item); + protected abstract void itemName(ItemWrapper item, String json); + + protected abstract Optional itemName(ItemWrapper item); + protected abstract void skull(ItemWrapper item, String skullData); protected abstract Optional> lore(ItemWrapper item); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java new file mode 100644 index 000000000..b6007279d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.minimessage.ImageTag; +import net.momirealms.craftengine.core.plugin.minimessage.PlaceholderTag; +import net.momirealms.craftengine.core.util.AdventureHelper; + +public class ItemNameModifier implements ItemModifier { + private final String parameter; + + public ItemNameModifier(String parameter) { + this.parameter = parameter; + } + @Override + public String name() { + return "item-name"; + } + + @Override + public void apply(Item item, Player player) { + item.itemName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize( + parameter, ImageTag.instance(), new PlaceholderTag(player)))); + } +}