protected Faction FindCarryingFaction(Pawn pawn, out Pawn carrier)
        {
            ThingContainer holder = pawn.holder;

            if (holder != null)
            {
                IThingContainerOwner owner = holder.owner;
                if (owner != null)
                {
                    Pawn_CarryTracker pawn_CarryTracker = owner as Pawn_CarryTracker;
                    if (pawn_CarryTracker != null)
                    {
                        Pawn pawn2 = pawn_CarryTracker.pawn;
                        if (pawn2 != null)
                        {
                            carrier = pawn2;
                            if (Find.ListerPawns.PawnsHostileToColony.Contains(pawn2))
                            {
                                this.Message(pawn, "Carried by pawn (" + pawn2.NameStringShort + ") in hostile faction");
                                return(pawn2.Faction);
                            }
                            this.Message(pawn, "Carried by pawn (" + pawn2.NameStringShort + ") in non-hostile faction");
                            return(Faction.OfColony);
                        }
                    }
                }
            }
            carrier = null;
            return(null);
        }
 public static void Postfix(Pawn_CarryTracker __instance, IntVec3 dropLoc, ThingPlaceMode mode,
                            Thing resultingThing, Action <Thing, int> placedAction = null)
 {
     if (resultingThing.IsForbidden(Faction.OfPlayer) && __instance.pawn.IsPrisonerOfColony)
     {
         resultingThing.SetForbidden(false);
     }
 }
        private void <PlaceTargetInCarrierInventory> m__3()
        {
            Pawn_CarryTracker carryTracker = this.pawn.carryTracker;
            Thing             carriedThing = carryTracker.CarriedThing;

            this.Transferable.AdjustTo(Mathf.Max(this.Transferable.CountToTransfer - carriedThing.stackCount, 0));
            carryTracker.innerContainer.TryTransferToContainer(carriedThing, this.Carrier.inventory.innerContainer, carriedThing.stackCount, true);
        }
 public void Update()
 {
     if (this.pawn == null)
     {
         return;
     }
     this.incapacitated = false;
     if (this.pawn.health != null)
     {
         this.health        = this.pawn.health.summaryHealth.SummaryHealthPercent;
         this.incapacitated = this.pawn.health.Downed;
     }
     else
     {
         this.health = 0f;
     }
     this.kidnapped = false;
     if (this.pawn.holder != null)
     {
         if (this.pawn.Destroyed)
         {
             this.missing = true;
         }
         else if (this.pawn.holder.owner != null)
         {
             Pawn_CarryTracker pawn_CarryTracker = this.pawn.holder.owner as Pawn_CarryTracker;
             if (pawn_CarryTracker != null && pawn_CarryTracker.pawn != null && pawn_CarryTracker.pawn.Faction != null && pawn_CarryTracker.pawn.Faction != Faction.OfColony && pawn_CarryTracker.pawn.Faction.RelationWith(Faction.OfColony).hostile)
             {
                 this.kidnapped = true;
             }
         }
     }
     this.dead = this.pawn.Dead;
     if (this.dead && this.WasReplaced(this.pawn))
     {
         this.dead = false;
     }
     this.sanity = null;
     if (this.pawn.mindState != null && this.pawn.mindState.broken != null)
     {
         this.sanity = this.pawn.mindState.broken.CurStateDef;
     }
     this.drafted         = (!this.dead && this.pawn.Drafted);
     this.psychologyLevel = 0;
     if (this.pawn.mindState != null && this.pawn.mindState.breaker != null && !this.pawn.Downed && !this.pawn.Dead)
     {
         if (this.pawn.mindState.breaker.HardBreakImminent)
         {
             this.psychologyLevel = 2;
         }
         else if (this.pawn.mindState.breaker.MentalBreakApproaching)
         {
             this.psychologyLevel = 1;
         }
     }
 }
