public static Job FeedJob(Pawn pawn) { Need_Blood blood = pawn.needs.TryGetNeed <Need_Blood>(); if (blood == null) { return(null); } bool desperate = blood.CurCategory == HungerCategory.Starving; bool isHuntHuman = blood.preferredFeedMode == PreferredFeedMode.HumanoidLethal || blood.preferredFeedMode == PreferredFeedMode.HumanoidNonLethal; bool isHuntLethal = blood.preferredFeedMode == PreferredFeedMode.HumanoidLethal || blood.preferredFeedMode == PreferredFeedMode.AnimalLethal; Thing thing; ThingDef def; if (!BloodUtility.TryFindBestBloodSourceFor(pawn, pawn, desperate, out thing, out def)) { return(null); } if (thing != null && thing != pawn && thing.Spawned) { Pawn pawn2 = thing as Pawn; if (pawn2 != null) { return(new Job(VampDefOf.ROMV_Feed, pawn2) { killIncappedTarget = isHuntLethal }); } return(new Job(VampDefOf.ROMV_ConsumeBlood, thing) { count = BloodUtility.WillConsumeStackCountOf(pawn, def) }); } return(null); }
// RimWorld.FloatMenuMakerMap private static void Vamp_FloatMenus_Consume(Vector3 clickPos, Pawn pawn, ref List <FloatMenuOption> opts) { IntVec3 c = IntVec3.FromVector3(clickPos); CompVampire selVampComp = pawn.VampComp(); bool pawnIsVampire = pawn.IsVampire(); if (selVampComp != null && pawnIsVampire) { //Hide food consumption from menus. Thing food = c.GetThingList(pawn.Map) .FirstOrDefault(t => t.GetType() != typeof(Pawn) && t?.def?.ingestible != null); if (food != null) { //string text = (!food.def.ingestible.ingestCommandString.NullOrEmpty()) ? string.Format(food.def.ingestible.ingestCommandString, food.LabelShort) : ((string)"ConsumeThing".Translate(food.LabelShort, food)); string text = ""; if (food?.def?.ingestible?.ingestCommandString == null || food.def.ingestible.ingestCommandString == "") { text = ((string)"ConsumeThing".Translate(food.LabelShort, food)); } else { text = string.Format(food.def.ingestible.ingestCommandString, food.LabelShort); } FloatMenuOption o = opts.FirstOrDefault(x => x.Label.Contains(text)); if (o != null) { opts.Remove(o); } } //Hide corpse consumption from menus. Thing corpse = c.GetThingList(pawn.Map).FirstOrDefault(t => t is Corpse); if (corpse != null) { string text; if (corpse.def.ingestible.ingestCommandString.NullOrEmpty()) { text = "ConsumeThing".Translate(new object[] { corpse.LabelShort }); } else { text = string.Format(corpse.def.ingestible.ingestCommandString, corpse.LabelShort); } FloatMenuOption o = opts.FirstOrDefault(x => x.Label.Contains(text)); if (o != null) { opts.Remove(o); } } //Add blood consumption Thing bloodItem = c.GetThingList(pawn.Map) .FirstOrDefault(t => t.def.GetCompProperties <CompProperties_BloodItem>() != null); if (bloodItem != null) { string text = ""; if (bloodItem.def.ingestible.ingestCommandString.NullOrEmpty()) { text = "ConsumeThing".Translate(new object[] { bloodItem.LabelShort }); } else { text = string.Format(bloodItem.def.ingestible.ingestCommandString, bloodItem.LabelShort); } if (!bloodItem.IsSociallyProper(pawn)) { text = text + " (" + "ReservedForPrisoners".Translate() + ")"; } FloatMenuOption item5; if (bloodItem.def.IsPleasureDrug && pawn.IsTeetotaler()) { item5 = new FloatMenuOption(text + " (" + TraitDefOf.DrugDesire.DataAtDegree(-1).label + ")", null); } else if (!pawn.CanReach(bloodItem, PathEndMode.OnCell, Danger.Deadly)) { item5 = new FloatMenuOption(text + " (" + "NoPath".Translate() + ")", null); } else { MenuOptionPriority priority = !(bloodItem is Corpse) ? MenuOptionPriority.Default : MenuOptionPriority.Low; item5 = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(text, delegate { bloodItem.SetForbidden(false); Job job = new Job(VampDefOf.ROMV_ConsumeBlood, bloodItem); job.count = BloodUtility.WillConsumeStackCountOf(pawn, bloodItem.def); pawn.jobs.TryTakeOrderedJob(job); }, priority), pawn, bloodItem); } opts.Add(item5); } } }