// Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54 protected override Job TryGiveJob(Pawn pawn) { if (pawn.Map == null) { // Log.Message("map == null"); return(null); } Map map = pawn.Map; if (!pawn.isXenomorph(out Comp_Xenomorph _Xenomorph)) { // Log.Message("not xenomorph"); return(null); } IntVec3 HiveCenter = IntVec3.Invalid; if (_Xenomorph.HiveLoc.IsValid && _Xenomorph.HiveLoc.InBounds(map) && _Xenomorph.HiveLoc != IntVec3.Zero) { HiveCenter = _Xenomorph.HiveLoc; } else { // Log.Message(string.Format("not _Xenomorph.HiveLoc({0})", _Xenomorph.HiveLoc)); return(null); } Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { return(null); } bool flag1 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive) != null; bool flag2 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Child) != null; bool flag3 = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Slime) != null; if (pawn.GetLord() is Lord L && L != null) { if ((L.CurLordToil is LordToil_DefendAndExpandHiveLike || L.CurLordToil is LordToil_DefendHiveLikeAggressively) && L.CurLordToil is LordToil_HiveLikeRelated THL) { if (THL != null) { if (THL.Data != null) { HiveLike hive = THL.Data.assignedHiveLikes.TryGetValue(pawn); if (hive != null) { flag1 = hive.def == XenomorphDefOf.RRY_Xenomorph_Hive; flag2 = hive.def == XenomorphDefOf.RRY_Xenomorph_Hive_Child; } } } } } if (flag1) { MiningRange = 7; } else if (flag2) { MiningRange = 3; } else { MiningRange = 5; } if (!pawn.CanReachMapEdge()) { MiningRange = 10; } for (int i = 0; i < GenRadial.NumCellsInRadius(MiningRange); i++) { IntVec3 c = HiveCenter + GenRadial.RadialPattern[i]; if (!HiveStructure.HiveStruct(HiveCenter).Contains(c) && !HiveStructure.HiveWalls(HiveCenter).Contains(c) && pawn.CanReach(c, PathEndMode.ClosestTouch, Danger.Deadly)) { Building edifice = c.GetEdifice(pawn.Map); if (edifice != null && edifice.def.size == IntVec2.One && edifice.def != ThingDefOf.CollapsedRocks && edifice.def != XenomorphDefOf.RRY_Xenomorph_Hive_Wall && pawn.CanReserveAndReach(edifice, PathEndMode.ClosestTouch, Danger.Deadly, 1, 1) && XenomorphUtil.DistanceBetween(edifice.Position, HiveCenter) <= MiningRange) { bool xenobuilding = edifice.GetType() != typeof(Building_XenoEgg) && edifice.GetType() != typeof(Building_XenomorphCocoon) && edifice.GetType() != typeof(HiveLike); if (xenobuilding) { return(new Job(JobDefOf.Mine, edifice) { ignoreDesignations = true }); } } } } return(null); }
// Token: 0x0600041E RID: 1054 RVA: 0x0002CA54 File Offset: 0x0002AE54 protected override Job TryGiveJob(Pawn pawn) { if (!pawn.isXenomorph(out Comp_Xenomorph _Xenomorph)) { return(null); } if (pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Queen && pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Drone && pawn.def != XenomorphRacesDefOf.RRY_Xenomorph_Predalien) { return(null); } Map map = pawn.Map; IntVec3 pos = pawn.Position; IntVec3 HiveCenter = _Xenomorph.HiveLoc; Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { return(null); } if (HiveCenter == pawn.InteractionCell) { return(null); } bool centerNode = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive) != null; bool centerChild = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Child) != null; bool centerSlime = HiveCenter.GetFirstThing(pawn.Map, XenomorphDefOf.RRY_Xenomorph_Hive_Slime) != null; bool centerFilled = HiveCenter.Filled(pawn.Map); if (centerNode) { MiningRange = 6; } else { MiningRange = 3; if (!centerChild) { if (pawn.def == XenomorphRacesDefOf.RRY_Xenomorph_Queen || pawn.def == XenomorphRacesDefOf.RRY_Xenomorph_Drone) { if (!centerNode) { IntVec3 c = HiveCenter; if (c.InBounds(pawn.Map) && c.Roofed(pawn.Map) && pawn.CanReserveAndReach(c, PathEndMode.OnCell, Danger.Deadly)) { return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Node, c) { ignoreDesignations = false }); } } return(null); } } } if (!centerChild) { foreach (var structure in HiveStructure.HiveStruct(HiveCenter).Where(x => x.GetThingList(map).Any(z => !z.def.defName.Contains("RRY_Xenomorph_Hive")) && x.DistanceTo(HiveCenter) <= MiningRange && pawn.CanReserveAndReach(x, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Floor) && x.GetFirstBuilding(map) == null)) { return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Wall, structure) { ignoreDesignations = false }); } foreach (var structure in HiveStructure.HiveWallGen(HiveCenter, MiningRange).Where(x => x.GetThingList(map).Any(z => !z.def.defName.Contains("RRY_Xenomorph_Hive")) && x.DistanceTo(HiveCenter) <= MiningRange + 2 && pawn.CanReserveAndReach(x, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Floor) && x.GetFirstBuilding(map) == null)) { return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Wall, structure) { ignoreDesignations = false }); } Predicate <IntVec3> validator2 = delegate(IntVec3 y) { bool roofed = (y.Roofed(pawn.Map)); bool result = !roofed && XenomorphUtil.DistanceBetween(y, HiveCenter) <= MiningRange && pawn.CanReserveAndReach(y, PathEndMode.OnCell, Danger.Deadly, layer: ReservationLayerDefOf.Ceiling); return(result); }; if (RCellFinder.TryFindRandomCellNearWith(HiveCenter, validator2, pawn.Map, out IntVec3 c2, MiningRange, MiningRange)) { if (c2.InBounds(pawn.Map) && pawn.CanReserveAndReach(c2, PathEndMode.OnCell, Danger.Deadly)) { return(new Job(XenomorphDefOf.RRY_Job_Xenomorph_Construct_Hive_Roof, c2) { ignoreDesignations = false }); } } } return(null); }