Starsector Nihilism Guidance
首页
GitHub 项目
首页
GitHub 项目
  • 首页
  • 基础及舰船相关
    • MOD 骨架和入口文件
    • 制作一艘基本舰船
    • 制作一艘航母与战机
    • 制作一艘相位舰
    • 制作火炮、光束与导弹
    • 为舰船加入内置武器、船插与战机
    • 补充描述文本
  • 无需入门的代码修改
    • 以船插为例初步熟悉代码
    • 制作完整船插
    • 制作最小战术系统
    • 为武器加入命中与光束特效
  • 势力与生涯星系
    • 注册一个势力
    • 配置势力舰队
    • 制作 MOD 入口类的最基础适配
    • 制作一个生涯星系
    • 补完描述文本
  • 战役与无代码对象
    • 制作测试战役装配
    • 为模拟战与标题画面加入装配
    • 为舰船加入外观风格
    • 制作一艘模块船
    • 制作一种星体类型
    • 制作一个自定义实体
  • 音频资源与播放
    • 准备 OGG 音频资源
    • 注册音频资源
    • 为游戏对象加入音频
  • Java 工程化
    • 确认 Java 与编译依赖
    • 迁移代码文件到 src
    • 配置 Gradle 工程
    • 构建 JAR 并声明产物
  • 全局服务
    • 制作 MOD 入口类
    • 使用 Global 访问游戏服务
    • 读取设置
    • 调用声音播放器
    • 记录和定位 MOD 日志
  • 战斗运行时
    • 读取战斗引擎状态
    • 读取战斗对象
    • 制作每帧战斗插件
    • 修改舰船数值
    • 配置武器脚本
    • 配置战斗监听器
    • 制作分层渲染插件
  • 战斗内容扩展
    • 详解舰船插件
    • 详解战术系统
    • 详解武器动画
  • 生涯世界与基础服务
    • 读取生涯世界状态
    • 构建生涯地点
    • 配置生涯势力
    • 放置生涯实体
  • 生涯舰队与舰队成员
    • 生成生涯舰队
    • 管理舰队中的成员
    • 舰队状态的重算过程
    • 维护舰队成员状态
    • 读取并修改舰船装配
  • 市场与商品
    • 创建生涯市场
    • 读写货舱内容
    • 注册市场商品
    • 实现专用子市场
    • 制作专用产业
    • 注册特殊物品
    • 实现市场条件
  • 人物与技能
    • 配置人物基础
    • 让人物承担角色
    • 制作角色技能
  • 生涯脚本与情报事件
    • 编写生涯逐帧脚本
    • 监听生涯事件
    • 选择生涯插件
    • 管理舰队活动情报
  • 酒吧事件与任务
    • 组织生涯交互对话
    • 实现对话插件
    • 接入酒吧事件
    • 构建阶段任务
    • 接入酒吧任务
  • Rules 系统、命令与内存
    • 组织 Rules 规则表
    • 编排 Rules 对话
    • 接入 Rules 生涯场景
    • 编写 Rules 命令
    • 使用 MemoryAPI 保存状态
  • 文件读取与写入
    • 读取 MOD 内文本
    • 读取 MOD 内 JSON 文件
    • 读取 MOD 内 CSV
    • 读写 common 数据
    • 实现本地化机制
  • 常用依赖库
    • 接入常用依赖库
    • 使用 LazyLib 几何工具
    • 使用 LazyLib 查询战场
    • 使用 LazyLib 保存公共 JSON
    • 注册 GraphicsLib 光照数据
    • 创建 GraphicsLib 动态光源
    • 制作 GraphicsLib 纹理映射
    • 配置 MagicLib 自动尾迹
    • 创建 MagicLib 运行时尾迹
    • 配置 MagicLib 数据赏金
    • 使用 MagicLib 辅助生涯开发
    • 使用 MagicLib 战斗小工具
  • 可选依赖与 Nexerelin
    • 接入可选依赖
    • 登记 Nexerelin 势力与外交配置
    • 配置 Nexerelin 的两种星区开局
    • 配置 Nexerelin 战略 AI 与扩张规模
    • 登记 Nexerelin 地面战单位与产业
    • 为 Nexerelin 特遣队添加命名与事件响应
    • 制作即时生效的 LunaLib 设置面板
  • 着色器与渲染
    • 使用 Java OpenGL
    • 使用 GLSL 进阶
    • 使用 VBO 和 VAO 保存顶点
    • 使用 SSBO 传递参数
    • 使用实例化进行绘制
    • 选择 BoxUtil 渲染方案

迁移代码文件到 src

准备好编译环境后,需要为编译器指定源码。本节将已有 Java 文件迁入 MOD 根目录的 src/,保留原来的包名和注册值。战役目录中还混有描述与图片,我们也将借此区分哪些文件交给编译器,哪些继续由游戏直接读取。

本节预期阅读时间:~8 分钟。

本节预期操作时间:~10 分钟。

学习目标

完成后,您将能够:

  • 区分源码输入与游戏数据;
  • 按包路径整理脚本和战役定义类;
  • 保留已有完整类名和数据注册;
  • 核对每个类的唯一源码位置。

