“Chemdah 开发者文档:自定义对话主题”的版本间的差异
来自Purtmars Wikipedia —— 普特莫斯维基
(→对话主题) |
(→对话主题) |
||
(未显示同一用户的7个中间版本) | |||
第2行: | 第2行: | ||
= 对话主题 = | = 对话主题 = | ||
注册自定义对话主题需要分别实现 Theme 与 ThemeSettings 类,在本章文档中我们会从零开始注册一个简单的聊天框对话主题。<br> | 注册自定义对话主题需要分别实现 Theme 与 ThemeSettings 类,在本章文档中我们会从零开始注册一个简单的聊天框对话主题。<br> | ||
− | '''ink.ptms.chemdah.core.conversation.theme.Theme''' | + | 以下是 '''ink.ptms.chemdah.core.conversation.theme.Theme''' 提供的所有方法。 |
<syntaxhighlight lang="kotlin" line="line"> | <syntaxhighlight lang="kotlin" line="line"> | ||
/** | /** | ||
第26行: | 第26行: | ||
* 在原版 chat 对话模式中用于归位玩家所选择的回复序号,而 chest 中没有使用 | * 在原版 chat 对话模式中用于归位玩家所选择的回复序号,而 chest 中没有使用 | ||
*/ | */ | ||
− | open fun | + | open fun onReset(session: Session): CompletableFuture<Void> |
/** | /** | ||
第32行: | 第32行: | ||
* 使用时必须返回 super.begin(session) | * 使用时必须返回 super.begin(session) | ||
*/ | */ | ||
− | open fun | + | open fun onBegin(session: Session): CompletableFuture<Void> |
/** | /** | ||
* 会话结束时,目前未被使用 | * 会话结束时,目前未被使用 | ||
*/ | */ | ||
− | open fun | + | open fun onClose(session: Session): CompletableFuture<Void |
/** | /** | ||
第43行: | 第43行: | ||
* @param canReply 是否可以回复 | * @param canReply 是否可以回复 | ||
*/ | */ | ||
− | abstract fun | + | abstract fun onDisplay(session: Session, message: List<String>, canReply: Boolean = true): CompletableFuture<Void> |
/** | /** | ||
* 初始化对话配置文件 | * 初始化对话配置文件 | ||
*/ | */ | ||
− | abstract fun | + | abstract fun createConfig(): T |
</syntaxhighlight> | </syntaxhighlight> | ||
第61行: | 第61行: | ||
* 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml 文件 | * 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml 文件 | ||
*/ | */ | ||
− | override fun | + | override fun createConfig(): ThemeDemoSettings { |
return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!) | return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!) | ||
} | } | ||
第68行: | 第68行: | ||
* 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言 | * 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言 | ||
*/ | */ | ||
− | override fun | + | override fun onBegin(session: Session): CompletableFuture<Void> { |
// 粒子播放行为 | // 粒子播放行为 | ||
Effects.create(Particle.CLOUD, session.origin.clone().add(0.0, 0.5, 0.0)).count(5).player(session.player).play() | Effects.create(Particle.CLOUD, session.origin.clone().add(0.0, 0.5, 0.0)).count(5).player(session.player).play() | ||
第75行: | 第75行: | ||
} | } | ||
− | override fun | + | override fun onDisplay(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> { |
TODO("Not yet implemented") | TODO("Not yet implemented") | ||
} | } | ||
第81行: | 第81行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | '''对话展示过程的逻辑是'''至关重要'''的部分。'''方法中的 message 参数代表 NPC 说的话,不需要再做任何处理。 | |
+ | |||
+ | <syntaxhighlight lang="kotlin" line="line" start=22> | ||
+ | /** | ||
+ | * 对话展示过程 | ||
+ | */ | ||
+ | override fun onDisplay(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> { | ||
+ | // 使用 Chemdah 提供的扩展方法创建展示逻辑 | ||
+ | return session.createDisplay { replies -> | ||
+ | // NPC 名称 | ||
+ | session.player.sendMessage("${session.createTitle()}§f:") | ||
+ | // NPC 发言 | ||
+ | session.npcSide.forEach { npc -> | ||
+ | session.player.sendMessage(" §8\" §7$npc §8\"") | ||
+ | } | ||
+ | session.player.sendMessage("") | ||
+ | // 是否启用玩家回复(若支持告别则需要判断该参数) | ||
+ | if (canReply) { | ||
+ | replies.forEachIndexed { index, reply -> | ||
+ | // 创建 Tellraw 信息并在点击后执行特殊命令 | ||
+ | TellrawJson.create().append("§f$index. §7${reply.build(session)}") | ||
+ | .clickCommand("/session reply ${reply.uuid}") | ||
+ | .send(session.player) | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''现在我们完成了对话的展示部分。'''<br> | ||
+ | 当玩家点击回复后会执行 '''/session''' 并转交给 Chemdah 命令接口,至此不需要再做任何处理。需要注意的是玩家的任何回复都可能存在条件判断,所以无论是渲染还是在执行回复时都需要进行条件判断,以免发生<span style="color: red">越权</span>行为。若不使用命令接口,则可以通过借鉴 '''ink.ptms.chemdah.core.conversation.theme.ThemeChest''' 中的代码了解如何通过 API 接口完成。 |
2021年5月6日 (四) 17:38的最新版本
目录
- 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 提供的所有方法。
/**
* 注册到 ChemdahAPI 中
*/
fun register(name)
/**
* 当配置文件被重载
* 使用时必须调用 super.reloadConfig()
*/
open fun reloadConfig()
/**
* 是否支持告别
* 即结束对话时使用 talk 语句创建没有回复的对话信息
* 在原版 chat 对话模式中支持告别,而 chest 不支持(会被转换为 Holographic 信息)
*/
open fun allowFarewell()
/**
* 重置会话时(即 begin 之前)
* 在原版 chat 对话模式中用于归位玩家所选择的回复序号,而 chest 中没有使用
*/
open fun onReset(session: Session): CompletableFuture
/**
* 会话开始之前,在原版 chat 对话模式中用于播放音效特效等
* 使用时必须返回 super.begin(session)
*/
open fun onBegin(session: Session): CompletableFuture
/**
* 会话结束时,目前未被使用
*/
open fun onClose(session: Session): CompletableFuture, canReply: Boolean = true): CompletableFuture
/**
* 初始化对话配置文件
*/
abstract fun createConfig(): T
实现
继承 Theme 与 ThemeSettings 类,并实现部分简单的逻辑。
class ThemeDemoSettings(root: ConfigurationSection) : ThemeSettings(root)
class ThemeDemo : Theme() {
/**
* 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml 文件
*/
override fun createConfig(): ThemeDemoSettings {
return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!)
}
/**
* 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言
*/
override fun onBegin(session: Session): CompletableFuture {
// 粒子播放行为
Effects.create(Particle.CLOUD, session.origin.clone().add(0.0, 0.5, 0.0)).count(5).player(session.player).play()
// 必须返回这段代码,否则需要自行实现父类逻辑
return super.begin(session)
}
override fun onDisplay(session: Session, message: List, canReply: Boolean): CompletableFuture {
TODO("Not yet implemented")
}
}
对话展示过程的逻辑是至关重要的部分。方法中的 message 参数代表 NPC 说的话,不需要再做任何处理。
/**
* 对话展示过程
*/
override fun onDisplay(session: Session, message: List, canReply: Boolean): CompletableFuture {
// 使用 Chemdah 提供的扩展方法创建展示逻辑
return session.createDisplay { replies ->
// NPC 名称
session.player.sendMessage("${session.createTitle()}§f:")
// NPC 发言
session.npcSide.forEach { npc ->
session.player.sendMessage(" §8\" §7$npc §8\"")
}
session.player.sendMessage("")
// 是否启用玩家回复(若支持告别则需要判断该参数)
if (canReply) {
replies.forEachIndexed { index, reply ->
// 创建 Tellraw 信息并在点击后执行特殊命令
TellrawJson.create().append("§f$index. §7${reply.build(session)}")
.clickCommand("/session reply ${reply.uuid}")
.send(session.player)
}
}
}
}
}
现在我们完成了对话的展示部分。
当玩家点击回复后会执行 /session 并转交给 Chemdah 命令接口,至此不需要再做任何处理。需要注意的是玩家的任何回复都可能存在条件判断,所以无论是渲染还是在执行回复时都需要进行条件判断,以免发生越权行为。若不使用命令接口,则可以通过借鉴 ink.ptms.chemdah.core.conversation.theme.ThemeChest 中的代码了解如何通过 API 接口完成。