예제 #5
0
        public void CheckForOwner()
        {
            CompEquippable tempcomp;
            Apparel        tempthing;

            if (this.parent != null && !this.parent.Spawned && this.parent.holdingContainer == null)
            {
                //         Log.Message("Begin Check");
                if (this.parent is Apparel)
                {
                    //             Log.Message("Soul item is Apparel");
                    tempthing  = this.parent as Apparel;
                    this.Owner = tempthing.wearer;
                }
                else if ((tempcomp = this.parent.TryGetComp <CompEquippable>()) != null && tempcomp.PrimaryVerb.CasterPawn != null)
                {
                    //         Log.Message("IsGun");
                    this.Owner = tempcomp.PrimaryVerb.CasterPawn;
                }
                else if (this.parent.holdingContainer != null && this.parent.holdingContainer.owner is Pawn_CarryTracker)
                {
                    Pawn_CarryTracker tracker = this.parent.holdingContainer.owner as Pawn_CarryTracker;
                    this.Owner = tracker.pawn;
                }
                if ((this.Owner != null))
                {
                    if ((soul = this.Owner.needs.TryGetNeed <Need_Soul>()) != null)
                    {
                        this.CalculateSoulChanges(soul, SProps);
                    }
                    if (!PsykerPowerAdded)
                    {
                        CompPsyker compPsyker;
                        if ((compPsyker = Owner.TryGetComp <CompPsyker>()) != null)
                        {
                            for (int i = 0; i < SProps.UnlockedPsykerPowers.Count; i++)
                            {
                                if (soul.PsykerPowerLevel >= SProps.UnlockedPsykerPowers[i].PowerLevel)
                                {
                                    //    Log.Message("Adding Power to: " + compPsyker.psyker + " : " + SProps.UnlockedPsykerPowers[i].defName);
                                    compPsyker.allpsykerPowers.Add(new PsykerPowerEntry(SProps.UnlockedPsykerPowers[i], true, this.parent.def));
                                }
                            }
                            compPsyker.UpdatePowers();
                        }
                        PsykerPowerAdded = true;
                    }
                }
            }
            if (this.parent.Spawned)
            {
                PsykerPowerAdded = false;
            }
        }
 public Pawn FindCarrier()
 {
     if (this.pawn.holder != null && this.pawn.holder.owner != null)
     {
         Pawn_CarryTracker pawn_CarryTracker = this.pawn.holder.owner as Pawn_CarryTracker;
         if (pawn_CarryTracker != null && pawn_CarryTracker.pawn != null)
         {
             return(pawn_CarryTracker.pawn);
         }
     }
     return(null);
 }
 private Toil PlaceTargetInCarrierInventory()
 {
     return(new Toil
     {
         initAction = delegate()
         {
             Pawn_CarryTracker carryTracker = this.pawn.carryTracker;
             Thing carriedThing = carryTracker.CarriedThing;
             carryTracker.innerContainer.TryTransferToContainer(carriedThing, this.vehicle.inventory.innerContainer, carriedThing.stackCount, true);
             this.pawn.Map.GetComponent <LoadItemsToVehicle>().itemsToBeLoaded.Remove(carriedThing);
         }
     });
 }
 private Toil PlaceTargetInCarrierInventory()
 {
     return(new Toil
     {
         initAction = delegate()
         {
             Pawn_CarryTracker carryTracker = this.pawn.carryTracker;
             Thing carriedThing = carryTracker.CarriedThing;
             this.Transferable.AdjustTo(Mathf.Max(this.Transferable.CountToTransfer - carriedThing.stackCount, 0));
             carryTracker.innerContainer.TryTransferToContainer(carriedThing, this.Carrier.inventory.innerContainer, carriedThing.stackCount, true);
         }
     });
 }
        private Toil PlaceTargetInCarrierInventory()
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn_CarryTracker carryTracker = pawn.carryTracker;
                Thing             carriedThing = carryTracker.CarriedThing;
                Transferable.AdjustTo(Mathf.Max(Transferable.CountToTransfer - carriedThing.stackCount, 0));
                carryTracker.innerContainer.TryTransferToContainer(carriedThing, Carrier.inventory.innerContainer, carriedThing.stackCount);
            };
            return(toil);
        }
        public static void Postfix(Pawn_CarryTracker __instance, ref Thing __result)
        {
            Job job = __instance.pawn.CurJob;

            if (job != null)
            {
                if (job.def == AwesomeInventory_JobDefOf.AwesomeInventory_Unload)
                {
                    if (job.targetA.HasThing)
                    {
                        __result = job.targetA.Thing;
                    }
                }
            }
        }
