普特莫斯维基 (Purtmars Wikipedia 📖)

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

来自Purtmars Wikipedia —— 普特莫斯维基

目录

实体选择器

实体选择器是由 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
        }
    }
}