普特莫斯维基 (Purtmars Wikipedia 📖)

“Chemdah 开发者文档:自定义任务目标”的版本间的差异

来自Purtmars Wikipedia —— 普特莫斯维基
 
(未显示同一用户的4个中间版本)
第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>
第24行: 第24行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
任何一个任务事件都必须可以获取到一个有效的玩家对象来进行任务,在初始化方法中调用 '''handler''' 方法试试看。
+
任何一个任务事件都必须存在一个有效的玩家对象来进行任务,在初始化方法中调用 '''handler''' 方法试试看。
  
 
<syntaxhighlight lang="kotlin" line="line" start=13>
 
<syntaxhighlight lang="kotlin" line="line" start=13>
第35行: 第35行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
如果 '''handler''' 方法未返回任何内容,则事件不会继续。 <br>
 
至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。
 
至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。
  
第72行: 第73行:
  
 
<syntaxhighlight lang="kotlin" line="line">
 
<syntaxhighlight lang="kotlin" line="line">
override onEnable() {
+
override fun onEnable() {
 +
    // 由 ink.ptms.chemdah.core.quest.QuestLoader 提供的扩展方法
 
     IItemPick.register()
 
     IItemPick.register()
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

2021年5月7日 (五) 01:04的最新版本

目录

自定义任务目标

所有的任务目标均继承自 ink.ptms.chemdah.core.quest.objective.Objective (Github) 类,这里不在过多赘述。
本章内容只列出以下两个由 Chemdah 封装后的二级任务目标接口。

  • 整型可计数任务目标 ink.ptms.chemdah.core.quest.objective.ObjectiveCountableI.kt (Github)
  • 浮点可计数任务目标 ink.ptms.chemdah.core.quest.objective.ObjectiveCountableF.kt (Github)

捡起物品

让我们以一个最简单的玩家捡起物品任务目标为例,首先确定任务的计数类型是整数还是浮点数。
物品的数量必然是整数,固继承自 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 }