コード例 #1
0
 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);
             }
         }
     }
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
                }
            }
コード例 #4
0
        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);
        }