From faa9afc2a2613dd7f7b424fa43e221e658b89730 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 20 Dec 2020 13:19:24 +0000 Subject: [PATCH] Optimised FastGetEnchants for enchantment-specific level getting --- .../nms/api/FastGetEnchantsWrapper.java | 1 + .../nms/v1_15_R1/FastGetEnchants.java | 16 ++++++++++++++++ .../nms/v1_16_R1/FastGetEnchants.java | 16 ++++++++++++++++ .../nms/v1_16_R2/FastGetEnchants.java | 16 ++++++++++++++++ .../nms/v1_16_R3/FastGetEnchants.java | 16 ++++++++++++++++ .../enchantments/util/EnchantChecks.java | 4 +--- .../willfp/ecoenchants/nms/FastGetEnchants.java | 12 +++++++++++- 7 files changed, 77 insertions(+), 4 deletions(-) diff --git a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/api/FastGetEnchantsWrapper.java b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/api/FastGetEnchantsWrapper.java index 010c197e..bdea7273 100644 --- a/NMS/API/src/main/java/com/willfp/ecoenchants/nms/api/FastGetEnchantsWrapper.java +++ b/NMS/API/src/main/java/com/willfp/ecoenchants/nms/api/FastGetEnchantsWrapper.java @@ -7,4 +7,5 @@ import java.util.Map; public interface FastGetEnchantsWrapper { Map getEnchantmentsOnItem(ItemStack itemStack); + int getLevelOnItem(ItemStack itemStack, Enchantment enchantment); } diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/nms/v1_15_R1/FastGetEnchants.java b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/nms/v1_15_R1/FastGetEnchants.java index 050b1f9f..2f275e99 100644 --- a/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/nms/v1_15_R1/FastGetEnchants.java +++ b/NMS/v1_15_R1/src/main/java/com/willfp/ecoenchants/nms/v1_15_R1/FastGetEnchants.java @@ -29,4 +29,20 @@ public class FastGetEnchants implements FastGetEnchantsWrapper { } return foundEnchantments; } + + @Override + public int getLevelOnItem(ItemStack itemStack, Enchantment enchantment) { + net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = nmsStack.getEnchantments(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + if(!key.equals(enchantment.getKey().toString())) + continue; + + return '\uffff' & compound.getShort("lvl"); + } + return 0; + } } diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/nms/v1_16_R1/FastGetEnchants.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/nms/v1_16_R1/FastGetEnchants.java index fb76e150..6877a40d 100644 --- a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/nms/v1_16_R1/FastGetEnchants.java +++ b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/nms/v1_16_R1/FastGetEnchants.java @@ -29,4 +29,20 @@ public class FastGetEnchants implements FastGetEnchantsWrapper { } return foundEnchantments; } + + @Override + public int getLevelOnItem(ItemStack itemStack, Enchantment enchantment) { + net.minecraft.server.v1_16_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = nmsStack.getEnchantments(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + if(!key.equals(enchantment.getKey().toString())) + continue; + + return '\uffff' & compound.getShort("lvl"); + } + return 0; + } } diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/nms/v1_16_R2/FastGetEnchants.java b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/nms/v1_16_R2/FastGetEnchants.java index ed5412f3..ed725a6d 100644 --- a/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/nms/v1_16_R2/FastGetEnchants.java +++ b/NMS/v1_16_R2/src/main/java/com/willfp/ecoenchants/nms/v1_16_R2/FastGetEnchants.java @@ -29,4 +29,20 @@ public class FastGetEnchants implements FastGetEnchantsWrapper { } return foundEnchantments; } + + @Override + public int getLevelOnItem(ItemStack itemStack, Enchantment enchantment) { + net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = nmsStack.getEnchantments(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + if(!key.equals(enchantment.getKey().toString())) + continue; + + return '\uffff' & compound.getShort("lvl"); + } + return 0; + } } diff --git a/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/nms/v1_16_R3/FastGetEnchants.java b/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/nms/v1_16_R3/FastGetEnchants.java index 5c465d34..74f5e374 100644 --- a/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/nms/v1_16_R3/FastGetEnchants.java +++ b/NMS/v1_16_R3/src/main/java/com/willfp/ecoenchants/nms/v1_16_R3/FastGetEnchants.java @@ -29,4 +29,20 @@ public class FastGetEnchants implements FastGetEnchantsWrapper { } return foundEnchantments; } + + @Override + public int getLevelOnItem(ItemStack itemStack, Enchantment enchantment) { + net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = nmsStack.getEnchantments(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + if(!key.equals(enchantment.getKey().toString())) + continue; + + return '\uffff' & compound.getShort("lvl"); + } + return 0; + } } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/util/EnchantChecks.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/util/EnchantChecks.java index de2880bb..83d0ad6f 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/util/EnchantChecks.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/util/EnchantChecks.java @@ -47,9 +47,7 @@ public class EnchantChecks { if (item == null) return 0; if (item.getType().equals(Material.AIR)) return 0; - Integer level = FastGetEnchants.getEnchantsOnItem(item).get(enchantment); - - return level == null ? 0 : level; + return FastGetEnchants.getLevelOnItem(item, enchantment); } /** diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/nms/FastGetEnchants.java b/Plugin/src/main/java/com/willfp/ecoenchants/nms/FastGetEnchants.java index 6df983b3..16936a0d 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/nms/FastGetEnchants.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/nms/FastGetEnchants.java @@ -19,13 +19,23 @@ public class FastGetEnchants { * Efficiently get enchantments on an item without instantiating ItemMeta * * @param item The item to query - * * @return A map of all enchantments, where the integer is the level */ public static Map getEnchantsOnItem(ItemStack item) { return fastGetEnchantsWrapper.getEnchantmentsOnItem(item); } + /** + * Efficiently get level of enchantment on an item without using getByKey or instantiating keys or ItemMeta + * + * @param item The item to query + * @param enchantment The enchantment to query + * @return The level found, or 0 if not found + */ + public static int getLevelOnItem(ItemStack item, Enchantment enchantment) { + return fastGetEnchantsWrapper.getLevelOnItem(item, enchantment); + } + static { try { final Class class2 = Class.forName("com.willfp.ecoenchants.nms." + EcoEnchantsPlugin.NMS_VERSION + ".FastGetEnchants");