public static void Banish(Pawn pawn, int tile = -1) { if (pawn.Faction != Faction.OfPlayer && pawn.HostFaction != Faction.OfPlayer) { Log.Warning("Tried to banish " + pawn + " but he's neither a colonist, tame animal, nor prisoner."); } else { if (tile == -1) { tile = pawn.Tile; } bool flag = PawnBanishUtility.WouldBeLeftToDie(pawn, tile); PawnDiedOrDownedThoughtsUtility.TryGiveThoughts(pawn, null, (PawnDiedOrDownedThoughtsKind)((!flag) ? 1 : 2)); Caravan caravan = pawn.GetCaravan(); if (caravan != null) { CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(pawn, caravan.PawnsListForReading, null); caravan.RemovePawn(pawn); if (flag) { if (Rand.Value < 0.800000011920929) { pawn.Kill(null, null); } else { PawnBanishUtility.HealIfPossible(pawn); } } if (pawn.guest != null) { pawn.guest.SetGuestStatus(null, false); } if (pawn.Faction == Faction.OfPlayer) { Faction newFaction = default(Faction); if (Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction(out newFaction, pawn.Faction != null && (int)pawn.Faction.def.techLevel >= 3, false, TechLevel.Undefined)) { pawn.SetFaction(newFaction, null); } else { pawn.SetFaction(Faction.OfSpacer, null); } } } else { if (pawn.guest != null) { pawn.guest.SetGuestStatus(null, false); } if (pawn.Faction == Faction.OfPlayer) { pawn.SetFaction(Faction.OfSpacer, null); } } } }
public static void MakePawnLeave(Pawn pawn, Quest quest) { Caravan caravan = pawn.GetCaravan(); if (caravan != null) { CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(pawn, caravan.PawnsListForReading); caravan.RemovePawn(pawn); } if (pawn.Faction == Faction.OfPlayer) { Rand.PushState(quest.id ^ 0x394042B4); Faction result; if (pawn.HasExtraHomeFaction(quest) && pawn.GetExtraHomeFaction(quest) != Faction.OfPlayer) { result = pawn.GetExtraHomeFaction(quest); } else if (pawn.HasExtraMiniFaction(quest) && pawn.GetExtraMiniFaction(quest) != Faction.OfPlayer) { result = pawn.GetExtraMiniFaction(quest); } else if (!(from x in Find.FactionManager.GetFactions_NewTemp(allowHidden: false, allowDefeated: false, allowNonHumanlike: false) where !x.HostileTo(Faction.OfPlayer) select x).TryRandomElement(out result) && !Find.FactionManager.GetFactions_NewTemp(allowHidden: false, allowDefeated: false, allowNonHumanlike: false).TryRandomElement(out result)) { result = null; } Rand.PopState(); if (pawn.Faction != result) { pawn.SetFaction(result); } } foreach (Pawn item in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_OfPlayerFaction) { if (item.playerSettings.Master == pawn) { item.playerSettings.Master = null; } } if (pawn.guest != null) { if (pawn.InBed() && pawn.CurrentBed().Faction == Faction.OfPlayer && (pawn.Faction == null || !pawn.Faction.HostileTo(Faction.OfPlayer))) { pawn.guest.SetGuestStatus(Faction.OfPlayer); } else { pawn.guest.SetGuestStatus(null); } } pawn.GetLord()?.Notify_PawnLost(pawn, PawnLostCondition.ForcedByQuest); }
public static void Banish(Pawn pawn, int tile = -1) { if (pawn.Faction != Faction.OfPlayer && pawn.HostFaction != Faction.OfPlayer) { Log.Warning(string.Concat("Tried to banish ", pawn, " but he's neither a colonist, tame animal, nor prisoner.")); return; } if (tile == -1) { tile = pawn.Tile; } bool flag = WouldBeLeftToDie(pawn, tile); if (!pawn.IsQuestLodger()) { PawnDiedOrDownedThoughtsUtility.TryGiveThoughts(pawn, null, (!flag) ? PawnDiedOrDownedThoughtsKind.Banished : PawnDiedOrDownedThoughtsKind.BanishedToDie); } Caravan caravan = pawn.GetCaravan(); if (caravan != null) { CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(pawn, caravan.PawnsListForReading); caravan.RemovePawn(pawn); if (flag) { if (Rand.Value < 0.8f) { pawn.Kill(null, null); } else { HealIfPossible(pawn); } } } if (pawn.guest != null) { pawn.guest.SetGuestStatus(null); } if (pawn.Faction == Faction.OfPlayer) { if (!pawn.Spawned && Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction_NewTemp(out var faction, pawn.Faction != null && (int)pawn.Faction.def.techLevel >= 3)) { if (pawn.Faction != faction) { pawn.SetFaction(faction); } } else if (pawn.Faction != null) { pawn.SetFaction(null); } }
public static bool IgnoreWristblade(Pawn __instance) { bool result = true; if (__instance.RaceProps.Humanlike) { result = !(__instance.apparel.WornApparel.Any(x => x.def.defName.Contains("RRY_Equipment_HunterGauntlet")) && !__instance.Dead); } // Log.Message(string.Format("Pawn_StripPatch IgnoreWristblade: {0}", result)); if (!result) { Caravan caravan = __instance.GetCaravan(); if (caravan != null) { CaravanInventoryUtility.MoveAllInventoryToSomeoneElse(__instance, caravan.PawnsListForReading, null); if (__instance.apparel != null) { CaravanInventoryUtility.MoveAllApparelToSomeonesInventory(__instance, caravan.PawnsListForReading); } if (__instance.equipment != null) { CaravanInventoryUtility.MoveAllEquipmentToSomeonesInventory(__instance, caravan.PawnsListForReading); } } else { IntVec3 pos = (__instance.Corpse == null) ? __instance.PositionHeld : __instance.Corpse.PositionHeld; if (__instance.equipment != null) { __instance.equipment.DropAllEquipment(pos, false); } if (__instance.apparel != null) { DropAll(__instance, pos, false); } if (__instance.inventory != null) { __instance.inventory.DropAllNearPawn(pos, false, false); } } } return(result); }