public static bool isXenomorph(this Pawn p, out Comp_Xenomorph comp) { comp = p.TryGetComp <Comp_Xenomorph>() ?? null; return(p.RaceProps.FleshType == XenomorphRacesDefOf.RRY_Xenomorph); }
// Token: 0x060005B7 RID: 1463 RVA: 0x00037A28 File Offset: 0x00035E28 protected override Job TryGiveJob(Pawn pawn) { if (pawn.GetLord() != null && pawn.GetLord() is Lord lord) { if (lord.LordJob is LordJob_DefendAndExpandHiveLike hivejob) { if (lord.CurLordToil is LordToil_DefendAndExpandHiveLike hivetoil) { if (hivetoil.Data.assignedHiveLikes.TryGetValue(pawn) != null) { hive = hivetoil.Data.assignedHiveLikes.TryGetValue(pawn); } } } if (lord.CurLordToil is LordToil_DefendHiveLikeAggressively hivetoilA) { if (hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn) != null) { hive = hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn); } } } bool aggressive; Comp_Xenomorph _Xenomorph = pawn.TryGetComp <Comp_Xenomorph>(); if (pawn.TryGetAttackVerb(null, false) == null) { return(null); } Pawn pawn2 = null; if (_Xenomorph != null && hive.hiveDormant) { pawn2 = _Xenomorph.BestPawnToHuntForPredator(pawn, false, true); } if (pawn2 == null) { pawn2 = this.FindPawnTarget(pawn); } if (pawn2 == null) { return(null); } if (!pawn2.isPotentialHost()) { return(null); } if (pawn2 != null && pawn.CanReach(pawn2, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn)) { return(this.MeleeAttackJob(pawn, pawn2)); } if (pawn2 != null) { using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassDoors, true), PathEndMode.OnCell)) { if (!pawnPath.Found) { return(null); } if (!pawnPath.TryFindLastCellBeforeBlockingDoor(pawn, out IntVec3 loc)) { // Log.Error(pawn + " did TryFindLastCellBeforeDoor but found none when it should have been one. Target: " + pawn2.LabelCap, false); return(null); } IntVec3 randomCell = CellFinder.RandomRegionNear(loc.GetRegion(pawn.Map, RegionType.Set_Passable), 9, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true), null, null, RegionType.Set_Passable).RandomCell; if (randomCell == pawn.Position) { return(new Job(JobDefOf.Wait, 30, false)); } return(new Job(JobDefOf.Goto, randomCell)); } } return(null); }
// Token: 0x060005B7 RID: 1463 RVA: 0x00037A28 File Offset: 0x00035E28 protected override Job TryGiveJob(Pawn pawn) { Job job = null; bool healthy = (pawn.health.summaryHealth.SummaryHealthPercent > 0.75f && pawn.health.hediffSet.BleedRateTotal < 0.15f); if (!healthy) { return(job); } if (pawn.GetLord() != null && pawn.GetLord() is Lord lord) { if (lord.LordJob is LordJob_DefendAndExpandHiveLike hivejob) { if (lord.CurLordToil is LordToil_DefendAndExpandHiveLike hivetoil) { if (hivetoil.Data.assignedHiveLikes.TryGetValue(pawn) != null) { hive = hivetoil.Data.assignedHiveLikes.TryGetValue(pawn); } } } else if (lord.CurLordToil is LordToil_DefendHiveLikeAggressively hivetoilA) { if (hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn) != null) { hive = hivetoilA.Data.assignedHiveLikes.TryGetValue(pawn); } } } // bool aggressive; Comp_Xenomorph _Xenomorph = pawn.TryGetComp <Comp_Xenomorph>(); if (pawn.TryGetAttackVerb(null, false) == null) { return(job); } Pawn pawn2 = null; if (hive != null) { if (_Xenomorph != null) { if (!hive.hiveDormant) { pawn2 = _Xenomorph.BestPawnToHuntForPredator(pawn, false, true); requireLOS = false; HuntingRange = 40; } else { HuntingRange = 20; } } else { } } if (pawn2 == null) { pawn2 = this.FindPawnTarget(pawn); } if (pawn2 != null) { if (pawn2.isPotentialHost()) { if (pawn.CanReach(pawn2, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn)) { job = this.MeleeAttackJob(pawn, pawn2); } else { using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2.Position, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassDoors, true), PathEndMode.OnCell)) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("pawnPath.TotalCost: {0}", pawnPath.TotalCost)); } if (!pawnPath.Found) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("pawnPath.Found NOT Found")); } job = null; } else if (!pawnPath.TryFindLastCellBeforeBlockingDoor(pawn, out IntVec3 loc)) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("pawnPath.TryFindLastCellBeforeBlockingDoor NOT Found")); } // Log.Error(pawn + " did TryFindLastCellBeforeDoor but found none when it should have been one. Target: " + pawn2.LabelCap, false); job = null; } /* * else * { * if (pawn.jobs.debugLog) pawn.jobs.DebugLogEvent(string.Format("pawnPath.TryFindLastCellBeforeBlockingDoor NOT Found")); * IntVec3 randomCell = CellFinder.RandomRegionNear(loc.GetRegion(pawn.Map, RegionType.Set_Passable), 9, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true), null, null, RegionType.Set_Passable).RandomCell; * if (randomCell == pawn.Position) * { * job = new Job(JobDefOf.Wait, 30, false); * } * else * { * job = new Job(JobDefOf.Goto, randomCell); * } * } */ } } } if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0}: {1} Job Found: {2}: {3}", this, pawn, job != null, job)); } } else { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0}: {1} No target Found: {2}: {3}", this, pawn, job != null, job)); } } return(job); }