public static void TryUpdateInventory(Pawn_InventoryTracker tracker) { if (tracker != null && tracker.pawn != null) { TryUpdateInventory(tracker.pawn); } }
private void AddCorpseInventoryAndGearToTransferables(Corpse corpse) { Pawn_InventoryTracker inventory = corpse.InnerPawn.inventory; Pawn_ApparelTracker apparel = corpse.InnerPawn.apparel; Pawn_EquipmentTracker equipment = corpse.InnerPawn.equipment; for (int i = 0; i < inventory.innerContainer.Count; i++) { this.AddToTransferables(inventory.innerContainer[i], false); } if (apparel != null) { List <Apparel> wornApparel = apparel.WornApparel; for (int j = 0; j < wornApparel.Count; j++) { this.AddToTransferables(wornApparel[j], false); } } if (equipment != null) { List <ThingWithComps> allEquipmentListForReading = equipment.AllEquipmentListForReading; for (int k = 0; k < allEquipmentListForReading.Count; k++) { this.AddToTransferables(allEquipmentListForReading[k], false); } } }
static void Postfix(Pawn_InventoryTracker __instance, ref Thing __result) { Pawn pawn = __instance.pawn; if (pawn?.story?.traits?.HasTrait(GMT_DefOf.GMT_Drunken_Master) ?? false) { for (int i = 0; i < __instance.innerContainer.Count; i++) { Thing thing = __instance.innerContainer[i]; CompDrug compDrug = thing.TryGetComp <CompDrug>(); if (compDrug != null && compDrug.Props.chemical == ChemicalDefOf.Alcohol) { var doer = thing.def.ingestible.outcomeDoers.Find( (IngestionOutcomeDoer x) => ((x as IngestionOutcomeDoer_GiveHediff)?.hediffDef ?? null) == HediffDefOf.AlcoholHigh ) as IngestionOutcomeDoer_GiveHediff; if (doer == null) { continue; } Hediff hediff = HediffMaker.MakeHediff(doer.hediffDef, pawn, null); hediff.Severity = doer.severity; // Only count this as a drug if it won't down the pawn if (!pawn.health.WouldBeDownedAfterAddingHediff(hediff)) { __result = thing; break; } } } } }
private static bool ThingInLoadout(Pawn_InventoryTracker inventory, int index) { CompAwesomeInventoryLoadout comp = inventory?.pawn?.TryGetComp <CompAwesomeInventoryLoadout>(); if (comp?.Loadout != null) { Thing thingToUnload = inventory.innerContainer[index]; foreach (ThingGroupSelector groupSelector in comp.Loadout) { if (groupSelector.Allows(thingToUnload, out _) && !(comp.InventoryMargins[groupSelector] > 0)) { return(true); } } if (SimpleSidearmUtility.IsActive) { return(SimpleSidearmUtility.InMemory(inventory.pawn, inventory.innerContainer[index])); } return(false); } else if (comp != null) { if (comp.InventoryMargins != null) { Log.Error("Loadout and InventoryMargins are out of sync. This message is harmless. Resetting"); comp.RemoveLoadout(); } } return(false); }
public static void Postfix_Notify_ItemRemoved(Pawn_InventoryTracker __instance, Thing item) { if (item is SurvivalTool && __instance.pawn.TryGetComp <Pawn_SurvivalToolAssignmentTracker>() is Pawn_SurvivalToolAssignmentTracker assignmentTracker) { assignmentTracker.forcedHandler.SetForced(item, false); } }
// Verse.Pawn_InventoryTracker private static bool Vamp_BloodItemsDontSpawnForNormies(Pawn_InventoryTracker __instance, Thing item) { if (__instance?.pawn?.IsVampire() == false) { if (item?.def?.thingCategories?.Contains(VampDefOfTwo.ROMV_Blood) ?? false) { return(false); } } return(true); }
public static void Postfix(Pawn_InventoryTracker __instance, ref ThingCount __result) { if (__result == default(ThingCount) || !__result.Thing.def.IsWeapon) { return; } else { Pawn pawn = __instance.pawn; GoldfishModule pawnMemory = GoldfishModule.GetGoldfishForPawn(pawn); if ( pawnMemory == null || !pawn.IsColonist || pawn.equipment == null || __instance.innerContainer == null ) { return; } List <ThingDefStuffDefPair> desiredSidearms = pawnMemory.RememberedWeapons.ListFullCopy(); if (pawn.equipment.Primary != null) { if (desiredSidearms.Contains(pawn.equipment.Primary.toThingDefStuffDefPair())) { desiredSidearms.Remove(pawn.equipment.Primary.toThingDefStuffDefPair()); } } int inventoryOffset = 0; //TODO: this does not preserve best possible weapon, just whichever one is first in inventory. Maybe fix? while (inventoryOffset < __instance.innerContainer.Count) { Thing candidate = __instance.innerContainer[inventoryOffset]; if (candidate.def.IsWeapon & desiredSidearms.Contains(candidate.toThingDefStuffDefPair())) { desiredSidearms.Remove(candidate.toThingDefStuffDefPair()); } else { __result = new ThingCount(candidate, candidate.stackCount); return; } inventoryOffset++; } __result = default(ThingCount); return; } }
public static void Postfix_InventoryTrackerTickRare(Pawn_InventoryTracker __instance) { if (SurvivalToolsSettings.toolLimit) { Pawn pawn = __instance.pawn; if (pawn.CanUseSurvivalTools() && pawn.GetHeldSurvivalTools().Count() > pawn.GetStatValue(ST_StatDefOf.SurvivalToolCarryCapacity) && pawn.CanRemoveExcessSurvivalTools()) { Thing tool = pawn.GetHeldSurvivalTools().Last(); Job job = pawn.DequipAndTryStoreSurvivalTool(tool); pawn.jobs.StartJob(job, JobCondition.InterruptForced, cancelBusyStances: false); } } }
public void GizmoStuff() { pawnHolding = pwaninve.pawn; pwaninve = this.ParentHolder as Pawn_InventoryTracker; ThinkNode jobGiver = null; Pawn_JobTracker jobs = pawnHolding.jobs; Job job = this.TryMakeBipodJobComp(); Job newJob = job; JobCondition lastJobEndCondition = JobCondition.InterruptForced; Job curJob = pawnHolding.CurJob; jobs.StartJob(newJob, lastJobEndCondition, jobGiver, ((curJob != null) ? curJob.def : null) != job.def, true, null, null, false, false); }
public static bool TrySpawnHatchedOrBornPawn(Pawn pawn, Thing motherOrEgg) { bool result; if (motherOrEgg.SpawnedOrAnyParentSpawned) { result = (GenSpawn.Spawn(pawn, motherOrEgg.PositionHeld, motherOrEgg.MapHeld, WipeMode.Vanish) != null); } else { Pawn pawn2 = motherOrEgg as Pawn; if (pawn2 != null) { if (pawn2.IsCaravanMember()) { pawn2.GetCaravan().AddPawn(pawn, true); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); return(true); } if (pawn2.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); return(true); } } else if (motherOrEgg.ParentHolder != null) { Pawn_InventoryTracker pawn_InventoryTracker = motherOrEgg.ParentHolder as Pawn_InventoryTracker; if (pawn_InventoryTracker != null) { if (pawn_InventoryTracker.pawn.IsCaravanMember()) { pawn_InventoryTracker.pawn.GetCaravan().AddPawn(pawn, true); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); return(true); } if (pawn_InventoryTracker.pawn.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); return(true); } } } result = false; } return(result); }
// 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 static bool ThingInLoadout(Pawn_InventoryTracker inventory, int index) { CompAwesomeInventoryLoadout comp = inventory?.pawn?.TryGetComp <CompAwesomeInventoryLoadout>(); if (comp?.Loadout != null) { foreach (ThingGroupSelector groupSelector in comp.Loadout) { if (groupSelector.Allows(inventory.innerContainer[index], out _)) { return(true); } } return(false); } return(false); }
private static void Pawn_InventoryTracker_PostFix(Pawn_InventoryTracker __instance, Thing item) { CompHauledToInventory takenToInventory = __instance.pawn.TryGetComp <CompHauledToInventory>(); if (takenToInventory == null) { return; } HashSet <Thing> carriedThing = takenToInventory.GetHashSet(); if (carriedThing?.Count > 0) { if (carriedThing.Contains(item)) { carriedThing.Remove(item); } } }
public static bool TrySpawnHatchedOrBornPawn(Pawn pawn, Thing motherOrEgg) { if (motherOrEgg.SpawnedOrAnyParentSpawned) { return(GenSpawn.Spawn(pawn, motherOrEgg.PositionHeld, motherOrEgg.MapHeld) != null); } Pawn pawn2 = motherOrEgg as Pawn; if (pawn2 != null) { if (pawn2.IsCaravanMember()) { pawn2.GetCaravan().AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: true); Find.WorldPawns.PassToWorld(pawn); return(true); } if (pawn2.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn); return(true); } } else if (motherOrEgg.ParentHolder != null) { Pawn_InventoryTracker pawn_InventoryTracker = motherOrEgg.ParentHolder as Pawn_InventoryTracker; if (pawn_InventoryTracker != null) { if (pawn_InventoryTracker.pawn.IsCaravanMember()) { pawn_InventoryTracker.pawn.GetCaravan().AddPawn(pawn, addCarriedPawnToWorldPawnsIfAny: true); Find.WorldPawns.PassToWorld(pawn); return(true); } if (pawn_InventoryTracker.pawn.IsWorldPawn()) { Find.WorldPawns.PassToWorld(pawn); return(true); } } } return(false); }
internal static void Remove(this ThingContainer _this, Thing item) { if (!_this.Contains(item)) { return; } if (item.holdingContainer == _this) { item.holdingContainer = null; } List <Thing> innerList = (List <Thing>)innerListFieldInfo.GetValue(_this); // Fetch innerList through reflection innerList.Remove(item); Pawn_InventoryTracker pawn_InventoryTracker = _this.owner as Pawn_InventoryTracker; if (pawn_InventoryTracker != null) { pawn_InventoryTracker.Notify_ItemRemoved(item); } CR_Utility.TryUpdateInventory(_this.owner as Pawn_InventoryTracker); // Item was removed, update inventory }
public static void Postfix_FirstUnloadableThing(Pawn_InventoryTracker __instance, ref ThingCount __result) { if (__result.Thing is SurvivalTool tool && tool.InUse) { bool foundNewThing = false; // Had to iterate through because a lambda expression in this case isn't possible for (int i = 0; i < __instance.innerContainer.Count; i++) { Thing newThing = __instance.innerContainer[i]; if (newThing as SurvivalTool == null || !((SurvivalTool)newThing).InUse) { __result = new ThingCount(newThing, newThing.stackCount); foundNewThing = true; break; } } if (!foundNewThing) { __result = default(ThingCount); } } }
public static void DropUnmarkableNearPawn(Pawn_InventoryTracker inventory, IntVec3 pos, bool forbid = false, bool unforbid = false) { if (inventory.pawn.MapHeld == null) { Log.Error("Tried to drop all inventory near pawn but the pawn is unspawned. pawn=" + inventory.pawn, false); return; } List <Thing> tmpThingList = new List <Thing>(); tmpThingList.AddRange(inventory.innerContainer); for (int i = 0; i < tmpThingList.Count; i++) { ThingWithComps twc = tmpThingList[i] as ThingWithComps; if (twc != null) { continue; } Thing thing; inventory.innerContainer.TryDrop(tmpThingList[i], pos, inventory.pawn.MapHeld, ThingPlaceMode.Near, out thing, delegate(Thing t, int unused) { if (forbid) { t.SetForbiddenIfOutsideHomeArea(); } if (unforbid) { t.SetForbidden(false, false); } if (t.def.IsPleasureDrug) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.DrugBurning, OpportunityType.Important); } }, null); } }
public static void Prefix(ref Thing __instance, Map map, bool respawningAfterLoad) { if (respawningAfterLoad) { Type type = __instance.GetType(); ThingWithComps original = __instance as ThingWithComps; if (original != null) { try { Pawn pawn = original as Pawn; if (pawn != null) { // if (AMAMod.Dev) Log.Message(string.Format("checking {0}", pawn.Name.ToStringFull ?? pawn.NameShortColored)); Pawn_EquipmentTracker equipmentTracker = pawn.equipment; Pawn_ApparelTracker apparelTracker = pawn.apparel; Pawn_InventoryTracker inventoryTracker = pawn.inventory; if (equipmentTracker != null) { if (!equipmentTracker.AllEquipmentListForReading.NullOrEmpty()) { // if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s equipment", pawn.NameShortColored)); for (int i = 0; i < equipmentTracker.AllEquipmentListForReading.Count; i++) { if (ShouldUpdate(equipmentTracker.AllEquipmentListForReading[i])) { // if (AMAMod.Dev) Log.Message(string.Format("repalce {0}'s equipment({1}) class", pawn.NameShortColored, equipmentTracker.AllEquipmentListForReading[i])); equipmentTracker.AllEquipmentListForReading[i] = ReplacedThing(equipmentTracker.AllEquipmentListForReading[i]) as ThingWithComps; } } } } if (apparelTracker != null) { if (!apparelTracker.WornApparel.NullOrEmpty()) { // if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s apparel", pawn.NameShortColored)); for (int i = 0; i < apparelTracker.WornApparel.Count; i++) { if (ShouldUpdate(apparelTracker.WornApparel[i])) { // if (AMAMod.Dev) Log.Message(string.Format("repalce {0}'s apparel({1}) class", pawn.NameShortColored, apparelTracker.WornApparel[i])); apparelTracker.WornApparel[i] = ReplacedThing(apparelTracker.WornApparel[i]) as Apparel; } } } } if (inventoryTracker != null) { if (!inventoryTracker.GetDirectlyHeldThings().NullOrEmpty()) { // if (AMAMod.Dev) Log.Message(string.Format("checking {0}'s inventory", pawn.NameShortColored)); for (int i = inventoryTracker.GetDirectlyHeldThings().Count - 1; i > 0; i--) { if (ShouldUpdate(inventoryTracker.GetDirectlyHeldThings()[i])) { // if (AMAMod.Dev) Log.Message(string.Format("replace {0}'s inventory({1}) class", pawn.NameShortColored, inventoryTracker.GetDirectlyHeldThings()[i])); Thing replace = ReplacedThing(inventoryTracker.GetDirectlyHeldThings()[i] as ThingWithComps); inventoryTracker.GetDirectlyHeldThings().RemoveAt(i); inventoryTracker.GetDirectlyHeldThings().TryAdd(ReplacedThing(replace as ThingWithComps)); } } } } } else { if (ShouldUpdate(original)) { __instance = ReplacedThing(original); } } } catch (Exception) { if (AMAMod.Dev) { Log.Warning("Something went wrong trying to replace " + __instance.LabelCap + "'s ThingClass"); } } finally { if (type != __instance.def.thingClass && type != typeof(Pawn)) { if (AMAMod.Dev) { Log.Warning("Failed to replace " + __instance.LabelCap + "'s ThingClass(" + type.Name + ") to " + __instance.def.thingClass.Name); } } } } } }
private static bool Prefix(Pawn_InventoryTracker __instance, ref ThingCount __result) { if (__instance.innerContainer.Count == 0) { __result = default; return(false); } tmpDrugsToKeep.Clear(); if (__instance.pawn.drugs?.CurrentPolicy != null) { var currentPolicy = __instance.pawn.drugs.CurrentPolicy; for (var i = 0; i < currentPolicy.Count; i++) { if (currentPolicy[i].takeToInventory > 0) { tmpDrugsToKeep.Add(new ThingDefCount(currentPolicy[i].drug, currentPolicy[i].takeToInventory)); } } } Thing bestInstrument = null; if (!__instance.pawn.NonHumanlikeOrWildMan() && !__instance.pawn.WorkTagIsDisabled(WorkTags.Artistic)) { var artSkill = __instance.pawn.skills.GetSkill(SkillDefOf.Artistic).levelInt; IEnumerable <Thing> heldInstruments = __instance.innerContainer .Where(PerformanceManager.IsInstrument) .Where(x => !x.TryGetComp <CompMusicalInstrument>().Props.isBuilding) .OrderByDescending(x => x.TryGetComp <CompMusicalInstrument>().WeightedSuitability(artSkill)); if (heldInstruments.Any()) { bestInstrument = heldInstruments.FirstOrDefault(); } } if (tmpDrugsToKeep.Any() || bestInstrument != null) { foreach (var thing in __instance.innerContainer) { if (thing.def.IsDrug) { var num = -1; for (var k = 0; k < tmpDrugsToKeep.Count; k++) { if (thing.def != tmpDrugsToKeep[k].ThingDef) { continue; } num = k; break; } if (num < 0) { __result = new ThingCount(thing, thing.stackCount); return(false); } if (thing.stackCount > tmpDrugsToKeep[num].Count) { __result = new ThingCount(thing, thing.stackCount - tmpDrugsToKeep[num].Count); return(false); } tmpDrugsToKeep[num] = new ThingDefCount(tmpDrugsToKeep[num].ThingDef, tmpDrugsToKeep[num].Count - thing.stackCount); } else if (PerformanceManager.IsInstrument(thing)) { if (bestInstrument == null) { __result = new ThingCount(thing, thing.stackCount); return(false); } if (bestInstrument.GetHashCode() == thing.GetHashCode()) { continue; } __result = new ThingCount(thing, thing.stackCount); return(false); } else { __result = new ThingCount(thing, thing.stackCount); return(false); } } __result = default; return(false); } __result = new ThingCount(__instance.innerContainer[0], __instance.innerContainer[0].stackCount); return(false); }
public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result) { float masss = 0; foreach (Pawn pawn in __instance.pawns.InnerListForReading) { for (int j = 0; j < pawn.inventory.innerContainer.Count; j++) { if (pawn.inventory.innerContainer[j].def != USCMDefOf.RRY_USCM_DropshipUD4L) { masss += (pawn.inventory.innerContainer[j].def.BaseMass * pawn.inventory.innerContainer[j].stackCount); } } } foreach (Pawn pawn in __instance.pawns.InnerListForReading) { Pawn_InventoryTracker pinv = pawn.inventory; for (int i = 0; i < pinv.innerContainer.Count; i++) { if (pinv.innerContainer[i].def == USCMDefOf.RRY_USCM_DropshipUD4L) { Command_Action launch = new Command_Action(); launch.defaultLabel = "CommandSendShuttle".Translate(); launch.defaultDesc = "CommandSendShuttleDesc".Translate(); launch.icon = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true); launch.alsoClickIfOtherInGroupClicked = false; launch.action = delegate { float maxmass = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity; if (masss <= maxmass) { pinv.innerContainer[i].TryGetComp <CompUSCMDropship>().WorldStartChoosingDestination(__instance); } else { Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (maxmass - masss) + "KG)", MessageTypeDefOf.RejectInput, false); } }; List <Gizmo> newr = __result.ToList(); newr.Add(launch); Command_Action addFuel = new Command_Action(); addFuel.defaultLabel = "USCM_Dropship_CommandAddFuel".Translate(); addFuel.defaultDesc = "USCM_Dropship_CommandAddFuelDesc".Translate(); addFuel.icon = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true); addFuel.alsoClickIfOtherInGroupClicked = false; addFuel.action = delegate { bool hasAddFuel = false; int fcont = 0; CompRefuelable comprf = pinv.innerContainer[i].TryGetComp <CompRefuelable>(); List <Thing> list = CaravanInventoryUtility.AllInventoryItems(__instance); //pinv.innerContainer.Count for (int j = 0; j < list.Count; j++) { if (list[j].def == ThingDefOf.Chemfuel) { fcont = list[j].stackCount; Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, list[j]); float need = comprf.Props.fuelCapacity - comprf.Fuel; if (need < 1f && need > 0) { fcont = 1; } if (fcont * 1f >= need) { fcont = (int)need; } // Log.Warning("f&n is "+fcont+"/"+need); if (list[j].stackCount * 1f <= fcont) { list[j].stackCount -= fcont; Thing thing = list[j]; ownerOf.inventory.innerContainer.Remove(thing); thing.Destroy(DestroyMode.Vanish); } else { if (fcont != 0) { list[j].SplitOff(fcont).Destroy(DestroyMode.Vanish); } } Type crtype = comprf.GetType(); FieldInfo finfo = crtype.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance); finfo.SetValue(comprf, comprf.Fuel + fcont); hasAddFuel = true; break; } } if (hasAddFuel) { Messages.Message("USCM_Dropship_AddFuelDoneMsg".Translate(fcont, comprf.Fuel), MessageTypeDefOf.PositiveEvent, false); } else { Messages.Message("USCM_Dropship_NoFuelMsg".Translate(), MessageTypeDefOf.RejectInput, false); } }; newr.Add(addFuel); Gizmo_MapRefuelableFuelStatus fuelStat = new Gizmo_MapRefuelableFuelStatus { nowFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel, maxFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity, compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel }; newr.Add(fuelStat); __result = newr; return; } } } }
public Pawn FromRealmPawn(RealmData realmData) { // This code is mainly a copy/paste of what happens in // PawnGenerator.DoGenerateNakedPawn() PawnKindDef kindDef = DefDatabase <PawnKindDef> .GetNamed(kindDefName); Pawn pawn = (Pawn)ThingMaker.MakeThing(kindDef.race); pawn.kindDef = kindDef; pawn.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.CreateInitialComponents(pawn); pawn.gender = gender; // What is done in GenerateRandomAge() pawn.ageTracker.AgeBiologicalTicks = ageBiologicalTicks; pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks; // Ignored SetInitialLevels() // Ignored GenerateInitialHediffs() // Ignored GeneratePawnRelations() Pawn_StoryTracker story = pawn.story; story.melanin = melanin; story.crownType = crownType; story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]); // What is done in GiveAppropriateBio() Name nameObj = pawn.Name; switch (name.Count()) { case 1: nameObj = new NameSingle(name[0]); break; case 2: nameObj = new NameTriple(name[0], name[1], name[1]); break; case 3: nameObj = new NameTriple(name[0], name[1], name[2]); break; } pawn.Name = nameObj; if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood)) { throw new Exception(string.Format("Couldn't find backstory '{0}'", childhoodKey)); } if (!string.IsNullOrEmpty(adulthoodKey) && !BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood)) { throw new Exception(string.Format("Couldn't find backstory '{0}'", adulthoodKey)); } story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName); // Done in GiveRandomTraits() foreach (RealmTrait trait in traits) { TraitDef traitDef = DefDatabase <TraitDef> .GetNamed(trait.traitDefName); story.traits.GainTrait(new Trait(traitDef, trait.degree)); } // We attribute the skills level foreach (RealmSkillRecord rec in skills.AsEnumerable()) { SkillDef skillDef = DefDatabase <SkillDef> .AllDefs.First((def) => def.label == rec.skillDefLabel); SkillRecord skill = pawn.skills.GetSkill(skillDef); skill.Level = rec.level; skill.passion = rec.passion; } pawn.workSettings.EnableAndInitialize(); // Once we've generated a new solid pawn, we generate the gear of it // GenerateStartingApparelFor() Pawn_ApparelTracker apparelTracker = pawn.apparel; foreach (RealmThing realmThing in apparels) { Apparel apparel = (Apparel)realmData.FromRealmThing(realmThing); apparelTracker.Wear(apparel); } // TryGenerateWeaponFor() Pawn_EquipmentTracker equipmentTracker = pawn.equipment; foreach (RealmThing realmThing in equipments) { ThingWithComps thingWithComps = (ThingWithComps)realmData.FromRealmThing(realmThing); equipmentTracker.AddEquipment(thingWithComps); } // GenerateInventoryFor() Pawn_InventoryTracker inventoryTracker = pawn.inventory; foreach (RealmThing realmThing in inventory) { Thing thing = realmData.FromRealmThing(realmThing); inventoryTracker.innerContainer.TryAdd(thing); } // GenerateHediffsFor() if (hediffs == null) { Log.Warning("RealmHediffs is null in received colonist"); } foreach (RealmHediff hediff in hediffs ?? new List <RealmHediff>()) { var definition = DefDatabase <HediffDef> .GetNamed(hediff.hediffDefName); BodyPartRecord bodypart = null; if (hediff.bodyPartIndex != -1) { bodypart = pawn.RaceProps.body.GetPartAtIndex(hediff.bodyPartIndex); } pawn.health.AddHediff(definition, bodypart); var newdiff = pawn.health.hediffSet.hediffs.Last(); newdiff.source = (hediff.sourceDefName == null ? null : DefDatabase <ThingDef> .GetNamedSilentFail(hediff.sourceDefName)); newdiff.ageTicks = hediff.ageTicks; newdiff.Severity = hediff.severity; if (!float.IsNaN(hediff.immunity) && !pawn.health.immunity.ImmunityRecordExists(definition)) { var handler = pawn.health.immunity; handler.GetType().GetMethod("TryAddImmunityRecord", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(handler, new object[] { definition }); var record = handler.GetImmunityRecord(definition); record.immunity = hediff.immunity; } } var healthStateField = pawn.health.GetType().GetField("healthState", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (healthStateField == null) { Log.Error("Unable to find healthState field"); } else { healthStateField.SetValue(pawn.health, healthState); } // GenerateHediffsFor() if (workPriorities == null) { Log.Warning("WorkPriorities is null in received colonist"); } foreach (KeyValuePair <string, int> priority in workPriorities ?? new Dictionary <string, int>()) { var def = DefDatabase <WorkTypeDef> .GetNamedSilentFail(priority.Key); if (def == null) { Log.Warning(String.Format("Ignoring unknown workType: {0}", priority.Key)); continue; } pawn.workSettings.SetPriority(def, priority.Value); } return(pawn); }
public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null) { if (cafr == null && !this.parent.Spawned) { Log.Error("Tried to launch " + (object)this.parent + ", but it's unspawned.", false); } else { if (this.parent.Spawned && !this.LoadingInProgressOrReadyToLaunch || (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel)) { return; } if (cafr == null) { Map map = this.parent.Map; int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue); if (num > this.MaxLaunchDistance) { return; } this.Transporter.TryRemoveLord(map); int groupId = this.Transporter.groupID; float amount = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f); CompTransporter comp1 = this.FuelingPortSource.TryGetComp <CompTransporter>(); Building fuelingPortSource = this.FuelingPortSource; if (fuelingPortSource != null) { fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount); } ThingOwner directlyHeldThings = comp1.GetDirectlyHeldThings(); // Neceros Edit Thing thing = ThingMaker.MakeThing(ThingDef.Named(parent.def.defName), (ThingDef)null); thing.SetFactionDirect(Faction.OfPlayer); thing.Rotation = this.FuelingPortSource.Rotation; CompRefuelable comp2 = thing.TryGetComp <CompRefuelable>(); comp2.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp2, (object)fuelingPortSource.TryGetComp <CompRefuelable>().Fuel); comp2.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel; thing.stackCount = 1; directlyHeldThings.TryAddOrTransfer(thing, true); // Neceros Edit ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), null); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)directlyHeldThings, true, true); // Neceros Edit SRTSLeaving srtsLeaving = (SRTSLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named(parent.def.defName + "_Leaving"), (Thing)activeDropPod); srtsLeaving.rotation = this.FuelingPortSource.Rotation; srtsLeaving.groupID = groupId; srtsLeaving.destinationTile = destinationTile; srtsLeaving.arrivalAction = arrivalAction; comp1.CleanUpLoadingVars(map); IntVec3 position = fuelingPortSource.Position; SRTSStatic.SRTSDestroy((Thing)fuelingPortSource, DestroyMode.Vanish); GenSpawn.Spawn((Thing)srtsLeaving, position, map, WipeMode.Vanish); CameraJumper.TryHideWorld(); } else { int num = Find.WorldGrid.TraversalDistanceBetween(this.carr.Tile, destinationTile, true, int.MaxValue); if (num > this.MaxLaunchDistance) { return; } float amount = Mathf.Max(CompLaunchableSRTS.FuelNeededToLaunchAtDist((float)num), 1f); if (this.FuelingPortSource != null) { this.FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount); } ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings(); Thing thing = null; foreach (Pawn pawn in directlyHeldThings.InnerListForReading) { Pawn_InventoryTracker inventory = pawn.inventory; for (int index = 0; index < inventory.innerContainer.Count; ++index) { // Neceros Edit if (inventory.innerContainer[index].TryGetComp <CompLaunchableSRTS>() != null) { thing = inventory.innerContainer[index]; inventory.innerContainer[index].holdingOwner.Remove(inventory.innerContainer[index]); break; } } } /*Add caravan items to SRTS - SmashPhil */ foreach (Pawn p in directlyHeldThings.InnerListForReading) { p.inventory.innerContainer.InnerListForReading.ForEach(x => AddThingsToSRTS(x)); p.inventory.innerContainer.Clear(); } ThingOwner <Thing> thingOwner = new ThingOwner <Thing>(); foreach (Pawn pawn in directlyHeldThings.AsEnumerable <Pawn>().ToList <Pawn>()) { thingOwner.TryAddOrTransfer((Thing)pawn, true); } if (thing != null && thing.holdingOwner == null) { thingOwner.TryAddOrTransfer(thing, false); } // Neceros Edit ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named(parent.def.defName + "_Active"), (ThingDef)null); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingOwner, true, true); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer((IEnumerable <Thing>)thingsInsideShip, true, true); thingsInsideShip.Clear(); cafr.RemoveAllPawns(); if (cafr.Spawned) { Find.WorldObjects.Remove((WorldObject)cafr); } TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingSRTS", true)); travelingTransportPods.Tile = cafr.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = destinationTile; travelingTransportPods.arrivalAction = arrivalAction; Find.WorldObjects.Add((WorldObject)travelingTransportPods); travelingTransportPods.AddPod(activeDropPod.Contents, true); activeDropPod.Contents = (ActiveDropPodInfo)null; activeDropPod.Destroy(DestroyMode.Vanish); Find.WorldTargeter.StopTargeting(); } } }
internal static void getWeaponLists(out List <Thing> ranged, out List <Thing> melee, Pawn_InventoryTracker inventory) { ranged = new List <Thing>(); melee = new List <Thing>(); foreach (Thing item in inventory.innerContainer) { if (item.def.IsRangedWeapon) { ranged.Add(item); } else if (item.def.IsMeleeWeapon) { melee.Add(item); } } }
// Token: 0x060028DA RID: 10458 RVA: 0x001352F0 File Offset: 0x001336F0 public void TryLaunch(int destinationTile, TransportPodsArrivalAction arrivalAction, Caravan cafr = null) { //Log.Warning("CARR:" + this.carr+"/"+cafr); if (cafr == null) { if (!this.parent.Spawned) { Log.Error("Tried to launch " + this.parent + ", but it's unspawned.", false); return; } } /* * List<CompTransporter> transportersInGroup = this.TransportersInGroup; * if (transportersInGroup == null) * { * Log.Error("Tried to launch " + this.parent + ", but it's not in any group.", false); * return; * } */ if (this.parent.Spawned) { if (!this.LoadingInProgressOrReadyToLaunch) { return; } } if (!this.AllInGroupConnectedToFuelingPort || !this.AllFuelingPortSourcesInGroupHaveAnyFuel) { return; } if (cafr == null) { Map map = this.parent.Map; int num = Find.WorldGrid.TraversalDistanceBetween(map.Tile, destinationTile, true, int.MaxValue); if (num > this.MaxLaunchDistance) { return; } this.Transporter.TryRemoveLord(map); int groupID = this.Transporter.groupID; float amount = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f); //for (int i = 0; i < transportersInGroup.Count; i++) CompTransporter compTransporter = this.FuelingPortSource.TryGetComp <CompTransporter>(); //transportersInGroup[i]; Building fuelingPortSource = this.FuelingPortSource; //compTransporter.Launchable.FuelingPortSource; if (fuelingPortSource != null) { fuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount); } ThingOwner directlyHeldThings = compTransporter.GetDirectlyHeldThings(); Thing helicopter = ThingMaker.MakeThing(ThingDef.Named("Building_Helicopter")); helicopter.SetFactionDirect(Faction.OfPlayer); CompRefuelable compr = helicopter.TryGetComp <CompRefuelable>(); Type tcr = compr.GetType(); FieldInfo finfos = tcr.GetField("fuel", BindingFlags.NonPublic | BindingFlags.Instance); finfos.SetValue(compr, fuelingPortSource.TryGetComp <CompRefuelable>().Fuel); compr.TargetFuelLevel = fuelingPortSource.TryGetComp <CompRefuelable>().TargetFuelLevel; helicopter.stackCount = 1; directlyHeldThings.TryAddOrTransfer(helicopter); ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer(directlyHeldThings, true, true); HelicopterLeaving dropPodLeaving = (HelicopterLeaving)SkyfallerMaker.MakeSkyfaller(ThingDef.Named("HelicopterLeaving"), activeDropPod); dropPodLeaving.groupID = groupID; dropPodLeaving.destinationTile = destinationTile; dropPodLeaving.arrivalAction = arrivalAction; compTransporter.CleanUpLoadingVars(map); //compTransporter.parent IntVec3 poc = fuelingPortSource.Position; // fuelingPortSource.Destroy(DestroyMode.Vanish); HelicopterStatic.HelicopterDestroy(fuelingPortSource, DestroyMode.Vanish); GenSpawn.Spawn(dropPodLeaving, poc, map, WipeMode.Vanish); CameraJumper.TryHideWorld(); } else { int num = Find.WorldGrid.TraversalDistanceBetween(carr.Tile, destinationTile, true, int.MaxValue); if (num > this.MaxLaunchDistance) { return; } float amount = Mathf.Max(CompLaunchableHelicopter.FuelNeededToLaunchAtDist((float)num), 1f); if (FuelingPortSource != null) { FuelingPortSource.TryGetComp <CompRefuelable>().ConsumeFuel(amount); } ThingOwner <Pawn> directlyHeldThings = (ThingOwner <Pawn>)cafr.GetDirectlyHeldThings(); Thing helicopter = null; foreach (Pawn pawn in directlyHeldThings.InnerListForReading) { Pawn_InventoryTracker pinv = pawn.inventory; for (int i = 0; i < pinv.innerContainer.Count; i++) { if (pinv.innerContainer[i].def.defName == ("Building_Helicopter")) { helicopter = pinv.innerContainer[i]; pinv.innerContainer[i].holdingOwner.Remove(pinv.innerContainer[i]); break; } } } ThingOwner <Thing> finalto = new ThingOwner <Thing>(); List <Pawn> lpto = directlyHeldThings.AsEnumerable <Pawn>().ToList(); foreach (Pawn p in lpto) { finalto.TryAddOrTransfer(p); } if (helicopter != null) { // Log.Warning("TRY ADD"+helicopter); if (helicopter.holdingOwner == null) { //Log.Warning("NULL"); //directlyHeldThings. finalto.TryAddOrTransfer(helicopter, false); } } ActiveDropPod activeDropPod = (ActiveDropPod)ThingMaker.MakeThing(ThingDef.Named("ActiveHelicopter"), null); activeDropPod.Contents = new ActiveDropPodInfo(); activeDropPod.Contents.innerContainer.TryAddRangeOrTransfer( //directlyHeldThings finalto, true, true); cafr.RemoveAllPawns(); if (cafr.Spawned) { Find.WorldObjects.Remove(cafr); } TravelingTransportPods travelingTransportPods = (TravelingTransportPods)WorldObjectMaker.MakeWorldObject(DefDatabase <WorldObjectDef> .GetNamed("TravelingHelicopters", true)); travelingTransportPods.Tile = cafr.Tile; travelingTransportPods.SetFaction(Faction.OfPlayer); travelingTransportPods.destinationTile = destinationTile; travelingTransportPods.arrivalAction = arrivalAction; Find.WorldObjects.Add(travelingTransportPods); travelingTransportPods.AddPod(activeDropPod.Contents, true); activeDropPod.Contents = null; activeDropPod.Destroy(DestroyMode.Vanish); // CameraJumper.TryHideWorld(); Find.WorldTargeter.StopTargeting(); } }
// ================================== public override void SpawnSetup() { base.SpawnSetup(); tickTime = 0; this.training = null; callDriver = false; visibleInside = false; driverContainer = new ThingContainer(this, true); driverContainer.owner = this; inventory = new Pawn_InventoryTracker(this); //def.race.corpseDef = ThingDefOf.Steel; vehicleDef = def as VehicleDef; //Work setting this.drafter = new Pawn_DraftController(this); callDriver = false; isStandby = false; turretGuns = new List<Parts_TurretGun>(); if (!vehicleDef.vehicle.turretGunDefs.NullOrEmpty()) for (int i = 0; i < vehicleDef.vehicle.turretGunDefs.Count; i++) { Parts_TurretGun turretGun = new Parts_TurretGun(); turretGun.parent = this; turretGun.parts_TurretGunDef = vehicleDef.vehicle.turretGunDefs[i]; turretGun.SpawnSetup(); turretGuns.Add(turretGun); } }
public Pawn FromRealmPawn(RealmData realmData) { // This code is mainly a copy/paste of what happens in // PawnGenerator.DoGenerateNakedPawn() PawnKindDef kindDef = DefDatabase <PawnKindDef> .GetNamed(kindDefName); Pawn pawn = (Pawn)ThingMaker.MakeThing(kindDef.race); pawn.kindDef = kindDef; pawn.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.CreateInitialComponents(pawn); pawn.gender = gender; // What is done in GenerateRandomAge() pawn.ageTracker.AgeBiologicalTicks = ageBiologicalTicks; pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks; // Ignored SetInitialLevels() // Ignored GenerateInitialHediffs() // Ignored GeneratePawnRelations() Pawn_StoryTracker story = pawn.story; story.melanin = melanin; story.crownType = crownType; story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]); // What is done in GiveAppropriateBio() Name nameObj = pawn.Name; switch (name.Count()) { case 1: nameObj = new NameSingle(name[0]); break; case 2: nameObj = new NameTriple(name[0], name[1], name[1]); break; case 3: nameObj = new NameTriple(name[0], name[1], name[2]); break; } pawn.Name = nameObj; if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood)) { throw new Exception(string.Format("Couldn't find backstory '{0}'", childhoodKey)); } if (!BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood)) { throw new Exception(string.Format("Couldn't find backstory '{0}'", adulthoodKey)); } story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName); // Done in GiveRandomTraits() foreach (RealmTrait trait in traits) { TraitDef traitDef = DefDatabase <TraitDef> .GetNamed(trait.traitDefName); story.traits.GainTrait(new Trait(traitDef, trait.degree)); } // We attribute the skills level foreach (RealmSkillRecord rec in skills.AsEnumerable()) { SkillDef skillDef = DefDatabase <SkillDef> .AllDefs.First((def) => def.label == rec.skillDefLabel); SkillRecord skill = pawn.skills.GetSkill(skillDef); skill.Level = rec.level; skill.passion = rec.passion; } pawn.workSettings.EnableAndInitialize(); // Once we've generated a new solid pawn, we generate the gear of it // GenerateStartingApparelFor() Pawn_ApparelTracker apparelTracker = pawn.apparel; foreach (RealmThing realmThing in apparels) { Apparel apparel = (Apparel)realmData.FromRealmThing(realmThing); apparelTracker.Wear(apparel); } // TryGenerateWeaponFor() Pawn_EquipmentTracker equipmentTracker = pawn.equipment; foreach (RealmThing realmThing in equipments) { ThingWithComps thingWithComps = (ThingWithComps)realmData.FromRealmThing(realmThing); equipmentTracker.AddEquipment(thingWithComps); } // GenerateInventoryFor() Pawn_InventoryTracker inventoryTracker = pawn.inventory; foreach (RealmThing realmThing in inventory) { Thing thing = realmData.FromRealmThing(realmThing); inventoryTracker.innerContainer.TryAdd(thing); } return(pawn); }
public static void Postfix(Caravan __instance, ref IEnumerable <Gizmo> __result) { float masss = 0.0f; foreach (Pawn pawn in __instance.pawns.InnerListForReading) { for (int index = 0; index < pawn.inventory.innerContainer.Count; ++index) { if (pawn.inventory.innerContainer[index].def.defName != "Building_Helicopter") { masss += pawn.inventory.innerContainer[index].def.BaseMass * (float)pawn.inventory.innerContainer[index].stackCount; } } } foreach (Pawn pawn in __instance.pawns.InnerListForReading) { Pawn_InventoryTracker pinv = pawn.inventory; for (int i = 0; i < pinv.innerContainer.Count; i++) { if (pinv.innerContainer[i].def.defName == "Building_Helicopter") { Command_Action commandAction1 = new Command_Action(); commandAction1.defaultLabel = "CommandLaunchGroup".Translate(); commandAction1.defaultDesc = "CommandLaunchGroupDesc".Translate(); commandAction1.icon = ContentFinder <Texture2D> .Get("UI/Commands/LaunchShip", true); commandAction1.alsoClickIfOtherInGroupClicked = false; commandAction1.action = (Action)(() => { float massCapacity = pinv.innerContainer[i].TryGetComp <CompTransporter>().Props.massCapacity; if ((double)masss <= (double)massCapacity) { pinv.innerContainer[i].TryGetComp <CompLaunchableHelicopter>().WorldStartChoosingDestination(__instance); } else { Messages.Message("TooBigTransportersMassUsage".Translate() + "(" + (object)(float)((double)massCapacity - (double)masss) + "KG)", MessageTypeDefOf.RejectInput, false); } }); List <Gizmo> list = __result.ToList <Gizmo>(); list.Add((Gizmo)commandAction1); Command_Action commandAction2 = new Command_Action(); commandAction2.defaultLabel = "CommandAddFuel".Translate(); commandAction2.defaultDesc = "CommandAddFuelDesc".Translate(); commandAction2.icon = ContentFinder <Texture2D> .Get("Things/Item/Resource/Chemfuel", true); commandAction2.alsoClickIfOtherInGroupClicked = false; commandAction2.action = (Action)(() => { bool flag = false; int count = 0; CompRefuelable comp = pinv.innerContainer[i].TryGetComp <CompRefuelable>(); List <Thing> thingList = CaravanInventoryUtility.AllInventoryItems(__instance); for (int index = 0; index < thingList.Count; ++index) { if (thingList[index].def == ThingDefOf.Chemfuel) { count = thingList[index].stackCount; Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(__instance, thingList[index]); float num = comp.Props.fuelCapacity - comp.Fuel; if ((double)num < 1.0 && (double)num > 0.0) { count = 1; } if ((double)count * 1.0 >= (double)num) { count = (int)num; } if ((double)thingList[index].stackCount * 1.0 <= (double)count) { thingList[index].stackCount -= count; Thing thing = thingList[index]; ownerOf.inventory.innerContainer.Remove(thing); thing.Destroy(DestroyMode.Vanish); } else if ((uint)count > 0U) { thingList[index].SplitOff(count).Destroy(DestroyMode.Vanish); } comp.GetType().GetField("fuel", BindingFlags.Instance | BindingFlags.NonPublic).SetValue((object)comp, (object)(float)((double)comp.Fuel + (double)count)); flag = true; break; } } if (flag) { Messages.Message("AddFuelDoneMsg".Translate((object)count, (object)comp.Fuel), MessageTypeDefOf.PositiveEvent, false); } else { Messages.Message("NonOilMsg".Translate(), MessageTypeDefOf.RejectInput, false); } }); list.Add((Gizmo)commandAction2); Gizmo_MapRefuelableFuelStatus refuelableFuelStatus = new Gizmo_MapRefuelableFuelStatus() { nowFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Fuel, maxFuel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.fuelCapacity, compLabel = pinv.innerContainer[i].TryGetComp <CompRefuelable>().Props.FuelGizmoLabel }; list.Add((Gizmo)refuelableFuelStatus); __result = (IEnumerable <Gizmo>)list; return; } } } }
public static void Prefix(ref Thing __instance, Map map, bool respawningAfterLoad) { if (__instance?.def?.modContentPack != null && respawningAfterLoad) { ThingWithComps original = __instance as ThingWithComps; if (original != null) { try { Pawn pawn = original as Pawn; if (pawn != null) { Pawn_EquipmentTracker equipmentTracker = pawn.equipment; Pawn_ApparelTracker apparelTracker = pawn.apparel; Pawn_InventoryTracker inventoryTracker = pawn.inventory; if (equipmentTracker != null) { if (!equipmentTracker.AllEquipmentListForReading.NullOrEmpty()) { for (int i = 0; i < equipmentTracker.AllEquipmentListForReading.Count; i++) { equipmentTracker.AllEquipmentListForReading[i] = ReplacedThing(equipmentTracker.AllEquipmentListForReading[i]) as ThingWithComps; } } } if (apparelTracker != null) { if (!apparelTracker.WornApparel.NullOrEmpty()) { for (int i = 0; i < apparelTracker.WornApparel.Count; i++) { apparelTracker.WornApparel[i] = ReplacedThing(apparelTracker.WornApparel[i]) as Apparel; } } } if (inventoryTracker != null) { if (!inventoryTracker.GetDirectlyHeldThings().NullOrEmpty()) { for (int i = inventoryTracker.GetDirectlyHeldThings().Count - 1; i > 0; i--) { Thing replace = ReplacedThing(inventoryTracker.GetDirectlyHeldThings()[i] as ThingWithComps); inventoryTracker.GetDirectlyHeldThings().RemoveAt(i); inventoryTracker.GetDirectlyHeldThings().TryAdd(ReplacedThing(replace as ThingWithComps)); } } } } else { __instance = ReplacedThing(original); } } catch (Exception) { Log.Warning("Something went wrong trying to replace " + __instance.LabelCap + "'s ThingClass"); } finally { if (__instance.GetType() != __instance.def.thingClass) { Log.Warning("Failed to replace " + __instance.LabelCap + "'s ThingClass"); } } } } }