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

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

[复制链接]

巡洋大副

发表于 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() 方法:
  1. 代码怎么显示不出来,气笑了
复制代码
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 中:
  1. 代码怎么显示不出来,气笑了
复制代码
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. // 1. 寻找系统槽位
  2. this.findSlots(ship);

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

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

  7. // 4. 直接生成弹丸,绕过武器系统
  8. MissileAPI mote = (MissileAPI)engine.spawnProjectile(
  9.     ship, null, weaponId, loc, dir, null
  10. );
复制代码

findSlots() 方法逻辑:

  1. 代码怎么显示不出来,气笑了
复制代码
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也是代码低手,以上理解可能有误,欢迎各位指正







巡洋大副

 楼主| 发表于 2025-11-18 20:07:58 | 显示全部楼层
这个鬼代码是什么情况,选了代码框一会显示一会不显示

战列舰长

发表于 2025-11-18 20:21:42 | 显示全部楼层
顶♂一下群友

点评

啊♂thank you sir  详情 回复 发表于 2025-11-18 20:37

巡洋大副

 楼主| 发表于 2025-11-18 20:37:01 | 显示全部楼层

啊♂thank you sir

星域军阀

高级机师通讯记者

发表于 2025-11-18 20:43:43 | 显示全部楼层
你游好多东西用船插+装饰武器做最方便(

点评

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

巡洋大副

 楼主| 发表于 2025-11-18 21:04:13 | 显示全部楼层
Mycophobia 发表于 2025-11-18 20:43
你游好多东西用船插+装饰武器做最方便(

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

点评

能跑就行.jpg  详情 回复 发表于 2025-11-19 00:44

英仙统领

呱!是刻晶七音口牙!

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

能跑就行.jpg
相位洗衣机装配点五十六点耗散每分钟三百五十相位EMP电击瞬间完成,是洗衣机中的豪杰

本版积分规则

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

GMT+8, 2025-12-6 01:46

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio

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