protected override bool CheckPartWorker(Pawn pawn, object cause)
        {
            IEnumerable <Hediff>         hediffs = pawn.health.hediffSet.hediffs.Where(h => h.def == hediff);
            IEnumerable <BodyPartRecord> parts   = HediffUtility.GetPartsToAffect(pawn, partsToAffect);

            foreach (BodyPartRecord part in parts)
            {
                IEnumerable <Hediff> partHediffs = hediffs.Where(h => h.Part == part);

                if (partHediffs.Any())
                {
                    foreach (Hediff realHediff in partHediffs)
                    {
                        if (realHediff.Severity != target)
                        {
                            return(true);
                        }
                    }
                }
                else
                {
                    return(true);
                }
            }
            return(false);
        }
        protected override IEnumerable <string> ApplyPartWorker(Pawn pawn, object cause)
        {
            IEnumerable <Hediff>         hediffs = pawn.health.hediffSet.hediffs.Where(h => h.def == hediff);
            IEnumerable <BodyPartRecord> parts   = HediffUtility.GetPartsToAffect(pawn, partsToAffect);

            foreach (BodyPartRecord part in parts)
            {
                IEnumerable <Hediff> partHediffs = hediffs.Where(h => h.Part == part);

                if (partHediffs.Any())
                {
                    foreach (Hediff realHediff in partHediffs)
                    {
                        float adjustedSeverity = MathUtility.MoveTowardsOperationClamped(realHediff.Severity, target, delta, operation);

                        if (realHediff.Severity != adjustedSeverity)
                        {
                            int oldIndex = realHediff.CurStageIndex;

                            realHediff.Severity = adjustedSeverity;

                            if (realHediff.ShouldRemove)
                            {
                                yield return(HediffUtility.MessageHediffLost.Translate(pawn.LabelShort, realHediff.LabelBase, ParseCause(cause)));
                            }
                            else if (realHediff.CurStageIndex != oldIndex)
                            {
                                yield return(HediffUtility.MessageHediffChanged.Translate(pawn.LabelShort, realHediff.LabelBase, realHediff.CurStage.label, ParseCause(cause)));
                            }
                        }
                    }
                }
                else
                {
                    Hediff newHediff = HediffMaker.MakeHediff(hediff, pawn);

                    if (delta != default(float))
                    {
                        newHediff.Severity = MathUtility.MoveTowardsOperationClamped(0, target, delta, operation);
                    }
                    if (newHediff.Visible)
                    {
                        HediffComp_Discoverable discoverable = newHediff.TryGetComp <HediffComp_Discoverable>();
                        if (discoverable != null)
                        {
                            //discoverable.discovered = true;
                            typeof(HediffComp_Discoverable).GetField("discovered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(discoverable, true);
                        }
                        yield return(HediffUtility.MessageHediffGained.Translate(pawn.LabelShort, newHediff.Label, ParseCause(cause)));
                    }
                    pawn.health.AddHediff(newHediff);
                }
            }
            // We're done here.
            yield break;
        }
Beispiel #3
0
        protected override IEnumerable <string> ApplyPartWorker(Pawn pawn, object cause)
        {
            IEnumerable <BodyPartRecord> parts = HediffUtility.GetPartsToAffect(pawn, partsToAffect);

            foreach (Hediff realHediff in pawn.health.hediffSet.hediffs.Where(h => h.def == hediff && parts.Contains(h.Part)))
            {
                if (realHediff.Visible)
                {
                    yield return(HediffUtility.MessageHediffLost.Translate(pawn.LabelShort, realHediff.Label, ParseCause(cause)));
                }
                pawn.health.RemoveHediff(realHediff);
            }
            yield break;
        }