From dbd5cd341e97537992b5433ccdfb85edb52c14d6 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Wed, 2 Mar 2022 12:42:41 +0000 Subject: [PATCH] Moved FastItemStack into commons --- .../eco/internal/fast/EcoFastItemStack.kt | 18 -- .../spigot/proxy/common/NMSCommons.kt | 6 +- .../common/ai/entity/TemptGoalFactory.kt | 2 +- .../common/ai/entity/UseItemGoalFactory.kt | 2 +- .../proxy/common/fast/EcoFastItemStack.kt} | 33 +-- .../proxy/v1_17_R1/CommonsInitializer.kt | 23 ++- .../proxy/v1_17_R1/FastItemStackFactory.kt | 4 +- .../proxy/v1_17_R1/fast/FastItemStackUtils.kt | 17 -- .../proxy/v1_18_R1/CommonsInitializer.kt | 23 ++- .../proxy/v1_18_R1/fast/FastItemStackUtils.kt | 17 -- .../proxy/v1_18_R1/fast/NMSFastItemStack.kt | 188 ------------------ .../proxy/v1_18_R2/CommonsInitializer.kt | 23 ++- .../proxy/v1_18_R2/fast/FastItemStackUtils.kt | 17 -- .../proxy/v1_18_R2/fast/NMSFastItemStack.kt | 188 ------------------ 14 files changed, 91 insertions(+), 470 deletions(-) delete mode 100644 eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt rename eco-core/core-nms/{v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/NMSFastItemStack.kt => nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/fast/EcoFastItemStack.kt} (86%) delete mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/FastItemStackUtils.kt delete mode 100644 eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/FastItemStackUtils.kt delete mode 100644 eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/NMSFastItemStack.kt delete mode 100644 eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/FastItemStackUtils.kt delete mode 100644 eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/NMSFastItemStack.kt 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 deleted file mode 100644 index 174c25c6..00000000 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/fast/EcoFastItemStack.kt +++ /dev/null @@ -1,18 +0,0 @@ -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( - val handle: T, - val bukkit: ItemStack -) : FastItemStack { - 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/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/NMSCommons.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/NMSCommons.kt index e73c45c3..ab031875 100644 --- a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/NMSCommons.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/NMSCommons.kt @@ -18,11 +18,15 @@ val commonsProvider: CommonsProvider private lateinit var impl: CommonsProvider interface CommonsProvider { + val nbtTagString: Int + fun toPathfinderMob(mob: Mob): PathfinderMob? fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation - fun toNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack + fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack + + fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) fun toNMSClass(bukkit: Class): Optional> diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/TemptGoalFactory.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/TemptGoalFactory.kt index 2e63dbd0..9f64c6e3 100644 --- a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/TemptGoalFactory.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/TemptGoalFactory.kt @@ -13,7 +13,7 @@ object TemptGoalFactory : EntityGoalFactory { return TemptGoal( entity, apiGoal.speed, - Ingredient.of(*apiGoal.items.map { commonsProvider.toNMSStack(it) }.toTypedArray()), + Ingredient.of(*apiGoal.items.map { commonsProvider.asNMSStack(it) }.toTypedArray()), apiGoal.canBeScared ) } diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/UseItemGoalFactory.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/UseItemGoalFactory.kt index a039890d..90de126f 100644 --- a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/UseItemGoalFactory.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/ai/entity/UseItemGoalFactory.kt @@ -13,7 +13,7 @@ object UseItemGoalFactory : EntityGoalFactory { override fun create(apiGoal: EntityGoalUseItem, entity: PathfinderMob): Goal { return UseItemGoal( entity, - commonsProvider.toNMSStack(apiGoal.item), + commonsProvider.asNMSStack(apiGoal.item), SoundEvent(commonsProvider.toResourceLocation(apiGoal.sound.key)), ) { apiGoal.condition.test(it.toBukkitEntity()) diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/NMSFastItemStack.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/fast/EcoFastItemStack.kt similarity index 86% rename from eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/NMSFastItemStack.kt rename to eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/fast/EcoFastItemStack.kt index c3f2f5c7..7ee31c26 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/NMSFastItemStack.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/fast/EcoFastItemStack.kt @@ -1,6 +1,7 @@ -package com.willfp.eco.internal.spigot.proxy.v1_17_R1.fast +package com.willfp.eco.internal.spigot.proxy.common.fast -import com.willfp.eco.internal.fast.EcoFastItemStack +import com.willfp.eco.core.fast.FastItemStack +import com.willfp.eco.internal.spigot.proxy.common.commonsProvider import com.willfp.eco.util.NamespacedKeyUtils import com.willfp.eco.util.StringUtils import net.minecraft.nbt.CompoundTag @@ -8,19 +9,17 @@ import net.minecraft.nbt.ListTag import net.minecraft.nbt.StringTag import net.minecraft.world.item.EnchantedBookItem import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers import org.bukkit.enchantments.Enchantment import org.bukkit.inventory.ItemFlag import kotlin.experimental.and @Suppress("UsePropertyAccessSyntax") -class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack( - itemStack.getNMSStack(), itemStack -) { +class EcoFastItemStack( + private val bukkit: org.bukkit.inventory.ItemStack +) : FastItemStack { private var loreCache: List? = null + private val handle = commonsProvider.asNMSStack(bukkit) override fun getEnchants(checkStored: Boolean): Map { val enchantmentNBT = @@ -75,7 +74,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS displayTag.put("Lore", ListTag()) } - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) + val loreTag = displayTag.getList("Lore", commonsProvider.nbtTagString) loreTag.clear() @@ -103,7 +102,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS return emptyList() } - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) + val loreTag = displayTag.getList("Lore", commonsProvider.nbtTagString) val lore = ArrayList(loreTag.size) for (i in loreTag.indices) { @@ -169,7 +168,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS } override fun equals(other: Any?): Boolean { - if (other !is NMSFastItemStack) { + if (other !is EcoFastItemStack) { return false } @@ -181,8 +180,14 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS } private fun apply() { - if (bukkit !is CraftItemStack) { - bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta - } + commonsProvider.mergeIfNeeded(bukkit, handle) + } + + private fun getBitModifier(hideFlag: ItemFlag): Int { + return 1 shl hideFlag.ordinal + } + + override fun unwrap(): org.bukkit.inventory.ItemStack { + return bukkit } } diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt index 93095ad8..0c98fd10 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt @@ -12,10 +12,12 @@ import org.bukkit.craftbukkit.v1_17_R1.CraftWorld import org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity import org.bukkit.craftbukkit.v1_17_R1.entity.CraftMob 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.entity.LivingEntity import org.bukkit.entity.Mob import org.bukkit.inventory.ItemStack +import java.lang.reflect.Field import java.util.Optional class CommonsInitializer : CommonsInitializerProxy { @@ -24,6 +26,12 @@ class CommonsInitializer : CommonsInitializerProxy { } object CommonsProviderImpl : CommonsProvider { + private val cisHandle: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { + isAccessible = true + } + + override val nbtTagString = CraftMagicNumbers.NBT.TAG_STRING + override fun toPathfinderMob(mob: Mob): PathfinderMob? { val craft = mob as? CraftMob ?: return null return craft.handle as? PathfinderMob @@ -32,8 +40,19 @@ class CommonsInitializer : CommonsInitializerProxy { override fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation = CraftNamespacedKey.toMinecraft(namespacedKey) - override fun toNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack = - CraftItemStack.asNMSCopy(itemStack) + override fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack { + return if (itemStack !is CraftItemStack) { + CraftItemStack.asNMSCopy(itemStack) + } else { + cisHandle[itemStack] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(itemStack) + } + } + + override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { + if (itemStack !is CraftItemStack) { + itemStack.itemMeta = CraftItemStack.asCraftMirror(nmsStack).itemMeta + } + } override fun toNMSClass(bukkit: Class): Optional> { val world = Bukkit.getWorlds().first() as CraftWorld diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/FastItemStackFactory.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/FastItemStackFactory.kt index 66d3003b..d70f5443 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/FastItemStackFactory.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/FastItemStackFactory.kt @@ -2,11 +2,11 @@ package com.willfp.eco.internal.spigot.proxy.v1_17_R1 import com.willfp.eco.core.fast.FastItemStack import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy -import com.willfp.eco.internal.spigot.proxy.v1_17_R1.fast.NMSFastItemStack +import com.willfp.eco.internal.spigot.proxy.common.fast.EcoFastItemStack import org.bukkit.inventory.ItemStack class FastItemStackFactory : FastItemStackFactoryProxy { override fun create(itemStack: ItemStack): FastItemStack { - return NMSFastItemStack(itemStack) + return EcoFastItemStack(itemStack) } } \ No newline at end of file diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/FastItemStackUtils.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/FastItemStackUtils.kt deleted file mode 100644 index 15d851bc..00000000 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/fast/FastItemStackUtils.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_17_R1.fast - -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack -import org.bukkit.inventory.ItemStack -import java.lang.reflect.Field - -private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { - isAccessible = true -} - -fun ItemStack.getNMSStack(): net.minecraft.world.item.ItemStack { - return if (this !is CraftItemStack) { - CraftItemStack.asNMSCopy(this) - } else { - field[this] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(this) - } -} diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt index 3386c676..dfa59e65 100644 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt @@ -12,10 +12,12 @@ import org.bukkit.craftbukkit.v1_18_R1.CraftWorld import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity import org.bukkit.craftbukkit.v1_18_R1.entity.CraftMob import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey import org.bukkit.entity.LivingEntity import org.bukkit.entity.Mob import org.bukkit.inventory.ItemStack +import java.lang.reflect.Field import java.util.Optional class CommonsInitializer : CommonsInitializerProxy { @@ -24,6 +26,12 @@ class CommonsInitializer : CommonsInitializerProxy { } object CommonsProviderImpl : CommonsProvider { + private val cisHandle: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { + isAccessible = true + } + + override val nbtTagString = CraftMagicNumbers.NBT.TAG_STRING + override fun toPathfinderMob(mob: Mob): PathfinderMob? { val craft = mob as? CraftMob ?: return null return craft.handle as? PathfinderMob @@ -32,8 +40,19 @@ class CommonsInitializer : CommonsInitializerProxy { override fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation = CraftNamespacedKey.toMinecraft(namespacedKey) - override fun toNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack = - CraftItemStack.asNMSCopy(itemStack) + override fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack { + return if (itemStack !is CraftItemStack) { + CraftItemStack.asNMSCopy(itemStack) + } else { + cisHandle[itemStack] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(itemStack) + } + } + + override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { + if (itemStack !is CraftItemStack) { + itemStack.itemMeta = CraftItemStack.asCraftMirror(nmsStack).itemMeta + } + } override fun toNMSClass(bukkit: Class): Optional> { val world = Bukkit.getWorlds().first() as CraftWorld diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/FastItemStackUtils.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/FastItemStackUtils.kt deleted file mode 100644 index c50b54c6..00000000 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/FastItemStackUtils.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R1.fast - -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack -import org.bukkit.inventory.ItemStack -import java.lang.reflect.Field - -private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { - isAccessible = true -} - -fun ItemStack.getNMSStack(): net.minecraft.world.item.ItemStack { - return if (this !is CraftItemStack) { - CraftItemStack.asNMSCopy(this) - } else { - field[this] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(this) - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/NMSFastItemStack.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/NMSFastItemStack.kt deleted file mode 100644 index 85023909..00000000 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/fast/NMSFastItemStack.kt +++ /dev/null @@ -1,188 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R1.fast - -import com.willfp.eco.internal.fast.EcoFastItemStack -import com.willfp.eco.util.NamespacedKeyUtils -import com.willfp.eco.util.StringUtils -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.ListTag -import net.minecraft.nbt.StringTag -import net.minecraft.world.item.EnchantedBookItem -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers -import org.bukkit.enchantments.Enchantment -import org.bukkit.inventory.ItemFlag -import kotlin.experimental.and - -@Suppress("UsePropertyAccessSyntax") -class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack( - itemStack.getNMSStack(), itemStack -) { - private var loreCache: List? = null - - override fun getEnchants(checkStored: Boolean): Map { - val enchantmentNBT = - if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments( - handle - ) else handle.getEnchantmentTags() - val foundEnchantments: MutableMap = HashMap() - for (base in enchantmentNBT) { - val compound = base as CompoundTag - val key = compound.getString("id") - val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt() - val found = Enchantment.getByKey(NamespacedKeyUtils.fromStringOrNull(key)) - if (found != null) { - foundEnchantments[found] = level - } - } - return foundEnchantments - } - - override fun getLevelOnItem( - enchantment: Enchantment, - checkStored: Boolean - ): Int { - val enchantmentNBT = - if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments( - handle - ) else handle.getEnchantmentTags() - for (base in enchantmentNBT) { - val compound = base as CompoundTag - val key = compound.getString("id") - if (key != enchantment.key.toString()) { - continue - } - return ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt() - } - return 0 - } - - override fun setLore(lore: List?) { - loreCache = null - val jsonLore: MutableList = ArrayList() - - if (lore != null) { - for (s in lore) { - jsonLore.add(StringUtils.legacyToJson(s)) - } - } - - val displayTag = handle.getOrCreateTagElement("display") - - if (!displayTag.contains("Lore")) { - displayTag.put("Lore", ListTag()) - } - - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) - - loreTag.clear() - - for (s in jsonLore) { - loreTag.add(StringTag.valueOf(s)) - } - - apply() - } - - override fun getLore(): List { - if (loreCache != null) { - return loreCache!! - } - - val lore = this.getLoreJSON().map { StringUtils.jsonToLegacy(it) } - loreCache = lore - return lore - } - - private fun getLoreJSON(): List { - val displayTag = handle.getTagElement("display") ?: return emptyList() - - if (!displayTag.contains("Lore")) { - return emptyList() - } - - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) - val lore = ArrayList(loreTag.size) - - for (i in loreTag.indices) { - lore.add(loreTag.getString(i)) - } - - return lore - } - - override fun addItemFlags(vararg hideFlags: ItemFlag) { - for (flag in hideFlags) { - this.flagBits = this.flagBits or getBitModifier(flag) - } - - apply() - } - - override fun removeItemFlags(vararg hideFlags: ItemFlag) { - for (flag in hideFlags) { - this.flagBits = this.flagBits and getBitModifier(flag) - } - - apply() - } - - 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.getTag()!!.contains( - "HideFlags", - 99 - ) - ) handle.getTag()!!.getInt("HideFlags") else 0 - set(value) = - handle.getOrCreateTag().putInt("HideFlags", value) - - override fun getRepairCost(): Int { - return handle.getBaseRepairCost() - } - - override fun setRepairCost(cost: Int) { - handle.setRepairCost(cost) - } - - override fun equals(other: Any?): Boolean { - if (other !is NMSFastItemStack) { - return false - } - - return other.hashCode() == this.hashCode() - } - - override fun hashCode(): Int { - return handle.getTag()?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.getItem())) - } - - private fun apply() { - if (bukkit !is CraftItemStack) { - bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta - } - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt index 115507f1..45782a6c 100644 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt @@ -12,10 +12,12 @@ import org.bukkit.craftbukkit.v1_18_R1.CraftWorld import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity import org.bukkit.craftbukkit.v1_18_R1.entity.CraftMob import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey import org.bukkit.entity.LivingEntity import org.bukkit.entity.Mob import org.bukkit.inventory.ItemStack +import java.lang.reflect.Field import java.util.Optional class CommonsInitializer : CommonsInitializerProxy { @@ -24,6 +26,12 @@ class CommonsInitializer : CommonsInitializerProxy { } object CommonsProviderImpl : CommonsProvider { + private val cisHandle: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { + isAccessible = true + } + + override val nbtTagString = CraftMagicNumbers.NBT.TAG_STRING + override fun toPathfinderMob(mob: Mob): PathfinderMob? { val craft = mob as? CraftMob ?: return null return craft.handle as? PathfinderMob @@ -32,8 +40,19 @@ class CommonsInitializer : CommonsInitializerProxy { override fun toResourceLocation(namespacedKey: NamespacedKey): ResourceLocation = CraftNamespacedKey.toMinecraft(namespacedKey) - override fun toNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack = - CraftItemStack.asNMSCopy(itemStack) + override fun asNMSStack(itemStack: ItemStack): net.minecraft.world.item.ItemStack { + return if (itemStack !is CraftItemStack) { + CraftItemStack.asNMSCopy(itemStack) + } else { + cisHandle[itemStack] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(itemStack) + } + } + + override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { + if (itemStack !is CraftItemStack) { + itemStack.itemMeta = CraftItemStack.asCraftMirror(nmsStack).itemMeta + } + } override fun toNMSClass(bukkit: Class): Optional> { val world = Bukkit.getWorlds().first() as CraftWorld diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/FastItemStackUtils.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/FastItemStackUtils.kt deleted file mode 100644 index 7bb19c36..00000000 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/FastItemStackUtils.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R2.fast - -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack -import org.bukkit.inventory.ItemStack -import java.lang.reflect.Field - -private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply { - isAccessible = true -} - -fun ItemStack.getNMSStack(): net.minecraft.world.item.ItemStack { - return if (this !is CraftItemStack) { - CraftItemStack.asNMSCopy(this) - } else { - field[this] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(this) - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/NMSFastItemStack.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/NMSFastItemStack.kt deleted file mode 100644 index 824bd3ec..00000000 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/fast/NMSFastItemStack.kt +++ /dev/null @@ -1,188 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R2.fast - -import com.willfp.eco.internal.fast.EcoFastItemStack -import com.willfp.eco.util.NamespacedKeyUtils -import com.willfp.eco.util.StringUtils -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.ListTag -import net.minecraft.nbt.StringTag -import net.minecraft.world.item.EnchantedBookItem -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers -import org.bukkit.enchantments.Enchantment -import org.bukkit.inventory.ItemFlag -import kotlin.experimental.and - -@Suppress("UsePropertyAccessSyntax") -class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack( - itemStack.getNMSStack(), itemStack -) { - private var loreCache: List? = null - - override fun getEnchants(checkStored: Boolean): Map { - val enchantmentNBT = - if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments( - handle - ) else handle.getEnchantmentTags() - val foundEnchantments: MutableMap = HashMap() - for (base in enchantmentNBT) { - val compound = base as CompoundTag - val key = compound.getString("id") - val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt() - val found = Enchantment.getByKey(NamespacedKeyUtils.fromStringOrNull(key)) - if (found != null) { - foundEnchantments[found] = level - } - } - return foundEnchantments - } - - override fun getLevelOnItem( - enchantment: Enchantment, - checkStored: Boolean - ): Int { - val enchantmentNBT = - if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments( - handle - ) else handle.getEnchantmentTags() - for (base in enchantmentNBT) { - val compound = base as CompoundTag - val key = compound.getString("id") - if (key != enchantment.key.toString()) { - continue - } - return ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt() - } - return 0 - } - - override fun setLore(lore: List?) { - loreCache = null - val jsonLore: MutableList = ArrayList() - - if (lore != null) { - for (s in lore) { - jsonLore.add(StringUtils.legacyToJson(s)) - } - } - - val displayTag = handle.getOrCreateTagElement("display") - - if (!displayTag.contains("Lore")) { - displayTag.put("Lore", ListTag()) - } - - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) - - loreTag.clear() - - for (s in jsonLore) { - loreTag.add(StringTag.valueOf(s)) - } - - apply() - } - - override fun getLore(): List { - if (loreCache != null) { - return loreCache!! - } - - val lore = this.getLoreJSON().map { StringUtils.jsonToLegacy(it) } - loreCache = lore - return lore - } - - private fun getLoreJSON(): List { - val displayTag = handle.getTagElement("display") ?: return emptyList() - - if (!displayTag.contains("Lore")) { - return emptyList() - } - - val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING) - val lore = ArrayList(loreTag.size) - - for (i in loreTag.indices) { - lore.add(loreTag.getString(i)) - } - - return lore - } - - override fun addItemFlags(vararg hideFlags: ItemFlag) { - for (flag in hideFlags) { - this.flagBits = this.flagBits or getBitModifier(flag) - } - - apply() - } - - override fun removeItemFlags(vararg hideFlags: ItemFlag) { - for (flag in hideFlags) { - this.flagBits = this.flagBits and getBitModifier(flag) - } - - apply() - } - - 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.getTag()!!.contains( - "HideFlags", - 99 - ) - ) handle.getTag()!!.getInt("HideFlags") else 0 - set(value) = - handle.getOrCreateTag().putInt("HideFlags", value) - - override fun getRepairCost(): Int { - return handle.getBaseRepairCost() - } - - override fun setRepairCost(cost: Int) { - handle.setRepairCost(cost) - } - - override fun equals(other: Any?): Boolean { - if (other !is NMSFastItemStack) { - return false - } - - return other.hashCode() == this.hashCode() - } - - override fun hashCode(): Int { - return handle.getTag()?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.getItem())) - } - - private fun apply() { - if (bukkit !is CraftItemStack) { - bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta - } - } -} \ No newline at end of file