public override void MentalStateTick() { if (this.Target != null && !InsultingSpreeMentalStateUtility.CanChaseAndInsult(this.pawn, this.Target)) { this.ChooseNextTarget(); } if (this.pawn.IsHashIntervalTick(CheckChooseNewTargetIntervalTicks) && (this.Target == null || this.InsultedTargetAtLeastOnce)) { this.ChooseNextTarget(); } base.MentalStateTick(); }
public override bool StateCanOccur([NotNull] Pawn pawn) { if (!base.StateCanOccur(pawn)) { return(false); } if (!Controller.settings.UseHeadRotator) { return(false); } InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(pawn, Candidates); bool result = Candidates != null && Candidates.Count >= 2; Candidates?.Clear(); return(result); }
// Verse.AI.MentalState_InsultingSpreeAll private void ChooseNextTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(this.pawn, Candidates); if (!Candidates.Any()) { this.Target = null; this.InsultedTargetAtLeastOnce = false; this._targetFoundTicks = -1; } else { bool finished = Find.TickManager.TicksGame - this._targetFoundTicks <= MaxSameTargetChaseTicks; Pawn p = this.Target == null || finished || !Candidates.Any(x => x != this.Target) ? Candidates.RandomElementByWeight(x => this.GetCandidateWeight(x)) : (from x in Candidates where x != this.Target select x) .RandomElementByWeight(x => this.GetCandidateWeight(x)); if (p != this.Target) { this.Target = p; this.InsultedTargetAtLeastOnce = false; this._targetFoundTicks = Find.TickManager.TicksGame; } } }