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 插件的物品选择器为例,如下所示。
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 }