示例#1
0
        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);
        }
示例#2
0
        // 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);
                }
            }
        }