|
|
本帖最后由 安卡拉卡 于 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也是代码低手,以上理解可能有误,欢迎各位指正
|
|