Пример #1
0
        // Token: 0x06000075 RID: 117 RVA: 0x00006C54 File Offset: 0x00004E54
        public static void SetDRResponseData(Pawn pawn, string m, string d, int last, List <string> master, int num, out List <string> newMaster)
        {
            newMaster = new List <string>();
            string newValue = MSPainlessData.ConvertToDRRData(m, last, num);

            if (master != null)
            {
                bool beenSet = false;
                if (master.Count > 0)
                {
                    foreach (string Response in master)
                    {
                        string hdefname = MSPainlessData.HFromDRResponse(Response);
                        int    numof    = MSPainlessData.NumFromDRResponse(Response);
                        if (hdefname == m && numof == num)
                        {
                            GenCollection.AddDistinct <string>(newMaster, newValue);
                            beenSet = true;
                        }
                        else
                        {
                            int    time     = MSPainlessData.LTFromDRResponse(Response);
                            string oldValue = MSPainlessData.ConvertToDRRData(hdefname, time, numof);
                            GenCollection.AddDistinct <string>(newMaster, oldValue);
                        }
                    }
                }
                if (!beenSet)
                {
                    GenCollection.AddDistinct <string>(newMaster, newValue);
                }
            }
        }
Пример #2
0
        // Token: 0x0600007E RID: 126 RVA: 0x00007018 File Offset: 0x00005218
        public static Job DoPainReliefResponse(Pawn pawn)
        {
            if ((pawn?.CurJob) != null && pawn.CurJob.def == JobDefOf.Ingest)
            {
                return(null);
            }
            if (MSPainlessData.GetLastPainReliefTick(pawn) + 2500 * DRSettings.PainReliefWaitPeriod > Find.TickManager.TicksGame)
            {
                return(null);
            }
            ThingDef painDrugDef = MSPainUtility.NeedsPainReliefNow(pawn, out bool highpain);

            if (painDrugDef != null && MSDrugUtility.IsOKtoAdmin(pawn, null, painDrugDef) && !MSDrugUtility.IsViolation(pawn, painDrugDef))
            {
                Thing drug = MSDrugUtility.FindDrugFor(pawn, painDrugDef);
                if (drug != null)
                {
                    if (DRSettings.ShowReliefMsg)
                    {
                        Messages.Message(TranslatorFormattedStringExtensions.Translate("MSPainless.ReliefMsg", GenText.CapitalizeFirst(pawn.LabelShort), GenText.CapitalizeFirst(drug.def.label)), pawn, MessageTypeDefOf.NeutralEvent, false);
                    }
                    Job job = new Job(JobDefOf.Ingest, drug)
                    {
                        count = Mathf.Min(new int[]
                        {
                            drug.stackCount,
                            drug.def.ingestible.maxNumToIngestAtOnce,
                            1
                        })
                    };
                    if (drug.Spawned && pawn.drugs != null && !pawn.inventory.innerContainer.Contains(drug.def))
                    {
                        DrugPolicyEntry drugPolicyEntry = pawn.drugs.CurrentPolicy[drug.def];
                        if (drugPolicyEntry.takeToInventory > 0)
                        {
                            job.takeExtraIngestibles = drugPolicyEntry.takeToInventory;
                        }
                    }
                    if (MSPainResponse.IsUsingPainJob(pawn, highpain) && !pawn.IsPrisoner)
                    {
                        MSPainlessData.MSPainlessDataTickSet(pawn);
                        return(job);
                    }
                    if (MSAddDrugBill.GenDrugResponse(false, pawn, null, painDrugDef, null, null, 1))
                    {
                        MSPainlessData.MSPainlessDataTickSet(pawn);
                        return(null);
                    }
                }
            }
            return(null);
        }
Пример #3
0
 // Token: 0x0600007B RID: 123 RVA: 0x00006E50 File Offset: 0x00005050
 public static void CheckPainResponse(Pawn pawn)
 {
     if ((pawn.IsColonist || (pawn.IsPrisoner && DRSettings.DoIfPrisoner)) && MSPainlessData.IsPainManager(pawn) && MSPainUtility.IsInPain(pawn) && !FireUtility.IsBurning(pawn) && !pawn.InMentalState && !pawn.Drafted && ((RestUtility.Awake(pawn) && !pawn.IsPrisoner) || pawn.IsPrisoner))
     {
         Job painjob = MSPainResponse.DoPainReliefResponse(pawn);
         if (painjob != null)
         {
             if (pawn.jobs != null && pawn.jobs.curJob != null)
             {
                 pawn.jobs.EndCurrentJob(JobCondition.InterruptForced, true, true);
                 pawn.jobs.ClearQueuedJobs(true);
             }
             pawn.jobs.TryTakeOrderedJob(painjob, 0);
         }
     }
 }