예제 #11
0
        // Token: 0x0600006D RID: 109 RVA: 0x00005354 File Offset: 0x00003554
        public static float GetInventoryWeight(Pawn pilot, bool includeCarried)
        {
            float weight = 0f;

            if (includeCarried)
            {
                Thing thing;
                if (pilot == null)
                {
                    thing = null;
                }
                else
                {
                    Pawn_CarryTracker carryTracker = pilot.carryTracker;
                    thing = (carryTracker?.CarriedThing);
                }
                Thing InvCarried = thing;
                if (InvCarried != null)
                {
                    weight += InvCarried.def.BaseMass * (float)InvCarried.stackCount;
                }
            }
            List <Thing> list;

            if (pilot == null)
            {
                list = null;
            }
            else
            {
                Pawn_InventoryTracker inventory = pilot.inventory;
                list = (inventory?.innerContainer.ToList <Thing>());
            }
            List <Thing> Inv = list;

            if (Inv != null && Inv.Count > 0)
            {
                for (int i = 0; i < Inv.Count; i++)
                {
                    weight += Inv[i].def.BaseMass * (float)Inv[i].stackCount;
                }
            }
            return(weight);
        }
 private Toil PlaceTargetInCarrierInventory()
 {
     return(new Toil
     {
         initAction = delegate
         {
             Pawn_CarryTracker carryTracker = this.pawn.carryTracker;
             Thing carriedThing = carryTracker.CarriedThing;
             //this.Transferable.AdjustTo(Mathf.Max(this.Transferable.CountToTransfer - carriedThing.stackCount, 0));
             if (carryTracker.innerContainer.TryTransferToContainer(carriedThing, this.Carrier.inventory.innerContainer, carriedThing.stackCount, true))
             {
                 if (Prefs.DevMode)
                 {
                     Log.Message("\t[Carnivale] " + this.pawn + " succesfully hauled " + carriedThing + " to " + this.Carrier + ". pos=" + this.Carrier.Position);
                 }
             }
         }
     });
 }
예제 #13
0
        private static void Follow()
        {
            if (!_currentlyFollowing || _followedThing == null)
            {
                return;
            }

            Vector3 newCameraPosition;

            if (!_followedThing.Spawned && _followedThing.holder != null)
            {
                // thing is in some sort of container
                IThingContainerOwner holder = _followedThing.holder.owner;

                // if holder is a pawn's carrytracker we can use the smoother positions of the pawns's drawposition
                Pawn_CarryTracker tracker = holder as Pawn_CarryTracker;
                if (tracker != null)
                {
                    newCameraPosition = tracker.pawn.DrawPos;
                }

                // otherwise the holder int location will have to do
                else
                {
                    newCameraPosition = holder.GetPosition().ToVector3Shifted();
                }
            }

            // thing is spawned in world, just use the things drawPos
            else if (_followedThing.Spawned)
            {
                newCameraPosition = _followedThing.DrawPos;
            }

            // we've lost track of whatever it was we were following
            else
            {
                StopFollow();
                return;
            }
            // to avoid cancelling the following immediately after it starts, allow the camera to move to the followed thing once
            // before starting to compare positions
            if (_cameraHasJumpedAtLeastOnce)
            {
                // the actual location of the camera right now
                var currentCameraPosition = Find.CameraDriver.MapPosition;

                // the location the camera has been requested to be at
                var requestedCameraPosition = GetRequestedCameraPosition().ToIntVec3();

                // these normally stay in sync while following is active, since we were the last to request where the camera should go.
                // If they get out of sync, it's because the camera has been asked to jump to somewhere else, and we should stop
                // following our thing.
                if (Math.Abs(currentCameraPosition.x - requestedCameraPosition.x) > 1 || Math.Abs(currentCameraPosition.z - requestedCameraPosition.z) > 1)
                {
                    StopFollow();
                    return;
                }
            }

            Find.CameraDriver.JumpTo(newCameraPosition);
            _cameraHasJumpedAtLeastOnce = true;
        }
