自定义物品选择器 (Chemdah 开发者文档)
来自Purtmars Wikipedia —— 普特莫斯维基
目录
- Chemdah
- 开始
- 基本
- 事件
- ink.ptms.chemdah.api.event.collect.ConversationEvents
- ink.ptms.chemdah.api.event.collect.ObjectiveEvents
- ink.ptms.chemdah.api.event.collect.PlayerEvents
- ink.ptms.chemdah.api.event.collect.QuestEvents
- ink.ptms.chemdah.api.event.collect.TemplateEvents
- ink.ptms.chemdah.api.event.InferEntityHookEvent
- ink.ptms.chemdah.api.event.InferItemHookEvent
- ink.ptms.chemdah.api.event.PartyHookEvent
- 对话相关
- 数据相关
- 任务相关
物品选择器
物品选择器是由 Chemdah 提供的一种物品表达形式,用于在任务中判断物品是否符合条件。常见的书写格式如下。
stone minecraft:stone minecraft:diamond[name=foo,lore=bar,enchant=damage_all]
表达式的前缀决定了物品选择器的类型,所有选择器均继承自 ink.ptms.chemdah.core.quest.selector.InferItem$Item 类。
以基于 Zaphkiel 插件的物品选择器为例,如下所示。
class ItemZaphkiel(material: String, flags: List, data: Map) : InferItem.Item(material, flags, data) {
fun ItemStack.zaphkielId(): String {
val itemStream = ZaphkielAPI.read(this)
return if (itemStream.isExtension()) itemStream.getZaphkielName() else "@vanilla"
}
override fun match(item: ItemStack): Boolean {
return matchType(item.zaphkielId()) && matchMetaData(item)
}
override fun matchMetaData(item: ItemStack, itemMeta: ItemMeta, key: String, value: String): Boolean {
return if (key.startsWith("data.")) {
ZaphkielAPI.read(item).getZaphkielData()[key.substring("data.".length)]?.asString().equals(value, true)
} else {
super.matchMetaData(item, itemMeta, key, value)
}
}
}
基本的物品选择器由 match 和 matchMetaData 两个方法构成,后者则是用于更为复杂的数据判断,无特殊需求可以不写。
并在最后通过 InferItemHookEvent 事件注册。
@EventHandler
fun e(e: InferItemHookEvent) {
when (e.id.toLowerCase()) {
"zaphkiel" -> {
e.itemClass = ItemZaphkiel::class.java
}
}
}