This commit is contained in:
2025-09-23 14:19:47 +08:00
parent 787d4bb248
commit efca10f561
8 changed files with 175 additions and 21 deletions

View File

@@ -40,11 +40,16 @@ namespace ArachnaeSwarm
private Vector3 position2;
public Vector3 ExPos;
public bool isDummy = false;
private Vector3 exactPositionInt; // 用于存储我们自己计算的位置
public override Vector3 ExactPosition => exactPositionInt; // 重写属性,让游戏获取我们计算的位置
public override Quaternion ExactRotation => Quaternion.LookRotation(destination - origin); // 弹头始终朝向目标
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref isDummy, "isDummy", false);
Scribe_Values.Look(ref exactPositionInt, "exactPositionInt");
}
public override void SpawnSetup(Map map, bool respawningAfterLoad)
@@ -52,6 +57,8 @@ namespace ArachnaeSwarm
base.SpawnSetup(map, respawningAfterLoad);
settings = def.GetModExtension<CruiseMissileProperties>() ?? new CruiseMissileProperties();
this.isDummy = settings.isDummy;
// 初始化我们自己的位置
exactPositionInt = origin;
}
private void RandFactor()
@@ -166,15 +173,16 @@ namespace ArachnaeSwarm
);
}
protected override void DrawAt(Vector3 position, bool flip = false)
{
position2 = BPos(DistanceCoveredFraction - 0.01f);
ExPos = position = BPos(DistanceCoveredFraction);
base.DrawAt(position, flip);
}
// 不再需要重写DrawAt因为ExactPosition现在是正确的
// protected override void DrawAt(Vector3 position, bool flip = false)
// { ... }
protected override void Tick()
{
// 不调用 base.Tick() 来阻止直线运动逻辑
// base.Tick();
// 更新目标位置
if (intendedTarget.Thing is Pawn pawn && pawn.Spawned && !pawn.Destroyed)
{
if ((pawn.Dead || pawn.Downed) && DistanceCoveredFraction < 0.6f)
@@ -183,7 +191,25 @@ namespace ArachnaeSwarm
}
destination = pawn.DrawPos;
}
base.Tick();
// 更新ticksToImpact这是从基类Projectile复制过来的逻辑
ticksToImpact--;
if (ticksToImpact <= 0)
{
// 时间到了,强制撞击
Impact(null);
return;
}
// 更新我们自己的位置
exactPositionInt = BPos(this.DistanceCoveredFraction);
// 检查是否到达终点
if (this.DistanceCoveredFraction >= 1f)
{
Impact(null);
return;
}
}
private void FindNextTarget(Vector3 center)