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; } } }
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; } } } }
// 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); } } } }); }
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; }
// 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); }
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); }