普特莫斯维基 (Purtmars Wikipedia 📖)

Chemdah 开发者文档:自定义实体选择器

来自Purtmars Wikipedia —— 普特莫斯维基
Bkm016讨论 | 贡献2021年5月7日 (五) 09:17的版本 (建立内容为“{{:Chemdah 开发者文档目录}} = 实体选择器 = 实体选择器是由 Chemdah 提供的一种实体表达形式,用于在任务中判断实体是否符…”的新页面)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

目录

实体选择器

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

zombie
minecraft:skeleton
minecraft:skeleton[name=foo]

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

 1 class MythicMobsEntity(material: String, flags: List<Flags>, data: Map<String, String>) : Entity(material, flags, data) {
 2 
 3     fun org.bukkit.entity.Entity.mythicMobId(): String {
 4         return MythicMobs.inst().mobManager.getMythicMobInstance(this)?.type?.internalName ?: "@vanilla"
 5     }
 6     
 7     override fun match(entity: org.bukkit.entity.Entity): Boolean {
 8         return matchType(entity.mythicMobId()) && matchData(entity)
 9     }
10 
11     override fun matchData(entity: org.bukkit.entity.Entity): Boolean {
12         val mob = MythicMobs.inst().mobManager.getMythicMobInstance(entity)
13         return data.all {
14             when (it.key) {
15                 "type" -> it.value.equals(mob.type.entityType, true)
16                 "name" -> it.value in I18n.get().getName(entity)
17                 "level" -> Coerce.toDouble(it.value) <= mob.level
18                 "stance" -> it.value == mob.stance
19                 "faction" -> it.value == mob.faction
20                 else -> mob.type.config.getString(it.key)?.contains(it.value) == true
21             }
22         }
23     }
24 }

与物品选择器完全相同,由 match 和 matchData 两个方法构成,最后通过 InferEntityHookEvent 事件注册。

1 @EventHandler
2 fun e(e: InferEntityHookEvent) {
3     when (e.id.toLowerCase()) {
4         "mm", "mythicmobs" -> {
5             e.itemClass = MythicMobsEntity::class.java
6         }
7     }
8 }