項目架構
本文檔概述了 LeviLamina 的項目結構、設計原則和架構決策。
項目結構
頂層目錄
LeviLamina/
├── src/ # 通用 + 服务端代码
├── src-client/ # 客户端专用代码
├── src-server/ # 服务端专用代码
├── src-test/ # 测试代码
├── docs/ # 文档
├── scripts/ # 构建和工具脚本
├── builder/ # 头文件生成脚本
└── bin/ # 构建输出源代碼目錄組織
src/ — 通用 + 服務端
包含服務端和客戶端共享的代碼,以及僅服務端的實現:
src/
├── ll/
│ ├── api/ # 公共 API(255 个头文件)
│ │ ├── base/ # 基础类型
│ │ ├── command/ # 命令系统
│ │ ├── event/ # 事件系统
│ │ ├── form/ # UI 表单
│ │ ├── mod/ # 模组管理
│ │ ├── service/ # 服务注册表
│ │ └── ... # 其他模块
│ └── core/ # 内部实现(34 个文件)
│ ├── mod/ # 模组加载
│ ├── command/ # 内置命令
│ ├── form/ # 表单处理器
│ └── tweak/ # 游戏调整
└── mc/ # Bedrock 头文件(反编译)
├── server/
├── world/
├── network/
└── ...src-client/ — 僅客戶端
客戶端特定的擴展和覆蓋(28 個文件):
src-client/
├── ll/
│ ├── api/
│ │ ├── input/
│ │ │ ├── KeyRegistry.h # 输入绑定
│ │ │ └── KeyHandle.h
│ │ └── event/
│ │ ├── input/ # 输入事件
│ │ ├── render/ # 渲染事件
│ │ └── client/ # 客户端生命周期
│ └── core/
│ └── (8 个文件) # 客户端实现
└── mc/
└── client/ # 客户端专用头文件src-server/ — 僅服務端
服務端特定的擴展(5 個文件):
src-server/
├── ll/
│ ├── api/
│ │ ├── event/server/ # 服务端事件
│ │ └── service/ # 服务端服务
│ └── core/
│ └── (10 个文件) # 服务端实现
└── mc/
└── server/ # 服务端专用头文件分層架構
第 1 層:mc/ — Bedrock 引擎頭文件
- 來源: 從 Minecraft 基岩版專用服務器逆向工程
- 目的: 提供遊戲內部的 C++ 接口
- 維護: 由
header_generator工具從 BedrockAnalyzer 轉儲生成 - 範圍: 只讀,不被 LeviLamina 修改
關鍵命名空間:
- ::Actor, ::Player, ::Mob — 實體系統
- ::Level, ::Dimension, ::BlockSource — 世界管理
- ::ServerInstance, ::Minecraft — 服務器生命週期
- ::CommandRegistry, ::Command — 命令系統
- ::Packet, ::NetworkIdentifier — 網絡
第 2 層:ll/core/ — 內部實現
- 目的: 實現 LeviLamina 的核心功能
- 可見性: 內部,不暴露給模組
- 依賴: 使用
mc/頭文件和ll/api/
關鍵組件:
- ModRegistrar — 模組生命週期管理
- NativeModManager — DLL 加載
- 內置命令 — /version、/ll、/tpdim、/crash
- CrashLogger — 異常處理和 Sentry 集成
- Tweaks — 遊戲修改(漏洞修復、內存分配器等)
第 3 層:ll/api/ — 公共 API
- 目的: 為模組開發者提供穩定的 API
- 可見性: 通過
LLAPI/LLNDAPI宏導出 - 版本控制: 語義化版本,保證兼容性
設計原則:
- 類型安全: 大量使用 C++20 概念和類型萃取
- 錯誤處理: Expected<T> 用於可恢復錯誤
- 異步支持: 協程和執行器
- 反射: 編譯期反射用於序列化
- 事件驅動: 發佈-訂閱事件系統
模塊依賴關係
┌─────────────────────────────────────────┐
│ 模组代码(用户) │
└─────────────────┬───────────────────────┘
│ 使用
┌─────────────────▼───────────────────────┐
│ ll/api(公共 API) │
│ ┌──────────┐ ┌──────────┐ ┌────────┐│
│ │ 命令 │ │ 事件 │ │ 表单 ││
│ └──────────┘ └──────────┘ └────────┘│
│ ┌──────────┐ ┌──────────┐ ┌────────┐│
│ │ 模组 │ │ 服务 │ │ 内存 ││
│ └──────────┘ └──────────┘ └────────┘│
└─────────────────┬───────────────────────┘
│ 实现
┌─────────────────▼───────────────────────┐
│ ll/core(实现层) │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ ModRegistrar │ │ NativeModManager │ │
│ └──────────────┘ └──────────────────┘ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ CrashLogger │ │ 内置命令 │ │
│ └──────────────┘ └──────────────────┘ │
└─────────────────┬───────────────────────┘
│ 使用
┌─────────────────▼───────────────────────┐
│ mc/(Bedrock 引擎头文件) │
│ ┌──────────┐ ┌──────────┐ ┌────────┐│
│ │ Player │ │ Level │ │ Packet ││
│ └──────────┘ └──────────┘ └────────┘│
│ ┌──────────┐ ┌──────────┐ ┌────────┐│
│ │ Command │ │ Server │ │ Network││
│ └──────────┘ └──────────┘ └────────┘│
└─────────────────────────────────────────┘服務端 vs 客戶端構建
構建配置
由 XMake 中的 --target_type 控制:
-- xmake.lua
option("target_type")
set_default("server")
set_values("server", "client")編譯差異
| 方面 | 服務端構建 | 客戶端構建 |
|---|---|---|
| 源文件 | src/ + src-server/ | src/ + src-client/ |
| 頭文件 | bedrockdata:server | bedrockdata:client |
| 入口點 | DllMain(服務端) | DllMain(客戶端) |
| API 表面 | 通用 + 服務端 | 通用 + 客戶端 |
| 輸出 | LeviLamina.dll(服務端) | LeviLamina.dll(客戶端) |
API 可用性
| 模塊 | 服務端 | 客戶端 | 備註 |
|---|---|---|---|
| Base | ✅ | ✅ | 通用 |
| Command | ✅ | ✅ | 通用 |
| Event(玩家/世界) | ✅ | ✅ | 通用 |
| Event(服務器) | ✅ | ❌ | 僅服務端 |
| Event(客戶端/輸入/渲染) | ❌ | ✅ | 僅客戶端 |
| Form | ✅ | ✅ | 通用 |
| Input | ❌ | ✅ | 僅客戶端 |
| Service(Bedrock) | ✅ | ✅ | 通用(不同實現) |
運行時行為
服務端:
- 由 PreLoader 加載到 bedrock_server_mod.exe(安裝時由 PeEditor 從 bedrock_server.exe 生成,原文件保留為 bedrock_server.exe.bak)
- 鉤子服務器初始化
- 提供服務端事件和服務
客戶端:
- 由 PreLoader 加載到 Minecraft.Windows.exe(安裝時由 PeEditor 原地修改,原文件保留為 Minecraft.Windows.exe.bak)
- 鉤子客戶端初始化
- 提供客戶端輸入、渲染和 UI
設計模式
單例模式
用於全局註冊表:
- EventBus::getInstance()
- CommandRegistrar::getInstance(bool isClientSide)
- ServiceManager::getInstance()
- ModManagerRegistry::getInstance()
工廠模式
用於動態對象創建:
- PacketRegistrar — 數據包工廠
- EventBus::setEventEmitter() — 事件發射器工廠
觀察者模式
通過事件系統實現:
- EventBus — 主題
- Listener — 觀察者
- Event — 通知
依賴注入
通過服務系統實現:
- ServiceManager — 容器
- Service — 可注入組件
- subscribeService() — 依賴解析
內存管理
分配策略
- mimalloc — 默認分配器,提升性能
- 智能指針 —
std::shared_ptr、std::unique_ptr用於所有權 - optional_ref — 對 Bedrock 對象的非擁有引用
鉤子管理
- HookRegistrar — 自動鉤子註冊/清理
- 優先級系統 — 控制鉤子執行順序
線程安全
線程模型
- 服務器線程 — 主遊戲循環(單線程)
- 線程池 — 後臺任務
- 網絡線程 — 數據包處理
同步
- ServerThreadExecutor — 在服務器線程上執行
- ThreadPoolExecutor — 在後臺線程上執行
- 原子操作 — 儘可能無鎖
- 互斥鎖 — 保護共享狀態