Allow renaming armored elytras in an anvil
This commit is contained in:
		@@ -6,6 +6,7 @@ import nl.pim16aap2.armoredElytra.util.ArmorTier;
 | 
				
			|||||||
import nl.pim16aap2.armoredElytra.util.EnchantmentContainer;
 | 
					import nl.pim16aap2.armoredElytra.util.EnchantmentContainer;
 | 
				
			||||||
import nl.pim16aap2.armoredElytra.util.Util;
 | 
					import nl.pim16aap2.armoredElytra.util.Util;
 | 
				
			||||||
import nl.pim16aap2.armoredElytra.util.XMaterial;
 | 
					import nl.pim16aap2.armoredElytra.util.XMaterial;
 | 
				
			||||||
 | 
					import org.bukkit.ChatColor;
 | 
				
			||||||
import org.bukkit.Material;
 | 
					import org.bukkit.Material;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
import org.bukkit.event.EventHandler;
 | 
					import org.bukkit.event.EventHandler;
 | 
				
			||||||
@@ -16,6 +17,7 @@ import org.bukkit.event.inventory.InventoryType;
 | 
				
			|||||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
 | 
					import org.bukkit.event.inventory.PrepareAnvilEvent;
 | 
				
			||||||
import org.bukkit.inventory.AnvilInventory;
 | 
					import org.bukkit.inventory.AnvilInventory;
 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					import org.bukkit.inventory.meta.ItemMeta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.logging.Level;
 | 
					import java.util.logging.Level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -100,13 +102,12 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener
 | 
				
			|||||||
        ItemStack result = null;
 | 
					        ItemStack result = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (itemA != null && itemB != null)
 | 
					        if (itemA != null && itemB != null)
 | 
				
			||||||
            // If itemB is the elytra, while itemA isn't, switch itemA and itemB.
 | 
					            // If itemB is the (armored) elytra, while itemA isn't, switch itemA and itemB.
 | 
				
			||||||
            if (itemB.getType() == Material.ELYTRA && itemA.getType() != Material.ELYTRA)
 | 
					            if (itemB.getType() == Material.ELYTRA && itemA.getType() != Material.ELYTRA)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                result = itemA;
 | 
					                ItemStack tmp = itemA;
 | 
				
			||||||
                itemA = itemB;
 | 
					                itemA = itemB;
 | 
				
			||||||
                itemB = result;
 | 
					                itemB = tmp;
 | 
				
			||||||
                result = null;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check if there are items in both input slots.
 | 
					        // Check if there are items in both input slots.
 | 
				
			||||||
