普特莫斯维基 (Purtmars Wikipedia 📖)

“Chemdah 开发者文档:自定义对话主题”的版本间的差异

来自Purtmars Wikipedia —— 普特莫斯维基
第52行: 第52行:
  
 
= 实现 =
 
= 实现 =
首先继承 ThemeSettings 类,若没有特殊需求则不需要额外读取数据。数据来源由 Theme 类决定,可自行定义。
+
继承 Theme 与 ThemeSettings 类,并实现部分简单的逻辑。
 
<syntaxhighlight lang="kotlin" line="line">
 
<syntaxhighlight lang="kotlin" line="line">
 
class ThemeDemoSettings(root: ConfigurationSection) : ThemeSettings(root)
 
class ThemeDemoSettings(root: ConfigurationSection) : ThemeSettings(root)
</syntaxhighlight>
 
  
其次继承 Theme 类,并进行注册与配置定义。
 
<syntaxhighlight lang="kotlin" line="line">
 
 
class ThemeDemo : Theme<ThemeDemoSettings>() {
 
class ThemeDemo : Theme<ThemeDemoSettings>() {
 
    init {
 
        // 注册 demo 对话风格到插件
 
        register("demo")
 
    }
 
 
      
 
      
 
     /**
 
     /**
     * 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml
+
     * 初始化配置文件,并将其指向 plugins/Chemdah/core/conversation.yml 文件
 
     */
 
     */
 
     override fun getConfig(): ThemeDemoSettings {
 
     override fun getConfig(): ThemeDemoSettings {
第73行: 第65行:
 
     }
 
     }
  
     override fun npcTalk(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
+
    /**
 +
    * 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言
 +
    */
 +
     override fun begin(session: Session): CompletableFuture<Void> {
 +
        // 粒子播放行为
 +
        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 display(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
 
         TODO("Not yet implemented")
 
         TODO("Not yet implemented")
 
     }
 
     }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
接下来的渲染 NPC 发言是'''至关重要'''的部分,在 npcTalk 方法中提供了一个 message 参数代表 NPC 说的话。我们不需要再做任何处理。需要注意的是玩家的任何回复都可能存在条件判断,所以无论是渲染还是在执行回复时都需要进行条件判断,以免发生越权行为。

2021年5月6日 (四) 00:06的版本

目录

对话主题

注册自定义对话主题需要分别实现 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 reset(session: Session): CompletableFuture<Void>
24 
25 /**
26  * 会话开始之前,在原版 chat 对话模式中用于播放音效特效等
27  * 使用时必须返回 super.begin(session)
28  */
29 open fun begin(session: Session): CompletableFuture<Void>
30 
31 /**
32  * 会话结束时,目前未被使用
33  */
34 open fun end(session: Session): CompletableFuture<Void>
35 
36 /**
37  * 初始化对话配置文件
38  */
39 abstract fun getConfig(): T
40 
41 /**
42  * 会话渲染时
43  * @param canReply 是否可以回复
44  */
45 abstract fun npcTalk(session: Session, message: List<String>, canReply: Boolean = true): CompletableFuture<Void>

实现

继承 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 getConfig(): ThemeDemoSettings {
 9         return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!)
10     }
11 
12     /**
13      * 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言
14      */
15     override fun begin(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 display(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
23         TODO("Not yet implemented")
24     }
25 }

接下来的渲染 NPC 发言是至关重要的部分,在 npcTalk 方法中提供了一个 message 参数代表 NPC 说的话。我们不需要再做任何处理。需要注意的是玩家的任何回复都可能存在条件判断,所以无论是渲染还是在执行回复时都需要进行条件判断,以免发生越权行为。