Moved FastItemStack into commons
This commit is contained in:
@@ -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<T: Any>(
|
||||
val handle: T,
|
||||
val bukkit: ItemStack
|
||||
) : FastItemStack {
|
||||
override fun unwrap(): ItemStack {
|
||||
return bukkit
|
||||
}
|
||||
|
||||
fun getBitModifier(hideFlag: ItemFlag): Int {
|
||||
return 1 shl hideFlag.ordinal
|
||||
}
|
||||
}
|
||||
@@ -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<out org.bukkit.entity.LivingEntity>): Optional<Class<out LivingEntity>>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ object TemptGoalFactory : EntityGoalFactory<EntityGoalTempt> {
|
||||
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
|
||||
)
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ object UseItemGoalFactory : EntityGoalFactory<EntityGoalUseItem> {
|
||||
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())
|
||||
|
||||
@@ -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>(
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
class EcoFastItemStack(
|
||||
private val bukkit: org.bukkit.inventory.ItemStack
|
||||
) : FastItemStack {
|
||||
private var loreCache: List<String>? = null
|
||||
private val handle = commonsProvider.asNMSStack(bukkit)
|
||||
|
||||
override fun getEnchants(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
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<String>(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
|
||||
}
|
||||
}
|
||||
@@ -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<out LivingEntity>): Optional<Class<out net.minecraft.world.entity.LivingEntity>> {
|
||||
val world = Bukkit.getWorlds().first() as CraftWorld
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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<out LivingEntity>): Optional<Class<out net.minecraft.world.entity.LivingEntity>> {
|
||||
val world = Bukkit.getWorlds().first() as CraftWorld
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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>(
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
|
||||
override fun getEnchants(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
val enchantmentNBT =
|
||||
if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||
handle
|
||||
) else handle.getEnchantmentTags()
|
||||
val foundEnchantments: MutableMap<Enchantment, Int> = 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<String>?) {
|
||||
loreCache = null
|
||||
val jsonLore: MutableList<String> = 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<String> {
|
||||
if (loreCache != null) {
|
||||
return loreCache!!
|
||||
}
|
||||
|
||||
val lore = this.getLoreJSON().map { StringUtils.jsonToLegacy(it) }
|
||||
loreCache = lore
|
||||
return lore
|
||||
}
|
||||
|
||||
private fun getLoreJSON(): List<String> {
|
||||
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<String>(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<ItemFlag> {
|
||||
val flags = mutableSetOf<ItemFlag>()
|
||||
|
||||
var flagArr: Array<ItemFlag>
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<out LivingEntity>): Optional<Class<out net.minecraft.world.entity.LivingEntity>> {
|
||||
val world = Bukkit.getWorlds().first() as CraftWorld
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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>(
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
|
||||
override fun getEnchants(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
val enchantmentNBT =
|
||||
if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||
handle
|
||||
) else handle.getEnchantmentTags()
|
||||
val foundEnchantments: MutableMap<Enchantment, Int> = 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<String>?) {
|
||||
loreCache = null
|
||||
val jsonLore: MutableList<String> = 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<String> {
|
||||
if (loreCache != null) {
|
||||
return loreCache!!
|
||||
}
|
||||
|
||||
val lore = this.getLoreJSON().map { StringUtils.jsonToLegacy(it) }
|
||||
loreCache = lore
|
||||
return lore
|
||||
}
|
||||
|
||||
private fun getLoreJSON(): List<String> {
|
||||
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<String>(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<ItemFlag> {
|
||||
val flags = mutableSetOf<ItemFlag>()
|
||||
|
||||
var flagArr: Array<ItemFlag>
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user