public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { if (billDoer != null) { if (base.CheckSurgeryFail(billDoer, pawn, ingredients, part, bill) || this.CheckDruidSurgeryFail(billDoer, pawn, ingredients, part, bill)) { return; } TaleRecorder.RecordTale(TaleDefOf.DidSurgery, new object[] { billDoer, pawn }); TM_MedicalRecipesUtility.RestorePartAndSpawnAllPreviousParts(pawn, part, billDoer.Position, billDoer.Map); } else if (pawn.Map != null) { TM_MedicalRecipesUtility.RestorePartAndSpawnAllPreviousParts(pawn, part, pawn.Position, pawn.Map); } else { pawn.health.RestorePart(part, null, true); } ApplyHediff(pawn, part, billDoer); //pawn.health.AddHediff(this.recipe.addsHediff, part, null); }
public static Thing SpawnNaturalPartIfClean(Pawn pawn, BodyPartRecord part, IntVec3 pos, Map map) { if (TM_MedicalRecipesUtility.IsCleanAndDroppable(pawn, part)) { return(GenSpawn.Spawn(part.def.spawnThingOnRemoved, pos, map)); } return(null); }
public static void RestorePartAndSpawnAllPreviousParts(Pawn pawn, BodyPartRecord part, IntVec3 pos, Map map) { TM_MedicalRecipesUtility.SpawnNaturalPartIfClean(pawn, part, pos, map); TM_MedicalRecipesUtility.SpawnThingsFromHediffs(pawn, part, pos, map); if (part.def.defName == "Rib") { for (int i = 0; i < part.parent.parts.Count; i++) { if (part.parent.parts[i].def.defName == "Rib") { pawn.health.RestorePart(part.parent.parts[i], null, true); } } } else { pawn.health.RestorePart(part, null, true); } }
public static void SpawnThingsFromHediffs(Pawn pawn, BodyPartRecord part, IntVec3 pos, Map map) { if (!pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined).Contains(part)) { return; } IEnumerable <Hediff> enumerable = from x in pawn.health.hediffSet.hediffs where x.Part == part select x; foreach (Hediff current in enumerable) { if (current.def.spawnThingOnRemoved != null) { GenSpawn.Spawn(current.def.spawnThingOnRemoved, pos, map); } } for (int i = 0; i < part.parts.Count; i++) { TM_MedicalRecipesUtility.SpawnThingsFromHediffs(pawn, part.parts[i], pos, map); } }
public override IEnumerable <BodyPartRecord> GetPartsToApplyOn(Pawn pawn, RecipeDef recipe) { IEnumerable <BodyPartRecord> regrowthParts = from parts in pawn.def.race.body.AllParts where (!TorannMagicDefOf.Regrowth.appliedOnFixedBodyParts.Contains(parts.def)) select parts; if (pawn.def != ThingDefOf.Human) { regrowthParts = pawn.def.race.body.AllParts; } return(TM_MedicalRecipesUtility.GetAdjustedPartsToApplyOn(regrowthParts.ToList(), pawn, delegate(BodyPartRecord record) { if (!pawn.health.hediffSet.hediffs.Any((Hediff x) => x.Part == record)) { return false; } if (!pawn.health.hediffSet.PartIsMissing(record)) { return false; } if (record.parent != null && !pawn.health.hediffSet.GetNotMissingParts().Contains(record.parent)) { return false; } if (pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(record) && !pawn.health.hediffSet.HasDirectlyAddedPartFor(record)) { return false; } if (record.IsCorePart) { return false; } return true; }).Distinct()); }
public static bool IsCleanAndDroppable(Pawn pawn, BodyPartRecord part) { return(!pawn.Dead && !pawn.RaceProps.Animal && part.def.spawnThingOnRemoved != null && TM_MedicalRecipesUtility.IsClean(pawn, part)); }
public static void RestorePartAndSpawnAllPreviousParts(Pawn pawn, BodyPartRecord part, IntVec3 pos, Map map) { TM_MedicalRecipesUtility.SpawnNaturalPartIfClean(pawn, part, pos, map); TM_MedicalRecipesUtility.SpawnThingsFromHediffs(pawn, part, pos, map); pawn.health.RestorePart(part, null, true); }