public override void Apply(User user, RealmData realmData) { // We spawn the object with a DropPod Log.Message("Drop pod to spawn !"); Thing thing = realmData.FromRealmThing(realmThing); IntVec3 position = DropCellFinder.RandomDropSpot(); DropPodUtility.DropThingsNear(position, new Thing[] { thing }); Find.LetterStack.ReceiveLetter( "Ship pod", "A pod was sent from " + userFrom.name + " containing " + thing.Label, LetterType.Good, position ); }
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); }
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); }