Skip to content

Architecture

SSOrangeCATY edited this page Sep 16, 2026 · 3 revisions

架构说明

本页面说明 BlockOffensive 的主要模块、生命周期与源码入口。

总体结构

BlockOffensive 是一个 Forge Mod,核心职责是在 FPSMatch 提供的竞技 FPS 框架上实现 CS 风格玩法。

Minecraft Forge
└─ BlockOffensive
   ├─ FPSMatch 地图/队伍/经济/商店/网络基础能力
   ├─ cs 爆破模式
   ├─ csdm 死斗模式
   ├─ C4、拆弹器、声音、HUD、TAB、击杀反馈
   ├─ TaCZ / Modern UI / Physics Mod / KubeJS 等兼容层
   └─ 可选本地 Web API

主入口

主类:com.ptcrys.blockoffensive.BlockOffensive

关键职责:

  • 定义 MODID=blockoffensive。
  • 创建网络通道 blockoffensive:main。
  • 协议版本为 1.6.0。
  • 注册物品、创造模式标签、实体类型、音效。
  • 注册 CLIENT 和 COMMON 配置。
  • 监听 Forge 命令注册事件并注册 /cs2。
  • 在 common setup 中调用 BOPacketRegistration 注册全部自定义网络包。
  • 初始化枪械拾取/丢弃声音、投掷物类型、Physics Mod 和 CounterStrikeGrenade 兼容逻辑。
  • 在 IMC 阶段注册 Modern UI / Cloth Config 配置界面。

地图注册

地图注册类:map/MapRegister.java

注册内容:

类型 类 说明
cs CSGameMap 爆破模式。
csdm CSDeathMatchMap 死斗模式。

同时注册:

  • CSGameMaps 持久化数据。
  • CSDeathMatchMaps 持久化数据。
  • CSGameMap 旧数据修复器。
  • cs 与 csdm 商店类型。

地图类层级

FPSMatch BaseMap
└─ CSMap
   ├─ CSGameMap
   └─ CSDeathMatchMap

CSMap

CSMap 是 BlockOffensive 两个模式共享的基类,负责:

  • CT/T 队伍基础行为。
  • 通用地图开始逻辑。
  • 比赛游戏规则应用。
  • 经济和商店辅助逻辑。
  • 自动开始状态。
  • 队伍颜色与玩家颜色。
  • 旁观/玩家状态通用处理。
  • 地图清理通用逻辑。

CSGameMap

CSGameMap 是爆破模式核心,负责:

  • 回合制比赛生命周期。
  • 热身、等待、暂停、取消暂停投票。
  • 胜利回合、加时、换边。
  • 购买阶段与商店锁定。
  • C4 发放、放置、引信、拆弹、爆炸。
  • CT/T 胜负判定。
  • MVP 判定与消息。
  • 回合经济结算。
  • 爆破模式内置 action。

CSDeathMatchMap

CSDeathMatchMap 是死斗模式核心,负责:

  • csdm 地图类型。
  • 个人死斗或团队死斗开关。
  • 比赛计时。
  • 重生保护。
  • 出生点选择。
  • 玩家死亡后的快速重生。
  • 死斗 TAB 和 HUD 数据同步。

客户端结构

客户端启动注册

类:client/BOClientBootstrap.java

职责:

  • 注册打开商店按键。
  • 注册拆弹按键。
  • 注册旁观切换按键。
  • 注册队伍聊天按键。
  • 将旁观切换键接入 FPSMatch SpecKeyHandler。
  • 注册 CSGameTabRenderer 和 CSDMTabRenderer。
  • 为 cs 和 csdm 注册 CSGameHud。
  • 注册 C4 实体渲染器。

客户端事件

类:client/BOClientEvent.java

职责:

  • 客户端 tick 中检查比赛数据是否需要重新拉取。
  • 在等待/暂停状态锁定移动输入。
  • 恢复商店界面临时修改过的 GUI scale。
  • 根据 Web Server 配置和旁观状态启动/停止 BOClientWebServer。
  • 在 csdm 中同步玩家移动输入。
  • 根据 FPSMatch 投掷物事件发送投掷物语音/消息。
  • 处理客户端数据重置。

