安卡拉卡 发表于 2025-11-18 19:57:09

关于通灵塔如何实现发射光尘以及两种光尘的代码

本帖最后由 安卡拉卡 于 2025-11-18 20:06 编辑

塔子的两种光尘是武器,可以在weapons/weapon_data.csv里找到,但是,这两个武器的.wpn文件位置在shipsystems\wpn\motelauncher.wpn和shipsystems\wpn\motelauncher_hf.wpn。它们发射的光尘属性是导弹,是data\shipsystems\proj\mote.proj和data\shipsystems\proj\mote_hf.proj这两个文件。


如果想在游戏里实现让玩家的塔子发射紫光尘,只需要在塔子名.json文件里builtinmods这个栏里面加上high_frequency_attractor这个船插即可,也就是加一个感灵吸引场就能实现。但是,这个船插是空的,它单独不生效,只是作为一个条件。它具体是怎么生效的就要从塔子发射光尘的原理来说。


塔子的光尘靠的是武器,而通灵塔的武器有左右角两个隐藏小槽(还有一个中间的隐藏中槽,是发射光尘牵引光束也就是F系统的),其属性是system,用舰船编辑器就能找到,而这两个隐藏小槽上会自动装上光尘武器,也就是前面说的motelauncher(蓝色版)和motelauncher_hf(紫色版)。那么是怎么产生“多了船插就换武器”的效果呢?
首先查塔子的F系统的文件mote_control.system就能发现这样一个东西:"statsScript":"com.fs.starfarer.api.impl.combat.MoteControlScript"
也就是这个MoteControlScript它在编译的jar包里,其位置在Starsector\starsector-core\starfarer.api.jar\com\fs\starfarer\api\impl\combat\MoteControlScript.class,将它反编译之后,就能发现核心在 getWeaponId() 方法:
代码怎么显示不出来,气笑了public static String getWeaponId(ShipAPI ship) {
    if (MoteControlScript.isHighFrequency(ship)) {
      return MOTELAUNCHER_HF;// "motelauncher_hf"
    }
    return MOTELAUNCHER;// "motelauncher"
}

public static boolean isHighFrequency(ShipAPI ship) {
    return ship != null && ship.getVariant().hasHullMod("high_frequency_attractor");
}

武器参数差异预存在 MOTE_DATA 中:代码怎么显示不出来,气笑了static {
    MoteData normal = new MoteData();
    normal.maxMotes = MAX_MOTES;// 30
    normal.antiFighterDamage = ANTI_FIGHTER_DAMAGE;// 200
    normal.impactSound = "mote_attractor_impact_normal";
    // ...
   
    MoteData hf = new MoteData();
    hf.maxMotes = MAX_MOTES_HF;// 50(数量+66%)
    hf.antiFighterDamage = ANTI_FIGHTER_DAMAGE_HF;// 1000(伤害+400%)
    hf.impactSound = "mote_attractor_impact_damage";
    // ...
}
补:自动安装武器的核心代码在 apply() 方法中:
// 1. 寻找系统槽位
this.findSlots(ship);

// 2. 从可用发射槽中随机选一个
WeaponSlotAPI slot = (WeaponSlotAPI)this.launchSlots.pick();

// 3. 获取当前应使用的武器ID(根据Hull Mod)
String weaponId = MoteControlScript.getWeaponId(ship);

// 4. 直接生成弹丸,绕过武器系统
MissileAPI mote = (MissileAPI)engine.spawnProjectile(
    ship, null, weaponId, loc, dir, null
);
findSlots() 方法逻辑:
代码怎么显示不出来,气笑了for (WeaponSlotAPI slot : ship.getHullSpec().getAllWeaponSlotsCopy()) {
    if (!slot.isSystemSlot()) continue;// 只选系统槽
    if (slot.getSlotSize() == WeaponAPI.WeaponSize.SMALL) {
      this.launchSlots.add(slot);// 小槽位=发射器
    }
    if (slot.getSlotSize() == WeaponAPI.WeaponSize.MEDIUM) {
      this.attractor = slot;// 中槽位=吸引器
    }
}

另外,LZ也是代码低手,以上理解可能有误,欢迎各位指正{:tieba_44:}






安卡拉卡 发表于 2025-11-18 20:07:58

这个鬼代码是什么情况,选了代码框一会显示一会不显示{:tieba_34:}

sdfd 发表于 2025-11-18 20:21:42

顶♂一下群友{:tieba_12:}

安卡拉卡 发表于 2025-11-18 20:37:01

sdfd 发表于 2025-11-18 20:21
顶♂一下群友

啊♂thank you sir

Mycophobia 发表于 2025-11-18 20:43:43

你游好多东西用船插+装饰武器做最方便(

安卡拉卡 发表于 2025-11-18 21:04:13

Mycophobia 发表于 2025-11-18 20:43
你游好多东西用船插+装饰武器做最方便(

笑死,确实是这样,但是A圣反其道而行,直接端上了装饰船插+武器这种劲霸代码{:tieba_29:}

相位自走洗衣机 发表于 2025-11-19 00:44:03

安卡拉卡 发表于 2025-11-18 21:04
笑死,确实是这样,但是A圣反其道而行,直接端上了装饰船插+武器这种劲霸代码 ...

能跑就行.jpg{:5_124:}
页: [1]
查看完整版本: 关于通灵塔如何实现发射光尘以及两种光尘的代码