diff --git a/Changelog.txt b/Changelog.txt index 0ea128fcb..165b075c9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,7 +1,6 @@ Version 2.1.174 Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) Updated hu_HU locale (thanks andris155) - Version 2.1.173 The experience orbs dropped by Knock on Wood rank 2 during Tree Feller are now much less frequent but provide more XP mcMMO no longer damages fishing rods or drains a player's hunger when fishing diff --git a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java index 3a5a64f2b..7a0a0e72a 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java +++ b/src/main/java/com/gmail/nossr50/util/compat/CompatibilityManager.java @@ -14,6 +14,7 @@ import com.gmail.nossr50.util.nms.NMSVersion; import com.gmail.nossr50.util.platform.MinecraftGameVersion; import com.gmail.nossr50.util.text.StringUtils; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashMap; @@ -102,7 +103,6 @@ public class CompatibilityManager { private void initPersistentDataLayer() { if(minecraftGameVersion.getMinorVersion().asInt() >= 14 || minecraftGameVersion.getMajorVersion().asInt() >= 2) { - persistentDataLayer = new SpigotPersistentDataLayer_1_14(); } else { @@ -138,11 +138,11 @@ public class CompatibilityManager { return isFullyCompatibleServerSoftware; } - public NMSVersion getNmsVersion() { + public @NotNull NMSVersion getNmsVersion() { return nmsVersion; } - private NMSVersion determineNMSVersion() { + private @NotNull NMSVersion determineNMSVersion() { if (minecraftGameVersion.getMajorVersion().asInt() == 1) { switch (minecraftGameVersion.getMinorVersion().asInt()) { case 12: @@ -160,8 +160,10 @@ public class CompatibilityManager { return NMSVersion.NMS_1_16_2; } else if(minecraftGameVersion.getPatchVersion().asInt() == 3) { return NMSVersion.NMS_1_16_3; - } else if(minecraftGameVersion.getPatchVersion().asInt() >= 4) { + } else if(minecraftGameVersion.getPatchVersion().asInt() == 4) { return NMSVersion.NMS_1_16_4; + } else if(minecraftGameVersion.getPatchVersion().asInt() >= 5) { + return NMSVersion.NMS_1_16_5; } } } diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java index 909f290b6..6cdb19037 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/DummyPlayerAttackCooldownToolLayer.java @@ -1,42 +1,42 @@ -package com.gmail.nossr50.util.compat.layers.attackcooldown; - -import com.gmail.nossr50.util.nms.NMSVersion; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.InvocationTargetException; - -public class DummyPlayerAttackCooldownToolLayer extends PlayerAttackCooldownToolLayer { - public DummyPlayerAttackCooldownToolLayer() { - super(NMSVersion.UNSUPPORTED); - } - - @Override - public boolean initializeLayer() { - return noErrorsOnInitialize; - } - - @Override - public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - return 1.0F; //Always full strength - } - - @Override - public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - return 0F; - } - - @Override - public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - //Do nothing - } - - @Override - public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - return 0; - } - - @Override - public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { - } -} +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//import com.gmail.nossr50.util.nms.NMSVersion; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +// +//import java.lang.reflect.InvocationTargetException; +// +//public class DummyPlayerAttackCooldownToolLayer extends PlayerAttackCooldownToolLayer { +// public DummyPlayerAttackCooldownToolLayer() { +// super(NMSVersion.UNSUPPORTED); +// } +// +// @Override +// public boolean initializeLayer() { +// return noErrorsOnInitialize; +// } +// +// @Override +// public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 1.0F; //Always full strength +// } +// +// @Override +// public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 0F; +// } +// +// @Override +// public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// //Do nothing +// } +// +// @Override +// public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// return 0; +// } +// +// @Override +// public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { +// } +//} diff --git a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java index 539c1a0c4..5b0026198 100644 --- a/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java +++ b/src/main/java/com/gmail/nossr50/util/compat/layers/attackcooldown/PlayerAttackCooldownToolLayer.java @@ -1,237 +1,238 @@ -package com.gmail.nossr50.util.compat.layers.attackcooldown; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.util.compat.layers.AbstractNMSCompatibilityLayer; -import com.gmail.nossr50.util.nms.NMSConstants; -import com.gmail.nossr50.util.nms.NMSVersion; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * - * These classes are a band-aid solution for adding NMS support into 2.1.XXX - * In 2.2 we are switching to modules and that will clean things up significantly - * - */ -public class PlayerAttackCooldownToolLayer extends AbstractNMSCompatibilityLayer implements PlayerAttackCooldownMethods { - - private final String cbNMSVersionPath; - - protected Class craftPlayerClass; - protected Class entityHumanClass; - protected Class entityLivingClass; - - protected Method playerAttackCooldownMethod; - protected Method playerAttackStrengthMethod; - protected Method resetPlayerAttackCooldownMethod; - protected Method setPlayerAttackStrengthMethod; - protected Method getHandleMethod; - protected Field attackCooldownField; - protected String attackStrengthFieldName; - - public PlayerAttackCooldownToolLayer(@NotNull NMSVersion nmsVersion) { - super(nmsVersion); - mcMMO.p.getLogger().info("Loading Compatibility Layer... (Player Attack Cooldown Exploit Prevention)"); - if(!isCompatibleWithMinecraftVersion(nmsVersion)) { - mcMMO.p.getLogger().severe("this version of mcMMO does not support NMS for this version of Minecraft, try updating mcMMO or updating Minecraft. Not all versions of Minecraft will have NMS support built into mcMMO."); - cbNMSVersionPath = ""; - } else { - if(NMSConstants.getCraftBukkitVersionPath(nmsVersion) != null) { - cbNMSVersionPath = NMSConstants.getCraftBukkitVersionPath(nmsVersion); - noErrorsOnInitialize = initializeLayer(); - - if(noErrorsOnInitialize) { - mcMMO.p.getLogger().info("Successfully Loaded Compatibility Layer! (Player Attack Cooldown Exploit Prevention)"); - } - } else { - mcMMO.p.getLogger().info("Failed to load - CL (Player Attack Cooldown Exploit Prevention) Could not find CB NMS path for CL"); - flagErrorsDuringStartup(); - mcMMO.p.getLogger().warning("Could not wire NMS package path for CraftBukkit!"); - cbNMSVersionPath = ""; - } - } - } - - public static boolean isCompatibleWithMinecraftVersion(@NotNull NMSVersion nmsVersion) { - switch(nmsVersion) { - case NMS_1_13_2: - case NMS_1_14_4: - case NMS_1_15_2: - case NMS_1_16_4: - return true; - default: - return false; - } - } - - /** - * Cache all reflection methods/types/classes needed for the NMS of this CompatibilityLayer - * @param cooldownMethodName the cooldown method name - * @param attackStrengthMethodName the attack strength method name - * @param resetAttackCooldownMethodName the reset attack cooldown method name - * @param getHandleMethodName the get handle method name - * @return true if NMS was successfully wired - */ - public boolean wireNMS(@NotNull String cooldownMethodName, @NotNull String attackStrengthMethodName, @NotNull String resetAttackCooldownMethodName, @NotNull String getHandleMethodName, @NotNull String attackStrengthFieldName) { - entityHumanClass = initEntityHumanClass(); - - if (entityHumanClass != null) { - entityLivingClass = entityHumanClass.getSuperclass(); - } - - craftPlayerClass = initCraftPlayerClass(); - this.attackStrengthFieldName = attackStrengthFieldName; - - try { - this.attackCooldownField = entityLivingClass.getDeclaredField(attackStrengthFieldName); - this.attackCooldownField.setAccessible(true); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - - try { - this.playerAttackCooldownMethod = entityHumanClass.getMethod(cooldownMethodName); - this.playerAttackStrengthMethod = entityHumanClass.getMethod(attackStrengthMethodName, float.class); - this.resetPlayerAttackCooldownMethod = entityHumanClass.getMethod(resetAttackCooldownMethodName); - - if (craftPlayerClass != null) { - this.getHandleMethod = craftPlayerClass.getMethod(getHandleMethodName); - } else { - return false; - } - return true; - } catch (NoSuchMethodException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return false; - } - } - - /** - * Get the cached player attack cooldown method - * @return the cached player attack cooldown method - */ - private @Nullable Method getPlayerAttackCooldownMethod() { - return playerAttackCooldownMethod; - } - - /** - * Get the cached player attack strength method - * @return the cached player attack strength method - */ - private @Nullable Method getPlayerAttackStrengthMethod() { - return playerAttackStrengthMethod; - } - - /** - * Get the cached player attack cooldown reset method - * @return the cached player attack cooldown reset method - */ - private @Nullable Method getResetPlayerAttackCooldownMethod() { - return resetPlayerAttackCooldownMethod; - } - - /** - * Grab the CraftPlayer class type from NMS - * @return the CraftPlayer class type from NMS - */ - private @Nullable Class initCraftPlayerClass() { - try { - return Class.forName(NMSConstants.getCraftPlayerClassPath(cbNMSVersionPath)); - } catch (ClassNotFoundException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return null; - } - } - - /** - * Grab the EntityHuman class type from NMS - * @return the EntityHuman class type from NMS - */ - private @Nullable Class initEntityHumanClass() { - try { - return Class.forName(NMSConstants.getEntityHumanClassPath(cbNMSVersionPath)); - } catch (ClassNotFoundException e) { - flagErrorsDuringStartup(); - e.printStackTrace(); - return null; - } - } - - private void flagErrorsDuringStartup() { - noErrorsOnInitialize = false; - } - - /** - * Grabs the attack strength for a player - * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening - * @param player target player - * @return the float value of the player's attack strength - */ - @Override - public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - return (float) playerAttackStrengthMethod.invoke(entityHuman, 0F); //Add no adjustment ticks - } - - @Override - public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - return (float) playerAttackCooldownMethod.invoke(entityHuman); //Add no adjustment ticks - } - - @Override - public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - Object entityLiving = entityLivingClass.cast(entityHuman); - - resetPlayerAttackCooldownMethod.invoke(entityLiving); - } - - @Override - public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - Object entityLiving = entityLivingClass.cast(entityHuman); - - return attackCooldownField.getInt(entityLiving); - } - - @Override - public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { - Object craftPlayer = craftPlayerClass.cast(player); - Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); - - attackCooldownField.setInt(entityHuman, fieldValue); - } - - @Override - public boolean initializeLayer() { - switch(nmsVersion) { - case NMS_1_12_2: - return wireNMS("dr", "n", "ds", "getHandle", "at"); - case NMS_1_13_2: - return wireNMS("dG", "r", "dH", "getHandle", "at"); - case NMS_1_14_4: - return wireNMS("dY", "s", "dZ", "getHandle", "at"); - case NMS_1_15_2: - return wireNMS("ex", "s", "ey", "getHandle", "at"); - case NMS_1_16_4: - return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle", "at"); - default: - throw new RuntimeException("Unexpected NMS version support in PlayerAttackCooldown compatibility layer initialization!"); - } - } -} - +//package com.gmail.nossr50.util.compat.layers.attackcooldown; +// +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.util.compat.layers.AbstractNMSCompatibilityLayer; +//import com.gmail.nossr50.util.nms.NMSConstants; +//import com.gmail.nossr50.util.nms.NMSVersion; +//import org.bukkit.entity.Player; +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +// +//import java.lang.reflect.Field; +//import java.lang.reflect.InvocationTargetException; +//import java.lang.reflect.Method; +// +///** +// * +// * These classes are a band-aid solution for adding NMS support into 2.1.XXX +// * In 2.2 we are switching to modules and that will clean things up significantly +// * +// */ +//public class PlayerAttackCooldownToolLayer extends AbstractNMSCompatibilityLayer implements PlayerAttackCooldownMethods { +// +// private final String cbNMSVersionPath; +// +// protected Class craftPlayerClass; +// protected Class entityHumanClass; +// protected Class entityLivingClass; +// +// protected Method playerAttackCooldownMethod; +// protected Method playerAttackStrengthMethod; +// protected Method resetPlayerAttackCooldownMethod; +// protected Method setPlayerAttackStrengthMethod; +// protected Method getHandleMethod; +// protected Field attackCooldownField; +// protected String attackStrengthFieldName; +// +// public PlayerAttackCooldownToolLayer(@NotNull NMSVersion nmsVersion) { +// super(nmsVersion); +// mcMMO.p.getLogger().info("Loading Compatibility Layer... (Player Attack Cooldown Exploit Prevention)"); +// if(!isCompatibleWithMinecraftVersion(nmsVersion)) { +// mcMMO.p.getLogger().severe("this version of mcMMO does not support NMS for this version of Minecraft, try updating mcMMO or updating Minecraft. Not all versions of Minecraft will have NMS support built into mcMMO."); +// cbNMSVersionPath = ""; +// } else { +// if(NMSConstants.getCraftBukkitVersionPath(nmsVersion) != null) { +// cbNMSVersionPath = NMSConstants.getCraftBukkitVersionPath(nmsVersion); +// noErrorsOnInitialize = initializeLayer(); +// +// if(noErrorsOnInitialize) { +// mcMMO.p.getLogger().info("Successfully Loaded Compatibility Layer! (Player Attack Cooldown Exploit Prevention)"); +// } +// } else { +// mcMMO.p.getLogger().info("Failed to load - CL (Player Attack Cooldown Exploit Prevention) Could not find CB NMS path for CL"); +// flagErrorsDuringStartup(); +// mcMMO.p.getLogger().warning("Could not wire NMS package path for CraftBukkit!"); +// cbNMSVersionPath = ""; +// } +// } +// } +// +// public static boolean isCompatibleWithMinecraftVersion(@NotNull NMSVersion nmsVersion) { +// switch(nmsVersion) { +// case NMS_1_13_2: +// case NMS_1_14_4: +// case NMS_1_15_2: +// case NMS_1_16_4: +// case NMS_1_16_5: +// return true; +// default: +// return false; +// } +// } +// +// /** +// * Cache all reflection methods/types/classes needed for the NMS of this CompatibilityLayer +// * @param cooldownMethodName the cooldown method name +// * @param attackStrengthMethodName the attack strength method name +// * @param resetAttackCooldownMethodName the reset attack cooldown method name +// * @param getHandleMethodName the get handle method name +// * @return true if NMS was successfully wired +// */ +// public boolean wireNMS(@NotNull String cooldownMethodName, @NotNull String attackStrengthMethodName, @NotNull String resetAttackCooldownMethodName, @NotNull String getHandleMethodName, @NotNull String attackStrengthFieldName) { +// entityHumanClass = initEntityHumanClass(); +// +// if (entityHumanClass != null) { +// entityLivingClass = entityHumanClass.getSuperclass(); +// } +// +// craftPlayerClass = initCraftPlayerClass(); +// this.attackStrengthFieldName = attackStrengthFieldName; +// +// try { +// this.attackCooldownField = entityLivingClass.getDeclaredField(attackStrengthFieldName); +// this.attackCooldownField.setAccessible(true); +// } catch (NoSuchFieldException e) { +// e.printStackTrace(); +// } +// +// try { +// this.playerAttackCooldownMethod = entityHumanClass.getMethod(cooldownMethodName); +// this.playerAttackStrengthMethod = entityHumanClass.getMethod(attackStrengthMethodName, float.class); +// this.resetPlayerAttackCooldownMethod = entityHumanClass.getMethod(resetAttackCooldownMethodName); +// +// if (craftPlayerClass != null) { +// this.getHandleMethod = craftPlayerClass.getMethod(getHandleMethodName); +// } else { +// return false; +// } +// return true; +// } catch (NoSuchMethodException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return false; +// } +// } +// +// /** +// * Get the cached player attack cooldown method +// * @return the cached player attack cooldown method +// */ +// private @Nullable Method getPlayerAttackCooldownMethod() { +// return playerAttackCooldownMethod; +// } +// +// /** +// * Get the cached player attack strength method +// * @return the cached player attack strength method +// */ +// private @Nullable Method getPlayerAttackStrengthMethod() { +// return playerAttackStrengthMethod; +// } +// +// /** +// * Get the cached player attack cooldown reset method +// * @return the cached player attack cooldown reset method +// */ +// private @Nullable Method getResetPlayerAttackCooldownMethod() { +// return resetPlayerAttackCooldownMethod; +// } +// +// /** +// * Grab the CraftPlayer class type from NMS +// * @return the CraftPlayer class type from NMS +// */ +// private @Nullable Class initCraftPlayerClass() { +// try { +// return Class.forName(NMSConstants.getCraftPlayerClassPath(cbNMSVersionPath)); +// } catch (ClassNotFoundException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return null; +// } +// } +// +// /** +// * Grab the EntityHuman class type from NMS +// * @return the EntityHuman class type from NMS +// */ +// private @Nullable Class initEntityHumanClass() { +// try { +// return Class.forName(NMSConstants.getEntityHumanClassPath(cbNMSVersionPath)); +// } catch (ClassNotFoundException e) { +// flagErrorsDuringStartup(); +// e.printStackTrace(); +// return null; +// } +// } +// +// private void flagErrorsDuringStartup() { +// noErrorsOnInitialize = false; +// } +// +// /** +// * Grabs the attack strength for a player +// * Should be noted that as of today there is no way to capture a players current attack strength in spigot when they attack an entity outside of network packet listening +// * @param player target player +// * @return the float value of the player's attack strength +// */ +// @Override +// public float getAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// return (float) playerAttackStrengthMethod.invoke(entityHuman, 0F); //Add no adjustment ticks +// } +// +// @Override +// public float getCooldownValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// return (float) playerAttackCooldownMethod.invoke(entityHuman); //Add no adjustment ticks +// } +// +// @Override +// public void resetAttackStrength(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// Object entityLiving = entityLivingClass.cast(entityHuman); +// +// resetPlayerAttackCooldownMethod.invoke(entityLiving); +// } +// +// @Override +// public int getCooldownFieldValue(@NotNull Player player) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// Object entityLiving = entityLivingClass.cast(entityHuman); +// +// return attackCooldownField.getInt(entityLiving); +// } +// +// @Override +// public void setCooldownFieldValue(@NotNull Player player, int fieldValue) throws InvocationTargetException, IllegalAccessException { +// Object craftPlayer = craftPlayerClass.cast(player); +// Object entityHuman = entityHumanClass.cast(getHandleMethod.invoke(craftPlayer)); +// +// attackCooldownField.setInt(entityHuman, fieldValue); +// } +// +// @Override +// public boolean initializeLayer() { +// switch(nmsVersion) { +// case NMS_1_12_2: +// return wireNMS("dr", "n", "ds", "getHandle", "at"); +// case NMS_1_13_2: +// return wireNMS("dG", "r", "dH", "getHandle", "at"); +// case NMS_1_14_4: +// return wireNMS("dY", "s", "dZ", "getHandle", "at"); +// case NMS_1_15_2: +// return wireNMS("ex", "s", "ey", "getHandle", "at"); +// case NMS_1_16_4: +// return wireNMS("eR", "getAttackCooldown", "resetAttackCooldown", "getHandle", "at"); +// default: +// throw new RuntimeException("Unexpected NMS version support in PlayerAttackCooldown compatibility layer initialization!"); +// } +// } +//} +// diff --git a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java index 2f2597a0b..4b2ce5c57 100644 --- a/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java +++ b/src/main/java/com/gmail/nossr50/util/nms/NMSVersion.java @@ -21,6 +21,7 @@ public enum NMSVersion { NMS_1_16_2("1.16.2"), NMS_1_16_3("1.16.3"), NMS_1_16_4("1.16.4"), + NMS_1_16_5("1.16.5"), //Version not known to this build of mcMMO UNSUPPORTED("unsupported");