Purtmars Plugins
插件️Chemdah开始开发文档

事件参考

事件参考

本文由 AI 辅助生成,可能存在疏漏或与当前版本不一致。Chemdah 为闭源付费插件,请以你使用的版本、api 依赖与实际运行行为为准;疑问请联系作者或售后群(见 服务)。

Chemdah 事件位于 ink.ptms.chemdah.api.event.collect(及部分 ink.ptms.chemdah.api.event),均继承 TabooLib 的 BukkitProxyEvent,使用 @SubscribeEvent 监听。档案加载与释放与 Database 的关系见 API 参考自定义数据库

BukkitProxyEvent 默认支持取消(isCancelled = true)。标注 allowCancelled = false 的事件不可取消。

档案生命周期

Database.loadProfile / releaseProfile、缓存 ChemdahAPI.playerProfile 直接相关:

事件主要字段可取消说明
Selectedplayer, playerProfile档案已写入缓存;此后可用 player.chemdahProfile
Updatedplayer, playerProfilePlayerProfile.push() 写盘成功后
Releasedplayer数据释放流程开始(默认 Quit,或 Database.releaseProfile

Released 提供 await(runnable) 注册异步收尾,以及 wait():先 call() 再等待全部 await 任务。Chemdah 在 MONITOR 阶段监听 Released,在 isDisableAutoSave = false 时执行 push 并移除 playerProfile 缓存。

事件主要字段可取消说明
Trackplayer, playerProfile, trackingQuest?, cancel玩家切换任务追踪
LevelChangeplayer, option, oldLevel, oldExperience, newLevel, newExperience自定义等级变动,可改 newLevel / newExperience
ScenesBlockBreakplayer, blockData破坏演出方块(构造时默认已取消)
ScenesBlockInteractplayer, blockData交互演出方块
Triggerplayer, value: StringPlayer.callTrigger 或等价逻辑唤起前
DataSet.Pre / Postplayer, playerProfile, dataContainer, key, valuePre ✓玩家级 DataContainer 读写
DataRemove.Pre / Postplayer, playerProfile, dataContainer, keyPre ✓玩家级键移除

任务事件

事件主要字段可取消说明
Accept.Prequest: Template, playerProfile, reason: String?接受前,可改 reason
Accept.Postquest: Quest, playerProfile接受后
Complete.Pre / Postquest: Quest, playerProfilePre ✓任务完成前后
Fail.Pre / Postquest: Quest, playerProfilePre ✓任务失败(放弃)前后
Restart.Pre / Postquest: Quest, playerProfilePre ✓任务重置前后
Registeredquest: Quest, playerProfile任务注册到玩家档案
Unregisteredquest: Quest, playerProfile任务从档案注销
AgentquestContainer, playerProfile, agentType, restrict任务脚本代理执行
DataSet.Pre / Postplayer, playerProfile, quest, dataContainer, key, valuePre ✓任务实例数据设置
DataRemove.Pre / Postplayer, playerProfile, quest, dataContainer, keyPre ✓任务实例数据移除
ScoreboardTrackcontent: MutableList<String>, playerProfile追踪记分板行更新,可改 content

QuestEvents.Collect 已废弃,请改用 ChemdahAPI.eventFactory 相关机制。

条目事件

事件主要字段可取消说明
Continue.Pre / Postobjective, task, quest, playerProfilePre ✓条目进度推进
Complete.Pre / Postobjective, task, quest, playerProfilePre ✓条目完成
Restart.Pre / Postobjective, task, quest, playerProfilePre ✓条目重置

对话事件

事件主要字段可取消说明
Loadfile: File?, option, root对话文件加载
Selectplayer, namespace, id: List<String>, 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箱子主题页面构建完成

模板事件

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

重载事件

ChemdahAPI.reloadAll() 或内部重载流程触发,均不可取消。

事件主要字段说明
QuestisInt: Boolean任务配置重载;首次多在 ACTIVE
Conversation对话重载;首次多在 ACTIVE
Module模块重载;首次可能在 ENABLE(未必能监听到)
WizardModelWizard 模块重载且数据已加载;首次多在 ACTIVE

Hook 事件

第三方注册自定义识别器或扩展,包名 ink.ptms.chemdah.api.event

事件主要字段说明
InferEntityHookEventid, entityClass注册 InferEntity 实现类
InferBlockHookEventid, blockClass注册 InferBlock 实现类
InferItemHookEventid, itemClass注册 InferItem 实现类
PartyHookEventplugin, party?自定义队伍实现
PlaceholderHookEventplayer, profile, identifier, parameter, 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()
        }
    }

    @SubscribeEvent
    fun onReleased(e: PlayerEvents.Released) {
        e.await {
            // 与 Chemdah 写盘并行注册的异步清理(勿阻塞过久)
        }
    }
}
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
        }
    }
}

On this page