插件️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 直接相关:
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Selected | player, playerProfile | ✗ | 档案已写入缓存;此后可用 player.chemdahProfile |
Updated | player, playerProfile | ✗ | PlayerProfile.push() 写盘成功后 |
Released | player | ✗ | 数据释放流程开始(默认 Quit,或 Database.releaseProfile) |
Released 提供 await(runnable) 注册异步收尾,以及 wait():先 call() 再等待全部 await 任务。Chemdah 在 MONITOR 阶段监听 Released,在 isDisableAutoSave = false 时执行 push 并移除 playerProfile 缓存。
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Track | player, playerProfile, trackingQuest?, cancel | ✓ | 玩家切换任务追踪 |
LevelChange | player, option, oldLevel, oldExperience, newLevel, newExperience | ✓ | 自定义等级变动,可改 newLevel / newExperience |
ScenesBlockBreak | player, blockData | ✓ | 破坏演出方块(构造时默认已取消) |
ScenesBlockInteract | player, blockData | ✗ | 交互演出方块 |
Trigger | player, value: String | ✓ | Player.callTrigger 或等价逻辑唤起前 |
DataSet.Pre / Post | player, playerProfile, dataContainer, key, value | Pre ✓ | 玩家级 DataContainer 读写 |
DataRemove.Pre / Post | player, playerProfile, dataContainer, key | Pre ✓ | 玩家级键移除 |
任务事件
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Accept.Pre | quest: Template, playerProfile, reason: String? | ✓ | 接受前,可改 reason |
Accept.Post | quest: Quest, playerProfile | ✗ | 接受后 |
Complete.Pre / Post | quest: Quest, playerProfile | Pre ✓ | 任务完成前后 |
Fail.Pre / Post | quest: Quest, playerProfile | Pre ✓ | 任务失败(放弃)前后 |
Restart.Pre / Post | quest: Quest, playerProfile | Pre ✓ | 任务重置前后 |
Registered | quest: Quest, playerProfile | ✗ | 任务注册到玩家档案 |
Unregistered | quest: Quest, playerProfile | ✗ | 任务从档案注销 |
Agent | questContainer, playerProfile, agentType, restrict | ✓ | 任务脚本代理执行 |
DataSet.Pre / Post | player, playerProfile, quest, dataContainer, key, value | Pre ✓ | 任务实例数据设置 |
DataRemove.Pre / Post | player, playerProfile, quest, dataContainer, key | Pre ✓ | 任务实例数据移除 |
ScoreboardTrack | content: MutableList<String>, playerProfile | ✗ | 追踪记分板行更新,可改 content |
QuestEvents.Collect 已废弃,请改用 ChemdahAPI.eventFactory 相关机制。
条目事件
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Continue.Pre / Post | objective, task, quest, playerProfile | Pre ✓ | 条目进度推进 |
Complete.Pre / Post | objective, task, quest, playerProfile | Pre ✓ | 条目完成 |
Restart.Pre / Post | objective, task, quest, playerProfile | Pre ✓ | 条目重置 |
对话事件
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Load | file: File?, option, root | ✓ | 对话文件加载 |
Select | player, namespace, id: List<String>, conversation?, source? | ✓ | 对话选择前,可替换 conversation |
Pre | conversation, session, relay | ✓ | 对话开始前 |
Begin | conversation, session, relay | ✗ | 对话渲染 |
Post | conversation, session, relay | ✗ | 对话开始后 |
SelectReply | player, session, reply: PlayerReply | ✓ | 玩家选择回复 |
Agent | conversation, session, agentType | ✓ | 对话脚本代理 |
Close | session, refuse, conversation | ✓ | 对话结束前 |
Closed | session, refuse, conversation | ✗ | 对话结束后 |
ReplyClosed | session, conversation | ✗ | 通过回复正常结束(先于 Closed) |
Cancelled | conversation, session, relay | ✗ | 对话被取消 |
ChestThemeBuild | session, message, canReply, inventory | ✗ | 箱子主题页面构建完成 |
模板事件
| 事件 | 主要字段 | 可取消 | 说明 |
|---|---|---|---|
Load | file: File?, id: String, root | ✓ | 任务模板加载 |
ControlHook | template, type, map, control? | ✗ | 控制器挂钩,可注入 control |
重载事件
ChemdahAPI.reloadAll() 或内部重载流程触发,均不可取消。
| 事件 | 主要字段 | 说明 |
|---|---|---|
Quest | isInt: Boolean | 任务配置重载;首次多在 ACTIVE |
Conversation | — | 对话重载;首次多在 ACTIVE |
Module | — | 模块重载;首次可能在 ENABLE(未必能监听到) |
WizardModel | — | Wizard 模块重载且数据已加载;首次多在 ACTIVE |
Hook 事件
第三方注册自定义识别器或扩展,包名 ink.ptms.chemdah.api.event。
| 事件 | 主要字段 | 说明 |
|---|---|---|
InferEntityHookEvent | id, entityClass | 注册 InferEntity 实现类 |
InferBlockHookEvent | id, blockClass | 注册 InferBlock 实现类 |
InferItemHookEvent | id, itemClass | 注册 InferItem 实现类 |
PartyHookEvent | plugin, party? | 自定义队伍实现 |
PlaceholderHookEvent | player, 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
}
}
}