Esempio n. 1
0
 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);
 }
Esempio n. 3
0
 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);
 }