76 lines
2.6 KiB
C#
76 lines
2.6 KiB
C#
using RimWorld.Planet;
|
|
using UnityEngine;
|
|
using Verse;
|
|
using RimWorld;
|
|
|
|
namespace ArachnaeSwarm
|
|
{
|
|
public class WorldObject_CatastropheMissile : WorldObject
|
|
{
|
|
public int destinationTile = -1;
|
|
public IntVec3 destinationCell = IntVec3.Invalid;
|
|
public ThingDef Projectile;
|
|
|
|
private int initialTile = -1;
|
|
private float traveledPct;
|
|
private const float TravelSpeed = 0.0002f;
|
|
|
|
public override void ExposeData()
|
|
{
|
|
base.ExposeData();
|
|
Scribe_Values.Look(ref destinationTile, "destinationTile", 0);
|
|
Scribe_Values.Look(ref destinationCell, "destinationCell");
|
|
Scribe_Defs.Look(ref Projectile, "Projectile");
|
|
Scribe_Values.Look(ref initialTile, "initialTile", 0);
|
|
Scribe_Values.Look(ref traveledPct, "traveledPct", 0f);
|
|
}
|
|
|
|
public override void PostAdd()
|
|
{
|
|
base.PostAdd();
|
|
this.initialTile = this.Tile;
|
|
}
|
|
|
|
private Vector3 StartPos => Find.WorldGrid.GetTileCenter(this.initialTile);
|
|
private Vector3 EndPos => Find.WorldGrid.GetTileCenter(this.destinationTile);
|
|
|
|
public override Vector3 DrawPos => Vector3.Slerp(StartPos, EndPos, traveledPct);
|
|
|
|
protected override void Tick()
|
|
{
|
|
base.Tick();
|
|
float distance = GenMath.SphericalDistance(StartPos.normalized, EndPos.normalized);
|
|
if(distance > 0)
|
|
{
|
|
traveledPct += TravelSpeed / distance;
|
|
}
|
|
else
|
|
{
|
|
traveledPct = 1;
|
|
}
|
|
|
|
if (traveledPct >= 1f)
|
|
{
|
|
Arrived();
|
|
}
|
|
}
|
|
|
|
private void Arrived()
|
|
{
|
|
Map targetMap = Current.Game.FindMap(this.destinationTile);
|
|
if (targetMap != null)
|
|
{
|
|
// Find a random entry point at the north edge of the target map
|
|
IntVec3 entryCell = CellFinder.RandomEdgeCell(Rot4.North, targetMap);
|
|
|
|
// Spawn the final projectile (the cruise missile) at the entry point
|
|
Projectile_CruiseMissile missile = (Projectile_CruiseMissile)GenSpawn.Spawn(this.Projectile, entryCell, targetMap, WipeMode.Vanish);
|
|
|
|
// Launch it from the entry point towards the final destination cell
|
|
missile.Launch(null, entryCell.ToVector3Shifted(), new LocalTargetInfo(this.destinationCell), new LocalTargetInfo(this.destinationCell), ProjectileHitFlags.IntendedTarget);
|
|
}
|
|
|
|
Find.WorldObjects.Remove(this);
|
|
}
|
|
}
|
|
} |