diff --git a/README.md b/README.md index c61e261f..bd2b772d 100644 --- a/README.md +++ b/README.md @@ -81,36 +81,36 @@ DMCC 支持三种运行模式,它们是统一架构的不同部署方式: 此模块是项目的核心,**完全不依赖 Minecraft**。它包含了服务端、网络客户端框架、以及所有共享代码。 -- **网络框架 (Netty)**: - - **服务端**: `ServerDMCC`, `NettyServer`, `ServerChannelInitializer` 负责监听连接和处理入站数据。 - - **客户端**: `ClientDMCC`, `NettyClient`, `ClientChannelInitializer` 负责建立和维持与服务端的连接。 - - **协议**: 定义了 `Packet` 接口和具体的数据包(如 `PlayerChatPacket`),并使用 `JsonPacketEncoder`/`Decoder` 进行 JSON 序列化。 -- **Discord 集成 (`DiscordManager`)**: +- **网络框架**: + - **服务端**: 负责监听连接和处理入站数据。 + - **客户端**: 负责建立和维持与服务端的连接。 + - **协议**: 定义了数据包接口和具体的数据包,并使用编码器/解码器进行 JSON 序列化。 +- **Discord 集成**: - 初始化并管理 JDA 实例,监听 Discord 事件(消息、命令)。 - 处理所有与 Discord API 的底层交互。 -- **命令系统 (`CommandManager`, `CommandEventHandler`)**: +- **命令系统**: - 提供一个统一的命令处理入口,支持来自 Discord、游戏内和独立终端的命令。 - - 通过 `CommandEvents` 进行解耦。 + - 通过事件机制进行解耦。 - **配置与国际化**: - - `ConfigManager`, `ModeManager`: 提供健壮的配置加载和验证机制。 - - `I18nManager`: 支持从本地和网络加载语言文件,并提供统一的翻译接口。 -- **日志系统 (`LoggerImpl`, `ServiceProvider`)**: + - 提供健壮的配置加载和验证机制。 + - 支持从本地和网络加载语言文件,并提供统一的翻译接口。 +- **日志系统**: - 实现了 SLF4J `ServiceProvider`,可在独立运行时输出到文件和控制台,在 Minecraft 环境中则桥接到游戏日志系统。 -- **事件总线 (`EventManager`)**: +- **事件总线**: - 提供一个轻量级的发布-订阅事件总线,用于项目内部各组件的解耦。 ### 4.2 Minecraft 适配器模块 (`:minecraft-adapter`) 此模块是连接 `:common` 模块与 Minecraft 的桥梁,包含了所有与 Minecraft 相关的代码。 -- **模组入口 (`NeoForgeDMCC`)**: 作为 NeoForge 模组的入口点,调用 `DMCC.init()` 启动程序。 -- **事件捕获 (Mixins)**: - - 通过一系列 Mixin (`MixinPlayerList`, `MixinServerGamePacketListenerImpl`, `MixinMinecraftServer` 等) 注入 Minecraft,以非侵入式的方式捕获游戏事件。 +- **模组入口**: 作为模组的入口点,调用初始化方法启动程序。 +- **事件捕获**: + - 通过一系列 Mixin 注入点注入 Minecraft,以非侵入式的方式捕获游戏事件。 - **事件发布与处理**: - - Mixin 捕获到事件后,通过 `EventManager.post()` 发布一个 `MinecraftEvents` 中的具体事件。 - - `MinecraftEventHandler` 订阅这些事件,并将事件数据打包通过网络客户端发送给服务端。 -- **服务提供者 (`MinecraftServiceImpl`)**: - - 实现了 `MinecraftService` 接口,通过 Java `ServiceLoader` 机制被 `ClientDMCC` 在运行时发现和调用,实现了与 Minecraft 的完全解耦。 + - Mixin 捕获到事件后,通过事件总线发布一个具体的事件。 + - 事件处理器订阅这些事件,并将事件数据打包通过网络客户端发送给服务端。 +- **服务提供者**: + - 实现了服务接口,通过 Java `ServiceLoader` 机制在运行时被发现和调用,实现了与 Minecraft 的完全解耦。 ## 5. 关键设计详解 @@ -120,7 +120,7 @@ DMCC 采用一个灵活的双轨权限模型来确定谁是“DMCC 管理员” 1. **路径一:原生继承模型 (Minecraft -> DMCC)** - **来源**: 玩家在 Minecraft 中的 OP 等级。 - - **运作方式**: 在 `config.yml` 中定义 `dmcc_admin.minecraft_op_level_requirement`。任何在游戏中拥有等于或高于此 OP 等级的玩家,都将**自动被视为“DMCC 管理员”**。 + - **运作方式**: 在配置中定义 OP 等级要求。任何在游戏中拥有等于或高于此 OP 等级的玩家,都将**自动被视为“DMCC 管理员”**。 - **目的**: 这是成为 DMCC 管理员的基础方式。若 Discord 用户想使用管理命令,其链接的 MC 账户必须满足此要求。 2. **路径二:角色同步模型 (Discord -> Minecraft)** @@ -130,19 +130,16 @@ DMCC 采用一个灵活的双轨权限模型来确定谁是“DMCC 管理员” ### 5.2 账户链接流程 -1. **发起**: 玩家在游戏中执行 `/dmcc link` 命令。 -2. **生成**: 客户端模块生成一个有时效性的一次性链接码,并通知服务端该验证码与当前玩家的 UUID 关联。 -3. **验证**: 玩家在 Discord 中对机器人使用 `/link ` 命令。 -4. **确认**: 服务端模块验证链接码是否有效、未过期。验证成功后,将玩家的 `Minecraft UUID` 和 `Discord User ID` 保存到持久化存储中(如 `linked_accounts.json`),并通知用户链接成功。 +(此部分待我们内部人员商榷,暂时不做) ### 5.3 数据流示例 (Minecraft -> Discord) -1. **[minecraft-adapter]** `MixinServerGamePacketListenerImpl` 捕获玩家 "Xujiayao" 的聊天事件,消息为 "Hello World"。 -2. **[minecraft-adapter]** `EventManager` 发布一个 `MinecraftEvents.PlayerChat` 事件。 -3. **[minecraft-adapter]** `MinecraftEventHandler` 订阅此事件,并从事件中提取数据。 -4. **[common: Client]** `NettyClient` 将数据(玩家名、消息内容等)封装成一个 `PlayerChatPacket`。 -5. **[common: Client]** `JsonPacketEncoder` 将 `PlayerChatPacket` 序列化为 JSON 字符串,通过 Netty 发送给 **服务端**。 -6. **[common: Server]** `NettyServer` 接收到数据,`JsonPacketDecoder` 将其反序列化为 `PlayerChatPacket` 对象。 -7. **[common: Server]** `ServerBusinessHandler` 处理此数据包,检查该玩家是否已链接账户,获取其 Discord 角色颜色等信息。 -8. **[common: Server]** 根据 `config.yml` 和 `custom_messages` 中的模板,生成最终要发送到 Discord 的字符串。 -9. **[common: Server]** `DiscordManager` 通过 JDA 将格式化后的消息发送到指定的 Discord 频道。 +1. **[minecraft-adapter]** 注入点捕获玩家聊天事件。 +2. **[minecraft-adapter]** 事件总线发布一个玩家聊天事件。 +3. **[minecraft-adapter]** 事件处理器订阅此事件,并从事件中提取数据。 +4. **[common: Client]** 网络客户端将数据封装成一个聊天数据包。 +5. **[common: Client]** 编码器将数据包序列化为 JSON 字符串,通过网络发送给 **服务端**。 +6. **[common: Server]** 服务端接收到数据,解码器将其反序列化为数据包对象。 +7. **[common: Server]** 业务逻辑处理器处理此数据包,检查该玩家是否已链接账户,获取其 Discord 角色颜色等信息。 +8. **[common: Server]** 根据配置中的模板,生成最终要发送到 Discord 的字符串。 +9. **[common: Server]** Discord 管理器将格式化后的消息发送到指定的 Discord 频道。