普特莫斯维基 (Purtmars Wikipedia 📖)

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

来自Purtmars Wikipedia —— 普特莫斯维基
(建立内容为“{{:Chemdah 开发者文档}} = 自定义任务目标 = 所有的任务目标均继承自 '''ink.ptms.chemdah.core.quest.objective.Objective''' ([https://github.co…”的新页面)
 
第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>
+
让我们以一个最简单的玩家捡起物品任务目标为例,首先确定任务的计数类型是整数还是浮点数。<br>
方块破坏必然是整数计数,固继承自 '''ObjectiveCountableI''' 类。
+
物品的数量必然是整数,固继承自 '''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>
 +
 
 +
至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。
 +
 
 +
<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 onEnable() {
 +
    IItemPick.register()
 +
}
 +
</syntaxhighlight>

2021年5月7日 (五) 00:59的版本

Chemdah 开发者文档

自定义任务目标

所有的任务目标均继承自 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 类。

object IItemPick : ObjectiveCountableI() {

    /**
     * 统一识别名称
     */
    override val name = "pickup item"

    /**
     * Bukkit 事件
     */
    override val event = EntityPickupItemEvent::class

任何一个任务事件都必须可以获取到一个有效的玩家对象来进行任务,在初始化方法中调用 handler 方法试试看。

    init {
        handler {
            // 返回 EntityPickupItemEvent 事件下的玩家对象
            entity as? Player
        }
    }

至此一个最简单的任务目标便完成了,但这还远远不够。因为这个任务目标还未注册任何条件。

    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 onEnable() {
    IItemPick.register()
}