protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_General.DoAtomic(delegate { Pawn pawn = job.targetA.Thing as Pawn; //if (pawn != null && pawn.Downed && base.pawn.mindState.duty != null && base.pawn.mindState.duty.attackDownedIfStarving && base.pawn.Starving()) //{ job.killIncappedTarget = true; //} })); yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); yield return(Toils_Combat.FollowAndMeleeAttack(TargetIndex.A, delegate { Thing thing = job.GetTarget(TargetIndex.A).Thing; Pawn p; //if (job.reactingToMeleeThreat && (p = (thing as Pawn)) != null && !p.Awake()) //{ // EndJobWith(JobCondition.InterruptForced); //} InteractionUtility.TryGetRandomVerbForSocialFight(base.pawn, out Verb verb); if (BeatDecider.shouldStopBeating(base.pawn, base.TargetA.Thing as Pawn)) { EndJobWith(JobCondition.Succeeded); } else { pawn.meleeVerbs.TryMeleeAttack(thing, verb); } }).FailOnDespawnedOrNull(TargetIndex.A));
public static bool CanTalkTo(this Pawn talker, Pawn talkee) { return(talker.MapHeld == talkee.MapHeld && InteractionUtility.CanInitiateInteraction(talker) && InteractionUtility.CanReceiveInteraction(talkee) && CanSee(talker, talkee)); }
public static void roll_to_hit(Pawn rapist, Pawn p) { if (!Mod_Settings.prisoner_beating) { return; } float rand_value = Rand.Value; float victim_pain = p.health.hediffSet.PainTotal; // bloodlust makes the aggressor more likely to hit the prisoner float beating_chance = xxx.config.base_chance_to_hit_prisoner * (xxx.is_bloodlust(rapist) ? 1.25f : 1.0f); // psychopath makes the aggressor more likely to hit the prisoner past the significant_pain_threshold float beating_threshold = xxx.is_psychopath(rapist) ? xxx.config.extreme_pain_threshold : xxx.config.significant_pain_threshold; //--Log.Message("roll_to_hit: rand = " + rand_value + ", beating_chance = " + beating_chance + ", victim_pain = " + victim_pain + ", beating_threshold = " + beating_threshold); if ((victim_pain < beating_threshold && rand_value < beating_chance) || (rand_value < (beating_chance / 2))) { //--Log.Message(" done told her twice already..."); if (InteractionUtility.TryGetRandomVerbForSocialFight(rapist, out Verb v)) { rapist.meleeVerbs.TryMeleeAttack(p, v); } } /* * //if (p.health.hediffSet.PainTotal < xxx.config.significant_pain_threshold) * if ((Rand.Value < 0.50f) && * ((Rand.Value < 0.33f) || (p.health.hediffSet.PainTotal < xxx.config.significant_pain_threshold) || * (xxx.is_bloodlust (rapist) || xxx.is_psychopath (rapist)))) { * Verb v; * if (InteractionUtility.TryGetRandomVerbForSocialFight (rapist, out v)) * rapist.meleeVerbs.TryMeleeAttack (p, v); * } */ }
private static bool CanInteractNowWith(Pawn pawn, Pawn recipient) // Had to add, copy { return(recipient.Spawned && ((pawn.Position - recipient.Position).LengthHorizontalSquared <= 36.0 && InteractionUtility.CanInitiateInteraction(pawn) && (InteractionUtility.CanReceiveInteraction(recipient) && GenSight.LineOfSight(pawn.Position, recipient.Position, pawn.MapHeld, true)))); }
public static bool CanTalkTo(this Pawn talker, Pawn talkee) { return(talker.MapHeld == talkee.MapHeld && InteractionUtility.CanInitiateInteraction(talker) && InteractionUtility.CanReceiveInteraction(talkee) && (talker.Position - talkee.Position).LengthHorizontalSquared <= 36.0 && GenSight.LineOfSight(talker.Position, talkee.Position, talker.MapHeld, true)); }
static bool SapientAnimalPatch([NotNull] Pawn p, ref bool __result) { if (p.IsSapientOrFeralFormerHuman()) { __result = InteractionUtility.CanReceiveInteraction(p) && (!p.Downed && !p.InAggroMentalState); return(false); } return(true); }
public static bool Replacement(Pawn_InteractionsTracker __instance, ref bool __result) { // Added var pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!IsInteractable(pawn)) { __result = false; return(false); } var workingList = Traverse.Create(__instance).Field("workingList").GetValue <List <Pawn> >(); // Had to add if (InteractedTooRecentlyToInteract(__instance)) // Changed to own { __result = false; return(false); } // BASE if (!InteractionUtility.CanInitiateRandomInteraction(pawn)) { __result = false; return(false); } var collection = pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable); // Added workingList.Clear(); workingList.AddRange(collection); workingList.Shuffle <Pawn>(); List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading; for (int i = 0; i < workingList.Count; i++) { Pawn p = workingList[i]; if (p != pawn && CanInteractNowWith(pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) && !pawn.HostileTo(p)) { InteractionDef intDef; if ( allDefsListForReading.TryRandomElementByWeight( (InteractionDef x) => x.Worker.RandomSelectionWeight(pawn, p), out intDef)) { if (__instance.TryInteractWith(p, intDef)) { __result = true; return(false); } Log.Error(pawn + " failed to interact with " + p); } } } __result = false; return(false); }
static bool Prefix(Pawn pawn, Pawn sick, JoyCategory maxPatientJoy, ref bool __result) { if (sick.needs.rest != null) { return(true); } __result = sick.IsColonist && !sick.Dead && pawn != sick && sick.InBed() && sick.Awake() && !sick.IsForbidden(pawn) && sick.needs.joy != null && sick.needs.joy.CurCategory <= maxPatientJoy && InteractionUtility.CanReceiveInteraction(sick) && !sick.needs.food.Starving && pawn.CanReserveAndReach(sick, PathEndMode.InteractionCell, Danger.None, 1, -1, null, false); return(false); }
public static bool Replacement(Pawn_InteractionsTracker __instance, ref bool __result, Pawn ___pawn, List <Pawn> ___workingList, int ___lastInteractionTime) { // Added if (!IsInteractable(___pawn)) { __result = false; return(false); } if (InteractedTooRecentlyToInteract(___lastInteractionTime)) // Changed to own { __result = false; return(false); } // BASE if (!InteractionUtility.CanInitiateRandomInteraction(___pawn)) { __result = false; return(false); } var collection = ___pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable); // Added ___workingList.Clear(); ___workingList.AddRange(collection); ___workingList.Shuffle(); List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading; foreach (var p in ___workingList) { if (p != ___pawn && CanInteractNowWith(___pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) && !___pawn.HostileTo(p)) { var p1 = p; if ( allDefsListForReading.TryRandomElementByWeight( x => x.Worker.RandomSelectionWeight(___pawn, p1), out var intDef)) { if (__instance.TryInteractWith(p, intDef)) { __result = true; return(false); } Log.Warning($"{___pawn} failed to interact with {p}."); } } } __result = false; return(false); }
protected override bool Satisfied(Pawn p) { // No animal whorin' for now. if (xxx.is_animal(p)) { return(false); } if (!InteractionUtility.CanInitiateInteraction(p)) { return(false); } return(xxx.is_whore(p)); }
// RimWorld.SickPawnVisitUtility public static bool Vamp_CanVisit(ref bool __result, Pawn pawn, Pawn sick, JoyCategory maxPatientJoy) { if (sick.IsVampire()) { __result = sick.IsColonist && !sick.Dead && pawn != sick && sick.InBed() && sick.Awake() && !sick.IsForbidden(pawn) && sick.needs.joy != null && sick.needs.joy.CurCategory <= maxPatientJoy && InteractionUtility.CanReceiveInteraction(sick) && pawn.CanReserveAndReach(sick, PathEndMode.InteractionCell, Danger.None) && !AboutToRecover(sick); return(false); } return(true); }
public static bool TryInteractRandomly(this Source _this) { var pawn = (Pawn) typeof(Source).GetField("pawn", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_this); if (!IsInteractable(pawn)) { return(false); } var workingList = (List <Pawn>) typeof(Source).GetField("workingList", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null); // Had to add // BASE if (_this.InteractedTooRecentlyToInteract()) { return(false); } if (!InteractionUtility.CanInitiateRandomInteraction(pawn)) { return(false); } var collection = pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable).InRandomOrder(); // Added workingList.Clear(); workingList.AddRange(collection); workingList.Shuffle <Pawn>(); List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading; for (int i = 0; i < workingList.Count; i++) { Pawn p = workingList[i]; if (p != pawn && CanInteractNowWith(pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) && !pawn.HostileTo(p)) { InteractionDef intDef; if (allDefsListForReading.TryRandomElementByWeight((InteractionDef x) => x.Worker.RandomSelectionWeight(pawn, p), out intDef)) { if (_this.TryInteractWith(p, intDef)) { return(true); } Log.Error(pawn + " failed to interact with " + p); } } } return(false); }
public static bool TryInteractRandomly(Pawn_InteractionsTracker __instance, ref bool __result) { if (__instance.InteractedTooRecentlyToInteract()) { __result = false; return(false); } if (!InteractionUtility.CanInitiateRandomInteraction(pawn(__instance))) { __result = false; return(false); } List <Pawn> collection = pawn(__instance).Map.mapPawns.SpawnedPawnsInFaction(pawn(__instance).Faction); //Pawn_InteractionsTracker.workingList.Clear(); List <Pawn> workingList = getWorkingList(); //ADDED workingList.AddRange(collection); //REPLACED workingList with local workingList.Shuffle(); //REPLACED workingList with local List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading; for (int i = 0; i < workingList.Count; i++) //REPLACED workingList with local { Pawn p = workingList[i]; //REPLACED workingList with local InteractionDef intDef; if (p != pawn(__instance) && __instance.CanInteractNowWith(p, null) && InteractionUtility.CanReceiveRandomInteraction(p) && !pawn(__instance).HostileTo(p) && allDefsListForReading.TryRandomElementByWeight(delegate(InteractionDef x) { if (!__instance.CanInteractNowWith(p, x)) { return(0f); } return(x.Worker.RandomSelectionWeight(pawn(__instance), p)); }, out intDef)) { if (__instance.TryInteractWith(p, intDef)) { workingList.Clear(); //REPLACED workingList with local __result = true; return(false); } Log.Error(pawn(__instance) + " failed to interact with " + p, false); } } //Pawn_InteractionsTracker.workingList.Clear(); __result = false; return(false); }
public static bool ShouldImproveRelationship(this Pawn pawn, Pawn guest) { if (!pawn.IsColonist) { return(false); } if (!ViableGuestTarget(guest)) { return(false); } if (!guest.ImproveRelationship()) { return(false); } //if (guest.Faction.ColonyGoodwill >= 100) return false; if (guest.relations.OpinionOf(pawn) >= 100) { return(false); } if (guest.InMentalState) { return(false); } if (!guest.IsInGuestZone(guest)) { return(false); } if (!InteractionUtility.CanInitiateInteraction(pawn)) { return(false); } if (!InteractionUtility.CanReceiveInteraction(guest)) { return(false); } if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger())) { return(false); } if (guest.CurJob?.def.suspendable == false) { return(false); } return(true); }
public static Action GetAttackAction(Pawn pawn, LocalTargetInfo target, out string failStr) { failStr = ""; if (!pawn.IsColonistPlayerControlled) { failStr = "CannotOrderNonControlledLower".Translate(); } else if (target.IsValid && !pawn.CanReach(target, PathEndMode.Touch, Danger.Deadly)) { failStr = "NoPath".Translate(); } else if (pawn.WorkTagIsDisabled(WorkTags.Violent)) { failStr = "IsIncapableOfViolenceLower".Translate(pawn.LabelShort, pawn); } else if (pawn.meleeVerbs.TryGetMeleeVerb(target.Thing) == null) { failStr = "Incapable".Translate(); } else if (pawn == target.Thing) { failStr = "CannotAttackSelf".Translate(); } else { Pawn target2; if ((target2 = (target.Thing as Pawn)) == null || (!pawn.InSameExtraFaction(target2, ExtraFactionType.HomeFaction) && !pawn.InSameExtraFaction(target2, ExtraFactionType.MiniFaction))) { return(delegate { if (InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out Verb verb)) { Job job = JobMaker.MakeJob(jobDef, target.Thing as Pawn); //job.maxNumMeleeAttacks = 1; //job.killIncappedTarget = false; Pawn pawn2 = target.Thing as Pawn; if (pawn2 != null) { job.killIncappedTarget = pawn2.Downed; } //job.verbToUse = verb; pawn.jobs.TryTakeOrderedJob(job); } //Job job = JobMaker.MakeJob(JobDefOf.AttackMelee, target); //pawn.jobs.TryTakeOrderedJob(job); });
public override void MentalStateTick() { // Insult a nearby pawn if (this.pawn.IsHashIntervalTick(180)) { IEnumerable <Pawn> targets = from thing in GenRadial.RadialDistinctThingsAround(this.pawn.Position, this.pawn.Map, 5.0f, false) where (thing as Pawn) != null && InteractionUtility.CanReceiveRandomInteraction(thing as Pawn) select thing as Pawn; Pawn target; if (targets.TryRandomElement(out target)) { // Try to insult the target. Use the enemy insult interaction for enemies, so we don't start social fights with them. this.pawn.interactions.TryInteractWith(target, /*this.pawn.HostileTo(target)*/ true ? GMT_DefOf.GMT_Interaction_InsultEnemy : InteractionDefOf.Insult); } } base.MentalStateTick(); }
public static bool ShouldMakeFriends(this Pawn pawn, Pawn guest) { if (!pawn.IsColonist) { return(false); } if (!ViableGuestTarget(guest, true)) { return(false); } if (!guest.MakeFriends()) { return(false); } if (guest.InMentalState) { return(false); } //if (guest.relations.OpinionOf(pawn) >= 100) return false; //if (guest.RelativeTrust() < 50) return false; if (guest.relations.OpinionOf(pawn) <= -10) { return(false); } if (!InteractionUtility.CanInitiateInteraction(pawn)) { return(false); } if (!InteractionUtility.CanReceiveInteraction(guest)) { return(false); } if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger())) { return(false); } if (guest.CurJob?.def.suspendable == false) { return(false); } return(true); }
public override Job TryGiveJob(Pawn pawn) { if (pawn.RaceProps.Humanlike && pawn.WorkTagIsDisabled(WorkTags.Violent)) { return(null); } Pawn otherPawn = ((MentalState_Ork_Scrapping)pawn.MentalState).otherPawn; Verb verbToUse; if (!InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out verbToUse)) { return(null); } Job job = JobMaker.MakeJob(AdeptusJobDefOf.OGO_Orkoid_Scrap, otherPawn); job.maxNumMeleeAttacks = 1; job.verbToUse = verbToUse; return(job); }
public override bool ShouldSkip(Pawn pawn, bool forced = false) { if (!InteractionUtility.CanInitiateInteraction(pawn)) { return(true); } if (!pawn.GetRestaurant().IsOpenedRightNow) { return(true); } var list = pawn.GetRestaurant().SpawnedDiningPawns; var anyPatrons = list.Any(p => { var driver = p.jobs.curDriver as JobDriver_Dine; return(driver?.wantsToOrder == true); }); return(!anyPatrons); }
protected override bool Satisfied(Pawn p) { // No animal whorin' for now. if (xxx.is_animal(p)) { return(false); } if (!InteractionUtility.CanInitiateInteraction(p)) { return(false); } if (DebugSettings.alwaysDoLovin) { return(true); } return(xxx.is_whore(p) || RJWSettings.WildMode); }
protected override Job TryGiveJob(Pawn pawn) { //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called0"); if (pawn == null || !InteractionUtility.CanInitiateInteraction(pawn)) { return(null); } if (PawnUtility.WillSoonHaveBasicNeed(pawn) || !xxx.is_healthy(pawn) || !xxx.can_be_fucked(pawn)) //As long as pawns is older than minimum sex age, they can be assigned as w****s. { return(null); } if (Find.TickManager.TicksGame >= pawn.mindState.canLovinTick && pawn.CurJob == null) { int price; Pawn pawn2 = FindAttractivePawn(pawn, out price); //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called1 - pawn2 is " + (pawn2 == null ? "NULL" : pawn2.NameStringShort)); if (pawn2 == null) { return(null); } Building_WhoreBed whorebed = xxx.FindWhoreBed(pawn); if ((whorebed == null) || !xxx.CanUse(pawn, whorebed) || (100f * Rand.Value) > percentRate) { //--Log.Message("resetting ticks"); if (xxx.config.whores_always_findjob) { pawn.mindState.canLovinTick = Find.TickManager.TicksGame + 5; } else { pawn.mindState.canLovinTick = Find.TickManager.TicksGame + Rand.Range(75, 150); } return(null); } //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called2 - " + pawn2.NameStringShort + " is pawn2."); whorebed.priceOfWhore = price; return(new Job(xxx.inviting_visitors, pawn2, whorebed)); } return(null); }
public override void Tick() { base.Tick(); if (this.realPawn == null) { this.realPawn = this.pawn as PsychologyPawn; } if (this.otherPawn == null) { this.pawn.health.RemoveHediff(this); return; } if (!this.otherPawn.Spawned || !this.pawn.Spawned || !InteractionUtility.CanReceiveInteraction(this.pawn) || !InteractionUtility.CanReceiveInteraction(this.otherPawn)) { this.pawn.health.RemoveHediff(this); return; } if ((this.pawn.Position - this.otherPawn.Position).LengthHorizontalSquared >= 54f || !GenSight.LineOfSight(this.pawn.Position, this.otherPawn.Position, this.pawn.Map, true)) { this.pawn.health.RemoveHediff(this); return; } if (this.otherPawn.Dead || this.otherPawn.Downed || this.otherPawn.InAggroMentalState) { this.pawn.health.RemoveHediff(this); return; } if (this.pawn.IsHashIntervalTick(200)) { if (Rand.Value > 1f - (this.ageTicks / 400000f)) { this.pawn.health.RemoveHediff(this); return; } else if (Rand.Value < 0.2f && this.pawn.Map != null) { MoteMaker.MakeInteractionBubble(this.pawn, otherPawn, InteractionDefOf.DeepTalk.interactionMote, InteractionDefOf.DeepTalk.Symbol); } } }
public virtual void roll_to_hit(Pawn pawn, Pawn partner) { if (!RJWSettings.rape_beating || !xxx.is_human(pawn)) { return; } //Rand.PopState(); //Rand.PushState(RJW_Multiplayer.PredictableSeed()); float rand_value = Rand.Value; float victim_pain = partner.health.hediffSet.PainTotal; float chance_to_hit = xxx.config.base_chance_to_hit_prisoner / 5; float threshold = xxx.config.minor_pain_threshold; if ((victim_pain < threshold && rand_value < chance_to_hit)) { if (InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out Verb v)) { pawn.meleeVerbs.TryMeleeAttack(partner, v); } } }
public static bool ShouldRecruit(this Pawn pawn, Pawn guest) { if (!ViableGuestTarget(guest, true)) { return(false); } if (!guest.TryRecruit()) { return(false); } if (guest.InMentalState) { return(false); } //if (guest.relations.OpinionOf(pawn) >= 100) return false; //if (guest.RelativeTrust() < 50) return false; if (guest.relations.OpinionOf(pawn) <= -10) { return(false); } //if (guest.interactions.InteractedTooRecentlyToInteract()) return false; //if (pawn.interactions.InteractedTooRecentlyToInteract()) return false; if (!InteractionUtility.CanInitiateInteraction(pawn)) { return(false); } if (!InteractionUtility.CanReceiveInteraction(guest)) { return(false); } if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger())) { return(false); } return(true); }
protected override Job TryGiveJob(Pawn pawn) { if (!InteractionUtility.CanInitiateInteraction(pawn)) { return(null); } Pawn patient = SickPawnVisitUtility.FindRandomSickPawn(pawn, JoyCategory.High); if (patient == null) { return(null); } Thing wheelChair = ToolsForHaulUtility.FindWheelChair(patient, pawn); if (wheelChair == null || !pawn.CanReserve(wheelChair)) { return(null); } return(new Job(DefDatabase <JobDef> .GetNamed("TakeToWheelChair"), patient, wheelChair) { maxNumToCarry = 1 }); }
public async Task CreateDebt(IUser user, decimal amount, string unit, [Remainder] string?note = null) { if (amount < 0) { await RespondAsync("You cannot owe a negative amount!"); return; } var message = $"{Context.User.Mention} owes {TransactionFormatting.FormatCurrency(amount, unit)} to {user.Mention}"; var confirmed = await InteractionUtility.ConfirmAsync(_client, Context.Channel, TimeSpan.FromMinutes(1), message); if (!confirmed) { await RespondAsync("Confirmation timed out. Cancelled transaction!"); return; } await _transactions.CreateTransaction(user.Id, Context.User.Id, amount, unit, note, DateTime.UtcNow); await RespondAsync(message); }
public override void Tick() { base.Tick(); if (this.otherPawn == null) { this.pawn.health.RemoveHediff(this); return; } if (!this.otherPawn.Spawned || !this.pawn.Spawned || !InteractionUtility.CanReceiveInteraction(this.pawn) || !InteractionUtility.CanReceiveInteraction(this.otherPawn)) { this.pawn.health.RemoveHediff(this); return; } if (this.pawn.Map != null && this.otherPawn.Map != null && ((this.pawn.Position - this.otherPawn.Position).LengthHorizontalSquared >= 54f || !GenSight.LineOfSight(this.pawn.Position, this.otherPawn.Position, this.pawn.Map, true))) { this.pawn.health.RemoveHediff(this); return; } if (this.otherPawn.Dead || this.otherPawn.Downed || this.otherPawn.InAggroMentalState) { this.pawn.health.RemoveHediff(this); return; } if (this.pawn.IsHashIntervalTick(200)) { /* When a conversation first starts, the mean time for it to last is 3 hours. * When it reaches half an hour, the mean time for it to continue is 2 hours. * When it reaches an hour, the mean time for it to continue is 1 hour. * When it surpasses 2 hours, it will on average last for half an hour more. * Conversations will thus usually not surpass 2 hours, and very rarely surpass 2 and a half hours, but are very likely to last up to an hour. */ float mtb = 3f; if (this.ageTicks > GenDate.TicksPerHour * 2) { mtb = 0.5f; } else if (this.ageTicks > GenDate.TicksPerHour) { mtb = 1f; } else if (this.ageTicks > (GenDate.TicksPerHour / 2)) { mtb = 2f; } if (pawn.story.traits.HasTrait(TraitDefOfPsychology.Chatty)) { mtb *= 2f; } if (this.otherPawn.story.traits.HasTrait(TraitDefOfPsychology.Chatty)) { mtb *= 2f; } if (Rand.MTBEventOccurs(mtb, GenDate.TicksPerHour, 200)) { this.pawn.health.RemoveHediff(this); return; } else if (Rand.Value < 0.2f && this.pawn.Map != null) { MoteMaker.MakeInteractionBubble(this.pawn, otherPawn, InteractionDefOfPsychology.EndConversation.interactionMote, InteractionDefOfPsychology.EndConversation.Symbol); } } }
public static bool CanChaseAndInsult(Pawn bully, Pawn insulted, bool skipReachabilityCheck = false, bool allowPrisoners = true) { return(insulted.RaceProps.Humanlike && (insulted.Faction == bully.Faction || (allowPrisoners && insulted.HostFaction == bully.Faction)) && insulted != bully && !insulted.Dead && !insulted.Downed && insulted.Spawned && insulted.Awake() && insulted.Position.InHorDistOf(bully.Position, 40f) && InteractionUtility.CanReceiveInteraction(insulted) && !insulted.HostileTo(bully) && Find.TickManager.TicksGame - insulted.mindState.lastHarmTick >= 833 && (skipReachabilityCheck || bully.CanReach(insulted, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn))); }
// Token: 0x06000095 RID: 149 RVA: 0x00005528 File Offset: 0x00003728 protected override Job TryGiveJob(Pawn pawn) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown if (pawn.interactions.InteractedTooRecentlyToInteract() || lastInteractionTick > Find.TickManager.TicksGame - 500) { return(null); } Pawn val = (Pawn)(object)(Pawn)GenClosest.ClosestThingReachable(((Thing)pawn).Position, ((Thing)pawn).Map, ThingRequest.ForGroup((ThingRequestGroup)11), (PathEndMode)1, TraverseParms.For(pawn, (Danger)3, (TraverseMode)0, false), 9999f, (Predicate <Thing>)validator, (IEnumerable <Thing>)null, 0, -1, false, (RegionType)6, false); if (val == null || Rand.Value > 0.5f) { return(null); } lastInteractionTick = Find.TickManager.TicksGame; return((Job)(object)new Job(JobDefOfEvaineQMentalWorker.StormMark, (LocalTargetInfo)val)); bool validator(Thing t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown Pawn val2 = (Pawn)(object)(Pawn)t; if (val2 != pawn && !val2.Dead && !val2.Downed && RestUtility.Awake(val2) && InteractionUtility.CanReceiveInteraction(val2)) { return(val2.RaceProps.Humanlike); } return(false); } }
protected override Job TryGiveJob(Pawn pawn) { if (pawn.interactions.InteractedTooRecentlyToInteract() || lastInteractionTick > Find.TickManager.TicksGame - 500) { return(null); } Predicate <Thing> validator = delegate(Thing t) { Pawn pawn3 = (Pawn)t; return(pawn3 != pawn && !pawn3.Dead && !pawn3.Downed && pawn3.Awake() && InteractionUtility.CanReceiveInteraction(pawn3) && pawn3.RaceProps.Humanlike); }; Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator); if (pawn2 == null || Rand.Value > 0.5f) { return(null); } lastInteractionTick = Find.TickManager.TicksGame; return(new Job(JobDefOfPsychology.Abuse, pawn2)); }