diff --git a/pom.xml b/pom.xml index fb097ec..7a0c809 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.spigotmc spigot-api - 1.14.4-R0.1-SNAPSHOT + 1.16.2-R0.1-SNAPSHOT jar diff --git a/src/com/codingforcookies/armorequip/ArmorListener.java b/src/com/codingforcookies/armorequip/ArmorListener.java index c30fc40..130e281 100644 --- a/src/com/codingforcookies/armorequip/ArmorListener.java +++ b/src/com/codingforcookies/armorequip/ArmorListener.java @@ -18,141 +18,178 @@ import org.bukkit.inventory.ItemStack; import com.codingforcookies.armorequip.ArmorEquipEvent.EquipMethod; +import org.bukkit.Tag; +import org.bukkit.block.Container; /** * @author Arnah * @since Jul 30, 2015 */ -public class ArmorListener implements Listener{ +public class ArmorListener implements Listener { - private final List blockedMaterials; + private final List blockedMaterials; - public ArmorListener(List blockedMaterials){ - this.blockedMaterials = blockedMaterials; - } - //Event Priority is highest because other plugins might cancel the events before we check. + public ArmorListener(List blockedMaterials) { + this.blockedMaterials = blockedMaterials; + } + //Event Priority is highest because other plugins might cancel the events before we check. - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public final void inventoryClick(final InventoryClickEvent e){ - boolean shift = false, numberkey = false; - if(e.isCancelled()) return; - if(e.getAction() == InventoryAction.NOTHING) return;// Why does this get called if nothing happens?? - if(e.getClick().equals(ClickType.SHIFT_LEFT) || e.getClick().equals(ClickType.SHIFT_RIGHT)){ - shift = true; - } - if(e.getClick().equals(ClickType.NUMBER_KEY)){ - numberkey = true; - } - if(e.getSlotType() != SlotType.ARMOR && e.getSlotType() != SlotType.QUICKBAR && e.getSlotType() != SlotType.CONTAINER) return; - if(e.getClickedInventory() != null && !e.getClickedInventory().getType().equals(InventoryType.PLAYER)) return; - if (!e.getInventory().getType().equals(InventoryType.CRAFTING) && !e.getInventory().getType().equals(InventoryType.PLAYER)) return; - if(!(e.getWhoClicked() instanceof Player)) return; - ArmorType newArmorType = ArmorType.matchType(shift ? e.getCurrentItem() : e.getCursor()); - if(!shift && newArmorType != null && e.getRawSlot() != newArmorType.getSlot()){ - // Used for drag and drop checking to make sure you aren't trying to place a helmet in the boots slot. - return; - } - if(shift){ - newArmorType = ArmorType.matchType(e.getCurrentItem()); - if(newArmorType != null){ - boolean equipping = true; - if(e.getRawSlot() == newArmorType.getSlot()){ - equipping = false; - } - if(newArmorType.equals(ArmorType.HELMET) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getHelmet()) : !isAirOrNull(e.getWhoClicked().getInventory().getHelmet())) || newArmorType.equals(ArmorType.CHESTPLATE) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getChestplate()) : !isAirOrNull(e.getWhoClicked().getInventory().getChestplate())) || newArmorType.equals(ArmorType.LEGGINGS) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getLeggings()) : !isAirOrNull(e.getWhoClicked().getInventory().getLeggings())) || newArmorType.equals(ArmorType.BOOTS) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getBoots()) : !isAirOrNull(e.getWhoClicked().getInventory().getBoots()))){ - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), EquipMethod.SHIFT_CLICK, newArmorType, equipping ? null : e.getCurrentItem(), equipping ? e.getCurrentItem() : null); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if(armorEquipEvent.isCancelled()){ - e.setCancelled(true); - } - } - } - }else{ - ItemStack newArmorPiece = e.getCursor(); - ItemStack oldArmorPiece = e.getCurrentItem(); - if(numberkey){ - if(e.getClickedInventory().getType().equals(InventoryType.PLAYER)){// Prevents shit in the 2by2 crafting - // e.getClickedInventory() == The players inventory - // e.getHotBarButton() == key people are pressing to equip or unequip the item to or from. - // e.getRawSlot() == The slot the item is going to. - // e.getSlot() == Armor slot, can't use e.getRawSlot() as that gives a hotbar slot ;-; - ItemStack hotbarItem = e.getClickedInventory().getItem(e.getHotbarButton()); - if(!isAirOrNull(hotbarItem)){// Equipping - newArmorType = ArmorType.matchType(hotbarItem); - newArmorPiece = hotbarItem; - oldArmorPiece = e.getClickedInventory().getItem(e.getSlot()); - }else{// Unequipping - newArmorType = ArmorType.matchType(!isAirOrNull(e.getCurrentItem()) ? e.getCurrentItem() : e.getCursor()); - } - } - }else{ - if(isAirOrNull(e.getCursor()) && !isAirOrNull(e.getCurrentItem())){// unequip with no new item going into the slot. - newArmorType = ArmorType.matchType(e.getCurrentItem()); - } - // e.getCurrentItem() == Unequip - // e.getCursor() == Equip - // newArmorType = ArmorType.matchType(!isAirOrNull(e.getCurrentItem()) ? e.getCurrentItem() : e.getCursor()); - } - if(newArmorType != null && e.getRawSlot() == newArmorType.getSlot()){ - EquipMethod method = EquipMethod.PICK_DROP; - if(e.getAction().equals(InventoryAction.HOTBAR_SWAP) || numberkey) method = EquipMethod.HOTBAR_SWAP; - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), method, newArmorType, oldArmorPiece, newArmorPiece); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if(armorEquipEvent.isCancelled()){ - e.setCancelled(true); - } - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void playerInteractEvent(PlayerInteractEvent e){ - if(e.useItemInHand().equals(Result.DENY))return; - // - if(e.getAction() == Action.PHYSICAL) return; - if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK){ - Player player = e.getPlayer(); - if(!e.useInteractedBlock().equals(Result.DENY)){ - if(e.getClickedBlock() != null && e.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()){// Having both of these checks is useless, might as well do it though. - // Some blocks have actions when you right click them which stops the client from equipping the armor in hand. - Material mat = e.getClickedBlock().getType(); - for(String s : blockedMaterials){ - if(mat.name().equalsIgnoreCase(s)) return; - } - } - } - ArmorType newArmorType = ArmorType.matchType(e.getItem()); - if(newArmorType != null){ - if(newArmorType.equals(ArmorType.HELMET) && isAirOrNull(e.getPlayer().getInventory().getHelmet()) || newArmorType.equals(ArmorType.CHESTPLATE) && isAirOrNull(e.getPlayer().getInventory().getChestplate()) || newArmorType.equals(ArmorType.LEGGINGS) && isAirOrNull(e.getPlayer().getInventory().getLeggings()) || newArmorType.equals(ArmorType.BOOTS) && isAirOrNull(e.getPlayer().getInventory().getBoots())){ - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer(), EquipMethod.HOTBAR, ArmorType.matchType(e.getItem()), null, e.getItem()); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if(armorEquipEvent.isCancelled()){ - e.setCancelled(true); - player.updateInventory(); - } - } - } - } - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void inventoryDrag(InventoryDragEvent event){ - // getType() seems to always be even. - // Old Cursor gives the item you are equipping - // Raw slot is the ArmorType slot - // Can't replace armor using this method making getCursor() useless. - ArmorType type = ArmorType.matchType(event.getOldCursor()); - if(event.getRawSlots().isEmpty()) return;// Idk if this will ever happen - if(type != null && type.getSlot() == event.getRawSlots().stream().findFirst().orElse(0)){ - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked(), EquipMethod.DRAG, type, null, event.getOldCursor()); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if(armorEquipEvent.isCancelled()){ - event.setResult(Result.DENY); - event.setCancelled(true); - } - } - // Debug shit - /*System.out.println("Slots: " + event.getInventorySlots().toString()); + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public final void inventoryClick(final InventoryClickEvent e) { + boolean shift = false, numberkey = false; + if (e.isCancelled()) { + return; + } + if (e.getAction() == InventoryAction.NOTHING) { + return;// Why does this get called if nothing happens?? + } + if (e.getClick().equals(ClickType.SHIFT_LEFT) || e.getClick().equals(ClickType.SHIFT_RIGHT)) { + shift = true; + } + if (e.getClick().equals(ClickType.NUMBER_KEY)) { + numberkey = true; + } + if (e.getSlotType() != SlotType.ARMOR && e.getSlotType() != SlotType.QUICKBAR && e.getSlotType() != SlotType.CONTAINER) { + return; + } + if (e.getClickedInventory() != null && !e.getClickedInventory().getType().equals(InventoryType.PLAYER)) { + return; + } + if (!e.getInventory().getType().equals(InventoryType.CRAFTING) && !e.getInventory().getType().equals(InventoryType.PLAYER)) { + return; + } + if (!(e.getWhoClicked() instanceof Player)) { + return; + } + ArmorType newArmorType = ArmorType.matchType(shift ? e.getCurrentItem() : e.getCursor()); + if (!shift && newArmorType != null && e.getRawSlot() != newArmorType.getSlot()) { + // Used for drag and drop checking to make sure you aren't trying to place a helmet in the boots slot. + return; + } + if (shift) { + newArmorType = ArmorType.matchType(e.getCurrentItem()); + if (newArmorType != null) { + boolean equipping = true; + if (e.getRawSlot() == newArmorType.getSlot()) { + equipping = false; + } + if (newArmorType.equals(ArmorType.HELMET) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getHelmet()) : !isAirOrNull(e.getWhoClicked().getInventory().getHelmet())) || newArmorType.equals(ArmorType.CHESTPLATE) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getChestplate()) : !isAirOrNull(e.getWhoClicked().getInventory().getChestplate())) || newArmorType.equals(ArmorType.LEGGINGS) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getLeggings()) : !isAirOrNull(e.getWhoClicked().getInventory().getLeggings())) || newArmorType.equals(ArmorType.BOOTS) && (equipping ? isAirOrNull(e.getWhoClicked().getInventory().getBoots()) : !isAirOrNull(e.getWhoClicked().getInventory().getBoots()))) { + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), EquipMethod.SHIFT_CLICK, newArmorType, equipping ? null : e.getCurrentItem(), equipping ? e.getCurrentItem() : null); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + e.setCancelled(true); + } + } + } + } else { + ItemStack newArmorPiece = e.getCursor(); + ItemStack oldArmorPiece = e.getCurrentItem(); + if (numberkey) { + if (e.getClickedInventory().getType().equals(InventoryType.PLAYER)) {// Prevents shit in the 2by2 crafting + // e.getClickedInventory() == The players inventory + // e.getHotBarButton() == key people are pressing to equip or unequip the item to or from. + // e.getRawSlot() == The slot the item is going to. + // e.getSlot() == Armor slot, can't use e.getRawSlot() as that gives a hotbar slot ;-; + ItemStack hotbarItem = e.getClickedInventory().getItem(e.getHotbarButton()); + if (!isAirOrNull(hotbarItem)) {// Equipping + newArmorType = ArmorType.matchType(hotbarItem); + newArmorPiece = hotbarItem; + oldArmorPiece = e.getClickedInventory().getItem(e.getSlot()); + } else {// Unequipping + newArmorType = ArmorType.matchType(!isAirOrNull(e.getCurrentItem()) ? e.getCurrentItem() : e.getCursor()); + } + } + } else { + if (isAirOrNull(e.getCursor()) && !isAirOrNull(e.getCurrentItem())) {// unequip with no new item going into the slot. + newArmorType = ArmorType.matchType(e.getCurrentItem()); + } + // e.getCurrentItem() == Unequip + // e.getCursor() == Equip + // newArmorType = ArmorType.matchType(!isAirOrNull(e.getCurrentItem()) ? e.getCurrentItem() : e.getCursor()); + } + if (newArmorType != null && e.getRawSlot() == newArmorType.getSlot()) { + EquipMethod method = EquipMethod.PICK_DROP; + if (e.getAction().equals(InventoryAction.HOTBAR_SWAP) || numberkey) { + method = EquipMethod.HOTBAR_SWAP; + } + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), method, newArmorType, oldArmorPiece, newArmorPiece); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + e.setCancelled(true); + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void playerInteractEvent(PlayerInteractEvent e) { + if (e.useItemInHand().equals(Result.DENY)) { + return; + } + // + if (e.getAction() == Action.PHYSICAL) { + return; + } + if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) { + Player player = e.getPlayer(); + if (!e.useInteractedBlock().equals(Result.DENY)) { + if (e.getClickedBlock() != null && e.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()) {// Having both of these checks is useless, might as well do it though. + // Some blocks have actions when you right click them which stops the client from equipping the armor in hand. + if ((e.getClickedBlock().getState() != null) && e.getClickedBlock().getState() instanceof Container) { + return; + } + Material mat = e.getClickedBlock().getType(); + if (Tag.SIGNS.isTagged(mat) + || Tag.WALL_SIGNS.isTagged(mat) + || Tag.TRAPDOORS.isTagged(mat) + || Tag.DOORS.isTagged(mat) + || Tag.BUTTONS.isTagged(mat) + || Tag.FENCE_GATES.isTagged(mat) + || Tag.BEDS.isTagged(mat) + || Tag.FLOWER_POTS.isTagged(mat)) { + return; + } + for (String s : blockedMaterials) { + if (mat.name().equalsIgnoreCase(s)) { + return; + } + } + } + } + ArmorType newArmorType = ArmorType.matchType(e.getItem()); + if (newArmorType != null) { + if (newArmorType.equals(ArmorType.HELMET) && isAirOrNull(e.getPlayer().getInventory().getHelmet()) || newArmorType.equals(ArmorType.CHESTPLATE) && isAirOrNull(e.getPlayer().getInventory().getChestplate()) || newArmorType.equals(ArmorType.LEGGINGS) && isAirOrNull(e.getPlayer().getInventory().getLeggings()) || newArmorType.equals(ArmorType.BOOTS) && isAirOrNull(e.getPlayer().getInventory().getBoots())) { + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer(), EquipMethod.HOTBAR, ArmorType.matchType(e.getItem()), null, e.getItem()); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + e.setCancelled(true); + player.updateInventory(); + } + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void inventoryDrag(InventoryDragEvent event) { + // getType() seems to always be even. + // Old Cursor gives the item you are equipping + // Raw slot is the ArmorType slot + // Can't replace armor using this method making getCursor() useless. + ArmorType type = ArmorType.matchType(event.getOldCursor()); + if (event.getRawSlots().isEmpty()) { + return;// Idk if this will ever happen + } + if (type != null && type.getSlot() == event.getRawSlots().stream().findFirst().orElse(0)) { + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked(), EquipMethod.DRAG, type, null, event.getOldCursor()); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + event.setResult(Result.DENY); + event.setCancelled(true); + } + } + // Debug shit + /*System.out.println("Slots: " + event.getInventorySlots().toString()); System.out.println("Raw Slots: " + event.getRawSlots().toString()); if(event.getCursor() != null){ System.out.println("Cursor: " + event.getCursor().getType().name()); @@ -161,48 +198,50 @@ public void inventoryDrag(InventoryDragEvent event){ System.out.println("OldCursor: " + event.getOldCursor().getType().name()); } System.out.println("Type: " + event.getType().name());*/ - } + } - @EventHandler - public void itemBreakEvent(PlayerItemBreakEvent e){ - ArmorType type = ArmorType.matchType(e.getBrokenItem()); - if(type != null){ - Player p = e.getPlayer(); - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p, EquipMethod.BROKE, type, e.getBrokenItem(), null); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if(armorEquipEvent.isCancelled()){ - ItemStack i = e.getBrokenItem().clone(); - i.setAmount(1); - i.setDurability((short) (i.getDurability() - 1)); - if(type.equals(ArmorType.HELMET)){ - p.getInventory().setHelmet(i); - }else if(type.equals(ArmorType.CHESTPLATE)){ - p.getInventory().setChestplate(i); - }else if(type.equals(ArmorType.LEGGINGS)){ - p.getInventory().setLeggings(i); - }else if(type.equals(ArmorType.BOOTS)){ - p.getInventory().setBoots(i); - } - } - } - } + @EventHandler + public void itemBreakEvent(PlayerItemBreakEvent e) { + ArmorType type = ArmorType.matchType(e.getBrokenItem()); + if (type != null) { + Player p = e.getPlayer(); + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p, EquipMethod.BROKE, type, e.getBrokenItem(), null); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + ItemStack i = e.getBrokenItem().clone(); + i.setAmount(1); + i.setDurability((short) (i.getDurability() - 1)); + if (type.equals(ArmorType.HELMET)) { + p.getInventory().setHelmet(i); + } else if (type.equals(ArmorType.CHESTPLATE)) { + p.getInventory().setChestplate(i); + } else if (type.equals(ArmorType.LEGGINGS)) { + p.getInventory().setLeggings(i); + } else if (type.equals(ArmorType.BOOTS)) { + p.getInventory().setBoots(i); + } + } + } + } - @EventHandler - public void playerDeathEvent(PlayerDeathEvent e){ - Player p = e.getEntity(); - if(e.getKeepInventory()) return; - for(ItemStack i : p.getInventory().getArmorContents()){ - if(!isAirOrNull(i)){ - Bukkit.getServer().getPluginManager().callEvent(new ArmorEquipEvent(p, EquipMethod.DEATH, ArmorType.matchType(i), i, null)); - // No way to cancel a death event. - } - } - } + @EventHandler + public void playerDeathEvent(PlayerDeathEvent e) { + Player p = e.getEntity(); + if (e.getKeepInventory()) { + return; + } + for (ItemStack i : p.getInventory().getArmorContents()) { + if (!isAirOrNull(i)) { + Bukkit.getServer().getPluginManager().callEvent(new ArmorEquipEvent(p, EquipMethod.DEATH, ArmorType.matchType(i), i, null)); + // No way to cancel a death event. + } + } + } - /** - * A utility method to support versions that use null or air ItemStacks. - */ - public static boolean isAirOrNull(ItemStack item){ - return item == null || item.getType().equals(Material.AIR); - } + /** + * A utility method to support versions that use null or air ItemStacks. + */ + public static boolean isAirOrNull(ItemStack item) { + return item == null || item.getType().equals(Material.AIR); + } } diff --git a/src/resources/config.yml b/src/resources/config.yml index ea37a56..6922610 100644 --- a/src/resources/config.yml +++ b/src/resources/config.yml @@ -1,88 +1,22 @@ # All blocks with an inventory or any blocks that when right clicked shouldn't equip armor. blocked: - - FURNACE - - CHEST - - TRAPPED_CHEST - BEACON - - DISPENSER - - DROPPER - - HOPPER - - WORKBENCH + - CRAFTING_TABLE - ENCHANTMENT_TABLE - ENDER_CHEST - - ANVIL - - BED_BLOCK - - FENCE_GATE - - SPRUCE_FENCE_GATE - - BIRCH_FENCE_GATE - - ACACIA_FENCE_GATE - - JUNGLE_FENCE_GATE - - DARK_OAK_FENCE_GATE - - IRON_DOOR_BLOCK - - WOODEN_DOOR - - SPRUCE_DOOR - - BIRCH_DOOR - - JUNGLE_DOOR - - ACACIA_DOOR - - DARK_OAK_DOOR - - WOOD_BUTTON - - STONE_BUTTON - - TRAP_DOOR - - IRON_TRAPDOOR - DIODE_BLOCK_OFF - DIODE_BLOCK_ON - REDSTONE_COMPARATOR_OFF - REDSTONE_COMPARATOR_ON - - FENCE - - SPRUCE_FENCE - - BIRCH_FENCE - - JUNGLE_FENCE - - DARK_OAK_FENCE - - ACACIA_FENCE - - NETHER_FENCE - - BREWING_STAND - - CAULDRON - - LEGACY_SIGN_POST - - LEGACY_WALL_SIGN - - LEGACY_SIGN - - ACACIA_SIGN - - ACACIA_WALL_SIGN - - BIRCH_SIGN - - BIRCH_WALL_SIGN - - DARK_OAK_SIGN - - DARK_OAK_WALL_SIGN - - JUNGLE_SIGN - - JUNGLE_WALL_SIGN - - OAK_SIGN - - OAK_WALL_SIGN - - SPRUCE_SIGN - - SPRUCE_WALL_SIGN - LEVER - - BLACK_SHULKER_BOX - - BLUE_SHULKER_BOX - - BROWN_SHULKER_BOX - - CYAN_SHULKER_BOX - - GRAY_SHULKER_BOX - - GREEN_SHULKER_BOX - - LIGHT_BLUE_SHULKER_BOX - - LIME_SHULKER_BOX - - MAGENTA_SHULKER_BOX - - ORANGE_SHULKER_BOX - - PINK_SHULKER_BOX - - PURPLE_SHULKER_BOX - - RED_SHULKER_BOX - - SILVER_SHULKER_BOX - - WHITE_SHULKER_BOX - - YELLOW_SHULKER_BOX - DAYLIGHT_DETECTOR_INVERTED - DAYLIGHT_DETECTOR - - BARREL - - BLAST_FURNACE - - SMOKER - CARTOGRAPHY_TABLE - - COMPOSTER + - ANVIL + - CHIPPED_ANVIL + - DAMAGED_ANVIL - GRINDSTONE - - LECTERN - LOOM - STONECUTTER - BELL + - SMITHING_TABLE diff --git a/src/resources/plugin.yml b/src/resources/plugin.yml index f0f3056..fb7e64a 100644 --- a/src/resources/plugin.yml +++ b/src/resources/plugin.yml @@ -2,4 +2,4 @@ name: ArmorEquipEvent main: com.codingforcookies.armorequip.Main version: 1.7.6-SNAPSHOT author: CodingForCookies -api-version: "1.14" \ No newline at end of file +api-version: "1.16" \ No newline at end of file