“Chemdah 开发者文档:自定义物品选择器”的版本间的差异
来自Purtmars Wikipedia —— 普特莫斯维基
(建立内容为“{{:Chemdah 开发者文档目录}} = 物品选择器 = 物品选择器是由 Chemdah 提供的一种物品表达形式,用于在任务中判断物品是否符…”的新页面) |
|||
第6行: | 第6行: | ||
<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=123,lore=123,enchant=123]</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:11的版本
目录
- 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=123,lore=123,enchant=123]
表达式的前缀决定了物品选择器的类型,所有选择器均继承自 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 }
基本的物品选择器由 match 和 matchMetaData 两个方法构成,后者则是用于更为复杂的数据判断,无特殊需求可以不写。
并在最后通过 InferItemHookEvent 事件注册。
1 @EventHandler
2 fun e(e: InferItemHookEvent) {
3 when (e.id.toLowerCase()) {
4 "zaphkiel" -> {
5 e.itemClass = ItemZaphkiel::class.java
6 }
7 }
8 }