// Token: 0x06000035 RID: 53 RVA: 0x000031C0 File Offset: 0x000013C0 protected override void UpdateEnemyTarget(Pawn pawn) { MentalState_Fighter state = (MentalState_Fighter)pawn.MentalState; Pawn pawnTarget = state.otherPawn; pawn.mindState.enemyTarget = pawnTarget; Find.TickManager.slower.SignalForceNormalSpeed(); }
// Token: 0x06000056 RID: 86 RVA: 0x00003870 File Offset: 0x00001A70 private void startFightingState(Fighter f) { f.p.mindState.enemyTarget = this.getOtherFighter(f).p; f.p.jobs.StopAll(false); f.p.mindState.mentalStateHandler.Reset(); MentalStateHandler mentalStateHandler = f.p.mindState.mentalStateHandler; MentalStateDef ArenaFighting = MentalStateDefOfArena.Fighter; Pawn pawn = f.p; MentalStateDef stateDef = ArenaFighting; Pawn otherPawn = this.getOtherFighter(f).p; mentalStateHandler.TryStartMentalState(stateDef, "", false, false, null, true); MentalState_Fighter mentalState = f.p.MentalState as MentalState_Fighter; mentalState.otherPawn = this.getOtherFighter(f).p; mentalState.bellRef = this; }
// Token: 0x06000031 RID: 49 RVA: 0x00002C44 File Offset: 0x00000E44 protected override Job TryGiveJob(Pawn pawn) { MentalState_Fighter state = (MentalState_Fighter)pawn.MentalState; Pawn pawnTarget = state.otherPawn; Building_Bell bellRef = state.bellRef; Job result; Fighter fighterTarget = bellRef.getFighter(pawnTarget); if (!fighterTarget.isInFight || (double)Rand.Value < 0.5) { result = new Job(JobDefOf.Wait_Combat) { expiryInterval = 10 }; } else { if (pawn.TryGetAttackVerb(null, false) == null) { result = null; } else { ThingWithComps primary = pawn.equipment != null ? pawn.equipment.Primary : null; if (bellRef.currentState == Building_Bell.State.fight && pawn.equipment != null && primary == null) { List <Thing> suitableWeapons = new List <Thing>(); foreach (IntVec3 c in bellRef.GetComp <CompBell>().ValidCells) { List <Thing> thingList = c.GetThingList(bellRef.Map); for (int i = 0; i < thingList.Count; i++) { Thing t = thingList[i]; bool flag8 = t.def.IsWeapon && !suitableWeapons.Contains(t) && t.Spawned && pawn.CanReserve(t, 1, -1, null, false); if (flag8) { suitableWeapons.Add(t); } } } Thing weapon = null; int maxDistance = 9999; foreach (Thing t2 in suitableWeapons) { if ((t2.Position - pawn.Position).LengthManhattan < maxDistance) { weapon = t2; maxDistance = (t2.Position - pawn.Position).LengthManhattan; } } if (weapon != null) { return(new Job(JobDefOf.Equip, weapon)); } } if (pawnTarget == null || !pawn.CanReach(pawnTarget, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn)) { result = new Job(JobDefOf.Wait); } else { pawn.mindState.enemyTarget = pawnTarget; pawn.mindState.enemyTarget = pawnTarget; this.UpdateEnemyTarget(pawn); Thing enemyTarget = pawn.mindState.enemyTarget; if (enemyTarget == null) { result = null; } else { bool allowManualCastWeapons = !pawn.IsColonist; Verb verb = pawn.TryGetAttackVerb(enemyTarget, allowManualCastWeapons); if (verb == null) { result = null; } else { bool isMeleeAttack = verb.verbProps.IsMeleeAttack; if (isMeleeAttack || pawnTarget.Downed) { result = this.MeleeAttackJob(enemyTarget); result.killIncappedTarget = bellRef.toDeath; } else { if (( CoverUtility.CalculateOverallBlockChance(pawn, enemyTarget.Position, pawn.Map) > 0.01f && pawn.Position.Standable(pawn.Map) && verb.CanHitTarget(enemyTarget) ) || ( (pawn.Position - enemyTarget.Position).LengthHorizontalSquared < 25 && verb.CanHitTarget(enemyTarget) )) { result = new Job(JobDefOf.AttackStatic, pawnTarget) { maxNumMeleeAttacks = 1, expiryInterval = Rand.Range(420, 900), canBash = true }; } else { IntVec3 intVec; if (!this.TryFindShootingPosition(pawn, out intVec)) { result = null; } else { if (intVec == pawn.Position) { result = new Job(JobDefOf.AttackStatic, pawnTarget) { maxNumMeleeAttacks = 1, expiryInterval = Rand.Range(420, 900), canBash = true }; } else { result = new Job(JobDefOf.Goto, intVec) { expiryInterval = JobGiver_AIFightEnemy.ExpiryInterval_ShooterSucceeded.RandomInRange, checkOverrideOnExpire = true }; } } } } } } } } } return(result); }