// Token: 0x06000420 RID: 1056 RVA: 0x0002CD30 File Offset: 0x0002B130 protected override IntVec3 GetWanderRoot(Pawn pawn) { if (pawn.isXenomorph()) { HiveLike hivelike = pawn.mindState.duty != null && pawn.mindState.duty.focus != null ? pawn.mindState.duty.focus.Thing as HiveLike : null; if (hivelike != null) { return(hivelike.Position); } /* * if (hivelike==null) * { * hivelike = FindClosestHiveLike(pawn); * } */ if (hivelike == null || !hivelike.Spawned) { if (XenomorphUtil.HivelikesPresent(pawn.Map)) { return(XenomorphUtil.ClosestReachableHivelike(pawn).Position); } if (!XenomorphKidnapUtility.hiveslimepresent) { if (XenomorphKidnapUtility.TryFindGoodHiveLoc(pawn, out IntVec3 c)) { return(c); } } else if (!XenomorphUtil.ClosestReachableHiveSlime(pawn).DestroyedOrNull()) { return(XenomorphUtil.ClosestReachableHiveSlime(pawn).Position); } return(pawn.Position); } // Log.Message(string.Format("JobGiver_WanderHiveLike hivelike.Position: {0}", hivelike.Position)); return(hivelike.Position); } else if (pawn.isNeomorph()) { Corpse corpse = (Corpse)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Corpse), PathEndMode.Touch, TraverseParms.For(pawn, Danger.Deadly), 20f); if (corpse != null) { return(corpse.Position); } return(pawn.Position); } else { return(pawn.Position); } }
// Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54 protected override Job TryGiveJob(Pawn pawn) { Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { return(null); } IntVec3 hiveCell; if (!XenomorphUtil.ClosestReachableParentHivelike(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableParentHivelike(pawn).Position; } else if (!XenomorphUtil.ClosestReachableHiveSlime(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableHiveSlime(pawn).Position; } else { hiveCell = pawn.mindState.duty.focus.Cell; } for (int i = 0; i < 40; i++) { IntVec3 randomCell = region.RandomCell; for (int j = 0; j < 8; j++) { IntVec3 c = randomCell + GenAdj.AdjacentCellsAround[j]; if (c.InBounds(pawn.Map)) { Thing thing = c.GetFirstHaulable(pawn.Map); // Log.Message(string.Format("thing: {0}", thing)); if (thing != null && (thing.def.passability == Traversability.Impassable || thing.def.IsDoor) && thing.def.size == IntVec2.One && thing.def != ThingDefOf.CollapsedRocks && pawn.CanReserve(thing, 1, -1, null, false) && XenomorphUtil.DistanceBetween(thing.Position, pawn.mindState.duty.focus.Cell) >= minClearingRange && XenomorphUtil.DistanceBetween(thing.Position, pawn.mindState.duty.focus.Cell) <= maxClearingRange) { return(XenomorphUtil.HaulAsideJobFor(pawn, thing, hiveCell, maxClearingRange)); } } } } return(null); }
// Token: 0x06000860 RID: 2144 RVA: 0x00047694 File Offset: 0x00045A94 public override void UpdateAllDuties() { QueenPresent = XenomorphUtil.QueenPresent(Map, out Pawn Queen); if (QueenPresent) { if (this.Data.HiveQueen.DestroyedOrNull()) { this.Data.HiveQueen = Queen; } } eggsPresent = XenomorphUtil.EggsPresent(Map); base.FilterOutUnspawnedHiveLikes(); for (int i = 0; i < this.lord.ownedPawns.Count; i++) { Pawn pawn = this.lord.ownedPawns[i]; PawnDuty duty; if (XenomorphUtil.HivelikesPresent(Map)) { HiveLike hiveFor = base.GetHiveLikeFor(this.lord.ownedPawns[i]); if (hiveFor.parentHiveLike != null) { duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, hiveFor.parentHiveLike, this.distToHiveToAttack); this.Data.HiveLoc = hiveFor.parentHiveLike.Position; } else if (hiveFor != null) { duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, hiveFor, this.distToHiveToAttack); this.Data.HiveLoc = hiveFor.Position; } else { // Log.Message(string.Format("hives present but not found, we dun f****d up boss")); duty = null; } } else { if (XenomorphUtil.HiveSlimePresent(Map)) { duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, XenomorphUtil.ClosestReachableHiveSlime(pawn), this.distToHiveToAttack); this.Data.HiveLoc = XenomorphUtil.ClosestReachableHiveSlime(pawn).Position; } else if (XenomorphKidnapUtility.TryFindGoodHiveLoc(pawn, out IntVec3 c)) { duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, c, this.distToHiveToAttack); this.Data.HiveLoc = c; } else { duty = null; } /* * ThingDef named = pawn.RaceProps.Humanlike ? XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon : XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon; * cocoonsPresent = XenomorphUtil.CocoonsPresent(pawn.Map, named); * eggsReachable = !XenomorphUtil.ClosestReachableEgg(pawn).DestroyedOrNull(); * closestReachableEgg = XenomorphUtil.ClosestReachableEgg(pawn); * * hivelikesReachable = !XenomorphUtil.ClosestReachableHivelike(pawn).DestroyedOrNull(); * closestReachableHivelike = XenomorphUtil.ClosestReachableHivelike(pawn); * * cocoonsReachable = !XenomorphUtil.ClosestReachableCocoon(pawn, named).DestroyedOrNull(); * closestReachableCocoon = XenomorphUtil.ClosestReachableCocoon(pawn, named); * * if (XenomorphUtil.EggsPresent(Map)) * { * // Log.Message(string.Format("eggsPresent: {0}", closestReachableEgg.Position)); * duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, closestReachableEgg, this.distToHiveToAttack); * } * else if (cocoonsPresent) * { * // Log.Message(string.Format("cocoonsPresent: {0}", closestReachableCocoon.Position)); * duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, closestReachableCocoon, this.distToHiveToAttack); * } * else if (myFocus.Cell != IntVec3.Zero) * { * // Log.Message(string.Format("myFocus {0}", myFocus.Cell)); * duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, myFocus, this.distToHiveToAttack); * } * else if (InfestationLikeCellFinder.TryFindCell(out IntVec3 c, Map, false)) * { * // Log.Message(string.Format("InfestationLikeCellFinder: {0}", c)); * duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, c, this.distToHiveToAttack); * } * else * { * // Log.Message(string.Format("pawn: {0}", pawn.Position)); * duty = new PawnDuty(OGHiveLikeDefOf.RRY_DefendAndExpandHiveLike, pawn, this.distToHiveToAttack); * } */ } this.lord.ownedPawns[i].mindState.duty = duty; if (duty != null) { if (duty.focus != null && duty.focus != IntVec3.Invalid && duty.focus != IntVec3.Zero) { myFocus = duty.focus; } } } }
// Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54 protected override Job TryGiveJob(Pawn pawn) { Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { return(null); } IntVec3 hiveCell; if (!XenomorphUtil.ClosestReachableParentHivelike(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableParentHivelike(pawn).Position; } else if (!XenomorphUtil.ClosestReachableHiveSlime(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableHiveSlime(pawn).Position; } else { hiveCell = pawn.mindState.duty.focus.Cell; } foreach (var c in GenAdj.AdjacentCellsAndInside) { if (Find.Selector.SelectedObjects.Contains(pawn) && Prefs.DevMode) { Log.Message(string.Format("{0} TryGiveJob {1} @ {2}", this, pawn.LabelShortCap, (hiveCell + c))); } if ((hiveCell + c).GetFirstHaulable(pawn.Map) is Thing h && !(h is Pawn) && !(h is Building_XenoEgg) && !(h is Building_XenomorphCocoon)) { if (Find.Selector.SelectedObjects.Contains(pawn) && Prefs.DevMode) { Log.Message(string.Format("{0} TryGiveJob {1} @ {2} 1", this, pawn.LabelShortCap, (hiveCell + c))); } if (pawn.CanReserve(h, 1, -1, null, false)) { if (Find.Selector.SelectedObjects.Contains(pawn) && Prefs.DevMode) { Log.Message(string.Format("{0} TryGiveJob {1} @ {2} 2", this, pawn.LabelShortCap, (hiveCell + c))); } if (!XenomorphUtil.CanHaulAside(pawn, h, hiveCell, ClearingRange, out IntVec3 c2)) { if (Find.Selector.SelectedObjects.Contains(pawn) && Prefs.DevMode) { Log.Message(string.Format("{0} TryGiveJob {1} @ {2} 3", this, pawn.LabelShortCap, (hiveCell + c))); } return(null); } if (Find.Selector.SelectedObjects.Contains(pawn) && Prefs.DevMode) { Log.Message(string.Format("{0} TryGiveJob {1} @ {2} 4", this, pawn.LabelShortCap, (hiveCell + c))); } return(new Job(JobDefOf.HaulToCell, h, c2) { count = 99999, haulOpportunisticDuplicates = false, haulMode = HaulMode.ToCellNonStorage, ignoreDesignations = true }); } } } return(null); }
// Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54 protected override Job TryGiveJob(Pawn pawn) { if (pawn.Map == null) { return(null); } Map map = pawn.Map; if (!pawn.isXenomorph(out Comp_Xenomorph _Xenomorph)) { return(null); } Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { return(null); } IntVec3 hiveCell; if (!XenomorphUtil.ClosestReachableParentHivelike(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableParentHivelike(pawn).Position; } else if (!XenomorphUtil.ClosestReachableHiveSlime(pawn).DestroyedOrNull()) { hiveCell = XenomorphUtil.ClosestReachableHiveSlime(pawn).Position; } else { hiveCell = _Xenomorph.HiveLoc == IntVec3.Invalid || _Xenomorph.HiveLoc == IntVec3.Zero || !_Xenomorph.HiveLoc.InBounds(map) ? pawn.mindState.duty.focus.Cell : _Xenomorph.HiveLoc; } if (hiveCell == IntVec3.Invalid || hiveCell == IntVec3.Zero || !hiveCell.InBounds(map)) { return(null); } foreach (var c in GenAdj.AdjacentCellsAndInside) { if ((hiveCell + c).GetFirstHaulable(pawn.Map) is Thing h && !(h is Pawn) && !(h is Building_XenoEgg) && !(h is Building_XenomorphCocoon)) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0} TryGiveJob {1} @ {2} 1", this, pawn.LabelShortCap, (hiveCell + c))); } if (pawn.CanReserve(h, 1, -1, null, false)) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0} TryGiveJob {1} @ {2} 2", this, pawn.LabelShortCap, (hiveCell + c))); } if (!XenomorphUtil.CanHaulAside(pawn, h, hiveCell, ClearingRange, out IntVec3 c2)) { if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0} TryGiveJob {1} @ {2} 3", this, pawn.LabelShortCap, (hiveCell + c))); } return(null); } if (pawn.jobs.debugLog) { pawn.jobs.DebugLogEvent(string.Format("{0} TryGiveJob {1} @ {2} 4", this, pawn.LabelShortCap, (hiveCell + c))); } return(new Job(JobDefOf.HaulToCell, h, c2) { count = 99999, haulOpportunisticDuplicates = false, haulMode = HaulMode.ToCellNonStorage, ignoreDesignations = true }); } } } return(null); }