private void SpawnCaravanAtDestinationTile() { PawnFlyersTraveling.tmpPawns.Clear(); for (int i = 0; i < this.pods.Count; i++) { ThingOwner innerContainer = this.pods[i].innerContainer; for (int j = 0; j < innerContainer.Count; j++) { Pawn pawn = innerContainer[j] as Pawn; PawnFlyer pawnFlyer = innerContainer[j] as PawnFlyer; if (pawn != null) { PawnFlyersTraveling.tmpPawns.Add(pawn); } else if (pawnFlyer != null) { PawnFlyersTraveling.tmpPawns.Add((Pawn)pawnFlyer); } } } int startingTile; if (!GenWorldClosest.TryFindClosestPassableTile(this.destinationTile, out startingTile)) { startingTile = this.destinationTile; } Caravan o = CaravanMaker.MakeCaravan(PawnFlyersTraveling.tmpPawns, Faction.OfPlayer, startingTile, true); o.AddPawn((Pawn)pawnFlyer, false); for (int k = 0; k < this.pods.Count; k++) { ThingOwner innerContainer2 = this.pods[k].innerContainer; for (int l = 0; l < innerContainer2.Count; l++) { if (!(innerContainer2[l] is Pawn)) { Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(innerContainer2[l], PawnFlyersTraveling.tmpPawns, null, null); pawn2.inventory.innerContainer.TryAdd(innerContainer2[l], true); } else { Pawn pawn3 = innerContainer2[l] as Pawn; if (!pawn3.IsPrisoner) { if (pawn3.Faction != pawnFlyer.Faction) { pawn3.SetFaction(pawnFlyer.Faction); } } } } } this.RemoveAllPods(); Find.WorldObjects.Remove(this); Messages.Message("MessageTransportPodsArrived".Translate(), o, MessageTypeDefOf.PositiveEvent); }
public bool ContainsPawnFlyer(PawnFlyer p) { for (int i = 0; i < this.pods.Count; i++) { if (this.pods[i].innerContainer.Contains(p)) { return(true); } } return(false); }
public void AddPod(ActiveDropPodInfo contents, bool justLeftTheMap) { contents.parent = null; this.pods.Add(contents); ThingOwner innerContainer = contents.innerContainer; for (int i = 0; i < innerContainer.Count; i++) { Pawn pawn = innerContainer[i] as Pawn; PawnFlyer pawnFlyer = innerContainer[i] as PawnFlyer; if (pawn != null && !pawn.IsWorldPawn()) { if (!base.Spawned) { Log.Warning("Passing pawn " + pawn + " to world, but the TravelingTransportPod is not spawned. This means that WorldPawns can discard this pawn which can cause bugs."); } if (justLeftTheMap) { pawn.ExitMap(false, Rot4.Random); } else { Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); } } if (pawnFlyer != null && !pawnFlyer.IsWorldPawn()) { if (!base.Spawned) { Log.Warning("Passing pawn " + pawnFlyer + " to world, but the TravelingTransportPod is not spawned. This means that WorldPawns can discard this pawn which can cause bugs."); } if (justLeftTheMap) { pawnFlyer.ExitMap(false, Rot4.Random); } else { Find.WorldPawns.PassToWorld(pawnFlyer, PawnDiscardDecideMode.Decide); } } } contents.savePawnsWithReferenceMode = true; }
private void GivePodContentsToCaravan(Caravan caravan) { for (int i = 0; i < this.pods.Count; i++) { List <Thing> tmpContainedThings = new List <Thing>(); //PawnFlyersTraveling.tmpContainedThing.Clear(); tmpContainedThings.AddRange(this.pods[i].innerContainer); //this.pods[i].innerContainer. for (int j = 0; j < tmpContainedThings.Count; j++) { this.pods[i].innerContainer.Remove(tmpContainedThings[j]); tmpContainedThings[j].holdingOwner = null; Pawn pawn = tmpContainedThings[j] as Pawn; PawnFlyer pawnFlyer = tmpContainedThings[j] as PawnFlyer; if (pawn != null) { caravan.AddPawn(pawn, true); } else if (pawnFlyer != null) { caravan.AddPawn(pawnFlyer, true); } else { Pawn pawn2 = CaravanInventoryUtility.FindPawnToMoveInventoryTo(tmpContainedThings[j], caravan.PawnsListForReading, null, null); bool flag = false; if (pawn2 != null) { flag = pawn2.inventory.innerContainer.TryAdd(tmpContainedThings[j], true); } if (!flag) { tmpContainedThings[j].Destroy(DestroyMode.Vanish); } } } } this.RemoveAllPods(); Find.WorldObjects.Remove(this); Messages.Message("MessageTransportPodsArrivedAndAddedToCaravan".Translate(), caravan, MessageTypeDefOf.PositiveEvent); }