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); }
//private HungerCategory minCategory; //public override ThinkNode DeepCopy(bool resolve = true) //{ // JobGiver_GetBlood jobGiver_GetBlood = (JobGiver_GetBlood)base.DeepCopy(resolve); // jobGiver_GetBlood.minCategory = this.minCategory; // return jobGiver_GetBlood; //} public override float GetPriority(Pawn pawn) { if (pawn.VampComp() == null) { return(0f); } if (!pawn.VampComp().IsVampire) { return(0f); } Need_Blood blood = pawn.needs.TryGetNeed <Need_Blood>(); if (blood == null) { return(0f); } if (blood.preferredFeedMode == PreferredFeedMode.None) { return(0f); } //HungerCategory.Starving && FoodUtility.ShouldBeFedBySomeone(pawn)) //{ // return 0f; //} //if (blood.CurCategory < this.minCategory) //{ // return 0f; //} if (blood.CurLevelPercentage < blood.ShouldFeedPerc) { return(9.5f); } return(0f); }
//private HungerCategory minCategory; //public override ThinkNode DeepCopy(bool resolve = true) //{ // JobGiver_GetBlood jobGiver_GetBlood = (JobGiver_GetBlood)base.DeepCopy(resolve); // jobGiver_GetBlood.minCategory = this.minCategory; // return jobGiver_GetBlood; //} public override float GetPriority(Pawn pawn) { //Log.Message("0"); if (pawn.VampComp() == null) { //Log.Message("0a"); return 0f; } if (!pawn.VampComp().IsVampire) { return 0f; } if (pawn.Drafted) { return 0f; } Need_Blood blood = pawn.needs.TryGetNeed<Need_Blood>(); if (blood == null) { //Log.Message("0c"); return 0f; } if (pawn.Faction == Faction.OfPlayer && blood.preferredFeedMode == PreferredFeedMode.None) { //Log.Message("0d"); return 0f; } //HungerCategory.Starving && FoodUtility.ShouldBeFedBySomeone(pawn)) //{ // return 0f; //} //if (blood.CurCategory < this.minCategory) //{ // return 0f; //} if (Find.World.GetComponent<WorldComponent_VampireTracker>().recentVampires?.ContainsKey(pawn) ?? false) { return 0f; } if (blood.CurLevelPercentage < blood.ShouldFeedPerc) { //Log.Message("0e"); return 9.5f; } //Log.Message("0f"); return 0f; }
public static void DrawFeedModeButton(Vector2 pos, Pawn pawn) { Need_Blood vampBlood = pawn.needs.TryGetNeed <Need_Blood>(); Texture2D icon = vampBlood.preferredFeedMode.GetIcon(); Rect rect = new Rect(pos.x, pos.y, 24f, 24f); if (Widgets.ButtonImage(rect, icon)) { vampBlood.preferredFeedMode = GetNextResponse(pawn); SoundDefOf.Tick_High.PlayOneShotOnCamera(); PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.HostilityResponse, KnowledgeAmount.SpecificInteraction); } UIHighlighter.HighlightOpportunity(rect, "ROMV_FeedMode"); TooltipHandler.TipRegion(rect, string.Concat(new string[] { "ROMV_FeedMode_Tip".Translate(), "\n\n", "ROMV_FeedMode_CurrentMode".Translate(), ": ", vampBlood.preferredFeedMode.GetLabel() })); if (vampBlood.preferredFeedMode > PreferredFeedMode.AnimalLethal) { Texture2D iconSub = vampBlood.preferredHumanoidFeedType == PreferredHumanoidFeedType.All ? HumanoidTypeAll : HumanoidTypePrisonersOnly; Rect rectSub = new Rect(pos.x, rect.yMax + 5f, 24f, 24f); if (Widgets.ButtonImage(rectSub, iconSub)) { if (vampBlood.preferredHumanoidFeedType == PreferredHumanoidFeedType.All) { vampBlood.preferredHumanoidFeedType = PreferredHumanoidFeedType.PrisonersOnly; } else if (vampBlood.preferredHumanoidFeedType == PreferredHumanoidFeedType.PrisonersOnly) { vampBlood.preferredHumanoidFeedType = PreferredHumanoidFeedType.All; } SoundDefOf.Tick_High.PlayOneShotOnCamera(); } UIHighlighter.HighlightOpportunity(rectSub, "ROMV_FeedModeHumanoidType"); TooltipHandler.TipRegion(rectSub, string.Concat(new string[] { "ROMV_FeedMode_CurrentType".Translate(), ": ", vampBlood.preferredHumanoidFeedType == PreferredHumanoidFeedType.All ? "ROMV_FeedMode_TypeAll".Translate() : "ROMV_FeedMode_TypePrisonersOnly".Translate() })); } }
//private HungerCategory minCategory; //public override ThinkNode DeepCopy(bool resolve = true) //{ // JobGiver_GetBlood jobGiver_GetBlood = (JobGiver_GetBlood)base.DeepCopy(resolve); // jobGiver_GetBlood.minCategory = this.minCategory; // return jobGiver_GetBlood; //} public override float GetPriority(Pawn pawn) { //Log.Message("0"); if (pawn.VampComp() == null) { //Log.Message("0a"); return(0f); } if (!pawn.VampComp().IsVampire) { return(0f); } if (pawn.Drafted) { return(0f); } Need_Blood blood = pawn.needs.TryGetNeed <Need_Blood>(); if (blood == null) { //Log.Message("0c"); return(0f); } if (pawn.Faction == Faction.OfPlayer && blood.preferredFeedMode == PreferredFeedMode.None) { //Log.Message("0d"); return(0f); } if (Find.World.GetComponent <WorldComponent_VampireTracker>().recentVampires?.ContainsKey(pawn) ?? false) { return(0f); } if (blood.CurLevelPercentage < blood.ShouldFeedPerc) { return(9.5f); } return(0f); }
public override float GetPriority(Pawn pawn) { //Log.Message("0"); if (pawn.VampComp() == null) { //Log.Message("0a"); return(0f); } if (!pawn.VampComp().IsVampire) { return(0f); } if (pawn.Drafted) { return(0f); } Need_Blood blood = pawn.needs.TryGetNeed <Need_Blood>(); if (blood == null) { return(0f); } if (blood.CurLevelPercentage < blood.ShouldFeedPerc) { return(0f); } if (pawn.VampComp().Ghouls is List <Pawn> ghouls && !ghouls.NullOrEmpty() && ghouls.Any(ghoul => ghoul?.VampComp()?.ThrallData?.ShouldFeedBlood ?? false)) { return(9.5f); } //Log.Message("0f"); return(0f); }