跳到正文
本頁目錄

項目架構

本文檔概述了 LeviLamina 的項目結構、設計原則和架構決策。

項目結構

頂層目錄

Text Only
LeviLamina/
├── src/              # 通用 + 服务端代码
├── src-client/       # 客户端专用代码
├── src-server/       # 服务端专用代码
├── src-test/         # 测试代码
├── docs/             # 文档
├── scripts/          # 构建和工具脚本
├── builder/          # 头文件生成脚本
└── bin/              # 构建输出

源代碼目錄組織

src/ — 通用 + 服務端

包含服務端和客戶端共享的代碼,以及僅服務端的實現:

Text Only
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 個文件):

Text Only
src-client/
├── ll/
│   ├── api/
│   │   ├── input/
│   │   │   ├── KeyRegistry.h  # 输入绑定
│   │   │   └── KeyHandle.h
│   │   └── event/
│   │       ├── input/         # 输入事件
│   │       ├── render/        # 渲染事件
│   │       └── client/        # 客户端生命周期
│   └── core/
│       └── (8 个文件)          # 客户端实现
└── mc/
    └── client/                # 客户端专用头文件

src-server/ — 僅服務端

服務端特定的擴展(5 個文件):

Text Only
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> 用於可恢復錯誤 - 異步支持: 協程和執行器 - 反射: 編譯期反射用於序列化 - 事件驅動: 發佈-訂閱事件系統

模塊依賴關係

Text Only
┌─────────────────────────────────────────┐
│         模组代码(用户)                 │
└─────────────────┬───────────────────────┘
                  │ 使用
┌─────────────────▼───────────────────────┐
│        ll/api(公共 API)               │
│  ┌──────────┐  ┌──────────┐  ┌────────┐│
│  │  命令    │  │  事件    │  │  表单  ││
│  └──────────┘  └──────────┘  └────────┘│
│  ┌──────────┐  ┌──────────┐  ┌────────┐│
│  │  模组    │  │  服务    │  │  内存  ││
│  └──────────┘  └──────────┘  └────────┘│
└─────────────────┬───────────────────────┘
                  │ 实现
┌─────────────────▼───────────────────────┐
│        ll/core(实现层)                │
│  ┌──────────────┐  ┌──────────────────┐ │
│  │ ModRegistrar │  │ NativeModManager │ │
│  └──────────────┘  └──────────────────┘ │
│  ┌──────────────┐  ┌──────────────────┐ │
│  │ CrashLogger  │  │   内置命令       │ │
│  └──────────────┘  └──────────────────┘ │
└─────────────────┬───────────────────────┘
                  │ 使用
┌─────────────────▼───────────────────────┐
│      mc/(Bedrock 引擎头文件)          │
│  ┌──────────┐  ┌──────────┐  ┌────────┐│
│  │  Player  │  │  Level   │  │ Packet ││
│  └──────────┘  └──────────┘  └────────┘│
│  ┌──────────┐  ┌──────────┐  ┌────────┐│
│  │ Command  │  │ Server   │  │ Network││
│  └──────────┘  └──────────┘  └────────┘│
└─────────────────────────────────────────┘

服務端 vs 客戶端構建

構建配置

由 XMake 中的 --target_type 控制:

Lua
-- xmake.lua
option("target_type")
    set_default("server")
    set_values("server", "client")

編譯差異

方面服務端構建客戶端構建
源文件src/ + src-server/src/ + src-client/
頭文件bedrockdata:serverbedrockdata: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 — 在後臺線程上執行
  • 原子操作 — 儘可能無鎖
  • 互斥鎖 — 保護共享狀態

相關文檔