前置知识

  • [C1-S1] 的 MOD 目录;
  • [C2-S3] 的系统源码和 [C3-S4] 的入口、生成器;
  • [C4-S1] 的 MissionDefinition 目录;
  • [C6-S1] 的 JDK 17 与编译依赖;
  • Java 包名、类名与目录结构。

建立源码目录

在 MOD 根目录建立 src/。后面的 Gradle 配置将从这里收集 Java 文件,因此迁移时要连同包目录一起保留。游戏直接读取的 JSON、CSV、文本和图片继续留在原位置。整理后的目录例如:

GearIndustry/
├── data/
│   ├── config/settings.json
│   └── missions/GearIn_test/
│       ├── descriptor.json
│       ├── mission_text.txt
│       └── icon.jpg
└── src/
    └── data/
        ├── scripts/gearin/
        └── missions/GearIn_test/MissionDefinition.java

这里容易产生一个误解:文件多了一层 src/,包名是否也要增加 src?

包目录从源码根目录开始计算。 将 src/ 指定为根目录后,data.scripts.gearin 仍对应它内部的 data/scripts/gearin/。完整文件位置因此是 src/data/scripts/gearin/,包名保留原值。

迁移系统、入口与生成器

先将 data/scripts/gearin/<domain>/ClassName.java 移到 src/data/scripts/gearin/<domain>/ClassName.java。文件中的 package 与类声明保持原样,数据文件引用的完整类名也继续使用。

以突击填弹器为例,迁移后的文件位置是:

src/data/scripts/gearin/shipsystems/GearInAssaultFeedSystem.java

它的包声明仍为 data.scripts.gearin.shipsystems,系统定义中的 statsScript 仍为 data.scripts.gearin.shipsystems.GearInAssaultFeedSystem。后续编译得到同名 class,游戏再按这个名字加载系统实现。

MOD 入口与星系生成器也按各自包路径迁入。文件位置增加了源码根目录,运行时身份保持不变。 因此这次迁移无需重新命名系统、船插或 MOD 入口。

分开战役代码与战役数据

战役的 MissionDefinition.java 原本和描述、图标放在同一个目录。将它移到 src/data/missions/GearIn_test/MissionDefinition.java,包名保留 data.missions.GearIn_test。

descriptor.json、mission_text.txt、icon.jpg 与 mission_list.csv 仍然放在 data/missions/ 下。游戏按战役 ID 读取这些文件,定义类则从编译产物中加载。若把整套战役文件一起迁入 src/,Java 文件的位置虽然正确,游戏却会失去原路径下的描述和图标。

后面检查 JAR 时也沿用这个对应关系:包名转成内部目录,类名成为 class 文件名。src/ 只参与选择编译输入,不进入 class 的包路径。

收束源码与注册关系

迁移完成后,按完整类名搜索 MOD 目录。每个类保留 src/ 中的一份源码,尤其要核对 MOD 入口、系统效果与战役定义。此前复制样本时,副本是工作的起点;现在若将同名副本也作为编译输入,就会得到重复类错误。

随后对照数据注册:系统的 statsScript、船插的脚本字段、MOD 的 modPlugin 与战役定义,都应继续指向原来的完整类名。至此,编译器将从新位置取得源码,游戏仍按既有名字取得实现。

验证方案

  1. 列出 src/data/scripts/gearin 与 src/data/missions 下的 Java 文件。
  2. 对照 package、目录、文件名和类声明。
  3. 搜索每个完整类名,确认源码位置唯一。
  4. 核对系统、船插、插件和战役数据仍引用当前类名。
  5. 确认 data 目录中的 JSON、CSV、文本和图片保持原路径。

预期结果:

  • Java 源码位于 src 内部的包路径。
  • 数据和资源继续供游戏从原目录读取。
  • 完整类名、对象 ID 与数据注册保持一致。
  • 每个类只有一份用于编译的源码。

故障分析

  • 后续 compileJava 没有发现源码:文件未迁入 src 或源码集合指向其他目录。

    • 解决方案:核对 Java 文件位置,并在构建配置中指定 src。
  • 完整类名找不到:包名与注册值不同,或源码未进入构建产物。

    • 解决方案:对照 package 和类名,完成下一节编译后核对 class 条目。
  • 编译出现重复类:相同 package 和类名有多份源码。

    • 解决方案:按完整类名整理为 src 中的唯一文件。
  • 战役描述或图标缺失:运行数据随源码一起被移走。

    • 解决方案:把战役数据与图标保留在 data/missions 的原目录。

总结

源码已经集中到 src/,包目录保留原来的层级,游戏数据和资源则留在原路径。改变的是编译器取得文件的位置,完整类名与数据注册继续成立。

下一节将这个源码目录写入 Gradle 配置。之后新增 Java 类也保存到相应包目录,构建任务就能统一收集它们。

建议参考项

  • Starsector/starsector-core/starfarer.api.zip:包名、类型与公开方法的对照来源。
  • mod_info.json:入口类和后续 JAR 声明。
在 GitHub 上编辑此页
上次更新: 2026/10/14 12:25
贡献者: 1847905557
上一页
确认 Java 与编译依赖
下一页
配置 Gradle 工程