跳到主要内容

事件参考

Chemdah 的所有事件均继承自 TabooLib 的 BukkitProxyEvent,通过 @SubscribeEvent 注解监听。

提示

BukkitProxyEvent 默认支持取消(isCancelled = true),但部分事件标注了 allowCancelled = false,表示该事件不可取消。

任务事件(QuestEvents)

事件主要字段可取消说明
Accept.Prequest: Template, playerProfile, reason: String?任务被接受前,可修改 reason
Accept.Postquest: Quest, playerProfile任务接受后
Complete.Prequest: Quest, playerProfile任务完成前
Complete.Postquest: Quest, playerProfile任务完成后
Fail.Prequest: Quest, playerProfile任务失败前
Fail.Postquest: Quest, playerProfile任务失败后
Restart.Prequest: Quest, playerProfile任务重置前
Restart.Postquest: Quest, playerProfile任务重置后
Registeredquest: Quest, playerProfile任务注册到玩家数据时
Unregisteredquest: Quest, playerProfile任务从玩家数据注销时
AgentquestContainer, playerProfile, agentType, restrict任务脚本代理执行时
DataSet.Preplayer, playerProfile: PlayerProfile, quest, dataContainer, key, value: Data任务数据设置前,可修改 value
DataSet.Postplayer, playerProfile: PlayerProfile, quest, dataContainer, key, value: Data任务数据设置后
DataRemove.Preplayer, playerProfile: PlayerProfile, quest, dataContainer, key任务数据移除前
DataRemove.Postplayer, playerProfile: PlayerProfile, quest, dataContainer, key任务数据移除后
ScoreboardTrackcontent: MutableList<String>, playerProfile追踪记分板内容更新时,可修改列表

条目事件(ObjectiveEvents)

事件主要字段可取消说明
Continue.Preobjective, task, quest, playerProfile条目进度推进前
Continue.Postobjective, task, quest, playerProfile条目进度推进后
Complete.Preobjective, task, quest, playerProfile条目完成前
Complete.Postobjective, task, quest, playerProfile条目完成后
Restart.Preobjective, task, quest, playerProfile条目重置前
Restart.Postobjective, task, quest, playerProfile条目重置后

对话事件(ConversationEvents)

事件主要字段可取消说明
Loadfile: File?, option, root对话文件加载时
Selectplayer, namespace, id, conversation?, source?玩家触发对话选择时,可替换 conversation
Preconversation, session, relay对话开始前
Beginconversation, session, relay对话渲染时
Postconversation, session, relay对话开始后
SelectReplyplayer, session, reply: PlayerReply玩家选择回复时
Agentconversation, session, agentType对话脚本代理执行时
Closesession, refuse, conversation对话结束前
Closedsession, refuse, conversation对话结束后
ReplyClosedsession, conversation玩家通过回复正常结束对话时(先于 Closed)
Cancelledconversation, session, relay对话被取消时
ChestThemeBuildsession, message, canReply, inventory箱子主题页面构建完成后

玩家事件(PlayerEvents)

事件主要字段可取消说明
Selectedplayer, playerProfile玩家数据加载完成
Releasedplayer玩家离开服务器,可通过 await() 挂起异步任务
Updatedplayer, playerProfile玩家数据更新时
Trackplayer, playerProfile, trackingQuest?, cancel玩家切换任务追踪时
LevelChangeplayer, option, oldLevel, oldExperience, newLevel, newExperience自定义等级数据变动,可修改 newLevel/newExperience
ScenesBlockBreakplayer, blockData玩家破坏演出方块(默认已取消)
ScenesBlockInteractplayer, blockData玩家交互演出方块
Triggerplayer, value: String玩家唤起 Trigger 类型任务时
DataSet.Preplayer, playerProfile, dataContainer, key, value: Data玩家数据设置前
DataSet.Postplayer, playerProfile, dataContainer, key, value: Data玩家数据设置后
DataRemove.Preplayer, playerProfile, dataContainer, key玩家数据移除前
DataRemove.Postplayer, playerProfile, dataContainer, key玩家数据移除后

模板事件(TemplateEvents)

事件主要字段可取消说明
Loadfile: File?, id: String, root任务模板加载时
ControlHooktemplate, type, map, control?控制器挂钩,可通过设置 control 注入自定义控制器

Hook 事件

用于第三方插件注册自定义实体、方块、物品或队伍的识别器。

事件主要字段说明
InferEntityHookEventid: String, entityClass注册自定义实体识别器
InferBlockHookEventid: String, blockClass注册自定义方块识别器
InferItemHookEventid: String, itemClass注册自定义物品识别器
PartyHookEventid: String, partyClass注册自定义队伍实现
PlaceholderHookEventplayer, profile, identifier: String, parameter: String, result注册自定义 Placeholder 处理器

监听示例

监听任务接受与完成
import ink.ptms.chemdah.api.event.collect.QuestEvents
import taboolib.common.platform.event.SubscribeEvent

object QuestListener {

@SubscribeEvent
fun onAcceptPre(e: QuestEvents.Accept.Pre) {
// 阻止特定任务被接受
if (e.quest.id == "forbidden_quest") {
e.isCancelled = true
e.reason = "该任务当前不可接受"
}
}

@SubscribeEvent
fun onComplete(e: QuestEvents.Complete.Post) {
val player = e.playerProfile.player ?: return
player.sendMessage("恭喜完成任务:${e.quest.id}")
}
}
监听玩家数据加载
import ink.ptms.chemdah.api.event.collect.PlayerEvents
import taboolib.common.platform.event.SubscribeEvent

object ProfileListener {

@SubscribeEvent
fun onSelected(e: PlayerEvents.Selected) {
// 玩家数据就绪后执行初始化逻辑
val profile = e.playerProfile
if (profile.persistentDataContainer["first_join"] == null) {
profile.persistentDataContainer["first_join"] = System.currentTimeMillis().toString()
}
}
}
监听对话选择
import ink.ptms.chemdah.api.event.collect.ConversationEvents
import taboolib.common.platform.event.SubscribeEvent

object ConversationListener {

@SubscribeEvent
fun onSelect(e: ConversationEvents.Select) {
// 可以在这里替换或取消对话
if (e.player.hasPermission("vip.bypass")) {
e.conversation = null
e.isCancelled = true
}
}
}