自定义实体选择器 (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 提供的一种实体表达形式,用于在任务中判断实体是否符合条件。常见的书写格式如下。
zombie minecraft:skeleton minecraft:skeleton[name=foo]
表达式的前缀决定了物品选择器的类型,所有选择器均继承自 ink.ptms.chemdah.core.quest.selector.InferEntity$Entity 类。 以基于 MythicMobs 插件的物品选择器为例,如下所示。
class MythicMobsEntity(material: String, flags: List, data: Map) : Entity(material, flags, data) {
fun org.bukkit.entity.Entity.mythicMobId(): String {
return MythicMobs.inst().mobManager.getMythicMobInstance(this)?.type?.internalName ?: "@vanilla"
}
override fun match(entity: org.bukkit.entity.Entity): Boolean {
return matchType(entity.mythicMobId()) && matchData(entity)
}
override fun matchData(entity: org.bukkit.entity.Entity): Boolean {
val mob = MythicMobs.inst().mobManager.getMythicMobInstance(entity)
return data.all {
when (it.key) {
"type" -> it.value.equals(mob.type.entityType, true)
"name" -> it.value in I18n.get().getName(entity)
"level" -> Coerce.toDouble(it.value) <= mob.level
"stance" -> it.value == mob.stance
"faction" -> it.value == mob.faction
else -> mob.type.config.getString(it.key)?.contains(it.value) == true
}
}
}
}
与物品选择器完全相同,由 match 和 matchData 两个方法构成,最后通过 InferEntityHookEvent 事件注册。
@EventHandler
fun e(e: InferEntityHookEvent) {
when (e.id.toLowerCase()) {
"mm", "mythicmobs" -> {
e.itemClass = MythicMobsEntity::class.java
}
}
}