// Token: 0x06000040 RID: 64 RVA: 0x00004AC0 File Offset: 0x00002CC0 private static bool GenMSRecipe(Pawn pawn, HediffDef hdef, ThingDef drugdef, BodyPartRecord part = null) { bool result = false; if (MSDrugUtility.IsOKtoAdmin(pawn, hdef, drugdef)) { RecipeDef recipeDef = DefDatabase <RecipeDef> .GetNamed("Administer_" + drugdef.defName, true); if (recipeDef != null) { if (!MSAddDrugBill.IsViolation(pawn, recipeDef, out string reason)) { if (!MSAddDrugBill.ChkDuplication(pawn, recipeDef) && MSAddDrugBill.GenAdminOption(pawn, recipeDef, part)) { result = true; } } else { Messages.Message(TranslatorFormattedStringExtensions.Translate("MSPainless.ViolationMsg", GenText.CapitalizeFirst(pawn.LabelShort), GenText.CapitalizeFirst(drugdef.label), reason), pawn, MessageTypeDefOf.NeutralEvent, false); } } } return(result); }
// Token: 0x0600003F RID: 63 RVA: 0x00004A60 File Offset: 0x00002C60 public static bool GenDrugResponse(bool isDR, Pawn pawn, HediffDef hdef, ThingDef drugDef = null, BodyPartRecord part = null, List <string> Master = null, int num = 1) { bool result = false; if (drugDef != null) { if (MSAddDrugBill.GenMSRecipe(pawn, hdef, drugDef, part)) { result = true; } } else if (isDR) { string Hdefname = hdef?.defName; if (Hdefname != null) { string drugdefname = MSDRUtility.GetValueDRDrug(Hdefname, Master, num); if (drugdefname != null) { drugDef = DefDatabase <ThingDef> .GetNamed(drugdefname, false); if (drugDef != null && MSAddDrugBill.GenMSRecipe(pawn, hdef, drugDef, part)) { result = true; } } } } return(result); }
// 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); }
// Token: 0x06000043 RID: 67 RVA: 0x00004CA0 File Offset: 0x00002EA0 private static bool GenAdminOption(Pawn patient, RecipeDef recipe, BodyPartRecord part = null) { bool result = false; if (patient != null) { Bill_Medical bill_Medical = new Bill_Medical(recipe); patient.BillStack.AddBill(bill_Medical); result = true; bill_Medical.Part = part; if (recipe.conceptLearned != null) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(recipe.conceptLearned, KnowledgeAmount.Total); } Pawn patient2 = patient; Map map = patient2?.Map; if (map != null) { if (!map.mapPawns.FreeColonists.Any((Pawn col) => recipe.PawnSatisfiesSkillRequirements(col))) { Bill.CreateNoPawnsWithSkillDialog(recipe); } if (!RestUtility.InBed(patient) && patient.RaceProps.IsFlesh) { if (patient.RaceProps.Humanlike) { if (!GenCollection.Any(map.listerBuildings.allBuildingsColonist, (Building x) => x is Building_Bed bed && RestUtility.CanUseBedEver(patient, x.def) && bed.Medical)) { Messages.Message(Translator.Translate("MessageNoMedicalBeds"), patient, MessageTypeDefOf.CautionInput, false); } } else if (!GenCollection.Any <Building>(map.listerBuildings.allBuildingsColonist, (Building x) => x is Building_Bed && RestUtility.CanUseBedEver(patient, x.def))) { Messages.Message(Translator.Translate("MessageNoAnimalBeds"), patient, MessageTypeDefOf.CautionInput, false); } } if (patient.Faction != null && !patient.Faction.def.hidden && !FactionUtility.HostileTo(patient.Faction, Faction.OfPlayer) && recipe.Worker.IsViolationOnPawn(patient, part, Faction.OfPlayer)) { Messages.Message(TranslatorFormattedStringExtensions.Translate("MessageMedicalOperationWillAngerFaction", patient.Faction), patient, MessageTypeDefOf.CautionInput, false); } ThingDef minRequiredMedicine = MSAddDrugBill.GetMinRequiredMedicine(recipe); if (minRequiredMedicine != null && patient.playerSettings != null && !MedicalCareUtility.AllowsMedicine(patient.playerSettings.medCare, minRequiredMedicine)) { Messages.Message(TranslatorFormattedStringExtensions.Translate("MessageTooLowMedCare", minRequiredMedicine.label, patient.LabelShort, MedicalCareUtility.GetLabel(patient.playerSettings.medCare), NamedArgumentUtility.Named(patient, "PAWN")), patient, MessageTypeDefOf.CautionInput, false); } } } return(result); }
// 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); } } } } } } } } }