感谢你考虑贡献 CS2-Box。本文档覆盖本地开发环境、代码规范、分支约定、PR 流程与问题报告。
- 安装 Git(Windows 上会附带 bash;JDK 无需手动安装——Gradle toolchain 经 foojay 自动下载 17/21/25)
- 克隆仓库:
git clone https://github.com/wikkd/CS2-Box.git && cd CS2-Box - 配置活动版本(默认
1.21.1):编辑gradle.properties中的active_versions,可选值1.21.1/26.1.2/26.2/forge-26.1.2/forge-26.2/forge-1.20.1/fabric-1.21.1/forge-1.18.2 - 验证构建:
./gradlew :v26_1_2:build或./gradlew :v1_21_1:build。v1_21_1 / forge_1_20_1 / fabric_1_21_1 首次编译会自动补齐不入库的 TACZ/Create 依赖(详见 docs/DEVELOPMENT.md §引导依赖);国内网络慢可先跑bash scripts/bootstrap-dev.sh并按需设置镜像变量 - 启动开发客户端:
./gradlew :v26_1_2:runClient(或:v1_21_1:runClient/:v26_2:runClient)
active_versions |
Gradle 项目 | 编译命令 | 启动客户端 |
|---|---|---|---|
1.21.1(默认) |
:v1_21_1 |
./gradlew :v1_21_1:compileJava |
./gradlew :v1_21_1:runClient |
26.1.2 |
:v26_1_2 |
./gradlew :v26_1_2:compileJava |
./gradlew :v26_1_2:runClient |
26.2 |
:v26_2 |
./gradlew :v26_2:compileJava |
./gradlew :v26_2:runClient |
forge-26.1.2 |
:forge_26_1_2 |
./gradlew :forge_26_1_2:compileJava |
./gradlew :forge_26_1_2:runClient |
forge-26.2 |
:forge_26_2 |
./gradlew :forge_26_2:compileJava |
./gradlew :forge_26_2:runClient |
forge-1.20.1 |
:forge_1_20_1 |
./gradlew :forge_1_20_1:compileJava |
./gradlew :forge_1_20_1:runClient |
fabric-1.21.1 |
:fabric_1_21_1 |
./gradlew :fabric_1_21_1:compileJava |
./gradlew :fabric_1_21_1:runClient |
forge-1.18.2 |
:forge_1_18_2 |
./gradlew :forge_1_18_2:compileJava |
./gradlew :forge_1_18_2:runClient |
由于 NeoGradle 7.x 在同一 Gradle invocation 中只能加载一个版本(参考 settings.gradle 注释),每次构建只启用一个 active_versions。CI / 手工 build 需要串行切换各版本。
仓库是 multiloader Gradle 多模块结构:
CS2-Box/
├── common/ # 跨版本业务逻辑 + 共享资源
│ └── src/main/
│ ├── java/com/reclizer/csgobox/
│ │ ├── box/ # BoxDefaults / BoxGrades / BoxRegistryStore / BoxStripGenerator / schema 校验
│ │ ├── logic/ # GradeMap / OddsCalculator / OpenBlockGuard
│ │ ├── config/ # CsboxConfigDefaults(八平台配置默认值唯一来源)
│ │ ├── terminal/ # NegotiationModel / TerminalAnims / WearBands / WearPenalty(平台无关)
│ │ └── utils/ # ColorTools / OverlayColor / GuiRegion / EntityChineseMap / Easing 等
│ └── resources/ # 共享资源(纹理、音效、配方、advancement)
├── v1_21_1/ # MC 1.21.1 / NeoForge 21.1.248 / Java 21
│ └── src/main/java/com/reclizer/csgobox/v1_21_1/
│ ├── CsgoBox.java # 模组入口
│ ├── advancement/ # 自定义进度触发器
│ ├── box/ # BoxDefinition / BoxRegistry / BoxJsonLoader / GradeGroup
│ ├── capability/ # NeoForge 玩家数据附件
│ ├── command/ # 服务端控制台命令
│ ├── config/ # TOML 配置处理
│ ├── event/ # 事件订阅(客户端/服务端)
│ ├── gui/ # 客户端 UI 界面
│ ├── item/ # 物品定义和注册
│ ├── packet/ # 网络协议接线
│ ├── sounds/ # 音效事件定义
│ └── utils/ # EntityChineseMap / GuiItemMove / IconListTools / RandomItem / RenderFontTool
├── v26_1_2/ # MC 26.1.2 / NeoForge 26.1.2.95 / Java 25
│ └── src/main/java/com/reclizer/csgobox/v26_1_2/
│ ├── (同 v1_21_1 结构,外加 26.x 特有适配)
│ ├── gui/pip/ # 独有:Icon3DRenderer + Icon3DRenderState (PIP 3D 管线)
│ └── utils/ # 独有:ButtonPalette + 26.x 适配的 RenderFontTool
├── v26_2/ # MC 26.2 / NeoForge 26.2.0.59 / Java 25
│ └── src/main/java/com/reclizer/csgobox/v26_2/
│ ├── (与 v26_1_2 镜像结构,当前代码为 v26_1_2 复制 + 包名替换)
│ └── (含 26.2 decoupled API 适配:setScreenAndShow / HudVisibility 等)
├── forge_26_1_2/ # MC 26.1.2 / MinecraftForge 26.1.2-64.1.0 / Java 25(实验模块)
│ └── src/main/java/com/reclizer/csgobox/forge_26_1_2/
│ └── (与 v26_1_2 特性同步,loader 为 MinecraftForge;经 scripts/port-forge-2612.py + 手工适配)
├── forge_26_2/ # MC 26.2 / MinecraftForge 26.2-65.1.1 / Java 25(正式发布模块)
│ └── src/main/java/com/reclizer/csgobox/forge_26_2/
│ └── (以 forge_26_1_2 为基准迁移,loader 为 MinecraftForge;经 scripts/port-forge-262.py + 手工适配)
├── forge_1_20_1/ # MC 1.20.1 / MinecraftForge 47.4.22 / Java 17(正式发布模块,1.20.1 回移)
│ └── src/main/java/com/reclizer/csgobox/forge_1_20_1/
│ └── (以 forge_26_1_2 为基准回移,复用 common/ 纯 Java 逻辑;Networking/Capability/渲染三大重写)
├── settings.gradle # 模块注册 + active_versions 动态 include
├── gradle.properties # mod_version / pack_format / active_versions / 26.2 占位块
├── settings.gradle # 模块注册 + active_versions 切换
├── gradle.properties # mod_version / pack_format / active_versions
└── docs/ # 项目文档
- 语言:Java 21 / 25(由 toolchain 强制)
- 构建系统:Gradle + NeoForged userdev 插件
- 代码风格:
- 遵循标准 Java 命名规范
- 4 空格缩进,LF 行尾
- 最大行长度:120 字符
- 公共 API 添加 Javadoc 注释
- 使用
Record类处理不可变数据结构(参见BoxDefinition.java) - 使用 NeoForge 的
Codec和StreamCodec进行数据序列化 - Cloth Config 可选(仅客户端 GUI):存储始终是
ModConfigSpec/ForgeConfigSpecTOML;Cloth 屏只读/写同一份ConfigValue(见docs/CONFIGURATION.md)
- 构建命令:
./gradlew build— 完整构建./gradlew :v26_1_2:compileJava— 快速编译检查./gradlew :v26_1_2:runClient— 启动 v26_1_2 客户端./gradlew :v1_21_1:runClient— 启动 v1_21_1 客户端./gradlew :v26_1_2:runServer— 启动 v26_1_2 服务端./gradlew gameTestServer— 运行 GameTest 集成测试
- 依赖方向:
common/不得直接import net.minecraft.*或import net.neoforged.*(版本敏感代码留在平台模块)
main— 稳定发布分支- 功能分支命名:
feat/描述、fix/描述、docs/描述、refactor/描述 - 所有 PR 应指向
main(或活跃开发分支)
- Fork 并创建分支:从目标分支(如
main)创建描述性名称(如feat/add-new-box-type) - 保持更改专注:每个 PR 一个功能或修复
- 测试更改:
- 在修改的模块下运行
./gradlew :<module>:build确保编译成功 - 用
./gradlew :<module>:runClient进行手动测试 - 跨平台验证(如改动影响 common)
- 在修改的模块下运行
- 更新文档:如更改影响行为:
- 更新对应
docs/*.md或根目录README.md - 更新 JSON schema 文档
- 更新对应
- 提交信息格式(推荐 Conventional Commits):
feat: add new box typefix: resolve key validation issuedocs: update configuration guiderefactor: extract ButtonPalette from CsboxScreen
- 提交 PR:附上清晰的更改描述、测试说明、影响的 MC 版本
在 GitHub Issues 页面 报告问题。
报告 bug 时请包含:
- Minecraft 版本(1.21.1 或 26.1.2 / 26.2)
- NeoForge 版本(21.1.248 或 26.1.2.95 / 26.2.0.59)
- 模组版本(
1.0.6等) - 重现步骤
- 预期与实际行为
- 相关日志文件(来自
.minecraft/logs/latest.log或runs/client/logs/latest.log)
功能请求请描述:
- 使用场景
- 如何让用户受益
- 任何现有的替代方案
CS2-Box 使用 NeoForge 内置的 GameTest 框架。详见 docs/TESTING.md。
测试应放在:
common/src/test/java/ (跨版本测试)
v1_21_1/src/test/java/ (1.21.1 平台特化)
v26_1_2/src/test/java/ (26.1.2 平台特化)
运行游戏测试:
./gradlew gameTestServer配置文件为 TOML + JSON 双轨:
config/csgobox.toml— 主模组配置(ModConfigSpec持久化)config/csbox/*.json— 箱子数据定义
添加新配置选项时:
- 在 common 与各平台模块的
CsboxConfig.java中同步添加字段(common 为默认值唯一来源,见CsboxConfigDefaults.java) - 通过
builder.define*().get()内联求值(扁平化访问,不用init()延迟填充) - 在 docs/CONFIGURATION.md 中记录
CONFIG是public static final—— 不要写CONFIG != null守卫
宝箱定义使用 Mojang 1.21+ DataComponent 系统。修改 BoxDefinition.java 时:
- 用新字段更新
BoxDefinitionRecord - 更新 JSON 序列化的
CODEC - 更新网络传输的
StreamCodec - 在 GUI 中添加对应字段(如适用)
详细 schema 见 docs/CONFIGURATION.md §3。
- 修改
common/后需在各平台模块重新构建验证 - GUI 代码改动先在 v1_21_1 落地(legacy
GuiGraphics),再迁移到 v26_1_2(GuiGraphicsExtractordecoupled API) - v26_1_2 渲染管线变更:用
nextStratum()分层、用RenderPipelines.GUI_TEXTURED替换静态RenderSystem调用、用Lightinginstance API
为 CS2-Box 贡献代码即表示您同意您的贡献将采用 MIT 许可证。参见 LICENSE 文件了解详情。