自定义任务目标 (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
- 对话相关
- 数据相关
- 任务相关
自定义任务目标
所有的任务目标均继承自 ink.ptms.chemdah.core.quest.objective.Objective (Github) 类,这里不在过多赘述。
本章内容只列出以下两个由 Chemdah 封装后的二级任务目标接口。
捡起物品
让我们以一个最简单的玩家捡起物品任务目标为例,首先确定任务的计数类型是整数还是浮点数。
物品的数量必然是整数,固继承自 ObjectiveCountableI 类。
object IItemPick : ObjectiveCountableI() {
/**
* 统一识别名称
*/
override val name = "pickup item"
/**
* Bukkit 事件
*/
override val event = EntityPickupItemEvent::class
任何一个任务事件都必须存在一个有效的玩家对象来进行任务,在初始化方法中调用 handler 方法试试看。
init {
handler {
// 返回 EntityPickupItemEvent 事件下的玩家对象
entity as? Player
}
}
如果 handler 方法未返回任何内容,则事件不会继续。
至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。
init {
handler {
// 返回 EntityPickupItemEvent 事件下的玩家对象
entity as? Player
}
// 注册一个条件,判断玩家所在位置
addCondition("position") { e ->
toPosition().inside(e.entity.location)
}
// 注册一个条件,判断玩家捡起的物品
addCondition("item") { e ->
toInferItem().isItem(e.item.itemStack)
}
// 注册一个条件,判断玩家捡起的物品的数量
addCondition("amount") { e ->
toInt() <= e.item.itemStack.amount
}
// 将捡起的物品的数量作为变量传入脚本代理,提高操作上限
addConditionVariable("amount") {
it.item.itemStack.amount
}
}
/**
* 以捡起的物品数量为计数单位,并非捡起的次数。
*/
override fun getCount(profile: PlayerProfile, task: Task, event: EntityPickupItemEvent): Int {
return event.item.itemStack.amount
}
好了,完成了。完整的代码看看这里 -> IItemPick.kt,现在只需要向 Chemdah 注册就可以了。
override fun onEnable() {
// 由 ink.ptms.chemdah.core.quest.QuestLoader 提供的扩展方法
IItemPick.register()
}