客户端数据

类:client/data/CSClientData.java

保存从服务端同步到客户端的比赛状态,例如:

  • 当前地图是否支持商店。
  • CT/T 分数。
  • 当前时间。
  • debug/start/error/pause/waiting/warm/waitingWinner flags。
  • 商店是否可打开、商店关闭时间、下一回合最低经济。
  • 拆弹进度。
  • C4 引信和总引信。
  • 武器与护甲数据。

命令结构

类 说明
command/CSCommand.java 注册 /cs2 <action>,将 action 转发给玩家所在 CSGameMap。
command/BOCommandRegister.java 监听 FPSMatch 命令注册事件,添加 /fpsm mvp <targets> <sound>。

事件结构

BlockOffensive 提供自己的 Forge Event:

  • CSGameMapEvent
  • CSGameMapEvent.TeamSwitchEvent
  • CSGameMapEvent.PlayerEvent.PlacedC4Event
  • CSGameRoundEndEvent
  • CSGamePlayerGetMvpEvent
  • CSHUDRenderEvent.RenderMvpHud.Pre
  • CSHUDRenderEvent.RenderMvpHud.Post
  • CSHUDRenderEvent.RenderMvpHud.TriggeredAnimation

这些事件用于让其他 Mod 或脚本扩展队伍换边、C4 放置、回合结束、MVP 和 HUD 渲染。

网络结构

网络通道:

blockoffensive:main

协议版本:

1.6.0

网络包按领域分组:

目录 说明
net/bomb C4 拆弹动作、拆弹进度、C4 行为同步。
net/dm 死斗移动输入同步。
net/intro 入场与换边演出序列、客户端完成回执。
net/mvp MVP 消息、HUD 和音乐上传/分块。
net/ping 队友 Ping 请求和标记同步。
net/shop 商店状态、附近掉落查询和拾取。
net/spec 旁观、击杀回放、观战名单、武器数据、C4 引信。
net/vote 投票状态同步和玩家投票。
net 根目录 比赛设置、比分板、TAB 移除、死亡消息、Physics Mod 兼容。

详情见 网络包文档。

物品、实体与声音

模块 说明
item/BOItemRegister.java 注册 C4、拆弹器等物品与创造模式标签。
entity/BOEntityRegister.java 注册 C4 实体。
sound/BOSoundRegister.java 注册 C4、武器拾取/丢弃、阵营语音、投掷物语音、MVP 等声音。

兼容层

类或包 说明
compat/BOImpl.java 兼容检测入口。
compat/BOMenuIntegration.java 配置界面集成。
compat/CSGrenadeCompat.java CounterStrikeGrenade 兼容。
compat/PhysicsModCompat.java Physics Mod 客户端兼容。
compat/HitIndicationCompat.java Hit Indication 兼容。
compat/PhysicsDeathProxyGuard.java Physics Mod 死亡代理保护。

资源结构

src/main/resources/assets/blockoffensive/
├─ lang/
├─ models/
├─ shaders/
├─ sounds/
├─ textures/
└─ sounds.json

主要资源:

  • 中文和英文语言文件。
  • C4 方块/物品模型。
  • killcam 灰度 shader。
  • C4、武器、阵营语音、投掷物语音声音。
  • UI 贴图和提示图标。

持久化与数据修复

BlockOffensive 通过 FPSMatch 的 SaveHolder 和 DataFixer 持久化地图数据:

  • CSGameMaps
  • CSDeathMatchMaps

CSGameMapFixer.OldV0 用于修复旧版本 CSGameMap 数据。

设计原则

开发新功能时建议遵循:

  • 地图与比赛生命周期优先复用 FPSMatch。
  • 模式共享逻辑放入 CSMap。
  • 爆破专属逻辑放入 CSGameMap。
  • 死斗专属逻辑放入 CSDeathMatchMap。
  • 客户端显示状态通过网络包同步到 CSClientData。
  • 对外扩展优先暴露 Forge Event,而不是让外部直接依赖内部字段。
  • 网络包必须在服务端校验发送者状态和地图状态。

Clone this wiki locally