예제 #14
0
        // Called every frame when the mod is enabled.
        public virtual void Update()
        {
            if (Enabled)
            {
                try
                {
                    // shut it off if we're manually scrolling (keys)
                    if (CurrentlyFollowing)
                    {
                        if (followBreakingKeyBindingDefs.Any(key => key.IsDown))
                        {
                            Messages.Message("FollowMe.Cancel".Translate(followedLabel), MessageSound.Negative);
                            followedThing      = null;
                            CurrentlyFollowing = false;
                        }
                    }

                    // TODO: figure out how to shut it off when scrolling by mouse?

                    // get selection
                    Thing newFollowedThing = Find.Selector.SingleSelectedObject as Thing;

                    // start/stop following thing on key press
                    if (FollowKey.KeyDownEvent)
                    {
                        Log.Message("FollowMe :: Follow key pressed");
                        // nothing to cancel or start following
                        if (!CurrentlyFollowing && newFollowedThing == null)
                        {
                            if (Find.Selector.NumSelected > 1)
                            {
                                Messages.Message("FollowMe.RejectMultiple".Translate(), MessageSound.RejectInput);
                            }
                            else if (Find.Selector.NumSelected == 0)
                            {
                                Messages.Message("FollowMe.RejectNoSelection".Translate(), MessageSound.RejectInput);
                            }
                            else
                            {
                                Messages.Message("FollowMe.RejectNotAThing".Translate(), MessageSound.RejectInput);
                            }
                        }

                        // cancel current follow
                        else if (CurrentlyFollowing && newFollowedThing == null || newFollowedThing == followedThing)
                        {
                            Messages.Message("FollowMe.Cancel".Translate(followedLabel), MessageSound.Negative);
                            followedThing      = null;
                            CurrentlyFollowing = false;
                        }

                        // follow new thing
                        else if (newFollowedThing != null)
                        {
                            followedThing      = newFollowedThing;
                            CurrentlyFollowing = true;
                            Messages.Message("FollowMe.Follow".Translate(followedLabel), MessageSound.Negative);
                        }
                    }

                    // try follow whatever thing is selected
                    if (CurrentlyFollowing && followedThing != null)
                    {
                        if (!followedThing.Spawned && followedThing.holder != null)
                        {
                            // thing is in some sort of container
                            IThingContainerOwner holder = followedThing.holder.owner;

                            // if holder is a pawn's carrytracker we can use the smoother positions of the pawns's drawposition
                            Pawn_CarryTracker tracker = holder as Pawn_CarryTracker;
                            if (tracker != null)
                            {
                                Find.CameraMap.JumpTo(tracker.pawn.DrawPos);
                            }

                            // otherwise the holder int location will have to do
                            else
                            {
                                Find.CameraMap.JumpTo(holder.GetPosition());
                            }
                        }
                        else if (followedThing.Spawned)
                        {
                            // thing is spawned in world, just use the things drawPos
                            Find.CameraMap.JumpTo(followedThing.DrawPos);
                        }
                        else
                        {
                            // we've lost track of whatever it was we were following
                            Log.Message("FollowMe.Cancel".Translate(followedLabel));
                            CurrentlyFollowing = false;
                            followedThing      = null;
                        }
                    }
                }

                // catch exception to avoid error spam
                catch (Exception e)
                {
                    Enabled = false;
                    Log.Error(e.ToString());
                }
            }
        }
        protected void UpdateColonistState(Pawn pawn, TrackedColonist colonist)
        {
            Faction faction = null;
            bool    flag    = false;
            Pawn    pawn2   = null;

            if (pawn.holder != null)
            {
                if (pawn.Destroyed)
                {
                    this.MarkColonistAsMissing(colonist);
                }
                else if (pawn.holder.owner != null)
                {
                    Pawn_CarryTracker pawn_CarryTracker = pawn.holder.owner as Pawn_CarryTracker;
                    if (pawn_CarryTracker != null && pawn_CarryTracker.pawn != null && pawn_CarryTracker.pawn.Faction != null && pawn_CarryTracker.pawn.Faction != Faction.OfColony && pawn_CarryTracker.pawn.Faction.RelationWith(Faction.OfColony).hostile)
                    {
                        pawn2   = pawn_CarryTracker.pawn;
                        faction = pawn2.Faction;
                    }
                    Building_CryptosleepCasket building_CryptosleepCasket = pawn.holder.owner as Building_CryptosleepCasket;
                    if (building_CryptosleepCasket != null)
                    {
                        flag = true;
                        if (!colonist.Cryptosleep)
                        {
                            colonist.Cryptosleep = true;
                            this.Message(pawn, "Colonist has entered cryptosleep.");
                        }
                    }
                    else
                    {
                        colonist.Cryptosleep = false;
                        if (colonist.Cryptosleep)
                        {
                            colonist.Cryptosleep = false;
                            this.Message(pawn, "Colonist has woken from cryptosleep.");
                        }
                    }
                }
            }
            else
            {
                faction = null;
                colonist.Cryptosleep = false;
                if (colonist.Captured)
                {
                    this.Message(pawn, "Captured colonist has been freed.");
                    this.MarkColonistAsFreed(colonist);
                }
                if (colonist.Cryptosleep)
                {
                    colonist.Cryptosleep = false;
                    this.Message(pawn, "Colonist has woken from cryptosleep.");
                }
            }
            if (!colonist.Captured && faction != null)
            {
                this.MarkColonistAsCaptured(colonist, pawn2, faction);
            }
            else if (colonist.Captured && faction == null)
            {
                this.MarkColonistAsFreed(colonist);
            }
            else if (colonist.Captured && faction != colonist.CapturingFaction)
            {
                this.MarkColonistAsCaptured(colonist, pawn2, faction);
            }
            if (flag && !colonist.Cryptosleep)
            {
                this.MarkColonistAsEnteredCryptosleep(colonist);
            }
            else if (!flag && colonist.Cryptosleep)
            {
                this.MarkColonistAsWokenFromCryptosleep(colonist);
            }
            int ticksGame = Find.TickManager.TicksGame;

            if (colonist.Dead && !colonist.Missing)
            {
                if (colonist.Corpse != null)
                {
                    if (colonist.Corpse.Destroyed)
                    {
                        this.MarkColonistAsMissing(colonist);
                    }
                    else if (this.IsBuried(colonist.Corpse))
                    {
                        this.MarkColonistAsBuried(colonist);
                    }
                }
            }
            else if (colonist.Missing)
            {
                int num = ticksGame - colonist.MissingTimestamp;
                if (num > ColonistTracker.MaxMissingDuration)
                {
                    this.MarkColonistAsLost(colonist);
                }
            }
        }
 public static void Postfix2(Pawn_CarryTracker __instance, int count, IntVec3 dropLoc, ThingPlaceMode mode,
                             Thing resultingThing, Action <Thing, int> placedAction = null)
 {
     Postfix(__instance, dropLoc, mode, resultingThing, placedAction);
 }
