Skip to content

架构总览

Emaki Series 的架构可以按一句话理解:CoreLib 提供通用能力,业务模块只写自己的玩法规则。模块之间通过 Bukkit ServicesManager、PDC 数据和 namespace layer 协作,避免直接改彼此内部状态。

总体分层

mermaid
graph TB
  Server[Spigot / Bukkit 1.21+]
  Core[EmakiCoreLib]
  Attribute[EmakiAttribute]
  Item[EmakiItem]
  Forge[EmakiForge]
  Strengthen[EmakiStrengthen]
  Gem[EmakiGem]
  Skills[EmakiSkills]
  Cooking[EmakiCooking]
  Mythic[MythicMobs]
  PAPI[PlaceholderAPI]
  Economy[Vault / ExcellentEconomy]
  Craft[CraftEngine / ItemsAdder / Nexo]

  Core --> Server
  Attribute --> Core
  Item --> Core
  Forge --> Core
  Strengthen --> Core
  Gem --> Core
  Skills --> Core
  Cooking --> Core

  Forge -.属性写入.-> Attribute
  Strengthen -.属性写入.-> Attribute
  Gem -.属性写入.-> Attribute
  Item -.属性/技能.-> Attribute
  Skills -.资源/属性检查.-> Attribute
  Skills -.技能效果.-> Mythic
  Core -.占位符.-> PAPI
  Core -.经济.-> Economy
  Cooking -.方块/物品来源.-> Craft

CoreLib 的职责

CoreLib 是共享基础设施层。它不承载某个玩法的核心规则,只提供所有模块都会用到的能力:

  • 动作系统:发送消息、执行命令、播放声音、发放物品、扣费、延迟、概率、条件控制。
  • GUI 系统:统一菜单模板、槽位按钮、点击处理和会话状态。
  • 物品来源系统:识别 Vanilla、外部物品插件和自定义来源。
  • PDC 工具:在物品、实体或玩家上保存结构化数据。
  • 表达式与条件:在 YAML 中编写数值公式、条件判断和概率规则。
  • 经济桥接:统一调用 Vault、ExcellentEconomy 等经济系统。
  • 结构化展示与装配:把多个模块写入的物品层合并成最终名称、Lore 和属性展示。
  • Web Console:内置 HTTP 管理台,各模块通过 WebConsoleRegistry 注册配置入口和字段注释。

业务模块如何协作

通过硬依赖和软依赖

  • 所有业务模块硬依赖 EmakiCoreLib
  • Attribute、Forge、Strengthen、Gem、Skills、Item 之间大多使用 softdepend 或 ServicesManager。
  • 软依赖不存在时,插件主体可以加载,但对应桥接功能不可用。

通过 ServicesManager

Attribute 会向 Bukkit ServicesManager 注册属性相关服务。其他模块可以在运行时查询这些服务,而不是直接依赖 Attribute 内部类。

这种方式的优点:

  • Attribute 未安装时,模块可以降级运行。
  • 服务接口比内部实现更稳定。
  • 方便未来替换实现或增加兼容层。

通过 PDC 和 namespace layer

装备成长系统最重要的规则是分层写入。每个模块只写自己的 layer:

  • Item 写入基础物品 ID、套装、基础属性。
  • Forge 写入锻造结果、品质或材料贡献。
  • Strengthen 写入强化星级、阶段和加成。
  • Gem 写入插槽、宝石和升级状态。

这些状态不能只拼进最终 Lore。它们应以结构化数据保存,由 CoreLib 读取各 layer 后统一重建名称、Lore、属性 payload 和展示状态。

这样可以避免:

  • 强化刷新时把宝石 Lore 覆盖掉。
  • 锻造修改名称时丢失自定义物品 ID。
  • 宝石提取后属性残留。
  • 多插件都在操作同一段 Lore 导致顺序混乱。

典型装备数据流

mermaid
sequenceDiagram
  participant Player as 玩家
  participant Item as EmakiItem
  participant Forge as EmakiForge
  participant Str as EmakiStrengthen
  participant Gem as EmakiGem
  participant Core as CoreLib Assembly
  participant Attr as EmakiAttribute

  Player->>Item: 获取自定义装备
  Item->>Core: 写入基础 layer
  Player->>Forge: 使用图纸和材料锻造
  Forge->>Core: 写入 forge layer
  Forge->>Attr: 可选写入属性 payload
  Player->>Str: 强化装备
  Str->>Core: 写入 strengthen layer
  Str->>Attr: 可选写入强化属性
  Player->>Gem: 开孔/镶嵌/升级
  Gem->>Core: 写入 gem layer
  Gem->>Attr: 可选写入宝石属性
  Core-->>Player: 重建名称、Lore、展示和状态

典型技能数据流

mermaid
sequenceDiagram
  participant Player as 玩家
  participant Skills as EmakiSkills
  participant Attr as EmakiAttribute Bridge
  participant Mythic as MythicMobs

  Player->>Skills: 触发主动/被动技能
  Skills->>Skills: 检查冷却、条件、槽位、等级
  Skills->>Attr: 检查或消耗资源/属性
  Attr-->>Skills: 返回检查结果
  Skills->>Mythic: 调用 Mythic 技能
  Mythic-->>Player: 执行实际技能效果

Skills 负责“能不能放、什么时候放、谁触发、消耗什么”,MythicMobs 负责“技能实际产生什么效果”。这种分工能让服主继续使用熟悉的 MythicMobs 技能配置,同时把 RPG 技能管理交给 EmakiSkills。

典型烹饪数据流

Cooking 与装备线不同,它更关注世界状态:

  1. 玩家与工位方块交互。
  2. Cooking 识别工位类型,例如砧板、炒锅、研磨机、蒸锅。
  3. 读取玩家手持物、工位内部状态和配方条件。
  4. 更新工位状态,例如加入材料、翻炒、加水、加燃料。
  5. 满足配方后发放产物或执行动作。
  6. 将工位状态按世界坐标保存,重启后恢复。