“Chemdah 开发者文档:自定义任务目标”的版本间的差异
来自Purtmars Wikipedia —— 普特莫斯维基
(建立内容为“{{:Chemdah 开发者文档}} = 自定义任务目标 = 所有的任务目标均继承自 '''ink.ptms.chemdah.core.quest.objective.Objective''' ([https://github.co…”的新页面) |
|||
(未显示同一用户的5个中间版本) | |||
第1行: | 第1行: | ||
− | {{:Chemdah | + | {{:Chemdah 开发者文档目录}} |
= 自定义任务目标 = | = 自定义任务目标 = | ||
所有的任务目标均继承自 '''ink.ptms.chemdah.core.quest.objective.Objective''' ([https://github.com/TabooLib/Chemdah/blob/master/src/main/java/ink/ptms/chemdah/core/quest/objective/Objective.kt Github]) 类,这里不在过多赘述。<br> | 所有的任务目标均继承自 '''ink.ptms.chemdah.core.quest.objective.Objective''' ([https://github.com/TabooLib/Chemdah/blob/master/src/main/java/ink/ptms/chemdah/core/quest/objective/Objective.kt Github]) 类,这里不在过多赘述。<br> | ||
第6行: | 第6行: | ||
* 浮点可计数任务目标 '''ink.ptms.chemdah.core.quest.objective.ObjectiveCountableF.kt''' ([https://github.com/TabooLib/Chemdah/blob/master/src/main/java/ink/ptms/chemdah/core/quest/objective/ObjectiveCountableF.kt Github])<br> | * 浮点可计数任务目标 '''ink.ptms.chemdah.core.quest.objective.ObjectiveCountableF.kt''' ([https://github.com/TabooLib/Chemdah/blob/master/src/main/java/ink/ptms/chemdah/core/quest/objective/ObjectiveCountableF.kt Github])<br> | ||
− | = | + | = 捡起物品 = |
− | + | 让我们以一个最简单的玩家捡起物品任务目标为例,首先确定任务的计数类型是整数还是浮点数。<br> | |
− | + | 物品的数量必然是整数,固继承自 '''ObjectiveCountableI''' 类。 | |
+ | |||
+ | <syntaxhighlight lang="kotlin" line="line"> | ||
+ | object IItemPick : ObjectiveCountableI<EntityPickupItemEvent>() { | ||
+ | |||
+ | /** | ||
+ | * 统一识别名称 | ||
+ | */ | ||
+ | override val name = "pickup item" | ||
+ | |||
+ | /** | ||
+ | * Bukkit 事件 | ||
+ | */ | ||
+ | override val event = EntityPickupItemEvent::class | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 任何一个任务事件都必须存在一个有效的玩家对象来进行任务,在初始化方法中调用 '''handler''' 方法试试看。 | ||
+ | |||
+ | <syntaxhighlight lang="kotlin" line="line" start=13> | ||
+ | init { | ||
+ | handler { | ||
+ | // 返回 EntityPickupItemEvent 事件下的玩家对象 | ||
+ | entity as? Player | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 如果 '''handler''' 方法未返回任何内容,则事件不会继续。 <br> | ||
+ | 至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。 | ||
+ | |||
+ | <syntaxhighlight lang="kotlin" line="line" start=13> | ||
+ | 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 | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 好了,完成了。完整的代码看看这里 -> [https://github.com/TabooLib/Chemdah/tree/master/src/main/java/ink/ptms/chemdah/core/quest/objective/bukkit/IItemPick.kt IItemPick.kt],现在只需要向 Chemdah 注册就可以了。 | ||
+ | |||
+ | <syntaxhighlight lang="kotlin" line="line"> | ||
+ | override fun onEnable() { | ||
+ | // 由 ink.ptms.chemdah.core.quest.QuestLoader 提供的扩展方法 | ||
+ | IItemPick.register() | ||
+ | } | ||
+ | </syntaxhighlight> |
2021年5月7日 (五) 01:04的最新版本
目录
- 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 类。
1 object IItemPick : ObjectiveCountableI<EntityPickupItemEvent>() {
2
3 /**
4 * 统一识别名称
5 */
6 override val name = "pickup item"
7
8 /**
9 * Bukkit 事件
10 */
11 override val event = EntityPickupItemEvent::class
任何一个任务事件都必须存在一个有效的玩家对象来进行任务,在初始化方法中调用 handler 方法试试看。
13 init {
14 handler {
15 // 返回 EntityPickupItemEvent 事件下的玩家对象
16 entity as? Player
17 }
18 }
如果 handler 方法未返回任何内容,则事件不会继续。
至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。
13 init {
14 handler {
15 // 返回 EntityPickupItemEvent 事件下的玩家对象
16 entity as? Player
17 }
18 // 注册一个条件,判断玩家所在位置
19 addCondition("position") { e ->
20 toPosition().inside(e.entity.location)
21 }
22 // 注册一个条件,判断玩家捡起的物品
23 addCondition("item") { e ->
24 toInferItem().isItem(e.item.itemStack)
25 }
26 // 注册一个条件,判断玩家捡起的物品的数量
27 addCondition("amount") { e ->
28 toInt() <= e.item.itemStack.amount
29 }
30 // 将捡起的物品的数量作为变量传入脚本代理,提高操作上限
31 addConditionVariable("amount") {
32 it.item.itemStack.amount
33 }
34 }
35
36 /**
37 * 以捡起的物品数量为计数单位,并非捡起的次数。
38 */
39 override fun getCount(profile: PlayerProfile, task: Task, event: EntityPickupItemEvent): Int {
40 return event.item.itemStack.amount
41 }
好了,完成了。完整的代码看看这里 -> IItemPick.kt,现在只需要向 Chemdah 注册就可以了。
1 override fun onEnable() {
2 // 由 ink.ptms.chemdah.core.quest.QuestLoader 提供的扩展方法
3 IItemPick.register()
4 }