Skip to content

Commit

Permalink
Experimental | Optimize & Move item.event & Support async script compile
Browse files Browse the repository at this point in the history
  • Loading branch information
TheFloodDragon committed Jul 21, 2024
1 parent 5721900 commit 133fc91
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 116 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package cn.fd.ratziel.module.item.event
package cn.fd.ratziel.module.item.api.event

import cn.fd.ratziel.core.Identifier
import cn.fd.ratziel.function.ArgumentContext
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ data class ItemInfo(
*/
val id: Identifier,
/**
* 物品元素名称
* 物品类型 (物品元素名称)
*/
val name: String,
val type: String,
/**
* 物品元素内容的哈希值
*/
Expand All @@ -44,7 +44,7 @@ data class ItemInfo(
/**
* [RatzielItem] 物品元素名称
*/
val RATZIEL_ELEMENT_NODE = OccupyNode("Element", RATZIEL_NODE)
val RATZIEL_ELEMENT_NODE = OccupyNode("Type", RATZIEL_NODE)

/**
* [RatzielItem] 物品元素内容哈希值
Expand All @@ -59,7 +59,7 @@ data class ItemInfo(
val data = ComponentUtil.findByNode(tag, RATZIEL_NODE)
// 写入数据
data[RATZIEL_IDENTIFIER_NODE.name] = NBTString(info.id.toString())
data[RATZIEL_ELEMENT_NODE.name] = NBTString(info.name)
data[RATZIEL_ELEMENT_NODE.name] = NBTString(info.type)
data[RATZIEL_HASH_NODE.name] = NBTInt(info.hash)
}

Expand All @@ -76,7 +76,7 @@ data class ItemInfo(
// 合成结果
return ItemInfo(
id = IdentifierImpl(id.content),
name = name.content,
type = name.content,
hash = hash.content,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import org.bukkit.inventory.ItemStack
*/
open class RatzielItem : NeoItem {

constructor(info: ItemInfo) : this(info, ItemDataImpl())
constructor(info: ItemInfo) : this(info, SimpleItemData())

constructor(info: ItemInfo, data: ItemData) {
// 写入数据
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import cn.fd.ratziel.module.item.api.ItemMaterial
import cn.fd.ratziel.module.item.nbt.NBTCompound

/**
* ItemDataImpl
* SimpleItemData
*
* @author TheFloodDragon
* @since 2024/5/5 13:33
*/
data class ItemDataImpl(
data class SimpleItemData(
/**
* 物品材料
*/
Expand All @@ -27,7 +27,7 @@ data class ItemDataImpl(

companion object {

val EMPTY = ItemDataImpl()
val EMPTY = SimpleItemData()

/**
* 将 [target] 合并到 [source] 中
Expand Down
Original file line number Diff line number Diff line change
@@ -1,80 +1,74 @@
@file:Suppress("DEPRECATION")

package cn.fd.ratziel.module.item.impl

import cn.fd.ratziel.module.item.api.ItemMaterial
import cn.fd.ratziel.module.item.exception.UnknownMaterialException
import taboolib.library.reflex.ReflexClass
import taboolib.library.xseries.XMaterial

/**
* ItemMaterialImpl
* SimpleItemMaterial
*
* 由于不可抗力的影响(我不会), 仅支持 [BukkitMaterial], 即仅支持原版物品
*
* @author TheFloodDragon
* @since 2024/4/5 13:26
*/
data class ItemMaterialImpl(override val name: String) : ItemMaterial {
open class SimpleItemMaterial(private val ref: BukkitMaterial) : ItemMaterial {

constructor(mat: XMaterial) : this(mat.name)
constructor(name: String) : this(getBukkitMaterial(name) ?: BukkitMaterial.AIR)

constructor(mat: BukkitMaterial) : this(mat.name)
constructor(id: Int) : this(getBukkitMaterial(id) ?: BukkitMaterial.AIR)

constructor(mat: ItemMaterial) : this(mat.name)
constructor(mat: XMaterial) : this(mat.name)

constructor(id: Int) : this(getBukkitMaterial(id) ?: BukkitMaterial.AIR)
constructor(mat: ItemMaterial) : this(mat.name)

/**
* 材料标识符 (低版本)
*/
override val id: Int get() = getIdUnsafe(insBukkit)
override val id: Int get() = getIdUnsafe(ref)

/**
* 材料的默认最大堆叠数量
* 材料名称
*/
override val maxStackSize: Int get() = insBukkit.maxStackSize
override val name: String get() = ref.name

/**
* 材料的默认最大耐久度
* 材料的默认最大堆叠数量
*/
override val maxDurability: Int get() = insBukkit.maxDurability.toInt()
override val maxStackSize: Int get() = ref.maxStackSize

/**
* 材料是否为空气材料
* 材料的默认最大耐久度
*/
fun isAir() = insBukkit.isAir || this.isEmpty()
override val maxDurability: Int get() = ref.maxDurability.toInt()

/**
* 获取 [BukkitMaterial] 形式 (若获取不到则抛出异常)
* 材料是否为空气材料
*/
fun getAsBukkit(): BukkitMaterial = insBukkit
open fun isAir() = ref.isAir || this.isEmpty()

/**
* 获取 [XMaterial] 形式 (若获取不到则抛出异常)
* 获取 [BukkitMaterial] 形式
*/
fun getAsXSeries(): XMaterial = insXSeries
open fun getAsBukkit(): BukkitMaterial = ref

/**
* [BukkitMaterial] 形式
* 获取 [XMaterial] 形式
*/
private val insBukkit: BukkitMaterial by lazy { getBukkitMaterial(name) ?: throw UnknownMaterialException(name) }
open fun getAsXSeries(): XMaterial = XMaterial.matchXMaterial(ref)

/**
* [XMaterial] 形式
*/
private val insXSeries: XMaterial by lazy { XMaterial.matchXMaterial(insBukkit) }
override fun toString() = "SimpleItemMaterial(name=$name,id=$id)"

override fun hashCode() = id.hashCode()
override fun hashCode() = name.hashCode()

override fun equals(other: Any?) = equal(this, other)

companion object {

fun equal(material: ItemMaterial, other: Any?) = material === other
|| (other as? ItemMaterial)?.id == material.id
|| (other as? BukkitMaterial)?.let { getIdUnsafe(it) } == material.id
|| (other as? XMaterial)?.id == material.id
|| (other as? ItemMaterial)?.name == material.name
|| (other as? BukkitMaterial)?.name == material.name
|| (other as? XMaterial)?.name == material.name

/**
* 获取 [BukkitMaterial] 形式的物品材料
Expand All @@ -88,7 +82,7 @@ data class ItemMaterialImpl(override val name: String) : ItemMaterial {
*/
val materialsMap by lazy {
HashMap<String, ItemMaterial>().apply {
BukkitMaterial.entries.forEach { put(it.name, ItemMaterialImpl(it)) }
BukkitMaterial.entries.forEach { put(it.name, SimpleItemMaterial(it)) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import cn.fd.ratziel.module.item.api.builder.ItemResolver
import cn.fd.ratziel.module.item.api.builder.ItemSerializer
import cn.fd.ratziel.module.item.event.ItemBuildEvent
import cn.fd.ratziel.module.item.event.ItemResolvedEvent
import cn.fd.ratziel.module.item.impl.ItemDataImpl
import cn.fd.ratziel.module.item.impl.SimpleItemData
import cn.fd.ratziel.module.item.impl.ItemInfo
import cn.fd.ratziel.module.item.impl.RatzielItem
import cn.fd.ratziel.module.item.util.toApexDataUncheck
Expand Down Expand Up @@ -67,7 +67,7 @@ class DefaultItemGenerator(
return transformFactory.thenApply { results ->
// 优先级排列 (优先级低的在前面)
for (data in results.mapNotNull { it }.sortPriority().reversed()) {
ItemDataImpl.merge(sourceData, data, true) // 合并数据
SimpleItemData.merge(sourceData, data, true) // 合并数据
}
// 合成最终结果
createRatzielItem(origin, sourceData, identifier).let { item ->
Expand All @@ -79,7 +79,7 @@ class DefaultItemGenerator(
}
}

override fun build(context: ArgumentContext) = build(ItemDataImpl(), context)
override fun build(context: ArgumentContext) = build(SimpleItemData(), context)

private fun resolve(element: JsonElement, context: ArgumentContext, resolvers: List<ItemResolver>): JsonElement {
var result = element
Expand Down Expand Up @@ -116,7 +116,7 @@ class DefaultItemGenerator(
}
// 转换成以顶级节点为根节点的数据
try {
Priority(prt.priority, transformer.toApexDataUncheck(component, ItemDataImpl())) // 封装成优先级对象后传递给合并阶段
Priority(prt.priority, transformer.toApexDataUncheck(component, SimpleItemData())) // 封装成优先级对象后传递给合并阶段
} catch (ex: Exception) {
severe("Failed to transform component by \"$transformer\"! Target component: $component")
ex.printStackTrace(); null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import cn.fd.ratziel.module.item.api.ItemData
import cn.fd.ratziel.module.item.api.ItemNode
import cn.fd.ratziel.module.item.api.ItemTransformer
import cn.fd.ratziel.module.item.impl.BukkitMaterial
import cn.fd.ratziel.module.item.impl.ItemMaterialImpl
import cn.fd.ratziel.module.item.impl.SimpleItemMaterial
import cn.fd.ratziel.module.item.impl.component.util.HeadUtil
import cn.fd.ratziel.module.item.nbt.NBTInt
import cn.fd.ratziel.module.item.nbt.read
Expand Down Expand Up @@ -50,18 +50,18 @@ data class ItemCharacteristic(

override fun transform(data: ItemData, component: ItemCharacteristic) {
// 头颅处理 (当源数据的材料为空或者是PLAYER_HEAD时, 才处理相关)
if (data.material.isEmpty() || ItemMaterialImpl.equal(data.material, BukkitMaterial.PLAYER_HEAD)) {
if (data.material.isEmpty() || SimpleItemMaterial.equal(data.material, BukkitMaterial.PLAYER_HEAD)) {
component.headMeta?.let { HeadUtil.getHeadTag(it) }?.let {
// 设置材质
data.material = ItemMaterialImpl(BukkitMaterial.PLAYER_HEAD)
data.material = SimpleItemMaterial(BukkitMaterial.PLAYER_HEAD)
// 应用标签
data.tag.merge(it, true)
}
}
// 颜色处理
val node = when {
ItemMaterialImpl.isLeatherArmor(data.material) -> ItemSheet.DYED_COLOR
ItemMaterialImpl.isPotion(data.material) -> ItemSheet.POTION_COLOR
SimpleItemMaterial.isLeatherArmor(data.material) -> ItemSheet.DYED_COLOR
SimpleItemMaterial.isPotion(data.material) -> ItemSheet.POTION_COLOR
else -> return
}
data.tag.write(node, component.color?.let { parseColor(it) }?.let { NBTInt(it) })
Expand All @@ -76,10 +76,10 @@ data class ItemCharacteristic(
impl.headMeta = skullMeta?.owner ?: skullMeta?.getSkullValue() ?: return impl
}
// 皮革颜色处理
ItemMaterialImpl.isLeatherArmor(data.material) ->
SimpleItemMaterial.isLeatherArmor(data.material) ->
data.tag.read<NBTInt>(ItemSheet.DYED_COLOR) { impl.color = it.content.toString() }
// 药水颜色处理
ItemMaterialImpl.isPotion(data.material) ->
SimpleItemMaterial.isPotion(data.material) ->
data.tag.read<NBTInt>(ItemSheet.POTION_COLOR) { impl.color = it.content.toString() }
}
// 返回
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import cn.fd.ratziel.core.exception.UnsupportedTypeException
import cn.fd.ratziel.module.item.api.ItemData
import cn.fd.ratziel.module.item.api.ItemMaterial
import cn.fd.ratziel.module.item.impl.BukkitMaterial
import cn.fd.ratziel.module.item.impl.ItemDataImpl
import cn.fd.ratziel.module.item.impl.ItemMaterialImpl
import cn.fd.ratziel.module.item.impl.SimpleItemData
import cn.fd.ratziel.module.item.impl.SimpleItemMaterial
import cn.fd.ratziel.module.item.nbt.NBTCompound
import taboolib.library.reflex.Reflex.Companion.invokeConstructor
import taboolib.library.reflex.Reflex.Companion.invokeMethod
Expand Down Expand Up @@ -77,8 +77,8 @@ class RefItemStack(raw: Any) {
* 获取物品数据
*/
fun getData(): ItemData? {
return ItemDataImpl(
material = ItemMaterialImpl(getMaterial()),
return SimpleItemData(
material = SimpleItemMaterial(getMaterial()),
tag = getTag() ?: return null,
amount = getAmount()
)
Expand All @@ -100,7 +100,7 @@ class RefItemStack(raw: Any) {
if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_13)) {
InternalUtil.obcGetMaterialMethod.invoke(handle)!! as BukkitMaterial
} else {
ItemMaterialImpl.getBukkitMaterial(InternalUtil.obcGetMaterialMethodLegacy.invoke(handle)!! as Int)!!
SimpleItemMaterial.getBukkitMaterial(InternalUtil.obcGetMaterialMethodLegacy.invoke(handle)!! as Int)!!
}

/**
Expand All @@ -110,12 +110,12 @@ class RefItemStack(raw: Any) {
if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_13)) {
InternalUtil.obcSetMaterialMethod.invoke(handle, material)
} else {
InternalUtil.obcSetMaterialMethodLegacy.invoke(handle, ItemMaterialImpl.getIdUnsafe(material))
InternalUtil.obcSetMaterialMethodLegacy.invoke(handle, SimpleItemMaterial.getIdUnsafe(material))
}
}

fun setMaterial(material: ItemMaterial) {
ItemMaterialImpl.getBukkitMaterial(material.name)?.let { setMaterial(it) }
SimpleItemMaterial.getBukkitMaterial(material.name)?.let { setMaterial(it) }
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package cn.fd.ratziel.module.item.util
import cn.fd.ratziel.module.item.api.ItemData
import cn.fd.ratziel.module.item.api.ItemNode
import cn.fd.ratziel.module.item.api.ItemTransformer
import cn.fd.ratziel.module.item.impl.ItemDataImpl
import cn.fd.ratziel.module.item.impl.SimpleItemData
import cn.fd.ratziel.module.item.nbt.NBTCompound
import cn.fd.ratziel.module.item.nbt.NBTData

Expand All @@ -22,15 +22,15 @@ object ComponentUtil {
transformer.transform(data, component) // 转换底层数据
val newTag = NBTCompound() // 创建新NBT
setByNode(newTag, transformer.node, data.tag) // 设置新NBT
return ItemDataImpl(data.material, newTag, data.amount)
return SimpleItemData(data.material, newTag, data.amount)
}

/**
* 通过 [transformer] 将 [data] 转化成 物品组件
*/
fun <T> toComponent(data: ItemData, transformer: ItemTransformer<T>): T {
val find = findByNode(data.tag, transformer.node)
return transformer.detransform(ItemDataImpl(data.material, find, data.amount))
return transformer.detransform(SimpleItemData(data.material, find, data.amount))
}

fun findByNode(source: NBTCompound, tailNode: ItemNode) = findByNode(source, fold(tailNode))
Expand Down
Loading

0 comments on commit 133fc91

Please sign in to comment.