diff --git a/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java b/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java index 574573a..1088186 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java +++ b/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java @@ -5,6 +5,7 @@ import nl.pim16aap2.armoredElytra.handlers.CommandHandler; import nl.pim16aap2.armoredElytra.handlers.EventHandlers; import nl.pim16aap2.armoredElytra.handlers.FlyDurabilityHandler; import nl.pim16aap2.armoredElytra.handlers.LoginHandler; +import nl.pim16aap2.armoredElytra.handlers.SmithingTableHandler; import nl.pim16aap2.armoredElytra.handlers.Uninstaller; import nl.pim16aap2.armoredElytra.nbtEditor.INBTEditor; import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; @@ -22,7 +23,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; -import sun.reflect.generics.reflectiveObjects.NotImplementedException; import java.util.EnumMap; import java.util.Map; @@ -84,12 +84,12 @@ public class ArmoredElytra extends JavaPlugin implements Listener myLogger(Level.INFO, "Stats disabled, not loading stats :(... Please consider enabling it! I am a simple man, seeing higher user numbers helps me stay motivated!"); - if (config.craftingInSmithingTable()) - throw new NotImplementedException(); - else - { - Bukkit.getPluginManager().registerEvents(new AnvilHandler(this, !config.uninstallMode()), this); - } + final Listener creationListener = config.craftingInSmithingTable() ? + new SmithingTableHandler(this, !config.uninstallMode()) : + new AnvilHandler(this, !config.uninstallMode()); + Bukkit.getPluginManager().registerEvents(creationListener, this); + + Bukkit.getPluginManager().registerEvents(new EventHandlers(this), this); getCommand("ArmoredElytra").setExecutor(new CommandHandler(this)); @@ -135,6 +135,11 @@ public class ArmoredElytra extends JavaPlugin implements Listener return parts.length > 0 && parts[0].equals("758abbe"); } + public MinecraftVersion getMinecraftVersion() + { + return minecraftVersion; + } + public Messages getMyMessages() { return messages; diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java b/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java index 08f78ac..c91a076 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java +++ b/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java @@ -18,51 +18,11 @@ import org.bukkit.inventory.ItemStack; import java.util.logging.Level; -public class AnvilHandler implements Listener +public class AnvilHandler extends ArmoredElytraHandler implements Listener { - private final ArmoredElytra plugin; - - private final boolean creationEnabled; - public AnvilHandler(final ArmoredElytra plugin, final boolean creationEnabled) { - this.plugin = plugin; - this.creationEnabled = creationEnabled; - } - - private void cleanAnvilInventory(AnvilInventory anvilInventory) - { - if (anvilInventory.getItem(0) != null) - anvilInventory.getItem(0).setAmount(0); - if (anvilInventory.getItem(1) != null) - anvilInventory.getItem(1).setAmount(anvilInventory.getItem(1).getAmount() - 1); - if (anvilInventory.getItem(2) != null) - anvilInventory.getItem(2).setAmount(0); - } - - // Repair an Armored Elytra - private short repairItem(short curDur, ItemStack repairItem) - { - // Get the multiplier for the repair items. - double mult = 0.01; - if (repairItem.getType().equals(Material.LEATHER)) - mult *= (100.0f / plugin.getConfigLoader().LEATHER_TO_FULL()); - - else if (repairItem.getType().equals(Material.GOLD_INGOT)) - mult *= (100.0f / plugin.getConfigLoader().GOLD_TO_FULL()); - - else if (repairItem.getType().equals(Material.IRON_INGOT)) - mult *= (100.0f / plugin.getConfigLoader().IRON_TO_FULL()); - - else if (repairItem.getType().equals(Material.DIAMOND)) - mult *= (100.0f / plugin.getConfigLoader().DIAMONDS_TO_FULL()); - - else if (repairItem.getType().equals(XMaterial.NETHERITE_INGOT.parseMaterial())) - mult *= (100.0f / plugin.getConfigLoader().NETHERITE_TO_FULL()); - - int maxDurability = Material.ELYTRA.getMaxDurability(); - int newDurability = (int) (curDur - (maxDurability * mult)); - return (short) (newDurability <= 0 ? 0 : newDurability); + super(plugin, creationEnabled); } // Valid inputs: diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java b/src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java new file mode 100644 index 0000000..e3e6b0c --- /dev/null +++ b/src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java @@ -0,0 +1,60 @@ +package nl.pim16aap2.armoredElytra.handlers; + +import nl.pim16aap2.armoredElytra.ArmoredElytra; +import nl.pim16aap2.armoredElytra.util.XMaterial; +import org.bukkit.Material; +import org.bukkit.inventory.AnvilInventory; +import org.bukkit.inventory.ItemStack; + +/** + * Base class for the anvil / smithing table handlers. + * + * @author Pim + */ +abstract class ArmoredElytraHandler +{ + protected final ArmoredElytra plugin; + + protected final boolean creationEnabled; + + public ArmoredElytraHandler(final ArmoredElytra plugin, final boolean creationEnabled) + { + this.plugin = plugin; + this.creationEnabled = creationEnabled; + } + + protected void cleanAnvilInventory(AnvilInventory anvilInventory) + { + if (anvilInventory.getItem(0) != null) + anvilInventory.getItem(0).setAmount(0); + if (anvilInventory.getItem(1) != null) + anvilInventory.getItem(1).setAmount(anvilInventory.getItem(1).getAmount() - 1); + if (anvilInventory.getItem(2) != null) + anvilInventory.getItem(2).setAmount(0); + } + + // Repair an Armored Elytra + protected short repairItem(short curDur, ItemStack repairItem) + { + // Get the multiplier for the repair items. + double mult = 0.01; + if (repairItem.getType().equals(Material.LEATHER)) + mult *= (100.0f / plugin.getConfigLoader().LEATHER_TO_FULL()); + + else if (repairItem.getType().equals(Material.GOLD_INGOT)) + mult *= (100.0f / plugin.getConfigLoader().GOLD_TO_FULL()); + + else if (repairItem.getType().equals(Material.IRON_INGOT)) + mult *= (100.0f / plugin.getConfigLoader().IRON_TO_FULL()); + + else if (repairItem.getType().equals(Material.DIAMOND)) + mult *= (100.0f / plugin.getConfigLoader().DIAMONDS_TO_FULL()); + + else if (repairItem.getType().equals(XMaterial.NETHERITE_INGOT.parseMaterial())) + mult *= (100.0f / plugin.getConfigLoader().NETHERITE_TO_FULL()); + + int maxDurability = Material.ELYTRA.getMaxDurability(); + int newDurability = (int) (curDur - (maxDurability * mult)); + return (short) (newDurability <= 0 ? 0 : newDurability); + } +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableHandler.java b/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableHandler.java new file mode 100644 index 0000000..8c330b1 --- /dev/null +++ b/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableHandler.java @@ -0,0 +1,49 @@ +package nl.pim16aap2.armoredElytra.handlers; + +import nl.pim16aap2.armoredElytra.ArmoredElytra; +import nl.pim16aap2.armoredElytra.enchantment.EnchantmentManager; +import nl.pim16aap2.armoredElytra.util.ArmorTier; +import nl.pim16aap2.armoredElytra.util.Util; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareSmithingEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.SmithingInventory; + +public class SmithingTableHandler extends ArmoredElytraHandler implements Listener +{ + public SmithingTableHandler(final ArmoredElytra plugin, final boolean creationEnabled) + { + super(plugin, creationEnabled); + } + + @EventHandler(ignoreCancelled = true) + public void onSmithingTableUsage(final PrepareSmithingEvent event) + { + final SmithingInventory inventory = event.getInventory(); + final ItemStack[] contents = inventory.getContents(); + + final ItemStack itemStackA = contents[0]; + final ItemStack itemStackB = contents[1]; + + if (itemStackA == null || itemStackB == null || + itemStackA.getType() != Material.ELYTRA || !Util.isChestPlate(itemStackB)) + return; + + final ArmorTier newTier = Util.armorToTier(itemStackB.getType()); + final EnchantmentManager enchantments = new EnchantmentManager(itemStackA); + final Player player = (Player) event.getView().getPlayer(); + + final ItemStack result; + if (plugin.playerHasCraftPerm(player, newTier)) + { + result = ArmoredElytra.getInstance().getNbtEditor() + .addArmorNBTTags(new ItemStack(Material.ELYTRA, 1), newTier, + plugin.getConfigLoader().unbreakable()); + enchantments.apply(result); + event.setResult(result); + } + } +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java b/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java index b2814cd..8daf386 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java +++ b/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java @@ -133,8 +133,15 @@ public class ConfigLoader DIAMONDS_TO_FULL = addNewConfigOption(config, "diamondsRepair", 3, null); NETHERITE_TO_FULL = addNewConfigOption(config, "netheriteIngotsRepair", 3, null); -// craftingInSmithingTable = addNewConfigOption(config, "craftingInSmithingTable", true, craftingInSmithingTableComment); - craftingInSmithingTable = false; + final boolean smithingTableAllowed = plugin.getMinecraftVersion().isNewerThan(MinecraftVersion.v1_15); + craftingInSmithingTable = addNewConfigOption(config, "craftingInSmithingTable", smithingTableAllowed, + craftingInSmithingTableComment); + if (craftingInSmithingTable && !smithingTableAllowed) + { + Bukkit.getLogger().log(Level.WARNING, "You tried to enable crafting in smithing tables, " + + "but this is only supported on 1.16+! Reverting to disabled."); + craftingInSmithingTable = false; + } defaultAllowedEnchantments = addNewConfigOption(config, "allowedEnchantments", defaultAllowedEnchantments, enchantmentsComment); @@ -202,7 +209,7 @@ public class ConfigLoader e.printStackTrace(); } } - + public boolean allowStats() { return allowStats; diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java b/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java index 7c91b51..4cc3446 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java +++ b/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java @@ -62,6 +62,11 @@ public class Util return ret; } + public static boolean isChestPlate(ItemStack itemStack) + { + return isChestPlate(itemStack.getType()); + } + // Check if mat is a chest plate. public static boolean isChestPlate(Material mat) {