跳到主要内容

事件参考

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注册自定义物品识别器
PartyHookEventplugin: String, party: Party?注册自定义队伍实现
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
}
}
}