public static void CopyPawnComps(Pawn source, Pawn target) { PawnCompsSaver saver = new PawnCompsSaver(source, DefaultPawnCompRules.RulesForCopying); string xml = UtilityCopy.SerializeExposableToString(saver); //Logger.Debug("Serialized comps to string\n" + xml); XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); foreach (var fieldPath in DefaultPawnCompRules.RulesForCopying.ExcludedFields) { XmlNode node = doc.DocumentElement.SelectSingleNode(fieldPath); if (node != null) { //Logger.Debug("Removing " + node.Name + " element"); doc.DocumentElement.RemoveChild(node); } } xml = "<saveable Class=\"" + typeof(PawnCompsLoader).FullName + "\">" + doc.DocumentElement.InnerXml + "</saveable>"; //Logger.Debug("Post node-exclusions\n" + xml); UtilityCopy.DeserializeExposable <PawnCompsLoader>(xml, new object[] { target, DefaultPawnCompRules.RulesForCopying }); }
public SaveRecordPawnV5(CustomPawn pawn) { this.id = pawn.Id; this.thingDef = pawn.Pawn.def.defName; this.type = pawn.Type.ToString(); if (pawn.Type == CustomPawnType.World && pawn.Faction != null) { this.faction = new SaveRecordFactionV4() { def = pawn.Faction?.Def?.defName, index = pawn.Faction.Index, leader = pawn.Faction.Leader }; } this.pawnKindDef = pawn.OriginalKindDef?.defName ?? pawn.Pawn.kindDef.defName; this.originalFactionDef = pawn.OriginalFactionDef?.defName; this.gender = pawn.Gender; this.adulthood = pawn.Adulthood?.identifier ?? pawn.LastSelectedAdulthoodBackstory?.identifier; this.childhood = pawn.Childhood?.identifier; this.skinColor = pawn.Pawn.story.SkinColor; this.melanin = pawn.Pawn.story.melanin; this.hairDef = pawn.HairDef.defName; this.hairColor = pawn.Pawn.story.hairColor; this.headGraphicPath = pawn.HeadGraphicPath; this.bodyType = pawn.BodyType.defName; this.firstName = pawn.FirstName; this.nickName = pawn.NickName; this.lastName = pawn.LastName; this.age = 0; this.biologicalAge = pawn.BiologicalAge; this.chronologicalAge = pawn.ChronologicalAge; foreach (var trait in pawn.Traits) { if (trait != null) { this.traits.Add(new SaveRecordTraitV5() { def = trait.def.defName, degree = trait.Degree }); } } foreach (var skill in pawn.Pawn.skills.skills) { this.skills.Add(new SaveRecordSkillV4() { name = skill.def.defName, value = pawn.GetUnmodifiedSkillLevel(skill.def), passion = pawn.currentPassions[skill.def] }); } foreach (var layer in PrepareCarefully.Instance.Providers.PawnLayers.GetLayersForPawn(pawn)) { if (layer.Apparel) { ThingDef apparelThingDef = pawn.GetAcceptedApparel(layer); Color color = pawn.GetColor(layer); if (apparelThingDef != null) { ThingDef apparelStuffDef = pawn.GetSelectedStuff(layer); this.apparel.Add(new SaveRecordApparelV4() { layer = layer.Name, apparel = apparelThingDef.defName, stuff = apparelStuffDef?.defName ?? "", color = color }); } } } OptionsHealth healthOptions = PrepareCarefully.Instance.Providers.Health.GetOptions(pawn); foreach (Implant implant in pawn.Implants) { var saveRecord = new SaveRecordImplantV3(implant); if (implant.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(implant.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.implants.Add(saveRecord); } foreach (Injury injury in pawn.Injuries) { var saveRecord = new SaveRecordInjuryV3(injury); if (injury.BodyPartRecord != null) { UniqueBodyPart part = healthOptions.FindBodyPartsForRecord(injury.BodyPartRecord); if (part != null && part.Index > 0) { saveRecord.bodyPartIndex = part.Index; } } this.injuries.Add(saveRecord); } pawnCompsSaver = new PawnCompsSaver(pawn.Pawn, DefaultPawnCompRules.RulesForSaving); }