Пример #4
0
 // Token: 0x06000074 RID: 116 RVA: 0x00006BD8 File Offset: 0x00004DD8
 public static int GetDRResponseLastTick(Pawn pawn, string m, List <string> responseList, int num)
 {
     if (responseList != null && responseList.Count > 0)
     {
         foreach (string response in responseList)
         {
             string hdefname = MSPainlessData.HFromDRResponse(response);
             int    numof    = MSPainlessData.NumFromDRResponse(response);
             if (hdefname == m && numof == num)
             {
                 return(MSPainlessData.LTFromDRResponse(response));
             }
         }
         return(0);
     }
     return(0);
 }
Пример #5
0
        // Token: 0x0600007D RID: 125 RVA: 0x00006F64 File Offset: 0x00005164
        public static void DoCaravanPainReliefResponse(Caravan car, Pawn pawn)
        {
            if (MSPainlessData.GetLastPainReliefTick(pawn) + 2500 * DRSettings.PainReliefWaitPeriod > Find.TickManager.TicksGame)
            {
                return;
            }
            ThingDef painDrugDef = MSPainUtility.NeedsPainReliefNow(pawn, out bool highpain);

            if (painDrugDef != null && MSDrugUtility.IsOKtoAdmin(pawn, null, painDrugDef) && !MSDrugUtility.IsViolation(pawn, painDrugDef) && MSCaravanUtility.CaravanHasDrug(car, painDrugDef, out Thing drug, out Pawn owner))
            {
                MSPainlessData.MSPainlessDataTickSet(pawn);
                MSCaravanUtility.PawnOnCaravanTakeDrug(car, pawn, drug, owner);
                if (DRSettings.ShowReliefMsg)
                {
                    Messages.Message(TranslatorFormattedStringExtensions.Translate("MSPainless.ReliefMsg", GenText.CapitalizeFirst(pawn.LabelShort), GenText.CapitalizeFirst(drug.def.label)), pawn, MessageTypeDefOf.NeutralEvent, false);
                }
            }
        }