@@ -163,8 +164,10 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener
 | 
				
			|||||||
                enchantments.applyEnchantments(result);
 | 
					                enchantments.applyEnchantments(result);
 | 
				
			||||||
                result.setDurability(durability);
 | 
					                result.setDurability(durability);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                final String name = getElytraResultName(itemA, action, newTier, event.getInventory().getRenameText());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                result = ArmoredElytra.getInstance().getNbtEditor()
 | 
					                result = ArmoredElytra.getInstance().getNbtEditor()
 | 
				
			||||||
                                      .addArmorNBTTags(result, newTier, plugin.getConfigLoader().unbreakable());
 | 
					                                      .addArmorNBTTags(result, newTier, plugin.getConfigLoader().unbreakable(), name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                event.setResult(result);
 | 
					                event.setResult(result);
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -178,6 +181,26 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener
 | 
				
			|||||||
            event.setResult(null);
 | 
					            event.setResult(null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String getElytraResultName(final ItemStack baseItem, final Action action,
 | 
				
			||||||
 | 
					                                       final ArmorTier armorTier, final String renameText)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        final String tierName = ArmoredElytra.getInstance().getArmoredElytraName(armorTier);
 | 
				
			||||||
 | 
					        if (renameText == null || !plugin.getConfigLoader().allowRenaming())
 | 
				
			||||||
 | 
					            return tierName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        final ItemMeta meta = baseItem.getItemMeta();
 | 
				
			||||||
 | 
					        final String currentName = meta == null ? null : meta.getDisplayName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // When the rename text is empty, give it the default tier-name when creating a new armored elytra
 | 
				
			||||||
 | 
					        // (so it's named properly) or when the current name is already the tier name (just returning the current
 | 
				
			||||||
 | 
					        // name would strip the tier's color in this case).
 | 
				
			||||||
 | 
					        if ((action == Action.CREATE && renameText.equals("")) ||
 | 
				
			||||||
 | 
					            ChatColor.stripColor(tierName).equals(ChatColor.stripColor(renameText)))
 | 
				
			||||||
 | 
					            return tierName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return renameText.equals("") ? currentName : renameText;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Let the player take items out of the anvil.
 | 
					    // Let the player take items out of the anvil.
 | 
				
			||||||
    @EventHandler
 | 
					    @EventHandler
 | 
				
			||||||
    public void onInventoryClick(InventoryClickEvent e)
 | 
					    public void onInventoryClick(InventoryClickEvent e)
 | 
				
			||||||
@@ -215,14 +238,7 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener
 | 
				
			|||||||
            // If there's an armored elytra in the final slot...
 | 
					            // If there's an armored elytra in the final slot...
 | 
				
			||||||
            if (armortier != ArmorTier.NONE && plugin.playerHasCraftPerm(player, armortier))
 | 
					            if (armortier != ArmorTier.NONE && plugin.playerHasCraftPerm(player, armortier))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Create a new armored elytra and give that one to the player instead of the
 | 
					                final ItemStack result = anvilInventory.getItem(2);
 | 
				
			||||||
                // result.
 | 
					 | 
				
			||||||
                // This is done because after putting item0 in AFTER item1, the first letter of
 | 
					 | 
				
			||||||
                // the color code shows up, this gets rid of that problem.
 | 
					 | 
				
			||||||
                ItemStack result = ArmoredElytra.getInstance().getNbtEditor()
 | 
					 | 
				
			||||||
                                                .addArmorNBTTags(anvilInventory.getItem(2), armortier,
 | 
					 | 
				
			||||||
                                                                 plugin.getConfigLoader().unbreakable());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // Give the result to the player and clear the anvil's inventory.
 | 
					                // Give the result to the player and clear the anvil's inventory.
 | 
				
			||||||
                if (!giveItemToPlayer(player, result, e.isShiftClick()))
 | 
					                if (!giveItemToPlayer(player, result, e.isShiftClick()))
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package nl.pim16aap2.armoredElytra.nbtEditor;
 | 
					package nl.pim16aap2.armoredElytra.nbtEditor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import nl.pim16aap2.armoredElytra.ArmoredElytra;
 | 
				
			||||||
import nl.pim16aap2.armoredElytra.util.ArmorTier;
 | 
					import nl.pim16aap2.armoredElytra.util.ArmorTier;
 | 
				
			||||||
import org.bukkit.inventory.ItemStack;
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -7,7 +8,8 @@ public interface INBTEditor
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Adds a given {@link ArmorTier} to an item. The item will be cloned. Note that setting the armor tier to {@link
 | 
					     * Adds a given {@link ArmorTier} to an item. The item will be cloned. Note that setting the armor tier to {@link
 | 
				
			||||||
     * ArmorTier#NONE} has no effect (besides making a copy of the item).
 | 
					     * ArmorTier#NONE} has no effect (besides making a copy of the item). The default name for the given tier is
 | 
				
			||||||
 | 
					     * applied. See {@link ArmoredElytra#getArmoredElytraName(ArmorTier)}.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param item        The item.
 | 
					     * @param item        The item.
 | 
				
			||||||
     * @param armorTier   The {@link ArmorTier} that will be added to it.
 | 
					     * @param armorTier   The {@link ArmorTier} that will be added to it.
 | 
				
			||||||
@@ -16,6 +18,18 @@ public interface INBTEditor
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable);
 | 
					    ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Adds a given {@link ArmorTier} to an item. The item will be cloned. Note that setting the armor tier to {@link
 | 
				
			||||||
 | 
					     * ArmorTier#NONE} has no effect (besides making a copy of the item).
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param item        The item.
 | 
				
			||||||
 | 
					     * @param armorTier   The {@link ArmorTier} that will be added to it.
 | 
				
			||||||
 | 
					     * @param unbreakable Whether the resulting item should be unbreakable.
 | 
				
			||||||
 | 
					     * @param name        The name fo the item.
 | 
				
			||||||
 | 
					     * @return The NEW item.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable, final String name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Checks which {@link ArmorTier} is on an item.
 | 
					     * Checks which {@link ArmorTier} is on an item.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,15 @@ public class NBTEditor implements INBTEditor
 | 
				
			|||||||
    private static final NamespacedKey armorTierKey = new NamespacedKey(ArmoredElytra.getInstance(),
 | 
					    private static final NamespacedKey armorTierKey = new NamespacedKey(ArmoredElytra.getInstance(),
 | 
				
			||||||
                                                                        "ARMOR_TIER_LEVEL");
 | 
					                                                                        "ARMOR_TIER_LEVEL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public NBTEditor()
 | 
					    @Override
 | 
				
			||||||
 | 
					    public ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        return addArmorNBTTags(item, armorTier, unbreakable,
 | 
				
			||||||
 | 
					                               ArmoredElytra.getInstance().getArmoredElytraName(armorTier));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable)
 | 
					    public ItemStack addArmorNBTTags(ItemStack item, ArmorTier armorTier, boolean unbreakable, final String name)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (armorTier == null || armorTier == ArmorTier.NONE)
 | 
					        if (armorTier == null || armorTier == ArmorTier.NONE)
 | 
				
			||||||
            return new ItemStack(item);
 | 
					            return new ItemStack(item);
 | 
				
			||||||
@@ -45,7 +48,7 @@ public class NBTEditor implements INBTEditor
 | 
				
			|||||||
                              "generic.knockback_resistance");
 | 
					                              "generic.knockback_resistance");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        meta.setUnbreakable(unbreakable);
 | 
					        meta.setUnbreakable(unbreakable);
 | 
				
			||||||
        meta.setDisplayName(ArmoredElytra.getInstance().getArmoredElytraName(armorTier));
 | 
					        meta.setDisplayName(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ret.setItemMeta(meta);
 | 
					        ret.setItemMeta(meta);
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,7 @@ public class ConfigLoader
 | 
				
			|||||||
    private boolean craftingInSmithingTable;
 | 
					    private boolean craftingInSmithingTable;
 | 
				
			||||||
    private boolean bypassWearPerm;
 | 
					    private boolean bypassWearPerm;
 | 
				
			||||||
    private boolean bypassCraftPerm;
 | 
					    private boolean bypassCraftPerm;
 | 
				
			||||||
 | 
					    private boolean allowRenaming;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final ArrayList<nl.pim16aap2.armoredElytra.util.ConfigOption<?>> configOptionsList;
 | 
					    private final ArrayList<nl.pim16aap2.armoredElytra.util.ConfigOption<?>> configOptionsList;
 | 
				
			||||||
    private final ArmoredElytra plugin;
 | 
					    private final ArmoredElytra plugin;
 | 
				
			||||||
@@ -118,6 +119,10 @@ public class ConfigLoader
 | 
				
			|||||||
                "This option only works on 1.16+! When enabled, armored elytra creation in anvils is disabled. ",
 | 
					                "This option only works on 1.16+! When enabled, armored elytra creation in anvils is disabled. ",
 | 
				
			||||||
                "Instead, you will have to craft them in a smithy. Enchanting/repairing them still works via the anvil."
 | 
					                "Instead, you will have to craft them in a smithy. Enchanting/repairing them still works via the anvil."
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					        String[] allowRenamingComment =
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "Whether or not to allow renaming of armored elytras in anvils."
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set default list of allowed enchantments.
 | 
					        // Set default list of allowed enchantments.
 | 
				
			||||||
@@ -172,6 +177,8 @@ public class ConfigLoader
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        allowMultipleProtectionEnchantments = addNewConfigOption(config, "allowMultipleProtectionEnchantments", false,
 | 
					        allowMultipleProtectionEnchantments = addNewConfigOption(config, "allowMultipleProtectionEnchantments", false,
 | 
				
			||||||
                                                                 allowMultipleProtectionEnchantmentsComment);
 | 
					                                                                 allowMultipleProtectionEnchantmentsComment);
 | 
				
			||||||
 | 
					        allowRenaming = addNewConfigOption(config, "allowRenaming", true, allowRenamingComment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        checkForUpdates = addNewConfigOption(config, "checkForUpdates", true, updateComment);
 | 
					        checkForUpdates = addNewConfigOption(config, "checkForUpdates", true, updateComment);
 | 
				
			||||||
        allowStats = addNewConfigOption(config, "allowStats", true, bStatsComment);
 | 
					        allowStats = addNewConfigOption(config, "allowStats", true, bStatsComment);
 | 
				
			||||||
        enableDebug = addNewConfigOption(config, "enableDebug", false, debugComment);
 | 
					        enableDebug = addNewConfigOption(config, "enableDebug", false, debugComment);
 | 
				
			||||||
@@ -287,6 +294,11 @@ public class ConfigLoader
 | 
				
			|||||||
        return allowMultipleProtectionEnchantments;
 | 
					        return allowMultipleProtectionEnchantments;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean allowRenaming()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return allowRenaming;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean uninstallMode()
 | 
					    public boolean uninstallMode()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return uninstallMode;
 | 
					        return uninstallMode;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user