diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java index 4a6d049..655bd16 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/EcoArmorPlugin.java @@ -14,6 +14,7 @@ import com.willfp.ecoarmor.display.packets.PacketSetSlot; import com.willfp.ecoarmor.display.packets.PacketWindowItems; import com.willfp.ecoarmor.effects.Effects; import com.willfp.ecoarmor.sets.ArmorSets; +import com.willfp.ecoarmor.tiers.CrystalListener; import org.bukkit.event.Listener; import java.util.ArrayList; @@ -116,7 +117,7 @@ public class EcoArmorPlugin extends AbstractEcoPlugin { @Override public List getListeners() { return Arrays.asList( - + new CrystalListener(this) ); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/display/ArmorDisplay.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/display/ArmorDisplay.java index 2b4accd..a612bd3 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/display/ArmorDisplay.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/display/ArmorDisplay.java @@ -1,10 +1,11 @@ package com.willfp.ecoarmor.display; +import com.willfp.eco.util.config.Configs; import com.willfp.ecoarmor.sets.ArmorSet; import com.willfp.ecoarmor.sets.meta.ArmorSlot; import com.willfp.ecoarmor.sets.util.ArmorUtils; +import com.willfp.ecoarmor.tiers.UpgradeCrystal; import lombok.experimental.UtilityClass; -import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; @@ -60,12 +61,11 @@ public class ArmorDisplay { * @return The itemStack, updated. */ public static ItemStack display(@Nullable final ItemStack itemStack) { - if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getType() != Material.PLAYER_HEAD) { + if (itemStack == null || itemStack.getItemMeta() == null) { return itemStack; } ArmorSlot slot = ArmorSlot.getSlot(itemStack); - if (slot == null) { return itemStack; } @@ -80,6 +80,15 @@ public class ArmorDisplay { ArmorSet set = ArmorUtils.getSetOnItem(itemStack); if (set == null) { + String crystalTier = ArmorUtils.getCrystalTier(itemStack); + UpgradeCrystal crystal = UpgradeCrystal.getByName(crystalTier); + + if (crystalTier == null || crystal == null) { + return itemStack; + } + + meta.setLore(UpgradeCrystal.getByName(crystalTier).getItemStack().getItemMeta().getLore()); + itemStack.setItemMeta(meta); return itemStack; } @@ -87,7 +96,15 @@ public class ArmorDisplay { ItemMeta slotMeta = slotStack.getItemMeta(); assert slotMeta != null; - meta.setLore(slotMeta.getLore()); + String tier = ArmorUtils.getTier(itemStack); + + List lore = new ArrayList<>(); + + for (String s : slotMeta.getLore()) { + lore.add(s.replace("%tier%", Configs.CONFIG.getString("tier." + tier + ".display"))); + } + + meta.setLore(lore); meta.setDisplayName(slotMeta.getDisplayName()); if (meta instanceof SkullMeta && slotMeta instanceof SkullMeta) { @@ -99,6 +116,7 @@ public class ArmorDisplay { } itemStack.setItemMeta(meta); + return itemStack; } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java index e7f529a..3d66191 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/ArmorSet.java @@ -11,7 +11,6 @@ import com.willfp.ecoarmor.effects.Effect; import com.willfp.ecoarmor.effects.Effects; import com.willfp.ecoarmor.proxy.proxies.SkullProxy; import com.willfp.ecoarmor.sets.meta.ArmorSlot; -import com.willfp.ecoarmor.sets.meta.ArmorTier; import lombok.Getter; import org.bukkit.Color; import org.bukkit.Material; @@ -129,7 +128,7 @@ public class ArmorSet { enchants.forEach((enchantment, integer) -> meta.addEnchant(enchantment, integer, true)); PersistentDataContainer container = meta.getPersistentDataContainer(); container.set(PLUGIN.getNamespacedKeyFactory().create("set"), PersistentDataType.STRING, name); - container.set(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING, ArmorTier.DEFAULT); + container.set(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING, "default"); itemStack.setItemMeta(meta); constructRecipe(slot, itemStack); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/meta/ArmorTier.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/meta/ArmorTier.java deleted file mode 100644 index 4a76c65..0000000 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/meta/ArmorTier.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.willfp.ecoarmor.sets.meta; - -public class ArmorTier { - /** - * Default tier. - */ - public static final String DEFAULT = "default"; - - /** - * Iron tier. - */ - public static final String IRON = "iron"; - - /** - * Diamond tier. - */ - public static final String DIAMOND = "diamond"; - - /** - * Netherite tier. - */ - public static final String NETHERITE = "netherite"; -} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/ArmorUtils.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/ArmorUtils.java index abb4ab3..089dbc8 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/ArmorUtils.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/sets/util/ArmorUtils.java @@ -4,6 +4,7 @@ import com.willfp.eco.util.plugin.AbstractEcoPlugin; import com.willfp.ecoarmor.effects.Effect; import com.willfp.ecoarmor.sets.ArmorSet; import com.willfp.ecoarmor.sets.ArmorSets; +import com.willfp.ecoarmor.sets.meta.ArmorSlot; import lombok.experimental.UtilityClass; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -122,4 +123,74 @@ public class ArmorUtils { @NotNull final Effect effect) { return getEffectStrength(player, effect) != 0; } + + /** + * Get tier on upgrade crystal. + * + * @param itemStack The item to check. + * @return The found tier, or null. + */ + @Nullable + public static String getCrystalTier(@NotNull final ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + + if (meta == null) { + return null; + } + + if (meta.getPersistentDataContainer().has(PLUGIN.getNamespacedKeyFactory().create("upgrade_crystal"), PersistentDataType.STRING)) { + return meta.getPersistentDataContainer().get(PLUGIN.getNamespacedKeyFactory().create("upgrade_crystal"), PersistentDataType.STRING); + } + + return null; + } + + /** + * Get tier on item. + * + * @param itemStack The item to check. + * @return The found tier. + */ + public static String getTier(@NotNull final ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + + if (meta == null) { + return "default"; + } + + if (meta.getPersistentDataContainer().has(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING)) { + return meta.getPersistentDataContainer().get(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING); + } + + return "default"; + } + + /** + * Get tier on item. + * + * @param itemStack The item to check. + * @param tier The tier to set. + */ + public static void setTier(@NotNull final ItemStack itemStack, + @NotNull final String tier) { + ItemMeta meta = itemStack.getItemMeta(); + + if (meta == null) { + return; + } + + if (getSetOnItem(itemStack) == null) { + return; + } + + meta.getPersistentDataContainer().set(PLUGIN.getNamespacedKeyFactory().create("tier"), PersistentDataType.STRING, tier); + + ArmorSlot slot = ArmorSlot.getSlot(itemStack); + + if (slot == null) { + return; + } + + itemStack.setItemMeta(meta); + } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/CrystalListener.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/CrystalListener.java new file mode 100644 index 0000000..e06d7bc --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/CrystalListener.java @@ -0,0 +1,57 @@ +package com.willfp.ecoarmor.tiers; + +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.ecoarmor.sets.util.ArmorUtils; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class CrystalListener extends PluginDependent implements Listener { + /** + * Create new listeners for dragging crystals onto items. + * + * @param plugin The plugin to listen for. + */ + public CrystalListener(@NotNull final AbstractEcoPlugin plugin) { + super(plugin); + } + + /** + * Listen for inventory click event. + * + * @param event The event to handle. + */ + @EventHandler + public void onDrag(@NotNull final InventoryClickEvent event) { + ItemStack current = event.getCurrentItem(); + ItemStack cursor = event.getCursor(); + + if (current == null || cursor == null) { + return; + } + + if (cursor.getType() != Material.END_CRYSTAL) { + return; + } + + String tier = ArmorUtils.getCrystalTier(cursor); + + if (tier == null) { + return; + } + + if (current.getType() == Material.AIR) { + return; + } + + ArmorUtils.setTier(current, tier); + + event.getWhoClicked().setItemOnCursor(null); + + event.setCancelled(true); + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/UpgradeCrystal.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/UpgradeCrystal.java new file mode 100644 index 0000000..dbd8cd7 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoarmor/tiers/UpgradeCrystal.java @@ -0,0 +1,129 @@ +package com.willfp.ecoarmor.tiers; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.willfp.eco.common.recipes.lookup.RecipePartUtils; +import com.willfp.eco.common.recipes.parts.ComplexRecipePart; +import com.willfp.eco.util.StringUtils; +import com.willfp.eco.util.config.Configs; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.eco.util.recipe.EcoShapedRecipe; +import com.willfp.ecoarmor.display.ArmorDisplay; +import com.willfp.ecoarmor.sets.util.ArmorUtils; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class UpgradeCrystal { + /** + * Iron crystal. + */ + public static final UpgradeCrystal IRON = new UpgradeCrystal("iron"); + + /** + * Diamond crystal. + */ + public static final UpgradeCrystal DIAMOND = new UpgradeCrystal("diamond"); + + /** + * Netherite crystal. + */ + public static final UpgradeCrystal NETHERITE = new UpgradeCrystal("netherite"); + + /** + * Registered crystals. + */ + private static final BiMap BY_NAME = HashBiMap.create(); + + /** + * Instance of ItemStats to create keys for. + */ + @Getter + private final AbstractEcoPlugin plugin = AbstractEcoPlugin.getInstance(); + + /** + * The tier of the crystal. + */ + @Getter + private final String tier; + + /** + * The ItemStack of the crystal. + */ + @Getter + private ItemStack itemStack; + + /** + * The crafting recipe to make the crystal. + */ + @Getter + private EcoShapedRecipe recipe; + + /** + * Create a new Upgrade Crystal. + * + * @param tier The tier to upgrade to. + */ + public UpgradeCrystal(@NotNull final String tier) { + this.tier = tier; + this.update(); + } + + /** + * Update the tracker's crafting recipe. + */ + public void update() { + NamespacedKey key = this.getPlugin().getNamespacedKeyFactory().create("upgrade_crystal"); + + ItemStack out = new ItemStack(Material.END_CRYSTAL); + ItemMeta outMeta = out.getItemMeta(); + assert outMeta != null; + PersistentDataContainer container = outMeta.getPersistentDataContainer(); + container.set(key, PersistentDataType.STRING, tier); + + outMeta.setDisplayName(Configs.CONFIG.getString("tier." + tier + ".crystal-name")); + + List lore = new ArrayList<>(); + for (String loreLine : Configs.CONFIG.getStrings("tier." + tier + ".crystal-lore")) { + lore.add(ArmorDisplay.PREFIX + StringUtils.translate(loreLine)); + } + outMeta.setLore(lore); + + out.setItemMeta(outMeta); + this.itemStack = out; + + EcoShapedRecipe.Builder builder = EcoShapedRecipe.builder(this.getPlugin(), "upgrade_crystal_" + tier) + .setOutput(out); + + List recipeStrings = Configs.CONFIG.getStrings("tier." + tier + ".crystal-recipe"); + + RecipePartUtils.registerLookup("ecoarmor:upgrade_crystal_" + tier, s -> new ComplexRecipePart(test -> Objects.equals(tier, ArmorUtils.getCrystalTier(test)), out)); + + for (int i = 0; i < 9; i++) { + builder.setRecipePart(i, RecipePartUtils.lookup(recipeStrings.get(i))); + } + + this.recipe = builder.build(); + this.recipe.register(); + } + + /** + * Get {@link UpgradeCrystal} matching name. + * + * @param name The name to search for. + * @return The matching {@link UpgradeCrystal}, or null if not found. + */ + public static UpgradeCrystal getByName(@Nullable final String name) { + return BY_NAME.get(name); + } +} diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml index dfe1d11..861a1dd 100644 --- a/eco-core/core-plugin/src/main/resources/config.yml +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -1,4 +1,66 @@ # # EcoArmor # by Auxilor -# \ No newline at end of file +# + +tier: + default: + display: "&8&lDEFAULT" + # No crystal for default + + iron: + display: "&7&lIRON" + crystal-name: "&7Iron Upgrade Crystal" + crystal-recipe: + - air + - iron_block + - air + + - iron_block + - leather_chestplate + - iron_block + + - air + - iron_block + - air + crystal-lore: + - "&8Drop this onto an item to set its tier to" + - "&7&lIRON" + + diamond: + display: "&b&lDIAMOND" + crystal-name: "&bDiamond Upgrade Crystal" + crystal-recipe: + - air + - diamond_block + - air + + - diamond_block + - ecoarmor:upgrade_crystal_iron + - diamond_block + + - air + - diamond_block + - air + crystal-lore: + - "&8Drop this onto an item to set its tier to" + - "&b&lDIAMOND" + + netherite: + display: "&c&lNETHERITE" + crystal-name: "&cNetherite Upgrade Crystal" + crystal-recipe: + - air + - netherite_block + - air + + - netherite_block + - ecoarmor:upgrade_crystal_diamond + - netherite_block + + - air + - netherite_block + - air + crystal-lore: + - "&8Drop this onto an item to set its tier to" + - "&c&lNETHERITE" diff --git a/eco-core/core-plugin/src/main/resources/sets.yml b/eco-core/core-plugin/src/main/resources/sets.yml index ade28ab..e100468 100644 --- a/eco-core/core-plugin/src/main/resources/sets.yml +++ b/eco-core/core-plugin/src/main/resources/sets.yml @@ -16,7 +16,7 @@ Reaper: - "&8&oRequires full set to be worn" - "" - "&fTier: %tier%" - - "&8&oUpgrade with a Tier Upgrader" + - "&8&oUpgrade with an Upgrade Crystal" recipe: - air - nether_star @@ -44,7 +44,7 @@ Reaper: - "&8&oRequires full set to be worn" - "" - "&fTier: %tier%" - - "&8&oUpgrade with a Tier Upgrader" + - "&8&oUpgrade with a Upgrade Crystal" recipe: - air - nether_star @@ -71,7 +71,7 @@ Reaper: - "&8&oRequires full set to be worn" - "" - "&fTier: %tier%" - - "&8&oUpgrade with a Tier Upgrader" + - "&8&oUpgrade with a Upgrade Crystal" recipe: - air - nether_star @@ -99,7 +99,7 @@ Reaper: - "&8&oRequires full set to be worn" - "" - "&fTier: %tier%" - - "&8&oUpgrade with a Tier Upgrader" + - "&8&oUpgrade with a Upgrade Crystal" recipe: - air - nether_star @@ -127,7 +127,7 @@ Reaper: - "&8&oRequires full set to be worn" - "" - "&fTier: %tier%" - - "&8&oUpgrade with a Tier Upgrader" + - "&8&oUpgrade with a Upgrade Crystal" recipe: - air - nether_star