普特莫斯维基 (Purtmars Wikipedia 📖)

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

来自Purtmars Wikipedia —— 普特莫斯维基
 
(未显示同一用户的9个中间版本)
第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 reset(session: Session): CompletableFuture<Void>
+
open fun onReset(session: Session): CompletableFuture<Void>
  
 
/**
 
/**
第32行: 第32行:
 
  * 使用时必须返回 super.begin(session)
 
  * 使用时必须返回 super.begin(session)
 
  */
 
  */
open fun begin(session: Session): CompletableFuture<Void>
+
open fun onBegin(session: Session): CompletableFuture<Void>
  
 
/**
 
/**
 
  * 会话结束时,目前未被使用
 
  * 会话结束时,目前未被使用
 
  */
 
  */
open fun end(session: Session): CompletableFuture<Void>
+
open fun onClose(session: Session): CompletableFuture<Void
  
 
/**
 
/**
  * 初始化对话配置文件
+
  * 会话渲染时
 +
* @param canReply 是否可以回复
 
  */
 
  */
abstract fun getConfig(): T
+
abstract fun onDisplay(session: Session, message: List<String>, canReply: Boolean = true): CompletableFuture<Void>
  
 
/**
 
/**
  * 会话渲染时
+
  * 初始化对话配置文件
* @param canReply 是否可以回复
 
 
  */
 
  */
abstract fun npcTalk(session: Session, message: List<String>, canReply: Boolean = true): CompletableFuture<Void>
+
abstract fun createConfig(): T
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
= 实现 =
 
= 实现 =
首先继承 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 createConfig(): ThemeDemoSettings {
 
         return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!)
 
         return ThemeDemoSettings(ConversationManager.conf.getConfigurationSection("theme-demo")!!)
 
     }
 
     }
  
     override fun npcTalk(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
+
    /**
 +
    * 对话开始之前,在 NPC 头顶播放一团粒子,示意 NPC 正在发言
 +
    */
 +
     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()
 +
        // 必须返回这段代码,否则需要自行实现父类逻辑
 +
        return super.begin(session)
 +
    }
 +
 
 +
    override fun onDisplay(session: Session, message: List<String>, canReply: Boolean): CompletableFuture<Void> {
 
         TODO("Not yet implemented")
 
         TODO("Not yet implemented")
 
     }
 
     }
 
}
 
}
 
</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的最新版本

目录

对话主题

注册自定义对话主题需要分别实现 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 接口完成。