Chemdah 开发者文档:自定义对话主题
来自Purtmars Wikipedia —— 普特莫斯维基
目录
- Chemdah
- 开始
- 基本
- 事件
- ink.ptms.chemdah.api.event.collect.ConversationEvents
- ink.ptms.chemdah.api.event.collect.ObjectiveEvents
- ink.ptms.chemdah.api.event.collect.PlayerEvents
- ink.ptms.chemdah.api.event.collect.QuestEvents
- ink.ptms.chemdah.api.event.collect.TemplateEvents
- ink.ptms.chemdah.api.event.InferEntityHookEvent
- ink.ptms.chemdah.api.event.InferItemHookEvent
- ink.ptms.chemdah.api.event.PartyHookEvent
- 对话相关
- 数据相关
- 任务相关
对话主题
注册自定义对话主题需要分别实现 Theme 与 ThemeSettings 类,在本章文档中我们会从零开始注册一个简单的聊天框对话主题。
ink.ptms.chemdah.core.conversation.theme.Theme
1 /**
2 * 注册到 ChemdahAPI 中
3 */
4 fun register(name)
5
6 /**
7 * 当配置文件被重载
8 * 使用时必须调用 super.reloadConfig()
9 */
10 open fun reloadConfig()
11
12 /**
13 * 是否支持告别
14 * 即结束对话时使用 talk 语句创建没有回复的对话信息
15 * 在原版 chat 对话模式中支持告别,而 chest 不支持(会被转换为 Holographic 信息)
16 */
17 open fun allowFarewell()
18
19 /**
20 * 重置会话时(即 begin 之前)
21 * 在原版 chat 对话模式中用于归位玩家所选择的回复序号,而 chest 中没有使用
22 */
23 open fun onReset(session: Session): CompletableFuture<Void>
24
25 /**
26 * 会话开始之前,在原版 chat 对话模式中用于播放音效特效等
27 * 使用时必须返回 super.begin(session)
28 */
29 open fun onBegin(session: Session): CompletableFuture<Void>
30
31 /**
32 * 会话结束时,目前未被使用
33 */
34 open fun onClose(session: Session): CompletableFuture<Void
35
36 /**
37 * 会话渲染时
38 * @param canReply 是否可以回复
39 */
40 abstract fun onDisplay(session: Session, message: List<String>, canReply: Boolean = true): CompletableFuture<Void>
41
42 /**
43 * 初始化对话配置文件
44 */
45 abstract fun createConfig(): T
实现
继承 Theme 与 ThemeSettings 类,并实现部分简单的逻辑。
1 class ThemeDemoSettings(root: ConfigurationSection) : ThemeSettings(root)
2
3 class ThemeDemo : Theme<ThemeDemoSettings>() {
4
5 /**
6 * 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml 文件
7 */
8 override fun createConfig(): ThemeDemoSettings {
9 return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!)
10 }
11
12 /**
13 * 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言
14 */
15 override fun onBegin(session: Session): CompletableFuture<Void> {
16 // 粒子播放行为
17 Effects.create(Particle.CLOUD, session.origin.clone().add(0.0, 0.5, 0.0)).count(5).player(session.player).play()
18 // 必须返回这段代码,否则需要自行实现父类逻辑
19 return super.begin(session)
20 }
21
22 override fun onDisplay(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
23 TODO("Not yet implemented")
24 }
25 }
对话展示过程的逻辑是至关重要的部分。方法中的 message 参数代表 NPC 说的话,不需要再做任何处理。
38 /**
39 * 对话展示过程
40 */
41 override fun onDisplay(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
42 // 使用 Chemdah 提供的扩展方法创建展示逻辑
43 return session.createDisplay { replies ->
44 // NPC 名称
45 session.player.sendMessage("${session.createTitle()}§f:")
46 // NPC 发言
47 session.npcSide.forEach { npc ->
48 session.player.sendMessage(" §8\" §7$npc §8\"")
49 }
50 session.player.sendMessage("")
51 // 玩家回复
52 replies.forEachIndexed { index, reply ->
53 // 创建 Tellraw 信息并在点击后执行特殊命令
54 TellrawJson.create().append("§f$index. §7${reply.build(session)}")
55 .clickCommand("/session reply ${reply.uuid}")
56 .send(session.player)
57 }
58 }
59 }
60 }
现在我们完成了对话的展示部分。
当玩家点击回复后会执行 /session 并转交给 Chemdah 命令接口,至此不需要再做任何处理。需要注意的是玩家的任何回复都可能存在条件判断,所以无论是渲染还是在执行回复时都需要进行条件判断,以免发生越权行为。若不使用命令接口,则可以通过借鉴 ink.ptms.chemdah.core.conversation.theme.ThemeChest 中的代码了解如何通过 API 接口完成。