/// <summary>
        /// spawn rjw parts after operation
        /// </summary>
        /// <param name="pawn"></param>
        /// <param name="part"></param>
        /// <param name="pos"></param>
        /// <param name="map"></param>
        public static void SpawnThingsFromHediffs(Pawn pawn, BodyPartRecord part, IntVec3 pos, Map map)
        {
            if (!pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined).Contains(part))
            {
                return;
            }
            if (pawn.Dead)
            {
                return;
            }
            IEnumerable <Hediff> enumerable = from x in pawn.health.hediffSet.hediffs
                                              where x.Part == part
                                              select x;

            //RJW parts and other implants?
            foreach (Hediff current in enumerable)
            {
                if (current.def.spawnThingOnRemoved != null)
                {
                    //Thing thing = GenSpawn.Spawn(current.def.spawnThingOnRemoved, pos, map);

                    //spawn thing
                    GenSpawn.Spawn(SexPartAdder.recipePartRemover(current), pos, map);
                }
            }
            //spawn sub parts? not sure why would it call itself but w/e
            for (int i = 0; i < part.parts.Count; i++)
            {
                MedicalRecipesUtility.SpawnThingsFromHediffs(pawn, part.parts[i], pos, map);
            }
        }
        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))
                {
                    DamageDef surgicalCut      = DamageDefOf.SurgicalCut;
                    float     amount           = 99999f;
                    float     armorPenetration = 999f;
                    pawn.TakeDamage(new DamageInfo(surgicalCut, amount, armorPenetration, -1f, null, part, null, DamageInfo.SourceCategory.ThingOrUnknown, null));
                    return;
                }
                TaleRecorder.RecordTale(TaleDefOf.DidSurgery, new object[]
                {
                    billDoer,
                    pawn
                });
                //pawn.health.AddHediff(recipe.addsHediff, part, null, null);

                pawn.health.AddHediff(SexPartAdder.recipePartAdder(recipe, pawn, part, ingredients), part, null, null);
            }
        }