public void wearEquipment(Apparel Equipment, bool wear) { changeTick(); Reset: foreach (ApparelLayerDef layer in Equipment.def.apparel.layers) { foreach (BodyPartGroupDef part in Equipment.def.apparel.bodyPartGroups) { foreach (Apparel apparel in defaultPawn.apparel.WornApparel) { if ((apparel.def.apparel.layers.Contains(layer) && apparel.def.apparel.bodyPartGroups.Contains(part)) || (Equipment.def.apparel.layers.Contains(ApparelLayerDefOf.Overhead) && apparel.def.apparel.layers.Contains(ApparelLayerDefOf.Overhead))) { defaultPawn.apparel.Remove(apparel); goto Reset; } } } } if (wear == false) { //NOTHING } else { defaultPawn.apparel.Wear(Equipment); } MilSquadFC.UpdateEquipmentTotalCostOfSquadsContaining(this); }
public bool AllowedToAutomaticallyDrop(Apparel ap) { return(!this.forcedAps.Contains(ap)); }
public virtual string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); float baseValueFor = this.GetBaseValueFor(req.Def); if (baseValueFor != 0f) { stringBuilder.AppendLine("StatsReport_BaseValue".Translate() + ": " + this.stat.ValueToString(baseValueFor, numberSense)); stringBuilder.AppendLine(); } Pawn pawn = req.Thing as Pawn; if (pawn != null) { if (pawn.skills != null) { if (this.stat.skillNeedOffsets != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int i = 0; i < this.stat.skillNeedOffsets.Count; i++) { SkillNeed skillNeed = this.stat.skillNeedOffsets[i]; int level = pawn.skills.GetSkill(skillNeed.skill).Level; float val = skillNeed.ValueFor(pawn); stringBuilder.AppendLine(string.Concat(new object[] { " ", skillNeed.skill.LabelCap, " (", level, "): ", val.ToStringSign(), this.ValueToString(val, false, ToStringNumberSense.Absolute) })); } stringBuilder.AppendLine(); } } else if (this.stat.noSkillOffset != 0f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(string.Concat(new string[] { " ", "default".Translate().CapitalizeFirst(), " : ", this.stat.noSkillOffset.ToStringSign(), this.ValueToString(this.stat.noSkillOffset, false, ToStringNumberSense.Absolute) })); stringBuilder.AppendLine(); } if (this.stat.capacityOffsets != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); foreach (PawnCapacityOffset current in from hfa in this.stat.capacityOffsets orderby hfa.capacity.listOrder select hfa) { string text = current.capacity.GetLabelFor(pawn).CapitalizeFirst(); float level2 = pawn.health.capacities.GetLevel(current.capacity); float offset = current.GetOffset(pawn.health.capacities.GetLevel(current.capacity)); string text2 = this.ValueToString(offset, false, ToStringNumberSense.Absolute); string text3 = Mathf.Min(level2, current.max).ToStringPercent() + ", " + "HealthOffsetScale".Translate(current.scale.ToString() + "x"); if (current.max < 999f) { text3 = text3 + ", " + "HealthFactorMaxImpact".Translate(current.max.ToStringPercent()); } stringBuilder.AppendLine(string.Concat(new string[] { " ", text, ": ", offset.ToStringSign(), text2, " (", text3, ")" })); } stringBuilder.AppendLine(); } if (pawn.RaceProps.intelligence >= Intelligence.ToolUser) { if (pawn.story != null && pawn.story.traits != null) { List <Trait> list = (from tr in pawn.story.traits.allTraits where tr.CurrentData.statOffsets != null && tr.CurrentData.statOffsets.Any((StatModifier se) => se.stat == this.stat) select tr).ToList <Trait>(); List <Trait> list2 = (from tr in pawn.story.traits.allTraits where tr.CurrentData.statFactors != null && tr.CurrentData.statFactors.Any((StatModifier se) => se.stat == this.stat) select tr).ToList <Trait>(); if (list.Count > 0 || list2.Count > 0) { stringBuilder.AppendLine("StatsReport_RelevantTraits".Translate()); for (int j = 0; j < list.Count; j++) { Trait trait = list[j]; string valueToStringAsOffset = trait.CurrentData.statOffsets.First((StatModifier se) => se.stat == this.stat).ValueToStringAsOffset; stringBuilder.AppendLine(" " + trait.LabelCap + ": " + valueToStringAsOffset); } for (int k = 0; k < list2.Count; k++) { Trait trait2 = list2[k]; string toStringAsFactor = trait2.CurrentData.statFactors.First((StatModifier se) => se.stat == this.stat).ToStringAsFactor; stringBuilder.AppendLine(" " + trait2.LabelCap + ": " + toStringAsFactor); } stringBuilder.AppendLine(); } } if (StatWorker.RelevantGear(pawn, this.stat).Any <Thing>()) { stringBuilder.AppendLine("StatsReport_RelevantGear".Translate()); if (pawn.apparel != null) { for (int l = 0; l < pawn.apparel.WornApparel.Count; l++) { Apparel gear = pawn.apparel.WornApparel[l]; stringBuilder.AppendLine(StatWorker.InfoTextLineFromGear(gear, this.stat)); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { stringBuilder.AppendLine(StatWorker.InfoTextLineFromGear(pawn.equipment.Primary, this.stat)); } stringBuilder.AppendLine(); } } bool flag = false; List <Hediff> hediffs = pawn.health.hediffSet.hediffs; for (int m = 0; m < hediffs.Count; m++) { HediffStage curStage = hediffs[m].CurStage; if (curStage != null) { float statOffsetFromList = curStage.statOffsets.GetStatOffsetFromList(this.stat); if (statOffsetFromList != 0f) { if (!flag) { stringBuilder.AppendLine("StatsReport_RelevantHediffs".Translate()); flag = true; } stringBuilder.AppendLine(" " + hediffs[m].LabelBase.CapitalizeFirst() + ": " + this.ValueToString(statOffsetFromList, false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } } } float statFactorFromList = pawn.ageTracker.CurLifeStage.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList != 1f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_LifeStage".Translate(), " (", pawn.ageTracker.CurLifeStage.label, "): ", statFactorFromList.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor) })); stringBuilder.AppendLine(); } } if (req.StuffDef != null) { if (baseValueFor > 0f || this.stat.applyFactorsIfNegative) { float statFactorFromList2 = req.StuffDef.stuffProps.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList2 != 1f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_Material".Translate(), " (", req.StuffDef.LabelCap, "): ", statFactorFromList2.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor) })); stringBuilder.AppendLine(); } } float statOffsetFromList2 = req.StuffDef.stuffProps.statOffsets.GetStatOffsetFromList(this.stat); if (statOffsetFromList2 != 0f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_Material".Translate(), " (", req.StuffDef.LabelCap, "): ", statOffsetFromList2.ToStringByStyle(this.stat.toStringStyle, ToStringNumberSense.Offset) })); stringBuilder.AppendLine(); } } CompAffectedByFacilities compAffectedByFacilities = req.Thing.TryGetComp <CompAffectedByFacilities>(); if (compAffectedByFacilities != null) { compAffectedByFacilities.GetStatsExplanation(this.stat, stringBuilder); } if (this.stat.statFactors != null) { stringBuilder.AppendLine("StatsReport_OtherStats".Translate()); for (int n = 0; n < this.stat.statFactors.Count; n++) { StatDef statDef = this.stat.statFactors[n]; stringBuilder.AppendLine(" " + statDef.LabelCap + ": x" + statDef.Worker.GetValue(req, true).ToStringPercent()); } stringBuilder.AppendLine(); } if (pawn != null) { if (pawn.skills != null) { if (this.stat.skillNeedFactors != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int num = 0; num < this.stat.skillNeedFactors.Count; num++) { SkillNeed skillNeed2 = this.stat.skillNeedFactors[num]; int level3 = pawn.skills.GetSkill(skillNeed2.skill).Level; stringBuilder.AppendLine(string.Concat(new object[] { " ", skillNeed2.skill.LabelCap, " (", level3, "): x", skillNeed2.ValueFor(pawn).ToStringPercent() })); } stringBuilder.AppendLine(); } } else if (this.stat.noSkillFactor != 1f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : x" + this.stat.noSkillFactor.ToStringPercent()); stringBuilder.AppendLine(); } if (this.stat.capacityFactors != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); if (this.stat.capacityFactors != null) { foreach (PawnCapacityFactor current2 in from hfa in this.stat.capacityFactors orderby hfa.capacity.listOrder select hfa) { string text4 = current2.capacity.GetLabelFor(pawn).CapitalizeFirst(); float factor = current2.GetFactor(pawn.health.capacities.GetLevel(current2.capacity)); string text5 = factor.ToStringPercent(); string text6 = "HealthFactorPercentImpact".Translate(current2.weight.ToStringPercent()); if (current2.max < 999f) { text6 = text6 + ", " + "HealthFactorMaxImpact".Translate(current2.max.ToStringPercent()); } if (current2.allowedDefect != 0f) { text6 = text6 + ", " + "HealthFactorAllowedDefect".Translate((1f - current2.allowedDefect).ToStringPercent()); } stringBuilder.AppendLine(string.Concat(new string[] { " ", text4, ": x", text5, " (", text6, ")" })); } } stringBuilder.AppendLine(); } if (pawn.Inspired) { float statOffsetFromList3 = pawn.InspirationDef.statOffsets.GetStatOffsetFromList(this.stat); if (statOffsetFromList3 != 0f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(pawn.Inspiration.def.LabelCap) + ": " + this.ValueToString(statOffsetFromList3, false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } float statFactorFromList3 = pawn.InspirationDef.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList3 != 1f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(pawn.Inspiration.def.LabelCap) + ": " + statFactorFromList3.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor)); stringBuilder.AppendLine(); } } } return(stringBuilder.ToString().TrimEndNewlines()); }
private static void AddHumanlikeOrders(Vector3 clickPos, Pawn pawn, List <FloatMenuOption> opts) { IntVec3 c = IntVec3.FromVector3(clickPos); foreach (Thing thing2 in c.GetThingList(pawn.Map)) { Thing t = thing2; if (t.def.ingestible != null && pawn.RaceProps.CanEverEat(t) && t.IngestibleNow) { string text = (!t.def.ingestible.ingestCommandString.NullOrEmpty()) ? string.Format(t.def.ingestible.ingestCommandString, t.LabelShort) : "ConsumeThing".Translate(t.LabelShort); if (!t.IsSociallyProper(pawn)) { text = text + " (" + "ReservedForPrisoners".Translate() + ")"; } FloatMenuOption item3; if (t.def.IsNonMedicalDrug && pawn.IsTeetotaler()) { item3 = new FloatMenuOption(text + " (" + TraitDefOf.DrugDesire.DataAtDegree(-1).label + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); } else if (!pawn.CanReach(t, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn)) { item3 = new FloatMenuOption(text + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); } else { MenuOptionPriority priority = (MenuOptionPriority)((!(t is Corpse)) ? 4 : 2); item3 = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(text, delegate { t.SetForbidden(false, true); Job job13 = new Job(JobDefOf.Ingest, t); job13.count = FoodUtility.WillIngestStackCountOf(pawn, t.def); pawn.jobs.TryTakeOrderedJob(job13, JobTag.Misc); }, priority, null, null, 0f, null, null), pawn, t, "ReservedBy"); } opts.Add(item3); } } if (pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { foreach (LocalTargetInfo item7 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true)) { Pawn victim = (Pawn)item7.Thing; if (!victim.InBed() && pawn.CanReserveAndReach(victim, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true)) { if (!victim.IsPrisonerOfColony && !victim.InMentalState && (victim.Faction == Faction.OfPlayer || victim.Faction == null || !victim.Faction.HostileTo(Faction.OfPlayer))) { string label = "Rescue".Translate(victim.LabelCap); Action action = delegate { Building_Bed building_Bed2 = RestUtility.FindBedFor(victim, pawn, false, false, false); if (building_Bed2 == null) { building_Bed2 = RestUtility.FindBedFor(victim, pawn, false, false, true); } if (building_Bed2 == null) { string str2 = (!victim.RaceProps.Animal) ? "NoNonPrisonerBed".Translate() : "NoAnimalBed".Translate(); Messages.Message("CannotRescue".Translate() + ": " + str2, victim, MessageTypeDefOf.RejectInput); } else { Job job12 = new Job(JobDefOf.Rescue, victim, building_Bed2); job12.count = 1; pawn.jobs.TryTakeOrderedJob(job12, JobTag.Misc); PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.Rescuing, KnowledgeAmount.Total); } }; MenuOptionPriority priority2 = MenuOptionPriority.RescueOrCapture; Pawn revalidateClickTarget = victim; opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, revalidateClickTarget, 0f, null, null), pawn, victim, "ReservedBy")); } if (!victim.NonHumanlikeOrWildMan() && (victim.InMentalState || victim.Faction != Faction.OfPlayer || (victim.Downed && (victim.guilt.IsGuilty || victim.IsPrisonerOfColony)))) { string label = "Capture".Translate(victim.LabelCap); Action action = delegate { Building_Bed building_Bed = RestUtility.FindBedFor(victim, pawn, true, false, false); if (building_Bed == null) { building_Bed = RestUtility.FindBedFor(victim, pawn, true, false, true); } if (building_Bed == null) { Messages.Message("CannotCapture".Translate() + ": " + "NoPrisonerBed".Translate(), victim, MessageTypeDefOf.RejectInput); } else { Job job11 = new Job(JobDefOf.Capture, victim, building_Bed); job11.count = 1; pawn.jobs.TryTakeOrderedJob(job11, JobTag.Misc); PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.Capturing, KnowledgeAmount.Total); } }; MenuOptionPriority priority2 = MenuOptionPriority.RescueOrCapture; Pawn revalidateClickTarget = victim; opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, revalidateClickTarget, 0f, null, null), pawn, victim, "ReservedBy")); } } } foreach (LocalTargetInfo item8 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true)) { LocalTargetInfo localTargetInfo = item8; Pawn victim2 = (Pawn)localTargetInfo.Thing; if (victim2.Downed && pawn.CanReserveAndReach(victim2, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true) && Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, true) != null) { string text2 = "CarryToCryptosleepCasket".Translate(localTargetInfo.Thing.LabelCap); JobDef jDef = JobDefOf.CarryToCryptosleepCasket; Action action2 = delegate { Building_CryptosleepCasket building_CryptosleepCasket = Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, false); if (building_CryptosleepCasket == null) { building_CryptosleepCasket = Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, true); } if (building_CryptosleepCasket == null) { Messages.Message("CannotCarryToCryptosleepCasket".Translate() + ": " + "NoCryptosleepCasket".Translate(), victim2, MessageTypeDefOf.RejectInput); } else { Job job10 = new Job(jDef, victim2, building_CryptosleepCasket); job10.count = 1; pawn.jobs.TryTakeOrderedJob(job10, JobTag.Misc); } }; string label = text2; Action action = action2; Pawn revalidateClickTarget = victim2; opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, MenuOptionPriority.Default, null, revalidateClickTarget, 0f, null, null), pawn, victim2, "ReservedBy")); } } } foreach (LocalTargetInfo item9 in GenUI.TargetsAt(clickPos, TargetingParameters.ForStrip(pawn), true)) { LocalTargetInfo stripTarg = item9; FloatMenuOption item4 = pawn.CanReach(stripTarg, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn) ? FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("Strip".Translate(stripTarg.Thing.LabelCap), delegate { stripTarg.Thing.SetForbidden(false, false); pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.Strip, stripTarg), JobTag.Misc); }, MenuOptionPriority.Default, null, null, 0f, null, null), pawn, stripTarg, "ReservedBy") : new FloatMenuOption("CannotStrip".Translate(stripTarg.Thing.LabelCap) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); opts.Add(item4); } if (pawn.equipment != null) { ThingWithComps equipment = null; List <Thing> thingList = c.GetThingList(pawn.Map); int num = 0; while (num < thingList.Count) { if (thingList[num].TryGetComp <CompEquippable>() == null) { num++; continue; } equipment = (ThingWithComps)thingList[num]; break; } if (equipment != null) { string labelShort = equipment.LabelShort; FloatMenuOption item5; if (equipment.def.IsWeapon && pawn.story.WorkTagIsDisabled(WorkTags.Violent)) { item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "IsIncapableOfViolenceLower".Translate(pawn.LabelShort) + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); } else if (!pawn.CanReach(equipment, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); } else if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "Incapable".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); } else { string text3 = "Equip".Translate(labelShort); if (equipment.def.IsRangedWeapon && pawn.story != null && pawn.story.traits.HasTrait(TraitDefOf.Brawler)) { text3 = text3 + " " + "EquipWarningBrawler".Translate(); } item5 = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(text3, delegate { equipment.SetForbidden(false, true); pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.Equip, equipment), JobTag.Misc); MoteMaker.MakeStaticMote(equipment.DrawPos, equipment.Map, ThingDefOf.Mote_FeedbackEquip, 1f); PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.EquippingWeapons, KnowledgeAmount.Total); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, equipment, "ReservedBy"); } opts.Add(item5); } } if (pawn.apparel != null) { Apparel apparel = pawn.Map.thingGrid.ThingAt <Apparel>(c); if (apparel != null) { FloatMenuOption item6 = pawn.CanReach(apparel, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn) ? (ApparelUtility.HasPartsToWear(pawn, apparel.def) ? FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("ForceWear".Translate(apparel.LabelShort), delegate { apparel.SetForbidden(false, true); Job job9 = new Job(JobDefOf.Wear, apparel); pawn.jobs.TryTakeOrderedJob(job9, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, apparel, "ReservedBy") : new FloatMenuOption("CannotWear".Translate(apparel.Label) + " (" + "CannotWearBecauseOfMissingBodyParts".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)) : new FloatMenuOption("CannotWear".Translate(apparel.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null); opts.Add(item6); } } if (!pawn.Map.IsPlayerHome) { Thing item = c.GetFirstItem(pawn.Map); if (item != null && item.def.EverHaulable) { if (!pawn.CanReach(item, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { opts.Add(new FloatMenuOption("CannotPickUp".Translate(item.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (MassUtility.WillBeOverEncumberedAfterPickingUp(pawn, item, 1)) { opts.Add(new FloatMenuOption("CannotPickUp".Translate(item.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (item.stackCount == 1) { opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUp".Translate(item.Label), delegate { item.SetForbidden(false, false); Job job8 = new Job(JobDefOf.TakeInventory, item); job8.count = 1; pawn.jobs.TryTakeOrderedJob(job8, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy")); } else { if (MassUtility.WillBeOverEncumberedAfterPickingUp(pawn, item, item.stackCount)) { opts.Add(new FloatMenuOption("CannotPickUpAll".Translate(item.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUpAll".Translate(item.Label), delegate { item.SetForbidden(false, false); Job job7 = new Job(JobDefOf.TakeInventory, item); job7.count = item.stackCount; pawn.jobs.TryTakeOrderedJob(job7, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy")); } opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUpSome".Translate(item.Label), delegate { int to2 = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(pawn, item), item.stackCount); Dialog_Slider window2 = new Dialog_Slider("PickUpCount".Translate(item.LabelShort), 1, to2, delegate(int count) { item.SetForbidden(false, false); Job job6 = new Job(JobDefOf.TakeInventory, item); job6.count = count; pawn.jobs.TryTakeOrderedJob(job6, JobTag.Misc); }, -2147483648); Find.WindowStack.Add(window2); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy")); } } } if (!pawn.Map.IsPlayerHome) { Thing item2 = c.GetFirstItem(pawn.Map); if (item2 != null && item2.def.EverHaulable) { Pawn bestPackAnimal = GiveToPackAnimalUtility.PackAnimalWithTheMostFreeSpace(pawn.Map, pawn.Faction); if (bestPackAnimal != null) { if (!pawn.CanReach(item2, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { opts.Add(new FloatMenuOption("CannotGiveToPackAnimal".Translate(item2.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (MassUtility.WillBeOverEncumberedAfterPickingUp(bestPackAnimal, item2, 1)) { opts.Add(new FloatMenuOption("CannotGiveToPackAnimal".Translate(item2.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (item2.stackCount == 1) { opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimal".Translate(item2.Label), delegate { item2.SetForbidden(false, false); Job job5 = new Job(JobDefOf.GiveToPackAnimal, item2); job5.count = 1; pawn.jobs.TryTakeOrderedJob(job5, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy")); } else { if (MassUtility.WillBeOverEncumberedAfterPickingUp(bestPackAnimal, item2, item2.stackCount)) { opts.Add(new FloatMenuOption("CannotGiveToPackAnimalAll".Translate(item2.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimalAll".Translate(item2.Label), delegate { item2.SetForbidden(false, false); Job job4 = new Job(JobDefOf.GiveToPackAnimal, item2); job4.count = item2.stackCount; pawn.jobs.TryTakeOrderedJob(job4, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy")); } opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimalSome".Translate(item2.Label), delegate { int to = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(bestPackAnimal, item2), item2.stackCount); Dialog_Slider window = new Dialog_Slider("GiveToPackAnimalCount".Translate(item2.LabelShort), 1, to, delegate(int count) { item2.SetForbidden(false, false); Job job3 = new Job(JobDefOf.GiveToPackAnimal, item2); job3.count = count; pawn.jobs.TryTakeOrderedJob(job3, JobTag.Misc); }, -2147483648); Find.WindowStack.Add(window); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy")); } } } } if (!pawn.Map.IsPlayerHome && pawn.Map.exitMapGrid.MapUsesExitGrid) { foreach (LocalTargetInfo item10 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true)) { Pawn p = (Pawn)item10.Thing; if (p.Faction == Faction.OfPlayer || p.HostFaction == Faction.OfPlayer) { IntVec3 exitSpot; if (!pawn.CanReach(p, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { opts.Add(new FloatMenuOption("CannotCarryToExit".Translate(p.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (!RCellFinder.TryFindBestExitSpot(pawn, out exitSpot, TraverseMode.ByPawn)) { opts.Add(new FloatMenuOption("CannotCarryToExit".Translate(p.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("CarryToExit".Translate(p.Label), delegate { Job job2 = new Job(JobDefOf.CarryDownedPawnToExit, p, exitSpot); job2.count = 1; pawn.jobs.TryTakeOrderedJob(job2, JobTag.Misc); }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item10, "ReservedBy")); } } } } if (pawn.equipment != null && pawn.equipment.Primary != null && GenUI.TargetsAt(clickPos, TargetingParameters.ForSelf(pawn), true).Any()) { Action action3 = delegate { pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.DropEquipment, pawn.equipment.Primary), JobTag.Misc); }; opts.Add(new FloatMenuOption("Drop".Translate(pawn.equipment.Primary.Label), action3, MenuOptionPriority.Default, null, null, 0f, null, null)); } foreach (LocalTargetInfo item11 in GenUI.TargetsAt(clickPos, TargetingParameters.ForTrade(), true)) { LocalTargetInfo dest = item11; if (!pawn.CanReach(dest, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn)) { opts.Add(new FloatMenuOption("CannotTrade".Translate() + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else if (pawn.skills.GetSkill(SkillDefOf.Social).TotallyDisabled) { opts.Add(new FloatMenuOption("CannotPrioritizeWorkTypeDisabled".Translate(SkillDefOf.Social.LabelCap), null, MenuOptionPriority.Default, null, null, 0f, null, null)); } else { Pawn pTarg = (Pawn)dest.Thing; Action action4 = delegate { Job job = new Job(JobDefOf.TradeWithPawn, pTarg); job.playerForced = true; pawn.jobs.TryTakeOrderedJob(job, JobTag.Misc); PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.InteractingWithTraders, KnowledgeAmount.Total); }; string str = string.Empty; if (pTarg.Faction != null) { str = " (" + pTarg.Faction.Name + ")"; } string label = "TradeWith".Translate(pTarg.LabelShort + ", " + pTarg.TraderKind.label) + str; Action action = action4; MenuOptionPriority priority2 = MenuOptionPriority.InitiateSocial; Thing thing = dest.Thing; opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, thing, 0f, null, null), pawn, pTarg, "ReservedBy")); } } foreach (Thing item12 in pawn.Map.thingGrid.ThingsAt(c)) { foreach (FloatMenuOption floatMenuOption in item12.GetFloatMenuOptions(pawn)) { opts.Add(floatMenuOption); } } }
public ApparelGraphicRecord(Graphic graphic, Apparel sourceApparel) { this.graphic = graphic; this.sourceApparel = sourceApparel; }
protected override Job TryGiveJob(Pawn pawn) { if (pawn.outfits == null) { Log.ErrorOnce(pawn + " tried to run JobGiver_OptimizeApparel without an OutfitTracker", 5643897, false); return(null); } if (pawn.Faction != Faction.OfPlayer) { Log.ErrorOnce("Non-colonist " + pawn + " tried to optimize apparel.", 764323, false); return(null); } if (!DebugViewSettings.debugApparelOptimize) { if (Find.TickManager.TicksGame < pawn.mindState.nextApparelOptimizeTick) { return(null); } } else { JobGiver_OptimizeApparel.debugSb = new StringBuilder(); JobGiver_OptimizeApparel.debugSb.AppendLine(string.Concat(new object[] { "Scanning for ", pawn, " at ", pawn.Position })); } Outfit currentOutfit = pawn.outfits.CurrentOutfit; List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int i = wornApparel.Count - 1; i >= 0; i--) { if (!currentOutfit.filter.Allows(wornApparel[i]) && pawn.outfits.forcedHandler.AllowedToAutomaticallyDrop(wornApparel[i])) { return(new Job(JobDefOf.RemoveApparel, wornApparel[i]) { haulDroppedApparel = true }); } } Thing thing = null; float num = 0f; List <Thing> list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Apparel); if (list.Count == 0) { this.SetNextOptimizeTick(pawn); return(null); } JobGiver_OptimizeApparel.neededWarmth = PawnApparelGenerator.CalculateNeededWarmth(pawn, pawn.Map.Tile, GenLocalDate.Twelfth(pawn)); for (int j = 0; j < list.Count; j++) { Apparel apparel = (Apparel)list[j]; if (currentOutfit.filter.Allows(apparel)) { if (apparel.IsInAnyStorage()) { if (!apparel.IsForbidden(pawn)) { if (!apparel.IsBurning()) { float num2 = JobGiver_OptimizeApparel.ApparelScoreGain(pawn, apparel); if (DebugViewSettings.debugApparelOptimize) { JobGiver_OptimizeApparel.debugSb.AppendLine(apparel.LabelCap + ": " + num2.ToString("F2")); } if (num2 >= 0.05f && num2 >= num) { if (ApparelUtility.HasPartsToWear(pawn, apparel.def)) { if (pawn.CanReserveAndReach(apparel, PathEndMode.OnCell, pawn.NormalMaxDanger(), 1, -1, null, false)) { thing = apparel; num = num2; } } } } } } } } if (DebugViewSettings.debugApparelOptimize) { JobGiver_OptimizeApparel.debugSb.AppendLine("BEST: " + thing); Log.Message(JobGiver_OptimizeApparel.debugSb.ToString(), false); JobGiver_OptimizeApparel.debugSb = null; } if (thing == null) { this.SetNextOptimizeTick(pawn); return(null); } return(new Job(JobDefOf.Wear, thing)); }
public void Notify_ApparelAdded(Apparel apparel) { SortWornApparelIntoDrawOrder(); ApparelChanged(); }
public bool TryDrop(Apparel ap, out Apparel resultingAp) { return(TryDrop(ap, out resultingAp, pawn.PositionHeld)); }
public bool TryDrop(Apparel ap) { Apparel resultingAp; return(TryDrop(ap, out resultingAp)); }
public void Remove(Apparel ap) { wornApparel.Remove(ap); }