public static bool Prefix(int index, ref Pawn __result) { Scenario scenario = Find.Scenario; if (scenario != null) { if (scenario.AllParts.Any(x => x is ScenPart_ConfigPage_ConfigureStartingPawnsSpecific)) { Pawn pawn = Find.GameInitData.startingAndOptionalPawns[index]; PawnKindDef kindDef = pawn.kindDef; PawnUtility.TryDestroyStartingColonistFamily(pawn); pawn.relations.ClearAllRelations(); PawnComponentsUtility.RemoveComponentsOnDespawned(pawn); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Discard); Find.GameInitData.startingAndOptionalPawns[index] = null; for (int i = 0; i < Find.GameInitData.startingAndOptionalPawns.Count; i++) { if (Find.GameInitData.startingAndOptionalPawns[i] != null) { PawnUtility.TryDestroyStartingColonistFamily(Find.GameInitData.startingAndOptionalPawns[i]); } } __result = SpecificStartingPawnUtility.NewGeneratedStartingPawn(kindDef); Find.GameInitData.startingAndOptionalPawns[index] = __result; return(false); } } return(true); }
public void PrepForMapGen() { while (this.startingAndOptionalPawns.Count > this.startingPawnCount) { PawnComponentsUtility.RemoveComponentsOnDespawned(this.startingAndOptionalPawns[this.startingPawnCount]); Find.WorldPawns.PassToWorld(this.startingAndOptionalPawns[this.startingPawnCount], PawnDiscardDecideMode.KeepForever); this.startingAndOptionalPawns.RemoveAt(this.startingPawnCount); } List <Pawn> list = this.startingAndOptionalPawns; foreach (Pawn pawn in list) { pawn.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, false); } foreach (Pawn pawn2 in list) { pawn2.workSettings.DisableAll(); } using (IEnumerator <WorkTypeDef> enumerator3 = DefDatabase <WorkTypeDef> .AllDefs.GetEnumerator()) { while (enumerator3.MoveNext()) { WorkTypeDef w = enumerator3.Current; if (w.alwaysStartActive) { foreach (Pawn pawn3 in from col in list where !col.story.WorkTypeIsDisabled(w) select col) { pawn3.workSettings.SetPriority(w, 3); } } else { bool flag = false; foreach (Pawn pawn4 in list) { if (!pawn4.story.WorkTypeIsDisabled(w) && pawn4.skills.AverageOfRelevantSkillsFor(w) >= 6f) { pawn4.workSettings.SetPriority(w, 3); flag = true; } } if (!flag) { IEnumerable <Pawn> source = from col in list where !col.story.WorkTypeIsDisabled(w) select col; if (source.Any <Pawn>()) { Pawn pawn5 = source.InRandomOrder(null).MaxBy((Pawn c) => c.skills.AverageOfRelevantSkillsFor(w)); pawn5.workSettings.SetPriority(w, 3); } } } } } }
public void PrepForMapGen() { while (this.startingPawns.Count > this.startingPawnCount) { PawnComponentsUtility.RemoveComponentsOnDespawned(this.startingPawns[this.startingPawnCount]); Find.WorldPawns.PassToWorld(this.startingPawns[this.startingPawnCount], PawnDiscardDecideMode.KeepForever); this.startingPawns.RemoveAt(this.startingPawnCount); } foreach (Pawn startingPawn in this.startingPawns) { startingPawn.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.AddAndRemoveDynamicComponents(startingPawn, false); } foreach (Pawn startingPawn2 in this.startingPawns) { startingPawn2.workSettings.DisableAll(); } foreach (WorkTypeDef allDef in DefDatabase <WorkTypeDef> .AllDefs) { if (allDef.alwaysStartActive) { foreach (Pawn item in from col in this.startingPawns where !col.story.WorkTypeIsDisabled(allDef) select col) { item.workSettings.SetPriority(allDef, 3); } } else { bool flag = false; foreach (Pawn startingPawn3 in this.startingPawns) { if (!startingPawn3.story.WorkTypeIsDisabled(allDef) && startingPawn3.skills.AverageOfRelevantSkillsFor(allDef) >= 6.0) { startingPawn3.workSettings.SetPriority(allDef, 3); flag = true; } } if (!flag) { IEnumerable <Pawn> source = from col in this.startingPawns where !col.story.WorkTypeIsDisabled(allDef) select col; if (source.Any()) { Pawn pawn = source.InRandomOrder(null).MaxBy((Pawn c) => c.skills.AverageOfRelevantSkillsFor(allDef)); pawn.workSettings.SetPriority(allDef, 3); } else if (allDef.requireCapableColonist) { Log.Error("No colonist could do requireCapableColonist work type " + allDef); } } } } }
public void PrepForMapGen() { while (startingAndOptionalPawns.Count > startingPawnCount) { PawnComponentsUtility.RemoveComponentsOnDespawned(startingAndOptionalPawns[startingPawnCount]); Find.WorldPawns.PassToWorld(startingAndOptionalPawns[startingPawnCount], PawnDiscardDecideMode.KeepForever); startingAndOptionalPawns.RemoveAt(startingPawnCount); } List <Pawn> list = startingAndOptionalPawns; foreach (Pawn item in list) { item.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.AddAndRemoveDynamicComponents(item); } foreach (Pawn item2 in list) { item2.workSettings.DisableAll(); } foreach (WorkTypeDef allDef in DefDatabase <WorkTypeDef> .AllDefs) { if (allDef.alwaysStartActive) { foreach (Pawn item3 in from col in list where !col.story.WorkTypeIsDisabled(allDef) select col) { item3.workSettings.SetPriority(allDef, 3); } } else { bool flag = false; foreach (Pawn item4 in list) { if (!item4.story.WorkTypeIsDisabled(allDef) && item4.skills.AverageOfRelevantSkillsFor(allDef) >= 6f) { item4.workSettings.SetPriority(allDef, 3); flag = true; } } if (!flag) { IEnumerable <Pawn> source = from col in list where !col.story.WorkTypeIsDisabled(allDef) select col; if (source.Any()) { Pawn pawn = source.InRandomOrder().MaxBy((Pawn c) => c.skills.AverageOfRelevantSkillsFor(allDef)); pawn.workSettings.SetPriority(allDef, 3); } } } } }
public static void ClearAllStartingPawns() { for (int num = StartingAndOptionalPawns.Count - 1; num >= 0; num--) { StartingAndOptionalPawns[num].relations.ClearAllRelations(); if (Find.World != null) { PawnUtility.DestroyStartingColonistFamily(StartingAndOptionalPawns[num]); PawnComponentsUtility.RemoveComponentsOnDespawned(StartingAndOptionalPawns[num]); Find.WorldPawns.PassToWorld(StartingAndOptionalPawns[num], PawnDiscardDecideMode.Discard); } StartingAndOptionalPawns.RemoveAt(num); } }
static bool Prefix(RimWorld.Planet.WorldPawns __instance, ref Pawn pawn, ref RimWorld.Planet.PawnDiscardDecideMode discardMode) { if (Current.Game.Info.RealPlayTimeInteracting > 0 && // prevent this from firing when the game hasn't even started proper !pawn.Destroyed && // ignore pawns destroyed for whatever reason !KidnapUtility.IsKidnapped(pawn) && // don't make kidnapped pawns available; vanilla handles that naturally !PawnsFinder.AllCaravansAndTravelingTransportPods_Alive.Contains(pawn) && // ignore caravan/pods (pawn.ParentHolder == null || !(pawn.ParentHolder is CompTransporter)) && // ignore pawns in shuttle GameComponent.ListAllySpawned.Contains(pawn.GetUniqueLoadID())) { if (PawnComponentsUtility.HasSpawnedComponents(pawn)) { PawnComponentsUtility.RemoveComponentsOnDespawned(pawn); } GameComponent.ReturnToAvailable(pawn, GameComponent.ListAllySpawned, GameComponent.ListAllyAvailable); return(false); } return(true); }
public void PassToWorld(Pawn pawn, PawnDiscardDecideMode discardMode = PawnDiscardDecideMode.Decide) { if (pawn.Spawned) { Log.Error("Tried to call PassToWorld with spawned pawn: " + pawn + ". Despawn him first.", false); } else if (this.Contains(pawn)) { Log.Error("Tried to pass pawn " + pawn + " to world, but it's already here.", false); } else { if (discardMode == PawnDiscardDecideMode.KeepForever && pawn.Discarded) { Log.Error("Tried to pass a discarded pawn " + pawn + " to world with discardMode=Keep. Discarded pawns should never be stored in WorldPawns.", false); discardMode = PawnDiscardDecideMode.Decide; } if (PawnComponentsUtility.HasSpawnedComponents(pawn)) { PawnComponentsUtility.RemoveComponentsOnDespawned(pawn); } if (discardMode != PawnDiscardDecideMode.Decide) { if (discardMode != PawnDiscardDecideMode.KeepForever) { if (discardMode == PawnDiscardDecideMode.Discard) { this.DiscardPawn(pawn, false); } } else { this.pawnsForcefullyKeptAsWorldPawns.Add(pawn); this.AddPawn(pawn); } } else { this.AddPawn(pawn); } } }
private static Pawn RegenerateStartingPawnInPlace(int index) { Pawn pawn = StartingAndOptionalPawns[index]; PawnUtility.TryDestroyStartingColonistFamily(pawn); pawn.relations.ClearAllRelations(); PawnComponentsUtility.RemoveComponentsOnDespawned(pawn); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Discard); StartingAndOptionalPawns[index] = null; for (int i = 0; i < StartingAndOptionalPawns.Count; i++) { if (StartingAndOptionalPawns[i] != null) { PawnUtility.TryDestroyStartingColonistFamily(StartingAndOptionalPawns[i]); } } Pawn pawn2 = NewGeneratedStartingPawn(); StartingAndOptionalPawns[index] = pawn2; return(pawn2); }
public void PassToWorld(Pawn pawn, PawnDiscardDecideMode discardMode = PawnDiscardDecideMode.Decide) { if (pawn.Spawned) { Log.Error(string.Concat("Tried to call PassToWorld with spawned pawn: ", pawn, ". Despawn him first.")); return; } if (Contains(pawn)) { Log.Error(string.Concat("Tried to pass pawn ", pawn, " to world, but it's already here.")); return; } if (discardMode == PawnDiscardDecideMode.KeepForever && pawn.Discarded) { Log.Error(string.Concat("Tried to pass a discarded pawn ", pawn, " to world with discardMode=Keep. Discarded pawns should never be stored in WorldPawns.")); discardMode = PawnDiscardDecideMode.Decide; } if (PawnComponentsUtility.HasSpawnedComponents(pawn)) { PawnComponentsUtility.RemoveComponentsOnDespawned(pawn); } switch (discardMode) { case PawnDiscardDecideMode.Decide: AddPawn(pawn); break; case PawnDiscardDecideMode.KeepForever: pawnsForcefullyKeptAsWorldPawns.Add(pawn); AddPawn(pawn); break; case PawnDiscardDecideMode.Discard: DiscardPawn(pawn); break; } }