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 渲染方案

制作 MOD 入口类的最基础适配

势力文件提供身份与舰队配置,初始关系则在创建生涯时设置。本节建立齿轮工业的 MOD 入口,把关系代码放进新档回调。下一节会通过同一个入口生成星系,当前先确认类能加载、回调能执行。

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

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

学习目标

完成后,您将能够:

  • 在 mod_info.json 中声明 MOD 入口类;
  • 创建采用 BaseModPlugin 的入口文件;
  • 在新档回调中设置自定义势力的初始关系;
  • 根据加载日志与新档结果定位入口问题。

前置知识

  • [C1-S1] 的 MOD 目录、mod_info.json 与类名规则;
  • [C2-S1] 的效果类、参数和游戏回调;
  • [C3-S1] 的 gear_industry 势力。

创建入口文件

在 MOD 中创建 data/scripts/gearin/GearInModPlugin.java。入口类继承 BaseModPlugin,写法与此前船插继承基类的结构相似。

本例在创建新生涯时设置关系,因此使用 onNewGame() 回调。游戏在这个时机调用它,下面是入口中的局部片段:

@Override
public void onNewGame() {
    seedRelations(Global.getSector());
}

Global.getSector() 取得正在生成的生涯星区;seedRelations(...) 是本例定义的关系设置方法。这里将星区作为参数传入,关系设置便作用于这次生成的生涯。

方法名与调用位置共同决定代码何时生效。 关系设置放在新档回调,已有存档会继续保留自己的关系。修改代码后,需要创建新档观察初始值。

设置齿轮工业的初始关系

在同一个类中加入刚才调用的 seedRelations(...) 方法,局部片段如下:

private void seedRelations(SectorAPI sector) {
    FactionAPI gear = sector.getFaction("gear_industry");
    gear.setRelationship("player", 0f);
    gear.setRelationship("pirates", RepLevel.HOSTILE);
    gear.setRelationship("hegemony", RepLevel.FRIENDLY);
    gear.setRelationship("tritachyon", RepLevel.HOSTILE);
}

sector.getFaction("gear_industry") 按本章定义的 ID 取得势力,gear 保存这个对象。后面每行都通过它调用 setRelationship,第一项填写对方势力 ID,第二项填写关系;这些语句因此都以齿轮工业为设置对象。

0f 为中立,RepLevel.HOSTILE 为敌对,RepLevel.FRIENDLY 为友好。采用关系等级时,游戏选择对应数值,并同步双方的关系。设置的是开局关系,后续生涯事件仍然可以继续改变它们。

本例让齿轮工业与玩家中立、与霸主友好、与海盗和速子科技敌对。关系按势力设定安排:舰队构成、市场归属和外交行为最终都会在同一个星区中发生,关系也应当服务于这个设计。

在 mod_info.json 中声明入口

关系方法写好后,还需要声明这个类作为 MOD 入口。在 MOD 的 mod_info.json 顶层对象中加入下面的局部字段:

"modPlugin": "data.scripts.gearin.GearInModPlugin"

按相邻字段补齐逗号,并保留已有的 MOD 信息。modPlugin 的值由入口文件的包名和类名组成,与声明逐字符一致。游戏加载 MOD 时据此找到入口。

完整最小例

将完整文件保存为 data/scripts/gearin/GearInModPlugin.java,入口声明采用上面的完整类名。

完整成品:GearInModPlugin
package data.scripts.gearin;

import com.fs.starfarer.api.BaseModPlugin;
import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.FactionAPI;
import com.fs.starfarer.api.campaign.RepLevel;
import com.fs.starfarer.api.campaign.SectorAPI;

/** 在新档生成时设置齿轮工业的初始关系。 */
public class GearInModPlugin extends BaseModPlugin {

    @Override
    public void onNewGame() {
        seedRelations(Global.getSector());
    }

    private void seedRelations(SectorAPI sector) {
        FactionAPI gear = sector.getFaction("gear_industry");
        gear.setRelationship("player", 0f);
        gear.setRelationship("pirates", RepLevel.HOSTILE);
        gear.setRelationship("hegemony", RepLevel.FRIENDLY);
        gear.setRelationship("tritachyon", RepLevel.HOSTILE);
    }
}

验证方案

  1. 保存入口源码与 mod_info.json,重启游戏,检查主菜单加载和日志中的类加载信息。
  2. 创建新生涯,按 F 打开情报并进入势力列表。
  3. 选择齿轮工业,核对玩家、海盗、霸主与速子科技的关系。
  4. 修改其中一项初始关系,保存并重启,再创建测试生涯比较该项结果。

预期结果:

  • MOD 入口类加载完成,游戏进入主菜单。
  • 齿轮工业与玩家中立,与霸主友好,与海盗和速子科技敌对。
  • 新建生涯采用保存后的初始关系设置;已有生涯保留当前关系。

故障分析

  • 启动时报 Error loading [data.scripts.gearin.GearInModPlugin]:入口值与源码包名、类名或目录不一致。

    • 解决方案:按完整类名逐段核对文件路径和声明,保存后重启。
  • 新档的初始关系没有设置:入口尚未登记,或 onNewGame() 未调用关系方法。

    • 解决方案:核对 modPlugin 字段、回调与 seedRelations 调用,重新创建生涯。
  • 修改后已有存档关系保持原样:新档回调在创建生涯时执行,当前存档保留自己的状态。

    • 解决方案:创建测试生涯核对初始关系。

总结

MOD 入口通过 mod_info.json 登记,BaseModPlugin 提供回调结构,onNewGame() 把关系设置放在创建生涯的时机。势力文件定义的 ID 在这里用于取得运行中的势力对象。

下一节继续使用这个入口调用星系生成器。启动、保存、读档与持久化的完整处理,由 [C7-S1] 结合工程化后的代码讲解。

建议参考项

  • mod_info.json:modPlugin 入口声明。
  • com.fs.starfarer.api.BaseModPlugin:提供默认回调实现的基类。
  • com.fs.starfarer.api.ModPlugin:onNewGame() 新档回调。
  • com.fs.starfarer.api.Global:getSector() 取得生涯星区。
  • com.fs.starfarer.api.campaign.FactionAPI:setRelationship 设置势力关系。
  • com.fs.starfarer.api.campaign.RepLevel:关系等级。
在 GitHub 上编辑此页
上次更新: 2026/10/14 12:25
贡献者: 1847905557
上一页
配置势力舰队
下一页
制作一个生涯星系