From c851e35347d17e87818c7cedecbb89590e349ffe Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 29 Aug 2021 16:32:42 +0100 Subject: [PATCH] Added ItemFlags to FastItemStack --- .../willfp/eco/core/fast/FastItemStack.java | 36 ++++++++++++++- .../eco/internal/fast/EcoFastItemStack.kt | 5 +++ .../proxy/v1_16_R3/fast/NMSFastItemStack.kt | 44 +++++++++++++++++++ .../proxy/v1_17_R1/fast/NMSFastItemStack.kt | 44 +++++++++++++++++++ 4 files changed, 127 insertions(+), 2 deletions(-) diff --git a/eco-api/src/main/java/com/willfp/eco/core/fast/FastItemStack.java b/eco-api/src/main/java/com/willfp/eco/core/fast/FastItemStack.java index 5883b07b..905dd780 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/fast/FastItemStack.java +++ b/eco-api/src/main/java/com/willfp/eco/core/fast/FastItemStack.java @@ -3,6 +3,7 @@ package com.willfp.eco.core.fast; import com.willfp.eco.core.Eco; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; /** * FastItemStack contains methods to modify and read items faster than in default bukkit. @@ -51,17 +53,47 @@ public interface FastItemStack { /** * Set the rework penalty. * - * @param cost The rework penalty to set. + * @param cost The rework penalty to set. */ void setRepairCost(int cost); /** * Get the rework penalty. - *. + * . + * * @return The rework penalty found on the item. */ int getRepairCost(); + /** + * Add ItemFlags. + * + * @param hideFlags The flags. + */ + void addItemFlags(ItemFlag... hideFlags); + + /** + * Remove ItemFlags. + * + * @param hideFlags The flags. + */ + void removeItemFlags(ItemFlag... hideFlags); + + /** + * Get the ItemFlags. + * + * @return The flags. + */ + Set getItemFlags(); + + /** + * Test the item for a flag. + * + * @param flag The flag. + * @return If the flag is present. + */ + boolean hasItemFlag(ItemFlag flag); + /** * Get the Bukkit ItemStack again. * diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt index 54f396ca..174c25c6 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt @@ -1,6 +1,7 @@ package com.willfp.eco.internal.fast import com.willfp.eco.core.fast.FastItemStack +import org.bukkit.inventory.ItemFlag import org.bukkit.inventory.ItemStack abstract class EcoFastItemStack( @@ -10,4 +11,8 @@ abstract class EcoFastItemStack( override fun unwrap(): ItemStack { return bukkit } + + fun getBitModifier(hideFlag: ItemFlag): Int { + return 1 shl hideFlag.ordinal + } } \ No newline at end of file diff --git a/eco-core/core-nms/v1_16_R3/src/main/kotlin/com/willfp/eco/proxy/v1_16_R3/fast/NMSFastItemStack.kt b/eco-core/core-nms/v1_16_R3/src/main/kotlin/com/willfp/eco/proxy/v1_16_R3/fast/NMSFastItemStack.kt index 8780f22a..ab2e2442 100644 --- a/eco-core/core-nms/v1_16_R3/src/main/kotlin/com/willfp/eco/proxy/v1_16_R3/fast/NMSFastItemStack.kt +++ b/eco-core/core-nms/v1_16_R3/src/main/kotlin/com/willfp/eco/proxy/v1_16_R3/fast/NMSFastItemStack.kt @@ -8,6 +8,7 @@ import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_16_R3.util.CraftNamespacedKey import org.bukkit.enchantments.Enchantment +import org.bukkit.inventory.ItemFlag import java.lang.reflect.Field import kotlin.experimental.and @@ -96,6 +97,49 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS } } + override fun addItemFlags(vararg hideFlags: ItemFlag) { + for (flag in hideFlags) { + this.flagBits = this.flagBits or getBitModifier(flag) + } + } + + override fun removeItemFlags(vararg hideFlags: ItemFlag) { + for (flag in hideFlags) { + this.flagBits = this.flagBits and getBitModifier(flag) + } + } + + override fun getItemFlags(): MutableSet { + val flags = mutableSetOf() + + var flagArr: Array + val size = ItemFlag.values().also { flagArr = it }.size + + for (i in 0 until size) { + val flag = flagArr[i] + if (this.hasItemFlag(flag)) { + flags.add(flag) + } + } + + return flags + } + + override fun hasItemFlag(flag: ItemFlag): Boolean { + val bitModifier = getBitModifier(flag) + return this.flagBits and bitModifier == bitModifier + } + + private var flagBits: Int + get() = + if (handle.hasTag() && handle.tag!!.hasKeyOfType( + "HideFlags", + 99 + ) + ) handle.tag!!.getInt("HideFlags") else 0 + set(value) = + handle.orCreateTag.setInt("HideFlags", value) + override fun getRepairCost(): Int { return handle.repairCost; } diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/proxy/v1_17_R1/fast/NMSFastItemStack.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/proxy/v1_17_R1/fast/NMSFastItemStack.kt index 03336e01..03c93e8d 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/proxy/v1_17_R1/fast/NMSFastItemStack.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/proxy/v1_17_R1/fast/NMSFastItemStack.kt @@ -13,6 +13,7 @@ import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey import org.bukkit.enchantments.Enchantment +import org.bukkit.inventory.ItemFlag import kotlin.experimental.and class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack( @@ -115,6 +116,49 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS } } + override fun addItemFlags(vararg hideFlags: ItemFlag) { + for (flag in hideFlags) { + this.flagBits = this.flagBits or getBitModifier(flag) + } + } + + override fun removeItemFlags(vararg hideFlags: ItemFlag) { + for (flag in hideFlags) { + this.flagBits = this.flagBits and getBitModifier(flag) + } + } + + override fun getItemFlags(): MutableSet { + val flags = mutableSetOf() + + var flagArr: Array + val size = ItemFlag.values().also { flagArr = it }.size + + for (i in 0 until size) { + val flag = flagArr[i] + if (this.hasItemFlag(flag)) { + flags.add(flag) + } + } + + return flags + } + + override fun hasItemFlag(flag: ItemFlag): Boolean { + val bitModifier = getBitModifier(flag) + return this.flagBits and bitModifier == bitModifier + } + + private var flagBits: Int + get() = + if (handle.hasTag() && handle.tag!!.contains( + "HideFlags", + 99 + ) + ) handle.tag!!.getInt("HideFlags") else 0 + set(value) = + handle.orCreateTag.putInt("HideFlags", value) + override fun getRepairCost(): Int { return handle.baseRepairCost; }