예제 #17
0
        private bool CheckForErrors(List <Pawn> pawns)
        {
            if (!CanChangeAssignedThingsAfterStarting && !transferables.Any((TransferableOneWay x) => x.CountToTransfer != 0))
            {
                if (transporters[0].Props.max1PerGroup)
                {
                    Messages.Message("CantSendEmptyTransporterSingle".Translate(), MessageTypeDefOf.RejectInput, historical: false);
                }
                else
                {
                    Messages.Message("CantSendEmptyTransportPods".Translate(), MessageTypeDefOf.RejectInput, historical: false);
                }
                return(false);
            }
            if (MassUsage > MassCapacity)
            {
                FlashMass();
                if (transporters[0].Props.max1PerGroup)
                {
                    Messages.Message("TooBigTransporterSingleMassUsage".Translate(), MessageTypeDefOf.RejectInput, historical: false);
                }
                else
                {
                    Messages.Message("TooBigTransportersMassUsage".Translate(), MessageTypeDefOf.RejectInput, historical: false);
                }
                return(false);
            }
            Pawn pawn = pawns.Find((Pawn x) => !x.MapHeld.reachability.CanReach(x.PositionHeld, transporters[0].parent, PathEndMode.Touch, TraverseParms.For(TraverseMode.PassDoors)) && !transporters.Any((CompTransporter y) => y.innerContainer.Contains(x)));

            if (pawn != null)
            {
                if (transporters[0].Props.max1PerGroup)
                {
                    Messages.Message("PawnCantReachTransporterSingle".Translate(pawn.LabelShort, pawn).CapitalizeFirst(), MessageTypeDefOf.RejectInput, historical: false);
                }
                else
                {
                    Messages.Message("PawnCantReachTransporters".Translate(pawn.LabelShort, pawn).CapitalizeFirst(), MessageTypeDefOf.RejectInput, historical: false);
                }
                return(false);
            }
            Map map = transporters[0].parent.Map;

            for (int i = 0; i < transferables.Count; i++)
            {
                if (transferables[i].ThingDef.category != ThingCategory.Item)
                {
                    continue;
                }
                int countToTransfer = transferables[i].CountToTransfer;
                int num             = 0;
                if (countToTransfer <= 0)
                {
                    continue;
                }
                for (int j = 0; j < transferables[i].things.Count; j++)
                {
                    Thing             t = transferables[i].things[j];
                    Pawn_CarryTracker pawn_CarryTracker = t.ParentHolder as Pawn_CarryTracker;
                    if (map.reachability.CanReach(t.Position, transporters[0].parent, PathEndMode.Touch, TraverseParms.For(TraverseMode.PassDoors)) || transporters.Any((CompTransporter x) => x.innerContainer.Contains(t)) || (pawn_CarryTracker != null && pawn_CarryTracker.pawn.MapHeld.reachability.CanReach(pawn_CarryTracker.pawn.PositionHeld, transporters[0].parent, PathEndMode.Touch, TraverseParms.For(TraverseMode.PassDoors))))
                    {
                        num += t.stackCount;
                        if (num >= countToTransfer)
                        {
                            break;
                        }
                    }
                }
                if (num >= countToTransfer)
                {
                    continue;
                }
                if (countToTransfer == 1)
                {
                    if (transporters[0].Props.max1PerGroup)
                    {
                        Messages.Message("TransporterSingleItemIsUnreachableSingle".Translate(transferables[i].ThingDef.label), MessageTypeDefOf.RejectInput, historical: false);
                    }
                    else
                    {
                        Messages.Message("TransporterItemIsUnreachableSingle".Translate(transferables[i].ThingDef.label), MessageTypeDefOf.RejectInput, historical: false);
                    }
                }
                else if (transporters[0].Props.max1PerGroup)
                {
                    Messages.Message("TransporterSingleItemIsUnreachableMulti".Translate(countToTransfer, transferables[i].ThingDef.label), MessageTypeDefOf.RejectInput, historical: false);
                }
                else
                {
                    Messages.Message("TransporterItemIsUnreachableMulti".Translate(countToTransfer, transferables[i].ThingDef.label), MessageTypeDefOf.RejectInput, historical: false);
                }
                return(false);
            }
            return(true);
        }