找回密码
 初始化身份识别芯片
查看: 1103|回复: 12

星系无法生成

[复制链接]
4 星币 回复本帖可获得 1 星币奖励! 每人限 1 次

势力巨擘

联盟巡航舰队指挥

发表于 2023-8-10 18:33:36 | 显示全部楼层 |阅读模式
Mod Bug汇报
已解决
游戏版本: 0.95.1
Mod中文名:
Mod版本:
游戏日志:
    复现步骤:
    本帖最后由 sifang 于 2023-8-11 00:23 编辑

    我自己在学习如何添加星系,但是不知道为何星系始终无法生成,mod文件已付送

    代码:


    package data.scripts;

    import com.fs.starfarer.api.BaseModPlugin;
    import com.fs.starfarer.api.Global;
    import data.scripts.world.PTCS_WorldGenerate;

    import exerelin.campaign.SectorManager;

    // =====================================================================================================================
    // >> START

    /**
    * 定义PTCS_ModPlugin类,继承BaseModPlugin类。
    * 该类是Mod程序的执行入口。
    * Mod程序的执行入口最好继承BaseModPlugin类,而不必接入ModPlugin接口。因为BaseModPlugin类已接入ModPlugin接口,只要继承该类,就无需将
    * ModPlugin接口中的所有抽象方法都实现一遍,按需选用即可。
    */
    public class PTCS_ModPlugin extends BaseModPlugin {
        /**
         * 重写父类的onNewGame()方法。
         * 该方法会在创建新游戏时调用,这是在星域中添加内容的首选方法。
         */
        @Override
        public void onNewGame() {
            // 检查是否启用势力争霸
            boolean haveNexerelin = Global.getSettings().getModManager().isModEnabled("nexerelin");
            // 当未启用势力争霸,或启用势力争霸但未开启随机星域时
            if (!haveNexerelin || SectorManager.getManager().isCorvusMode()) {
                // 使用默认构造方法创建一个UCSE_WorldGenerate对象,并执行该对象的generate()方法
                new PTCS_WorldGenerate().generate(Global.getSector());
            }
            // 当启用势力争霸且开启随机星域时,什么都不做
        }
    }

    // >> END
    // =============================



    package data.scripts.world;

    import com.fs.starfarer.api.Global;
    import com.fs.starfarer.api.campaign.SectorAPI;
    import com.fs.starfarer.api.campaign.SectorGeneratorPlugin;
    import data.scripts.world.systems.PTCS_Aorura;


    // =====================================================================================================================
    // >> START

    /**
    * 定义PTCS_WorldGenerate类,接入SectorGeneratorPlugin接口。
    * 该类进行各星系的总体生成设定。
    * SectorGeneratorPlugin接口中只有一条抽象方法(generate()方法),实现即可。
    */
    public class PTCS_WorldGenerate implements SectorGeneratorPlugin {
        /**
         * 实现接口的generate()方法。
         */
        @Override
        public void generate(SectorAPI sector) {
            // 使用默认构造方法创建一个PTCS_Aorura对象,并执行该对象的generate()方法
                new PTCS_Aorura().generate(sector);
                    // 当所有值为false时,不生成任何星系
            }
    }

    // >> END
    // ================================



    package data.scripts.world.systems;

    import com.fs.starfarer.api.Global;
    import com.fs.starfarer.api.campaign.*;
    import com.fs.starfarer.api.campaign.econ.MarketAPI;
    import com.fs.starfarer.api.fleet.FleetMemberType;
    import com.fs.starfarer.api.impl.campaign.ids.Conditions;
    import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
    import com.fs.starfarer.api.impl.campaign.ids.Terrain;
    import com.fs.starfarer.api.impl.campaign.procgen.NebulaEditor;
    import com.fs.starfarer.api.impl.campaign.procgen.StarAge;
    import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
    import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageSpecialAssigner;
    import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
    import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin.MagneticFieldParams;
    import com.fs.starfarer.api.util.Misc;

    import java.awt.*;

    import static com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
    import static com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldSource;

    // =====================================================================================================================
    // >> START

    /**
    * 定义Aorura类。
    * 该类进行恒星系生成的具体设定。若想生成星系,需要先将该类实例化为对象,再由对象执行其中的generate()方法。
    */
    public class PTCS_Aorura {
            /**
             * 定义generate()方法。
             * 该方法进行Aorura生成的具体设定。
             */
            public void generate(SectorAPI sector) {
                    // 添加星系
                    StarSystemAPI system = sector.createStarSystem("PTCS_Aorura");
                    // 设置星系位置
                    system.getLocation().set(400F, -19500F);
                     // 通过本地文件导入星系背景图
                    system.setBackgroundTextureFilename("graphics/PTCS/backgrounds/backgrounds_Aorura.jpg");
                   
                    /*
                     * [恒星]
                     * 添加一个恒星。参数列表:ID,星球类型,半径,日冕大小。
                     * 星球类型定义在data/config/planets.json中。
                     */
                    PlanetAPI Aorura_star  = system.initStar("Aorura_star", "star_yellow", 600F, 300F);
                    //星系全局光照颜色
                    system.setLightColor(new Color(255, 252, 222));
                   
                    /*
                     * [Aorura I]
                     * 添加一个行星。参数列表:ID,圆心,显示名称,星球类型,初始角坐标,星球大小,轨道半径,公转周期。
                     * 星球类型定义在data/config/planets.json中。
                    */
                    PlanetAPI Aorura_I = system.addPlanet("Aorura_1", Aorura_star, "Aorura_star", "barren", 90, 140, 1600, 156);
                    // 设置调用的描述文本的ID。描述文本定义在data/strings/descriptions中
                    Aorura_I.setCustomDescriptionId("Aorura_I");
                    // 在行星上添加一个market,该market与殖民地无关,仅用于设置星球修正
                    MarketAPI Aorura_I_market = Global.getFactory().createMarket("Aorura_I_market", Aorura_I.getName(), 0);
                    Aorura_I_market.setPlanetConditionMarketOnly(true);
                    // 设置修正列表
                    Aorura_I_market.addCondition(Conditions.VERY_HOT);  // 添加修正:异常炎热(+50)
                    Aorura_I_market.addCondition(Conditions.THIN_ATMOSPHERE);  // 添加修正:稀薄大气(+25)
                    Aorura_I_market.addCondition(Conditions.ORE_RICH);  // 添加修正:矿石+2
                    Aorura_I_market.addCondition(Conditions.RARE_ORE_RICH);  // 添加修正:稀有矿石+2
                    // 将market的位置设置在行星上,并告知行星其拥有一个market
                    Aorura_I_market.setPrimaryEntity(Aorura_I);
                    Aorura_I.setMarket(Aorura_I_market);
                   
                    /*
                     * [内部跳跃点]
                     * 添加一个跳跃点。参数列表:ID,显示名称。
                     */
                    JumpPointAPI inside_jumpPoint = Global.getFactory().createJumpPoint("Aorura_jump", "Aorura 内环跳跃点");
                    // 设置轨道。参数列表:圆心,初始角坐标,轨道半径,公转周期
                    inside_jumpPoint.setCircularOrbit(system.getEntityById("Aorura_star"), 140, 2600, 526);
                    // 设置关联星球(超空间中该跳跃点打开后显示在其中的星球,仅为视觉效果)
                    inside_jumpPoint.setRelatedPlanet(Aorura_I);
                    // 设置视觉效果
                    inside_jumpPoint.setStandardWormholeToHyperspaceVisual();
                    // 添加该跳跃点实体
                    system.addEntity(inside_jumpPoint);
            }
    }

    [试做]个人mod.rar

    313.76 KB, 下载次数: 70

    星域军阀

    高级机师

    发表于 2023-8-10 20:28:53 | 显示全部楼层

    回帖奖励 +1 星币

    为啥你的星系生成代码要套娃两层壳子
    直接丢在PTCS_WorldGenerate里面不就好了
    我猜你在mod_info.json中没有挂上自己的modPlugin,导致游戏压根没调用你的代码

    点评

    我有加 "jars":["jars/PTCS.jar"], "modPlugin": "data.scripts.PTCS_ModPlugin" } 所以是代码套娃的问题?  详情 回复 发表于 2023-8-10 21:37

    星域军阀

    高级机师

    发表于 2023-8-10 20:41:29 | 显示全部楼层
    在modPlugin中直接导入势力争霸的class会导致mod在没有安装势力争霸时会由于找不到exerelin.campaign.SectorManager而报错
    继而使得“检查是否启用势力争霸”变成无用代码
    最好是在modPlugin的同目录下建立一个新的class
    把  if (!haveNexerelin || SectorManager.getManager().isCorvusMode()) 放到新的类中
    由于同目录下无需Import,而exerelin.campaign.SectorManager由于没在json中挂载,不会因导入了不存在的类而报错导致游戏终止
    除非你的mod关联了大量的势力争霸代码,作为势力争霸的附属mod存在

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-10 21:37:10 | 显示全部楼层
    本帖最后由 sifang 于 2023-8-10 21:42 编辑
    cjy4312 发表于 2023-8-10 20:28
    为啥你的星系生成代码要套娃两层壳子
    直接丢在PTCS_WorldGenerate里面不就好了
    我猜你在mod_info. ...

    我有加

              "jars":["jars/PTCS.jar"],
            "modPlugin": "data.scripts.PTCS_ModPlugin"
    }

    所以是代码套娃的问题?
    但是我在抄代码的时候抄的是未殖民扩展的代码,几乎一摸一样,为什么它就能跑起来?

    点评

    不要只看一行字  详情 回复 发表于 2023-8-10 22:19

    星域军阀

    高级机师

    发表于 2023-8-10 22:19:07 | 显示全部楼层
    sifang 发表于 2023-8-10 21:37
    我有加

              "jars":["jars/PTCS.jar"],

    不要只看一行字

    点评

    我还是不理解哪里出错了  详情 回复 发表于 2023-8-10 22:27

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-10 22:27:27 | 显示全部楼层
    cjy4312 发表于 2023-8-10 22:19
    不要只看一行字

    我还是不理解哪里出错了

    点评

    我找到原因了 首先,你的星系Y坐标太大了,很可能超出了屏幕 其次你没给星系的星球设置势力归属,是个空白星系,属于未探索星系,不会自动显示名字,需要鼠标指过去才能看到,所以 不是没生成,是生成了你没找到 {:5  详情 回复 发表于 2023-8-10 23:25

    星域军阀

    高级机师

    发表于 2023-8-10 23:25:03 | 显示全部楼层
    sifang 发表于 2023-8-10 22:27
    我还是不理解哪里出错了

    我找到原因了
    首先,你的星系Y坐标太大了,很可能超出了屏幕
    其次你没给星系的星球设置势力归属,是个空白星系,属于未探索星系,不会自动显示名字,需要鼠标指过去才能看到,所以
    不是没生成,是生成了你没找到

    你把坐标改小点,就能看到它了

    星域军阀

    高级机师

    发表于 2023-8-10 23:26:53 | 显示全部楼层
    QQ图片20230810232533.png

    我把坐标修正到400F, -500F,就看到它了

    点评

    所以可能还有些差异,请问能不能把您修改后的文件发过来?谢谢  详情 回复 发表于 2023-8-11 00:08
    非常感谢!  详情 回复 发表于 2023-8-10 23:32

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-10 23:32:30 | 显示全部楼层
    本帖最后由 sifang 于 2023-8-11 00:08 编辑
    cjy4312 发表于 2023-8-10 23:26
    我把坐标修正到400F, -500F,就看到它了

    非常感谢!
    但是我还是没找到它,400F,-500F


    screenshot029.png

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-11 00:08:30 | 显示全部楼层
    cjy4312 发表于 2023-8-10 23:26
    我把坐标修正到400F, -500F,就看到它了

    所以可能还有些差异,请问能不能把您修改后的文件发过来?谢谢

    点评

    emmm,我看你没有,我还加了一句 system.autogenerateHyperspaceJumpPoints(true, true); 这是仅有的区别了  详情 回复 发表于 2023-8-11 00:10

    星域军阀

    高级机师

    发表于 2023-8-11 00:10:51 | 显示全部楼层
    sifang 发表于 2023-8-11 00:08
    所以可能还有些差异,请问能不能把您修改后的文件发过来?谢谢

    emmm,我看你没有写,我还加了一句
    system.autogenerateHyperspaceJumpPoints(true, true);
    这是仅有的区别了

    点评

    找到了!这就是不能生成的问题所在!  详情 回复 发表于 2023-8-11 00:23
    在末尾?  详情 回复 发表于 2023-8-11 00:14

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-11 00:14:29 | 显示全部楼层
    cjy4312 发表于 2023-8-11 00:10
    emmm,我看你没有写,我还加了一句
    system.autogenerateHyperspaceJumpPoints(true, true);
    这是 ...

    在末尾?

    势力巨擘

    联盟巡航舰队指挥

     楼主| 发表于 2023-8-11 00:23:17 | 显示全部楼层
    cjy4312 发表于 2023-8-11 00:10
    emmm,我看你没有写,我还加了一句
    system.autogenerateHyperspaceJumpPoints(true, true);
    这是 ...

    找到了!这就是不能生成的问题所在!

    本版积分规则

    Archiver|手机版|小黑屋|远行星号中文论坛

    GMT+8, 2024-11-22 16:13

    Powered by Discuz! X3.5

    © 2001-2077 Tencent Cloud | Durian Software Studio

    快速回复 返回顶部 返回列表