public static void PawnTrainingTrackerPostLoadInit(Pawn_TrainingTracker tracker, ref DefMap <TrainableDef, bool> wantedTrainables, ref DefMap <TrainableDef, int> steps, ref DefMap <TrainableDef, bool> learned) { if (wantedTrainables == null) { wantedTrainables = new DefMap <TrainableDef, bool>(); } if (steps == null) { steps = new DefMap <TrainableDef, int>(); } if (learned == null) { learned = new DefMap <TrainableDef, bool>(); } if (tracker.GetSteps(TrainableDefOf.Tameness) == 0 && DefDatabase <TrainableDef> .AllDefsListForReading.Any((TrainableDef td) => tracker.GetSteps(td) != 0)) { tracker.Train(TrainableDefOf.Tameness, null, complete: true); } foreach (TrainableDef item in DefDatabase <TrainableDef> .AllDefsListForReading) { if (tracker.GetSteps(item) == item.steps) { tracker.Train(item, null, complete: true); } } }
// Token: 0x06000005 RID: 5 RVA: 0x000020B4 File Offset: 0x000002B4 public override void PawnDied(Corpse corpse) { float value = (float)corpse.InnerPawn.ageTracker.AgeBiologicalYears; float value2 = (float)corpse.InnerPawn.ageTracker.AgeChronologicalYears; Name name = corpse.InnerPawn.Name; Pawn_PlayerSettings playerSettings = corpse.InnerPawn.playerSettings; Pawn_TrainingTracker training = corpse.InnerPawn.training; Pawn_HealthTracker health = corpse.InnerPawn.health; Pawn_RecordsTracker records = corpse.InnerPawn.records; Pawn_RelationsTracker relations = corpse.InnerPawn.relations; Pawn_SkillTracker skills = corpse.InnerPawn.skills; Faction faction = corpse.InnerPawn.Faction; Comp_TimeLord timeLord = corpse.InnerPawn.TryGetComp <Comp_TimeLord>(); if (timeLord != null) { if (timeLord.TimesRegenerated < 13) { int regens = timeLord.TimesRegenerated; regens++; Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(corpse.InnerPawn.kindDef, faction, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 0f, false, false, false, false, false, false, false, false, 0, null, 1, null, null, null)); pawn.TryGetComp <Comp_TimeLord>().TimesRegenerated = regens; GenSpawn.Spawn(pawn, corpse.Position, corpse.Map, Rot4.Random); pawn.Name = name; pawn.relations = relations; pawn.training = training; pawn.records = records; pawn.skills = skills; pawn.playerSettings = playerSettings; corpse.Destroy(0); } } }
public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef) { Thing brainScanThing = ThingMaker.MakeThing(genomeDef); BrainScanTemplate brainScan = brainScanThing as BrainScanTemplate; if (brainScan != null) { //Standard. brainScan.sourceName = pawn?.Name?.ToStringFull ?? null; //Backgrounds Pawn_StoryTracker story = pawn.story; if (story != null) { brainScan.backStoryChild = story.childhood; brainScan.backStoryAdult = story.adulthood; } //Skills Pawn_SkillTracker skillTracker = pawn.skills; if (skillTracker != null) { foreach (SkillRecord skill in skillTracker.skills) { brainScan.skills.Add(new SkillRecord() { def = skill.def, Level = skill.Level, passion = skill.passion }); } } //Animal brainScan.isAnimal = pawn.RaceProps.Animal; //Training Pawn_TrainingTracker trainingTracker = pawn.training; if (trainingTracker != null) { DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap <TrainableDef, int> steps = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in learned) { brainScan.trainingLearned[item.Key] = item.Value; } foreach (var item in steps) { brainScan.trainingSteps[item.Key] = item.Value; } } } return(brainScanThing); }
public static void ApplyBrainScanTemplateOnPawn(Pawn thePawn, BrainScanTemplate brainScan, float efficency = 1f) { if(thePawn.IsValidBrainScanningTarget()) { //Backgrounds Pawn_StoryTracker storyTracker = thePawn.story; if (storyTracker != null) { //story.childhood = brainScan.backStoryChild; storyTracker.adulthood = brainScan.backStoryAdult; } //Skills Pawn_SkillTracker skillTracker = thePawn.skills; if (skillTracker != null) { foreach (ComparableSkillRecord skill in brainScan.skills) { SkillRecord pawnSkill = skillTracker.GetSkill(skill.def); pawnSkill.Level = (int)Math.Floor((float)skill.level * efficency); pawnSkill.passion = skill.passion; pawnSkill.Notify_SkillDisablesChanged(); } } //Dirty hack ahoy! if(storyTracker != null) { AccessTools.Field(typeof(Pawn_StoryTracker), "cachedDisabledWorkTypes").SetValue(storyTracker, null); } //Training Pawn_TrainingTracker trainingTracker = thePawn.training; if (trainingTracker != null) { DefMap<TrainableDef, bool> learned = (DefMap<TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap<TrainableDef, int> steps = (DefMap<TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in brainScan.trainingLearned) { learned[item.Key] = item.Value; } foreach (var item in brainScan.trainingSteps) { steps[item.Key] = (int)Math.Floor((float)item.Value * efficency); } } //Apply Hediff thePawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated); Messages.Message("QE_BrainTemplatingComplete".Translate(thePawn.Named("PAWN")), MessageTypeDefOf.PositiveEvent, false); } }
public static float computeTrainPriority(Pawn worker, Pawn target) { Pawn_TrainingTracker train = target.training; TrainableDef nextTrain = train.NextTrainableToTrain(); MethodInfo dynMethod = train.GetType().GetMethod("GetSteps", BindingFlags.Instance | BindingFlags.NonPublic); int steps = (int)dynMethod.Invoke(train, new object[] { nextTrain }); float priority = trainmap[nextTrain.defName]; if (nextTrain.defName == "Tameness") { priority += (10 - steps); } else { priority += steps; } //Log.Message("Hello from computeTrainPriority with pawn: " + target.Name.ToStringShort + ", " + nextTrain.defName + ", Steps:" + steps + ", Priority" + priority); return(priority); }
public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef) { Thing brainScanThing = ThingMaker.MakeThing(genomeDef); BrainScanTemplate brainScan = brainScanThing as BrainScanTemplate; if (brainScan != null) { //Standard. brainScan.sourceName = pawn?.Name?.ToStringFull ?? null; brainScan.kindDef = pawn?.kindDef ?? null; //Backgrounds Pawn_StoryTracker story = pawn.story; if (story != null) { brainScan.backStoryChild = story.childhood; brainScan.backStoryAdult = story.adulthood; } //Skills Pawn_SkillTracker skillTracker = pawn.skills; if (skillTracker != null) { foreach (SkillRecord skill in skillTracker.skills) { brainScan.skills.Add(new ComparableSkillRecord() { def = skill.def, level = skill.Level, passion = skill.passion }); } } //Animal brainScan.isAnimal = pawn.RaceProps.Animal; //Training Pawn_TrainingTracker trainingTracker = pawn.training; if (trainingTracker != null) { DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap <TrainableDef, int> steps = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in learned) { brainScan.trainingLearned[item.Key] = item.Value; } foreach (var item in steps) { brainScan.trainingSteps[item.Key] = item.Value; } } //Hediffs if (pawn?.health?.hediffSet?.hediffs != null) { List <Hediff> pawnHediffs = pawn.health.hediffSet.hediffs; if (pawnHediffs.Count > 0) { foreach (Hediff h in pawnHediffs) { if (GeneralCompatibility.includedBrainTemplateHediffs.Any(hediffDef => h.def.defName == hediffDef.defName)) { QEEMod.TryLog("Hediff " + h.def.defName + " will be added to brain template"); brainScan.hediffInfos.Add(new HediffInfo(h)); } } } } } return(brainScanThing); }
public static int GetSteps(Pawn_TrainingTracker training, TrainableDef td) { DefMap <TrainableDef, int> defMap = (DefMap <TrainableDef, int>)TrainingCardUtility.stepsField.GetValue(training); return(defMap[td]); }
public static void ApplyBrainScanTemplateOnPawn(Pawn thePawn, BrainScanTemplate brainScan, float efficency = 1f) { if (thePawn.IsValidBrainScanningTarget()) { //Backgrounds Pawn_StoryTracker storyTracker = thePawn.story; if (storyTracker != null) { //story.childhood = brainScan.backStoryChild; storyTracker.adulthood = brainScan.backStoryAdult; } //Skills Pawn_SkillTracker skillTracker = thePawn.skills; if (skillTracker != null) { foreach (ComparableSkillRecord skill in brainScan.skills) { SkillRecord pawnSkill = skillTracker.GetSkill(skill.def); pawnSkill.Level = (int)Math.Floor((float)skill.level * efficency); pawnSkill.passion = skill.passion; pawnSkill.Notify_SkillDisablesChanged(); } } //Training Pawn_TrainingTracker trainingTracker = thePawn.training; if (trainingTracker != null) { DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap <TrainableDef, int> steps = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in brainScan.trainingLearned) { learned[item.Key] = item.Value; } foreach (var item in brainScan.trainingSteps) { steps[item.Key] = (int)Math.Floor((float)item.Value * efficency); } } //Add Hediffs thePawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated); if (brainScan.hediffInfos != null && brainScan.hediffInfos?.Count > 0) { //add hediffs to pawn from defs in HediffInfo class foreach (HediffInfo h in brainScan.hediffInfos) { Hediff addedHediff = thePawn.health.AddHediff(h.def, h.part); //Psychic Awakened compatibility if (h.psychicAwakeningPowersKnownDefNames != null && h.psychicAwakeningPowersKnownDefNames?.Count > 0) { //create a List of the type PsychicPowerDef via Reflection. Cast it as IList to interact with it. var listType = typeof(List <>).MakeGenericType(PsychicAwakeningCompat.PsychicPowerDefType); var powers = Activator.CreateInstance(listType); IList powersInterface = (IList)powers; //iterate through the defNames saved in the list inside HediffInfo foreach (string defName in h.psychicAwakeningPowersKnownDefNames) { //look for this PsychicPowerDef in the DefDatabase var psychicPowerDef = GenDefDatabase.GetDef(PsychicAwakeningCompat.PsychicPowerDefType, defName, false); if (psychicPowerDef != null) { //add this to the list powersInterface.Add(psychicPowerDef); } else { QEEMod.TryLog("Psychic Power def " + defName + " not loaded in database of Rimworld Defs. This power will not be applied."); } } if (powersInterface.Count > 0) { QEEMod.TryLog("assigning " + powersInterface.Count + " psychic powers to " + thePawn.LabelCap + " from brain template"); PsychicAwakeningCompat.powersKnownField.SetValue(addedHediff, powers); } } } } Messages.Message("QE_BrainTemplatingComplete".Translate(thePawn.Named("PAWN")), MessageTypeDefOf.PositiveEvent, false); } }
public static Thing MakeBrainScan(Pawn pawn, ThingDef genomeDef) { Thing brainScanThing = ThingMaker.MakeThing(genomeDef); BrainScanTemplate brainScan = brainScanThing as BrainScanTemplate; if (brainScan != null) { //Standard. brainScan.sourceName = pawn?.Name?.ToStringFull ?? null; //Backgrounds Pawn_StoryTracker story = pawn.story; if (story != null) { brainScan.backStoryChild = story.childhood; brainScan.backStoryAdult = story.adulthood; brainScan.hairDef = story.hairDef; } //Skills Pawn_SkillTracker skillTracker = pawn.skills; if (skillTracker != null) { foreach (SkillRecord skill in skillTracker.skills) { brainScan.skills.Add(new SkillRecord() { def = skill.def, Level = skill.Level, passion = skill.passion }); } } //Relations //I have no clue on this one, but it NEEDS to happen or this mod won't do what it promises /*Pawn_RelationsTracker relationsTracker = pawn.relations; * if (relationsTracker != null) * { * foreach (DirectPawnRelation relations in relationsTracker.DirectRelations) * { * brainScan.directRelations.Add(new DirectPawnRelation() * { * def = relations.def, * otherPawn = relations.otherPawn, * startTicks = relations.startTicks, * }); * } * }*/ //Animal brainScan.isAnimal = pawn.RaceProps.Animal; //Training Pawn_TrainingTracker trainingTracker = pawn.training; if (trainingTracker != null) { DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap <TrainableDef, int> steps = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in learned) { brainScan.trainingLearned[item.Key] = item.Value; } foreach (var item in steps) { brainScan.trainingSteps[item.Key] = item.Value; } } } return(brainScanThing); }
public static void ApplyBrainScanTemplateOnPawn(Pawn pawn, BrainScanTemplate brainScan, float efficency = 1f) { if (pawn.IsValidBrainScanningTarget()) { //Backgrounds Pawn_StoryTracker storyTracker = pawn.story; if (storyTracker != null) { //Log.Warning("Child backstory transferring..."); storyTracker.childhood = brainScan.backStoryChild; //Log.Warning("Adult backstory transferring..."); storyTracker.adulthood = brainScan.backStoryAdult; //Log.Warning("Hairstyle being grown..."); storyTracker.hairDef = brainScan.hairDef; } //Skills Pawn_SkillTracker skillTracker = pawn.skills; if (skillTracker != null) { foreach (SkillRecord skill in brainScan.skills) { //Log.Warning("Iterating through skills..."); SkillRecord pawnSkill = skillTracker.GetSkill(skill.def); pawnSkill.Level = (int)Math.Floor((float)skill.levelInt * efficency); pawnSkill.passion = skill.passion; pawnSkill.Notify_SkillDisablesChanged(); } } /*Pawn_RelationsTracker relationsTracker = pawn.relations; * if (relationsTracker != null) * { * foreach (DirectPawnRelation relations in brainScan.directRelations) * { * DirectPawnRelation relationDef = relationsTracker.GetDirectRelation(relations.def, relations.otherPawn); * relationDef.def = relations.def; * relationDef.otherPawn = relations.otherPawn; * relationDef.startTicks = relations.startTicks; * } * }*/ //Dirty hack ahoy! - No longer exists in 1.1 //if (storyTracker != null) //{ // //Log.Warning("Transferring disabled worktypes... (yes, they still can't haul)"); // AccessTools.Field(typeof(Pawn_StoryTracker), "cachedDisabledWorkTypes").SetValue(storyTracker, null); //} //Training Pawn_TrainingTracker trainingTracker = pawn.training; if (trainingTracker != null) { DefMap <TrainableDef, bool> learned = (DefMap <TrainableDef, bool>)AccessTools.Field(typeof(Pawn_TrainingTracker), "learned").GetValue(trainingTracker); DefMap <TrainableDef, int> steps = (DefMap <TrainableDef, int>)AccessTools.Field(typeof(Pawn_TrainingTracker), "steps").GetValue(trainingTracker); //Copy foreach (var item in brainScan.trainingLearned) { learned[item.Key] = item.Value; } foreach (var item in brainScan.trainingSteps) { steps[item.Key] = (int)Math.Floor((float)item.Value * efficency); } } //Apply Hediff pawn.health.AddHediff(QEHediffDefOf.QE_BrainTemplated); } }