internal static bool TryDrop(this Pawn_ApparelTracker _this, Apparel ap, out Apparel resultingAp, IntVec3 pos, bool forbid = true) { if (!_this.WornApparel.Contains(ap)) { Log.Warning(_this.pawn.LabelCap + " tried to drop apparel he didn't have: " + ap.LabelCap); resultingAp = null; return(false); } _this.WornApparel.Remove(ap); ap.wearer = null; Thing thing = null; bool flag = GenThing.TryDropAndSetForbidden(ap, pos, ThingPlaceMode.Near, out thing, forbid); resultingAp = (thing as Apparel); _this.pawn.Drawer.renderer.graphics.ResolveApparelGraphics(); if (flag && _this.pawn.outfits != null) { _this.pawn.outfits.forcedHandler.SetForced(ap, false); } Utility.TryUpdateInventory(_this.pawn); // Apparel was dropped, update inventory return(flag); }
private static string GetPawnGear(Pawn pawn) { var parts = new List <string>(); if (TkSettings.TempInGear) { GetTemperatureValues(pawn, parts); } if (TkSettings.ShowArmor) { GetArmorValues(pawn, parts); } if (TkSettings.ShowWeapon) { GetWeaponData(pawn, parts); } if (!TkSettings.ShowApparel) { return(parts.GroupedJoin()); } Pawn_ApparelTracker a = pawn.apparel; if (a == null || a.WornApparelCount <= 0) { return(parts.GroupedJoin()); } List <Apparel> apparel = a.WornApparel; parts.Add($"{"Apparel".Localize()}: {apparel.Select(item => RichTextHelper.StripTags(item.LabelCap)).SectionJoin()}"); return(!parts.Any() ? "None".Localize() : parts.GroupedJoin()); }
public static void Postfix(Pawn_ApparelTracker __instance, Apparel newApparel, bool dropReplacedApparel = true, bool locked = false) { VerbUtility.TryModifyThingsVerbs(newApparel); if (newApparel is Apparel_Shield newShield) { newShield.CompShield.equippedOffHand = true; var comp = newShield.GetComp <CompEquippable>(); if (comp != null) { foreach (var verb in comp.AllVerbs) { verb.caster = newShield.Wearer; verb.Reset(); } } } if (!doNotRunTraitsPatch) { var extension = newApparel?.def.GetModExtension <ApparelExtension>(); if (extension != null) { if (__instance.pawn.story?.traits != null) { if (extension.traitsOnEquip != null) { foreach (var traitDef in extension.traitsOnEquip) { if (!__instance.pawn.story.traits.HasTrait(traitDef)) { __instance.pawn.story.traits.GainTrait(new Trait(traitDef)); } } } } } } }
internal static bool _TryDrop(this Pawn_ApparelTracker obj, Apparel ap, out Apparel resultingAp, IntVec3 pos, bool forbid = true) { var wornApparel = obj.wornApparel(); if (!wornApparel.Contains(ap)) { Verse.Log.Warning(obj.pawn.LabelCap + " tried to drop apparel he didn't have: " + ap.LabelCap); resultingAp = (Apparel)null; return(false); } if ( (ap is Apparel_SlaveCollar) && (!ap.wearer.health.Dead) ) { // Can only take off slave collars of the dead Verse.Log.Message(obj.pawn.LabelCap + " tried to remove slave collar but they aren't dead."); resultingAp = (Apparel)null; return(false); } wornApparel.Remove(ap); ap.wearer = (Pawn)null; Thing resultingThing = (Thing)null; bool flag = GenThing.TryDropAndSetForbidden((Thing)ap, pos, ThingPlaceMode.Near, out resultingThing, forbid); resultingAp = resultingThing as Apparel; obj.pawn.Drawer.renderer.graphics.ResolveApparelGraphics(); if ( (flag) && (obj.pawn.outfits != null) ) { obj.pawn.outfits.forcedHandler.SetForced(ap, false); } return(flag); }
public static void ApparelRemoved_Postfix(Apparel apparel, Pawn_ApparelTracker __instance) { if (Base.IsIgnoredMod(apparel?.def?.modContentPack?.Name)) { return; } var comp = apparel.TryGetComp <Comp_VerbGiver>(); if (comp?.VerbTracker?.AllVerbs == null) { return; } comp.Notify_Unworn(); var manager = __instance.pawn?.Manager(); if (manager == null) { return; } foreach (var verb in comp.VerbTracker.AllVerbs) { manager.RemoveVerb(verb); } }
internal static bool TryDrop(this Pawn_ApparelTracker _this, Apparel ap, out Apparel resultingAp, IntVec3 pos, bool forbid = true) { if (!_this.WornApparel.Contains(ap)) { Log.Warning(_this.pawn.LabelCap + " tried to drop apparel he didn't have: " + ap.LabelCap); resultingAp = null; return(false); } if (_this.pawn.MapHeld == null) { Log.Warning(_this.pawn.LabelCap + " tried to drop apparel but his MapHeld is null."); resultingAp = null; return(false); } ap.Notify_Stripped(_this.pawn); _this.Remove(ap); Thing thing = null; bool result = GenThing.TryDropAndSetForbidden(ap, pos, _this.pawn.MapHeld, ThingPlaceMode.Near, out thing, forbid); resultingAp = (thing as Apparel); CR_Utility.TryUpdateInventory(_this.pawn); // Apparel was dropped, update inventory return(result); }
public static void ApparelAdded_Postfix(Pawn_ApparelTracker __instance, Apparel apparel) { __instance.pawn.Manager().AddVerbs(apparel); }
static bool Prefix(ref Apparel ap, out Apparel resultingAp, IntVec3 pos, bool forbid, ref bool __result, Pawn_ApparelTracker __instance) { resultingAp = null; ApparelBodyPart apparel = ap as ApparelBodyPart; if (apparel == null) { return(true); } Pawn pawn = __instance.pawn; Outfit currentOutfit = pawn.outfits.CurrentOutfit; currentOutfit.filter.SetAllow(ap.def, true); __result = false; return(false); }
public static void Notify_ApparelRemoved_Postfix(Pawn_ApparelTracker __instance, Apparel apparel) { __instance.pawn.Notify_Dirty(); }
public static void Notify_ApparelChanged_Postfix(Pawn_ApparelTracker __instance) { __instance.pawn.Notify_Dirty(); }
public override void CompPostTick(ref float severityAdjustment) { base.CompPostTick(ref severityAdjustment); { Pawn_EquipmentTracker pe = base.Pawn.equipment; Pawn_ApparelTracker pa = base.Pawn.apparel; if (base.Pawn.Faction == Faction.OfPlayer) { if (base.Pawn.kindDef.defName == "ra2_AlliedTanya") { } else if (pe.Primary == null || pe.Primary.def != getDefaultGun(base.Pawn.kindDef.defName)) { pe.Remove(pe.Primary); pe.AddEquipment((ThingWithComps)ThingMaker.MakeThing(getDefaultGun(base.Pawn.kindDef.defName))); } if (base.Pawn.kindDef.defName == "ra2_AlliedChrono") { bool hasHat = false; foreach (Apparel ap in base.Pawn.apparel.WornApparel) { if (ap.def.defName == "ra2_Hat_Chrono") { hasHat = true; break; } } if (!hasHat) { base.Pawn.apparel.Wear((Apparel)ThingMaker.MakeThing(DefDatabase <ThingDef> .GetNamed("ra2_Hat_Chrono", true))); } } if (pa.WornApparel == null) { pa.Wear((Apparel)ThingMaker.MakeThing(DefDatabase <ThingDef> .GetNamed("ra2_Belt", true))); } bool hasBelt = false; foreach (Apparel ap in pa.WornApparel) { if (ap.def.defName.Equals("ra2_Belt")) { hasBelt = true; break; } } if (!hasBelt) { pa.Wear((Apparel)ThingMaker.MakeThing(DefDatabase <ThingDef> .GetNamed("ra2_Belt", true))); } } } if (base.Pawn.apparel.WornApparel.Find(x => x.TryGetComp <CompDownToDie>() != null) == null) { base.Pawn.health.RemoveHediff(base.parent); } if ((base.Pawn.Downed && !base.Pawn.Dead) || base.Pawn.IsPrisoner) { //Apparel ap = base.Pawn.apparel.WornApparel.Find(x => x.TryGetComp<CompDownToDie>() != null); //ap.Destroy(DestroyMode.Vanish); //base.Pawn.apparel.Remove(ap); DamageInfo dinfo = new DamageInfo(DamageDefOf.Crush, 100, 0, 0, null, null, null, DamageInfo.SourceCategory.ThingOrUnknown); HediffSet bodypart = base.Pawn.health.hediffSet; foreach (BodyPartRecord record in bodypart.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined)) { if (record.def.tags.Contains(BodyPartTagDefOf.BloodPumpingSource)) { dinfo.SetHitPart(record); break; } } base.Pawn.TakeDamage(dinfo); } }
// Copied from original tick public override void Tick() { //if (DebugSettings.noAnimals && RaceProps.IsAnimal) //{ // Destroy(); // return; //} if (stances != null && !stances.FullBodyBusy) { pather.PatherTick(); } drawer.DrawTrackerTick(); ageTracker.AgeTick(); if (health != null) { health.HealthTick(); } if (stances != null) { stances.StanceTrackerTick(); } if (mindState != null) { mindState.MindTick(); } if (equipment != null) { equipment.EquipmentTrackerTick(); } if (apparel == null) { apparel = new Pawn_ApparelTracker(this); } //if (apparel != null) //{ // apparel.ApparelTrackerTick(); //} if (jobs != null) { jobs.JobTrackerTick(); } if (carrier != null) { carrier.CarryHandsTick(); } if (talker as Pawn_Converted_TalkTracker != null) { ((Pawn_Converted_TalkTracker)talker).TalkTrackerTick(); } //needs.NeedsTrackerTick(); if (caller != null) { caller.CallTrackerTick(); } if (skills != null) { skills.SkillsTick(); } //if (playerController != null) //{ // playerController.PlayerControllerTick(); //} CrashCheck(); DamageCheck(); // If at home and damaged, do full repair RepairCheck(); if (needs != null && needs.mood == null) { needs.mood = new Need_Mood(this); } }
internal static void Wear(this Pawn_ApparelTracker _this, Apparel newApparel, bool dropReplacedApparel = true) { SlotGroupUtility.Notify_TakingThing(newApparel); if (newApparel.Spawned) { newApparel.DeSpawn(); } if (!ApparelUtility.HasPartsToWear(_this.pawn, newApparel.def)) { Log.Warning(string.Concat(new object[] { _this.pawn, " tried to wear ", newApparel, " but he has no body parts required to wear it." })); return; } for (int i = _this.WornApparel.Count - 1; i >= 0; i--) { Apparel apparel = _this.WornApparel[i]; if (!ApparelUtility.CanWearTogether(newApparel.def, apparel.def)) { bool forbid = _this.pawn.Faction.HostileTo(Faction.OfPlayer); if (dropReplacedApparel) { Apparel apparel2; if (!_this.TryDrop(apparel, out apparel2, _this.pawn.Position, forbid)) { Log.Error(_this.pawn + " could not drop " + apparel); return; } } else { _this.Remove(apparel); } } } if (newApparel.wearer != null) { Log.Warning(string.Concat(new object[] { _this.pawn, " is trying to wear ", newApparel, " but this apparel already has a wearer (", newApparel.wearer, "). This may or may not cause bugs." })); } _this.WornApparel.Add(newApparel); newApparel.wearer = _this.pawn; _this.SortWornApparelIntoDrawOrder(); _this.ApparelChanged(); //CR PART CR_Utility.TryUpdateInventory(_this.pawn); // Apparel was added, update inventory MethodInfo methodInfo = typeof(Pawn_ApparelTracker).GetMethod("SortWornApparelIntoDrawOrder", BindingFlags.Instance | BindingFlags.NonPublic); methodInfo.Invoke(_this, new object[] { }); LongEventHandler.ExecuteWhenFinished(new Action(_this.ApparelChanged)); }
internal static void Notify_WornApparelDestroyed(this Pawn_ApparelTracker _this, Apparel apparel) { _this.Remove(apparel); CR_Utility.TryUpdateInventory(_this.pawn); // Apparel was destroyed, update inventory }
public static void Postfix(Pawn_ApparelTracker __instance) { Pawn_ApparelTracker_Nofity_Changed.ApparelChanged(__instance.pawn); }
public static void PostFix(ref Pawn_ApparelTracker __instance) { CamoGearUtility.CalcAndSetCamoEff(__instance.pawn); }
public static void Postfix(Pawn_ApparelTracker __instance, Apparel ap) { VerbUtility.TryModifyThingsVerbs(ap); }
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 static bool Prefix(Pawn_ApparelTracker __instance, ThingOwner <Apparel> ___wornApparel) { // I don't like doing detours but this was too much of a pain to transpile ___wornApparel.InnerListForReading.Sort((Apparel a, Apparel b) => AdjustedDrawOrder(a.def.apparel.LastLayer.drawOrder, a.def).CompareTo(AdjustedDrawOrder(b.def.apparel.LastLayer.drawOrder, b.def))); return(false); }
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); }
// Token: 0x06000038 RID: 56 RVA: 0x000030B0 File Offset: 0x000012B0 public Pawn FromRealmPawn(RealmData realmData) { var named = DefDatabase <PawnKindDef> .GetNamed(kindDefName); var pawn = (Pawn)ThingMaker.MakeThing(named.race); foreach (var pawn2 in Find.WorldPawns.ForcefullyKeptPawns) { var health = pawn2.health; float?num; if (health == null) { num = null; } else { var hediffSet = health.hediffSet; if (hediffSet == null) { num = null; } else { var firstHediffOfDef = hediffSet.GetFirstHediffOfDef(PhiHediffDefOf.Phi_Key); num = firstHediffOfDef != null ? new float?(firstHediffOfDef.Severity) : null; } } var num2 = num ?? -1f; var list = hediffs; float?num3; if (list == null) { num3 = null; } else { var realmHediff = list.First(h => h.hediffDefName == PhiHediffDefOf.Phi_Key.defName); num3 = realmHediff != null ? new float?(realmHediff.severity) : null; } if (num2 != num3) { continue; } pawn = pawn2; break; } pawn.kindDef = named; pawn.SetFactionDirect(Faction.OfPlayer); PawnComponentsUtility.CreateInitialComponents(pawn); var pawnName = pawn.Name; switch (name.Length) { case 1: pawnName = new NameSingle(name[0]); break; case 2: pawnName = new NameTriple(name[0], name[1], name[1]); break; case 3: pawnName = new NameTriple(name[0], name[1], name[2]); break; } pawn.Name = pawnName; pawn.gender = gender; pawn.ageTracker.AgeBiologicalTicks = ageBiologicalTicks; pawn.ageTracker.AgeChronologicalTicks = ageChronologicalTicks; var story = pawn.story; if (story != null) { story.melanin = melanin; story.crownType = crownType; story.hairColor = new Color(hairColor[0], hairColor[1], hairColor[2], hairColor[3]); if (!BackstoryDatabase.TryGetWithIdentifier(childhoodKey, out story.childhood)) { throw new Exception($"Couldn't find backstory '{childhoodKey}'"); } if (!string.IsNullOrEmpty(adulthoodKey) && !BackstoryDatabase.TryGetWithIdentifier(adulthoodKey, out story.adulthood)) { throw new Exception($"Couldn't find backstory '{adulthoodKey}'"); } story.bodyType = DefDatabase <BodyTypeDef> .GetNamed(bodyTypeDefName); story.hairDef = DefDatabase <HairDef> .GetNamed(hairDefName); story.traits.allTraits.Clear(); foreach (var realmTrait in traits) { var named2 = DefDatabase <TraitDef> .GetNamed(realmTrait.traitDefName); story.traits.GainTrait(new Trait(named2, realmTrait.degree)); } } if (skills != null) { using var enumerator3 = skills.AsEnumerable().GetEnumerator(); while (enumerator3.MoveNext()) { var item2 = enumerator3.Current; var skillDef = DefDatabase <SkillDef> .AllDefs.First(def => def.label == item2?.skillDefLabel); var skill = pawn.skills.GetSkill(skillDef); if (item2 == null) { continue; } skill.Level = item2.level; skill.passion = item2.passion; } } var workSettings = pawn.workSettings; workSettings?.EnableAndInitialize(); if (apparels != null) { var pawn_ApparelTracker = new Pawn_ApparelTracker(pawn); foreach (var realmThing in apparels) { var apparel = (Apparel)realmData.FromRealmThing(realmThing); pawn_ApparelTracker.Wear(apparel); } } if (equipments != null) { var pawn_EquipmentTracker = new Pawn_EquipmentTracker(pawn); foreach (var realmThing2 in equipments) { var newEq = (ThingWithComps)realmData.FromRealmThing(realmThing2); pawn_EquipmentTracker.AddEquipment(newEq); } } if (inventory != null) { var pawn_InventoryTracker = pawn.inventory; foreach (var realmThing3 in inventory) { var item = realmData.FromRealmThing(realmThing3); pawn_InventoryTracker.innerContainer.TryAdd(item); } } if (hediffs == null) { Log.Warning("RealmHediffs is null in received colonist"); } foreach (var realmHediff2 in hediffs ?? new List <RealmHediff>()) { var named3 = DefDatabase <HediffDef> .GetNamed(realmHediff2.hediffDefName); BodyPartRecord part = null; if (realmHediff2.bodyPartIndex != -1) { part = pawn.RaceProps.body.GetPartAtIndex(realmHediff2.bodyPartIndex); } pawn.health.AddHediff(named3, part); var hediff = pawn.health.hediffSet.hediffs.Last(); hediff.source = realmHediff2.sourceDefName == null ? null : DefDatabase <ThingDef> .GetNamedSilentFail(realmHediff2.sourceDefName); hediff.ageTicks = realmHediff2.ageTicks; hediff.Severity = realmHediff2.severity; if (float.IsNaN(realmHediff2.immunity) || pawn.health.immunity.ImmunityRecordExists(named3)) { continue; } var immunity = pawn.health.immunity; immunity.GetType().GetMethod("TryAddImmunityRecord", BindingFlags.Instance | BindingFlags.NonPublic) .Invoke(immunity, new object[] { named3 }); immunity.GetImmunityRecord(named3).immunity = realmHediff2.immunity; } if (training != null) { pawn.training = new Pawn_TrainingTracker(pawn); foreach (var realmTrainingRecord in training) { var named4 = DefDatabase <TrainableDef> .GetNamed(realmTrainingRecord.trainingDefLabel); if (realmTrainingRecord.wanted) { pawn.training.SetWantedRecursive(named4, false); } if (realmTrainingRecord.learned) { pawn.training.Train(named4, null, true); } } } var field = pawn.health.GetType().GetField("healthState", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { Log.Error("Unable to find healthState field"); } else { field.SetValue(pawn.health, healthState); } if (workPriorities == null) { return(pawn); } foreach (var keyValuePair in workPriorities ?? new Dictionary <string, int>()) { var namedSilentFail = DefDatabase <WorkTypeDef> .GetNamedSilentFail(keyValuePair.Key); if (namedSilentFail == null) { Log.Warning($"Ignoring unknown workType: {keyValuePair.Key}"); } else { pawn.workSettings.SetPriority(namedSilentFail, keyValuePair.Value); } } return(pawn); }
static void DropDownThingMenu(object tab, Thing thing) { Pawn SelPawnForGear = (Pawn)LSelPawnForGear.GetValue(tab); Pawn SelPawn = (Pawn)LSelPawn.GetValue(tab); bool canControl = (bool)LCanControl.GetValue(tab); List <FloatMenuOption> list = new List <FloatMenuOption>(); list.Add(new FloatMenuOption("ThingInfo".Translate(), delegate() { Find.WindowStack.Add(new Dialog_InfoCard(thing)); }, MenuOptionPriority.Default, null, null, 0f, null, null)); //bool canControl = this.CanControl; if (canControl) { ThingWithComps eq = thing as ThingWithComps; bool flag10 = eq != null && eq.TryGetComp <CompEquippable>() != null; if (flag10) { object comp = SelPawnForGear.getCompInventory(); CompBiocodable compBiocodable = eq.TryGetComp <CompBiocodable>(); bool flag11 = comp != null; if (flag11) { string value = GenLabel.ThingLabel(eq.def, eq.Stuff, 1); bool flag12 = compBiocodable != null && compBiocodable.Biocoded && compBiocodable.CodedPawn != SelPawnForGear; FloatMenuOption item; if (flag12) { item = new FloatMenuOption("CannotEquip".Translate(value) + ": " + "BiocodedCodedForSomeoneElse".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null); } else { bool flag13 = SelPawnForGear.IsQuestLodger() && !EquipmentUtility.QuestLodgerCanEquip(eq, SelPawnForGear); if (flag13) { TaggedString t = SelPawnForGear.equipment.AllEquipmentListForReading.Contains(eq) ? "CE_CannotPutAway".Translate(value) : "CannotEquip".Translate(value); item = new FloatMenuOption(t + ": " + "CE_CannotChangeEquipment".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null); } else { bool flag14 = SelPawnForGear.equipment.AllEquipmentListForReading.Contains(eq) && SelPawnForGear.inventory != null; if (flag14) { item = new FloatMenuOption("CE_PutAway".Translate(value), delegate() { SelPawnForGear.equipment.TryTransferEquipmentToContainer(SelPawnForGear.equipment.Primary, SelPawnForGear.inventory.innerContainer); }, MenuOptionPriority.Default, null, null, 0f, null, null); } else { bool flag15 = !SelPawnForGear.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation); if (flag15) { item = new FloatMenuOption("CannotEquip".Translate(value), null, MenuOptionPriority.Default, null, null, 0f, null, null); } else { string text4 = "Equip".Translate(value); bool flag16 = eq.def.IsRangedWeapon && SelPawnForGear.story != null && SelPawnForGear.story.traits.HasTrait(TraitDefOf.Brawler); if (flag16) { text4 = text4 + " " + "EquipWarningBrawler".Translate(); } item = new FloatMenuOption(text4, (SelPawnForGear.story != null && SelPawnForGear.WorkTagIsDisabled(WorkTags.Violent)) ? null : new Action(delegate() { CEAccess.trySwitchToWeapon(comp, eq); }), MenuOptionPriority.Default, null, null, 0f, null, null); } } } } list.Add(item); } } //Pawn selPawnForGear = SelPawnForGear; //?? List <Apparel> list2; if (SelPawnForGear == null) { list2 = null; } else { Pawn_ApparelTracker apparel2 = SelPawnForGear.apparel; list2 = ((apparel2 != null) ? apparel2.WornApparel : null); } List <Apparel> list3 = list2; using (List <Apparel> .Enumerator enumerator = list3.GetEnumerator()) { while (enumerator.MoveNext()) { Apparel apparel = enumerator.Current; CompReloadable compReloadable = apparel.TryGetComp <CompReloadable>(); bool flag17 = compReloadable != null && compReloadable.AmmoDef == thing.def && compReloadable.NeedsReload(true); if (flag17) { bool flag18 = !SelPawnForGear.Drafted; if (flag18) { FloatMenuOption item2 = new FloatMenuOption("CE_ReloadApparel".Translate(apparel.Label, thing.Label), delegate() { SelPawnForGear.jobs.TryTakeOrderedJob(JobMaker.MakeJob(JobDefOf.Reload, apparel, thing), JobTag.Misc); }, MenuOptionPriority.Default, null, null, 0f, null, null); list.Add(item2); } } } } bool flag19 = canControl && thing.IngestibleNow && SelPawn.RaceProps.CanEverEat(thing); if (flag19) { Action action = delegate() { SoundDefOf.Tick_High.PlayOneShotOnCamera(null); LInterfaceIngest.Invoke(tab, new object[] { thing }); }; string text5 = thing.def.ingestible.ingestCommandString.NullOrEmpty() ? (string)"ConsumeThing".Translate(thing.LabelShort, thing) : string.Format(thing.def.ingestible.ingestCommandString, thing.LabelShort); bool flag20 = SelPawnForGear.IsTeetotaler() && thing.def.IsNonMedicalDrug; if (flag20) { List <FloatMenuOption> list4 = list; string str = text5; string str2 = ": "; TraitDegreeData traitDegreeData = (from x in TraitDefOf.DrugDesire.degreeDatas where x.degree == -1 select x).First <TraitDegreeData>(); list4.Add(new FloatMenuOption(str + str2 + ((traitDegreeData != null) ? traitDegreeData.label : null), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { list.Add(new FloatMenuOption(text5, action, MenuOptionPriority.Default, null, null, 0f, null, null)); } } bool flag21 = SelPawnForGear.isItemQuestLocked(eq); if (flag21) { list.Add(new FloatMenuOption("CE_CannotDropThing".Translate() + ": " + "DropThingLocked".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); list.Add(new FloatMenuOption("CE_CannotDropThingHaul".Translate() + ": " + "DropThingLocked".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { list.Add(new FloatMenuOption("DropThing".Translate(), delegate() { SoundDefOf.Tick_High.PlayOneShotOnCamera(null); LInterfaceDrop.Invoke(tab, new object[] { thing }); }, MenuOptionPriority.Default, null, null, 0f, null, null)); list.Add(new FloatMenuOption("CE_DropThingHaul".Translate(), delegate() { SoundDefOf.Tick_High.PlayOneShotOnCamera(null); InterfaceDropHaul(SelPawnForGear, thing, SelPawn); }, MenuOptionPriority.Default, null, null, 0f, null, null)); } bool flag22 = canControl && (bool)LHoldTrackerIsHeld.Invoke(null, new object[] { SelPawnForGear, thing }); //SelPawnForGear.HoldTrackerIsHeld(thing); if (flag22) { Action action2 = delegate() { SoundDefOf.Tick_High.PlayOneShotOnCamera(null); LHoldTrackerForget.Invoke(null, new object[] { SelPawnForGear, thing }); //SelPawnForGear.HoldTrackerForget(thing); }; list.Add(new FloatMenuOption("CE_HoldTrackerForget".Translate(), action2, MenuOptionPriority.Default, null, null, 0f, null, null)); } } FloatMenu window = new FloatMenu(list, thing.LabelCap, false); Find.WindowStack.Add(window); }
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); } } } } } }
public static void Notify_LostBodyPart_Postfix(Pawn_ApparelTracker __instance) { __instance.pawn.Notify_Dirty(); }
static void Prefix(Pawn_ApparelTracker __instance, Apparel apparel) { WorldComp.ApparelColorTracker.PersistColor(apparel); ColorApparel(__instance.pawn, apparel); }
static void OnRemoved(Pawn_ApparelTracker __instance, Apparel apparel) { HandleApparelChange(apparel, __instance.pawn); }
/// <summary> /// applies damage to all apparel the pawn is wearing based on /// </summary> /// <param name="pawn">The pawn.</param> /// <param name="newRace">The new race.</param> /// <param name="mutagen">the mutagen that caused the transformation, if null uses default values for <see cref="MutagenDamageProperties"/></param> /// <exception cref="System.ArgumentNullException"> /// pawn /// or /// newRace /// </exception> public static void ApplyTfDamageToApparel([NotNull] Pawn pawn, [NotNull] ThingDef newRace, [CanBeNull] MutagenDef mutagen) { if (pawn == null) { throw new ArgumentNullException(nameof(pawn)); } if (newRace == null) { throw new ArgumentNullException(nameof(newRace)); } Pawn_ApparelTracker apparelTracker = pawn.apparel; List <Apparel> cachedApparel = apparelTracker?.WornApparel?.ToList(); //make a copy of all worn apparel if (cachedApparel == null || cachedApparel.Count == 0) { return; } MutagenDamageProperties damageProps = mutagen?.damageProperties ?? DefaultDamageValues; float oldSize = pawn.RaceProps.baseBodySize; float newSize = newRace.race.baseBodySize; float percentDiff; if (oldSize < EPSILON && newSize < EPSILON) //prevent division by zero { percentDiff = 0; //if they're both really small say no change } else if (oldSize < EPSILON) { percentDiff = MAX_APPAREL_PDIFF; //if just old size is small then completely destroy the apparel } else { percentDiff = (newSize - oldSize) / oldSize; //signed percent difference between percentDiff += APPAREL_PDIFF_OFFSET; //add a little offset so if the body size is the same or slightly smaller we still apply some damage //trying to account for differences in 'body shape' } float percentDamage = Mathf.Clamp(percentDiff, 0, MAX_APPAREL_PDIFF); //clamp pDiff between [0, Max], if they shrink don't damage apparel percentDamage /= MAX_APPAREL_PDIFF; //normalize the percentDifference to get a percentage to damage apparel by int totalStuffProduced = 0; foreach (Apparel apparel in cachedApparel) { int damage = Mathf.CeilToInt(apparel.MaxHitPoints * percentDamage * damageProps.apparelDamageMultiplier) + damageProps.apparelDamageOffset; int newHitPoints = Mathf.Max(apparel.HitPoints - damage, 0); var damageDone = apparel.HitPoints - newHitPoints; //save the actual damage done apparel.HitPoints = newHitPoints; if (apparel.HitPoints == 0) { apparelTracker.Remove(apparel); apparelTracker.Notify_ApparelRemoved(apparel); apparel.Destroy(); } var stuffProduced = Mathf.FloorToInt(damageDone * damageProps.spawnedBiproductMult); totalStuffProduced += Mathf.Min(stuffProduced, MAX_APPAREL_DAMAGE_PRODUCT_PER_APPAREL); } if (damageProps.biproduct != null && damageProps.spawnedBiproductMult > EPSILON) { Thing thing = ThingMaker.MakeThing(damageProps.biproduct); thing.stackCount = totalStuffProduced; if (pawn.Spawned) { GenPlace.TryPlaceThing(thing, pawn.PositionHeld, pawn.MapHeld, ThingPlaceMode.Near); } else { Caravan caravan = pawn.GetCaravan(); caravan?.AddPawnOrItem(thing, false); } } }
private static void SortWornApparelIntoDrawOrder(this Pawn_ApparelTracker _this) { _this.WornApparel.Sort((Apparel a, Apparel b) => a.def.apparel.LastLayer.CompareTo(b.def.apparel.LastLayer)); }
public static void ApparelChanged(this Pawn_ApparelTracker appTracker) => ApparelChangedInfo.Invoke(appTracker, new object[] { });
public static void Notify_ApparelRemoved_Postfix(Pawn_ApparelTracker __instance, Apparel apparel) { var key = __instance.pawn.thingIDNumber; cache.RemoveAll(t => t.Key == __instance.pawn.thingIDNumber); }