不要太specific

This commit is contained in:
Xujiayao 2025-11-15 18:26:35 +08:00
parent a0c44809b4
commit 7bb5faca60

View file

@ -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 <code>` 命令。
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 频道。