普特莫斯维基 (Purtmars Wikipedia 📖)

“Chemdah 开发者文档:自定义物品选择器”的版本间的差异

来自Purtmars Wikipedia —— 普特莫斯维基
(建立内容为“{{:Chemdah 开发者文档目录}} = 物品选择器 = 物品选择器是由 Chemdah 提供的一种物品表达形式,用于在任务中判断物品是否符…”的新页面)
 
 
(未显示同一用户的1个中间版本)
第4行: 第4行:
 
  <span style="color: #0080FF">stone</span>
 
  <span style="color: #0080FF">stone</span>
 
  <span style="color: purple">minecraft:</span><span style="color: #0080FF">stone</span>
 
  <span style="color: purple">minecraft:</span><span style="color: #0080FF">stone</span>
  <span style="color: purple">minecraft:</span><span style="color: #0080FF">diamond</span><span style="color: green">[name=123,lore=123,enchant=123]</span>
+
  <span style="color: purple">minecraft:</span><span style="color: #0080FF">diamond</span><span style="color: green">[name=foo,lore=bar,enchant=damage_all]</span>
  
表达式的前缀决定了物品选择器的类型,所有选择器均继承自 '''ink.ptms.chemdah.core.quest.selector.InferItem$Item''' 类。
+
表达式的前缀决定了物品选择器的类型,所有选择器均继承自 '''ink.ptms.chemdah.core.quest.selector.InferItem$Item''' 类。<br>
 +
以基于 Zaphkiel 插件的物品选择器为例,如下所示。
 +
 
 +
<syntaxhighlight lang="kotlin" line="line">
 +
class ItemZaphkiel(material: String, flags: List<Flags>, data: Map<String, String>) : 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)
 +
        }
 +
    }
 +
}
 +
</syntaxhighlight>
 +
 
 +
基本的物品选择器由 '''match''' 和 '''matchMetaData''' 两个方法构成,后者则是用于更为复杂的数据判断,无特殊需求可以不写。<br>
 +
并在最后通过 '''InferItemHookEvent''' 事件注册。
 +
 
 +
<syntaxhighlight lang="kotlin" line="line">
 +
@EventHandler
 +
fun e(e: InferItemHookEvent) {
 +
    when (e.id.toLowerCase()) {
 +
        "zaphkiel" -> {
 +
            e.itemClass = ItemZaphkiel::class.java
 +
        }
 +
    }
 +
}
 +
</syntaxhighlight>

2021年5月7日 (五) 09:14的最新版本

目录

物品选择器

物品选择器是由 Chemdah 提供的一种物品表达形式,用于在任务中判断物品是否符合条件。常见的书写格式如下。

stone
minecraft:stone
minecraft:diamond[name=foo,lore=bar,enchant=damage_all]

表达式的前缀决定了物品选择器的类型,所有选择器均继承自 ink.ptms.chemdah.core.quest.selector.InferItem$Item 类。
以基于 Zaphkiel 插件的物品选择器为例,如下所示。

 1 class ItemZaphkiel(material: String, flags: List<Flags>, data: Map<String, String>) : InferItem.Item(material, flags, data) {
 2 
 3     fun ItemStack.zaphkielId(): String {
 4         val itemStream = ZaphkielAPI.read(this)
 5         return if (itemStream.isExtension()) itemStream.getZaphkielName() else "@vanilla"
 6     }
 7 
 8     override fun match(item: ItemStack): Boolean {
 9         return matchType(item.zaphkielId()) && matchMetaData(item)
10     }
11 
12     override fun matchMetaData(item: ItemStack, itemMeta: ItemMeta, key: String, value: String): Boolean {
13         return if (key.startsWith("data.")) {
14             ZaphkielAPI.read(item).getZaphkielData()[key.substring("data.".length)]?.asString().equals(value, true)
15         } else {
16             super.matchMetaData(item, itemMeta, key, value)
17         }
18     }
19 }

基本的物品选择器由 matchmatchMetaData 两个方法构成,后者则是用于更为复杂的数据判断,无特殊需求可以不写。
并在最后通过 InferItemHookEvent 事件注册。

1 @EventHandler
2 fun e(e: InferItemHookEvent) {
3     when (e.id.toLowerCase()) {
4         "zaphkiel" -> {
5             e.itemClass = ItemZaphkiel::class.java
6         }
7     }
8 }