feat(flight): add toggle Gizmo, fix missing ForceLand on undraft, update to latest flight logic

This commit is contained in:
2026-02-27 14:21:15 +08:00
parent d3711e77e2
commit 07f5cfdbc1
5 changed files with 58 additions and 10 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -9,6 +9,40 @@ namespace ArachnaeSwarm
/// </summary>
public class CompPawnFlight : ThingComp
{
public bool flightEnabled = true;
public CompProperties_PawnFlight Props => (CompProperties_PawnFlight)props;
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref flightEnabled, "flightEnabled", true);
}
public override System.Collections.Generic.IEnumerable<Gizmo> CompGetGizmosExtra()
{
if (Props.showFlightToggle && parent is Pawn pawn && pawn.Faction == RimWorld.Faction.OfPlayer)
{
yield return new Verse.Command_Toggle
{
defaultLabel = "Toggle Flight",
defaultDesc = "Toggle flight mode on or off.",
Order = 100f,
icon = Verse.ContentFinder<UnityEngine.Texture2D>.Get("StellarisDaughter/UI/Commands/SD_FlightToggle", false)
?? RimWorld.TexCommand.GatherSpotActive,
isActive = () => flightEnabled,
toggleAction = () =>
{
flightEnabled = !flightEnabled;
if (!flightEnabled && pawn.flight != null && pawn.flight.Flying)
{
pawn.flight.ForceLand();
if (pawn.CurJob != null)
pawn.CurJob.flying = false;
}
}
};
}
}
}
}

View File

@@ -14,6 +14,7 @@ namespace ArachnaeSwarm
{
// --- Custom Flight Logic ---
public FlightCondition flightCondition = FlightCondition.Drafted;
public bool showFlightToggle = true;
// --- Vanilla PawnKindDef Flight Parameters ---
[NoTranslate]

View File

@@ -65,17 +65,22 @@ namespace ArachnaeSwarm
bool shouldBeFlying = false;
var compProps = flightComp.Props;
if (compProps.flightCondition == FlightCondition.Always)
// Gizmo toggle check — if flight is disabled, never fly
if (flightComp.flightEnabled)
{
shouldBeFlying = true;
}
else if (compProps.flightCondition == FlightCondition.DraftedAndMove && (___pawn.Drafted || ___pawn.pather.MovingNow))
{
shouldBeFlying = true;
}
else if (compProps.flightCondition == FlightCondition.Drafted && ___pawn.Drafted)
{
shouldBeFlying = true;
if (compProps.flightCondition == FlightCondition.Always)
{
shouldBeFlying = true;
}
else if (compProps.flightCondition == FlightCondition.DraftedAndMove && (___pawn.Drafted || ___pawn.pather.MovingNow))
{
shouldBeFlying = true;
}
else if (compProps.flightCondition == FlightCondition.Drafted && ___pawn.Drafted)
{
shouldBeFlying = true;
}
}
if (shouldBeFlying)
@@ -104,6 +109,14 @@ namespace ArachnaeSwarm
var flightComp = ___pawn?.TryGetComp<CompPawnFlight>();
if (flightComp == null) return;
if (!flightComp.flightEnabled)
{
__instance.ForceLand();
if (___pawn.CurJob != null)
___pawn.CurJob.flying = false;
return;
}
if (___pawn.GetPosture() != PawnPosture.Standing)
{
__instance.ForceLand();