Пример #6
0
        // Token: 0x0600006A RID: 106 RVA: 0x000062D4 File Offset: 0x000044D4
        public override void CompTick()
        {
            int responseTicks = 150;

            if (DRSettings.UsePainManagement && MSDrugUtility.IsValidPawnMod(this.Pawn, true) && Gen.IsHashIntervalTick(this.Pawn, responseTicks))
            {
                Pawn pawn = this.Pawn;
                if ((pawn?.Map) != null)
                {
                    Pawn pawn2 = this.Pawn;
                    if ((pawn2?.CurJob) != null && this.Pawn.CurJob.def != JobDefOf.Ingest)
                    {
                        MSPainResponse.CheckPainResponse(this.Pawn);
                    }
                }
                else if (CaravanUtility.IsCaravanMember(this.Pawn))
                {
                    MSPainResponse.CheckCaravanPainResponse(this.Pawn);
                }
            }
            if (DRSettings.UseDrugResponse && MSDrugUtility.IsValidPawnMod(this.Pawn, false) && Gen.IsHashIntervalTick(this.Pawn, responseTicks + 50))
            {
                Pawn pawn3 = this.Pawn;
                if ((pawn3?.Map) != null)
                {
                    Pawn pawn4 = this.Pawn;
                    if ((pawn4?.CurJob) == null || this.Pawn.CurJob.def == JobDefOf.Ingest)
                    {
                        return;
                    }
                    Pawn      pawn5 = this.Pawn;
                    HediffSet hediffSet;
                    if (pawn5 == null)
                    {
                        hediffSet = null;
                    }
                    else
                    {
                        Pawn_HealthTracker health = pawn5.health;
                        hediffSet = (health?.hediffSet);
                    }
                    HediffSet hedSet = hediffSet;
                    if (hedSet == null || hedSet == null || hedSet.hediffs.Count <= 0)
                    {
                        return;
                    }
                    using (List <Hediff> .Enumerator enumerator = hedSet.hediffs.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            Hediff hediff = enumerator.Current;
                            if (hediff.Visible && !MSPainlessData.IsProsthetic(hediff) && MSDRUtility.MaladyUsed(hediff.def.defName))
                            {
                                for (int i = 1; i <= 2; i++)
                                {
                                    if (MSPainlessData.CheckIfResponse(this.Pawn, hediff.def.defName, this.DRResponse, i, out ThingDef drugdef) && MSDrugUtility.IsOKtoAdmin(this.Pawn, hediff.def, drugdef) && !MSDrugUtility.IsViolation(this.Pawn, drugdef))
                                    {
                                        Thing drug = MSDrugUtility.FindDrugFor(this.Pawn, drugdef);
                                        if (drug != null)
                                        {
                                            if ((i < 2 && MSDRUtility.GetValueDRBills(hediff.def.defName, DRSettings.MSDRValues)) || (i > 1 && MSDRUtility.GetValueDRBills(hediff.def.defName, DRSettings.MSDRValues2)) || (this.Pawn.IsPrisoner && DRSettings.DoDRIfPrisoner))
                                            {
                                                if ((i < 2 && MSAddDrugBill.GenDrugResponse(true, this.Pawn, hediff.def, drugdef, null, DRSettings.MSDRValues, i)) || (i > 1 && MSAddDrugBill.GenDrugResponse(true, this.Pawn, hediff.def, drugdef, null, DRSettings.MSDRValues2, i)))
                                                {
                                                    MSPainlessData.SetDRResponseData(this.Pawn, hediff.def.defName, drugdef.defName, Find.TickManager.TicksGame, this.DRResponse, i, out List <string> newDRResponse);
                                                    this.DRResponse = newDRResponse;
                                                    MSPainlessData.DoDRResponseMsg(this.Pawn, hediff.def, drugdef);
                                                }
                                            }
                                            else if (MSPainlessData.IsDRCapable(this.Pawn))
                                            {
                                                Job job = new Job(JobDefOf.Ingest, drug)
                                                {
                                                    count = Mathf.Min(new int[]
                                                    {
                                                        drug.stackCount,
                                                        drug.def.ingestible.maxNumToIngestAtOnce,
                                                        1
                                                    })
                                                };
                                                if (drug.Spawned && this.Pawn.drugs != null && !this.Pawn.inventory.innerContainer.Contains(drug.def))
                                                {
                                                    DrugPolicyEntry drugPolicyEntry = this.Pawn.drugs.CurrentPolicy[drug.def];
                                                    if (drugPolicyEntry.takeToInventory > 0)
                                                    {
                                                        job.takeExtraIngestibles = drugPolicyEntry.takeToInventory;
                                                    }
                                                }
                                                if (this.Pawn.jobs != null && this.Pawn.jobs.curJob != null)
                                                {
                                                    this.Pawn.jobs.EndCurrentJob(JobCondition.InterruptForced, true, true);
                                                    this.Pawn.jobs.ClearQueuedJobs(true);
                                                }
                                                MSPainlessData.SetDRResponseData(this.Pawn, hediff.def.defName, drugdef.defName, Find.TickManager.TicksGame, this.DRResponse, i, out List <string> newDRResponse2);
                                                this.DRResponse = newDRResponse2;
                                                MSPainlessData.DoDRResponseMsg(this.Pawn, hediff.def, drugdef);
                                                this.Pawn.jobs.TryTakeOrderedJob(job, 0);
                                            }
                                        }
                                    }
                                }
                                Pawn_JobTracker jobs = this.Pawn.jobs;
                                if ((jobs?.curJob) != null && this.Pawn.jobs.curJob.def == JobDefOf.Ingest)
                                {
                                    break;
                                }
                            }
                        }
                        return;
                    }
                }
                if (CaravanUtility.IsCaravanMember(this.Pawn))
                {
                    Pawn      pawn6 = this.Pawn;
                    HediffSet hediffSet2;
                    if (pawn6 == null)
                    {
                        hediffSet2 = null;
                    }
                    else
                    {
                        Pawn_HealthTracker health2 = pawn6.health;
                        hediffSet2 = (health2?.hediffSet);
                    }
                    HediffSet hedSet2 = hediffSet2;
                    if (hedSet2 != null && hedSet2 != null && hedSet2.hediffs.Count > 0)
                    {
                        foreach (Hediff hediff2 in hedSet2.hediffs)
                        {
                            if (hediff2.Visible && !MSPainlessData.IsProsthetic(hediff2) && MSDRUtility.MaladyUsed(hediff2.def.defName))
                            {
                                for (int j = 1; j <= 2; j++)
                                {
                                    if (MSPainlessData.CheckIfResponse(this.Pawn, hediff2.def.defName, this.DRResponse, j, out ThingDef drugdef2) && MSDrugUtility.IsOKtoAdmin(this.Pawn, hediff2.def, drugdef2) && !MSDrugUtility.IsViolation(this.Pawn, drugdef2))
                                    {
                                        Caravan car = CaravanUtility.GetCaravan(this.Pawn);
                                        if (car != null && MSCaravanUtility.CaravanHasDrug(car, drugdef2, out Thing drug2, out Pawn owner))
                                        {
                                            MSPainlessData.SetDRResponseData(this.Pawn, hediff2.def.defName, drugdef2.defName, Find.TickManager.TicksGame, this.DRResponse, j, out List <string> newDRResponse3);
                                            this.DRResponse = newDRResponse3;
                                            MSCaravanUtility.PawnOnCaravanTakeDrug(car, this.Pawn, drug2, owner);
                                            MSPainlessData.DoDRResponseMsg(this.Pawn, hediff2.def, drugdef2);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #7
0
 // Token: 0x0600006F RID: 111 RVA: 0x00006AFF File Offset: 0x00004CFF
 public static bool MedicallyPrevented(Pawn pawn)
 {
     return(HealthAIUtility.ShouldSeekMedicalRest(pawn) && !MSPainlessData.RelativeHealthOk(pawn));
 }
Пример #8
0
 // Token: 0x0600006E RID: 110 RVA: 0x00006AA4 File Offset: 0x00004CA4
 public static bool IsDRCapable(Pawn pawn)
 {
     return((pawn.IsColonistPlayerControlled || pawn.IsPrisoner) && !pawn.Downed && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Moving) && !MSPainlessData.MedicallyPrevented(pawn) && !FireUtility.IsBurning(pawn) && !pawn.InMentalState);
 }
Пример #9
0
        // Token: 0x0600006D RID: 109 RVA: 0x000069D0 File Offset: 0x00004BD0
        public static bool CheckIfResponse(Pawn pawn, string hdefname, List <string> ResponseList, int num, out ThingDef drugdef)
        {
            bool result = false;

            drugdef = null;
            string drugdefname;

            if (num < 2)
            {
                drugdefname = MSDRUtility.GetValueDRDrug(hdefname, DRSettings.MSDRValues, num);
            }
            else
            {
                drugdefname = MSDRUtility.GetValueDRDrug(hdefname, DRSettings.MSDRValues2, num);
            }
            if (drugdefname != null)
            {
                int ticksDR;
                if (num < 2)
                {
                    ticksDR = MSDRUtility.GetValueDRTime(hdefname, DRSettings.MSDRValues, num) * 2500;
                }
                else
                {
                    ticksDR = MSDRUtility.GetValueDRTime(hdefname, DRSettings.MSDRValues2, num) * 2500;
                }
                int lasttick = MSPainlessData.GetDRResponseLastTick(pawn, hdefname, ResponseList, num);
                if (lasttick > 0)
                {
                    if (lasttick + ticksDR < Find.TickManager.TicksGame)
                    {
                        result = true;
                    }
                }
                else
                {
                    result = true;
                }
            }
            if (result)
            {
                ThingDef chkdef = DefDatabase <ThingDef> .GetNamed(drugdefname, false);

                if (chkdef != null)
                {
                    drugdef = chkdef;
                }
                else
                {
                    result = false;
                    Log.Message(string.Concat(new string[]
                    {
                        "Warning DR: Missing ThingDef for ",
                        drugdefname,
                        " as response to malady ",
                        hdefname,
                        "(Possible mod list change)"
                    }), false);
                }
            }
            return(result);
        }
Пример #10
0
 // Token: 0x0600007C RID: 124 RVA: 0x00006F04 File Offset: 0x00005104
 public static void CheckCaravanPainResponse(Pawn pawn)
 {
     if (CaravanUtility.IsCaravanMember(pawn))
     {
         Caravan car = CaravanUtility.GetCaravan(pawn);
         if (car != null && (pawn.IsColonist || (pawn.IsPrisoner && DRSettings.DoIfPrisoner)) && MSPainlessData.IsPainManager(pawn) && MSPainUtility.IsInPain(pawn) && !pawn.InMentalState && !car.NightResting)
         {
             MSPainResponse.DoCaravanPainReliefResponse(car, pawn);
         }
     }
 }
Пример #11
0
 // Token: 0x0600007F RID: 127 RVA: 0x000071B4 File Offset: 0x000053B4
 private static bool IsUsingPainJob(Pawn p, bool highpain)
 {
     return(!DRSettings.UseReliefBills && (!highpain || !DRSettings.BillsHighPain) && !p.Downed && p.health.capacities.CapableOf(PawnCapacityDefOf.Moving) && !MSPainlessData.MedicallyPrevented(p));
 }