diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java index 6ebfac1b8..557420dab 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_21_5.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.bukkit.item.factory; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.saicone.rtag.data.ComponentType; import com.saicone.rtag.tag.TagList; import com.saicone.rtag.util.ChatComponent; @@ -7,6 +9,7 @@ import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.core.item.ComponentKeys; import net.momirealms.craftengine.core.item.ItemWrapper; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.GsonHelper; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -32,7 +35,7 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 { @Override protected Optional customName(ItemWrapper item) { if (!item.hasComponent(ComponentKeys.CUSTOM_NAME)) return Optional.empty(); - return ComponentType.encodeJava(ComponentKeys.CUSTOM_NAME, item.getComponent(ComponentKeys.ITEM_NAME)).map(ChatComponent::fromTag).map(ComponentUtils::minecraftToJson); + return ComponentType.encodeJson(ComponentKeys.CUSTOM_NAME, item.getComponent(ComponentKeys.CUSTOM_NAME)).map(jsonElement -> GsonHelper.get().toJson(jsonElement)); } @Override @@ -47,20 +50,19 @@ public class ComponentItemFactory1_21_5 extends ComponentItemFactory1_21_4 { @Override protected Optional itemName(ItemWrapper item) { if (!item.hasComponent(ComponentKeys.ITEM_NAME)) return Optional.empty(); - return ComponentType.encodeJava(ComponentKeys.ITEM_NAME, item.getComponent(ComponentKeys.ITEM_NAME)).map(ChatComponent::fromTag).map(ComponentUtils::minecraftToJson); + return ComponentType.encodeJson(ComponentKeys.ITEM_NAME, item.getComponent(ComponentKeys.ITEM_NAME)).map(jsonElement -> GsonHelper.get().toJson(jsonElement)); } @Override protected Optional> lore(ItemWrapper item) { if (!item.hasComponent(ComponentKeys.LORE)) return Optional.empty(); - return ComponentType.encodeJava( + return ComponentType.encodeJson( ComponentKeys.LORE, item.getComponent(ComponentKeys.LORE) ).map(list -> { List lore = new ArrayList<>(); - List tagList = TagList.getValue(list); - for (Object o : tagList) { - lore.add(ComponentUtils.minecraftToJson(ChatComponent.fromTag(o))); + for (JsonElement jsonElement : (JsonArray) list) { + lore.add(GsonHelper.get().toJson(jsonElement)); } return lore; }); 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 ade663df9..67850e487 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 @@ -643,6 +643,39 @@ public class RecipeEventListener implements Listener { } } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onAnvilRenameItem(PrepareAnvilEvent event) { + AnvilInventory inventory = event.getInventory(); + ItemStack first = inventory.getFirstItem(); + if (ItemUtils.isEmpty(first)) { + return; + } + if (event.getResult() == null) { + return; + } + Item wrappedFirst = BukkitItemManager.instance().wrap(first); + wrappedFirst.getCustomItem().ifPresent(item -> { + if (!item.settings().renameable()) { + String renameText; + if (VersionHelper.isVersionNewerThan1_21_2()) { + AnvilView anvilView = event.getView(); + renameText = anvilView.getRenameText(); + } else { + renameText = LegacyInventoryUtils.getRenameText(inventory); + } + System.out.println(wrappedFirst.itemName().get()); + System.out.println(wrappedFirst.lore().get()); + try { + if (!renameText.equals(Reflections.method$Component$getString.invoke(ComponentUtils.jsonToMinecraft(wrappedFirst.hoverName().orElse(AdventureHelper.EMPTY_COMPONENT))))) { + event.setResult(null); + } + } catch (Exception e) { + this.plugin.logger().warn("Failed to get hover name", e); + } + } + }); + } + public static int calculateIncreasedRepairCost(int cost) { return (int) Math.min((long) cost * 2L + 1L, 2147483647L); } 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 c56197dc1..9a2106eaf 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 @@ -18,6 +18,7 @@ public class ItemSettings { EquipmentGeneration equipment; boolean canRepair = true; List anvilRepairItems = List.of(); + boolean renameable = true; private ItemSettings() {} @@ -43,6 +44,7 @@ public class ItemSettings { newSettings.equipment = settings.equipment; newSettings.canRepair = settings.canRepair; newSettings.anvilRepairItems = settings.anvilRepairItems; + newSettings.renameable = settings.renameable; return newSettings; } @@ -66,6 +68,10 @@ public class ItemSettings { return fuelTime; } + public boolean renameable() { + return renameable; + } + public Set tags() { return tags; } @@ -89,6 +95,11 @@ public class ItemSettings { return this; } + public ItemSettings renameable(boolean renameable) { + this.renameable = renameable; + return this; + } + public ItemSettings fuelTime(int fuelTime) { this.fuelTime = fuelTime; return this; @@ -124,6 +135,10 @@ public class ItemSettings { boolean bool = (boolean) value; return settings -> settings.canRepair(bool); })); + registerFactory("renameable", (value -> { + boolean bool = (boolean) value; + return settings -> settings.renameable(bool); + })); registerFactory("anvil-repair-item", (value -> { @SuppressWarnings("unchecked") List> materials = (List>) value;