//public class JobGiver_SeekAllowedArea : ThinkNode_JobGiver public static bool SeekAllowedArea_TryGiveJob(JobGiver_SeekAllowedArea __instance, Pawn pawn, ref Job __result) { if (!pawn.AnimalOrWildMan()) { return(true); } if (pawn.playerSettings == null) { return(true); } //StringBuilder res = new StringBuilder(); //Log.Message($"{pawn.Label} sought an allowed area."); if (!pawn.Position.IsForbidden(pawn)) { //Log.Message("Not Forbidden cur position"); __result = null; return(false); } if (Traverse.Create(__instance).Method("HasJobWithSpawnedAllowedTarget", pawn).GetValue <bool>()) { //Log.Message("Has job with spawned allowed target"); __result = null; return(false); } Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { //Log.Message("No passable region"); __result = null; return(false); } var allows = false; TraverseParms traverseParms = TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false); RegionEntryPredicate entryCondition = (Region from, Region r) => { allows = r.Allows(traverseParms, false); if (allows) { //Log.Message("Move allowed."); return(true); } //Log.Message("Entry barred"); if (r.door == null) { //Log.Message("Door Null"); //Log.Message("Return True"); } ByteGrid avoidGrid = traverseParms.pawn.GetAvoidGrid(true); if (avoidGrid != null && avoidGrid[r.door.Position] == 255) { //Log.Message("Door Position == 255"); //Log.Message("Return False"); } if (traverseParms.pawn.HostileTo(r.door)) { //Log.Message("Door Position == 255"); //Log.Message("CanPhysicallyPass: "******"CanBash: " + traverseParms.canBash.ToString()); } //Log.Message("door.CanPhysicallyPass(tp.pawn) == " + r.door.CanPhysicallyPass(traverseParms.pawn)); //Log.Message("!r.door.IsForbiddenToPass(traverseParms.pawn); == " + !r.door.IsForbiddenToPass(traverseParms.pawn)); //Log.Message("Return " + (r.door.CanPhysicallyPass(traverseParms.pawn) && !r.door.IsForbiddenToPass(traverseParms.pawn))); //return this.door.CanPhysicallyPass(tp.pawn) && !this.door.IsForbiddenToPass(tp.pawn); return(false); }; Region reg = null; RegionProcessor regionProcessor = delegate(Region r) { if (r.IsDoorway && r?.ListerThings?.AllThings?.Any(x => x is Building_DoorRegionHandler) == false) { Log.Message("Doorway disallowed"); return(false); } if (!r.IsForbiddenEntirely(pawn)) { Log.Message("Allowed passage"); reg = r; return(true); } return(false); }; RegionTraverser.BreadthFirstTraverse(region, entryCondition, regionProcessor, 9999, RegionType.Set_Passable); if (reg == null) { Log.Message(pawn.LabelShort + " No region found"); __result = null; return(false); } IntVec3 c; if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, null, out c)) { Log.Message(pawn.LabelShort + " Failed to find random cell in region unforbidden"); __result = null; return(false); } __result = new Job(JobDefOf.Goto, c); return(false); }
//public class JobGiver_SeekAllowedArea : ThinkNode_JobGiver public static bool SeekAllowedArea_TryGiveJob(JobGiver_SeekAllowedArea __instance, Pawn pawn, ref Job __result) { if (!pawn.AnimalOrWildMan()) { return(true); } if (pawn.playerSettings == null) { return(true); } if (!pawn.Position.IsForbidden(pawn)) { __result = null; return(false); } if (Traverse.Create(__instance).Method("HasJobWithSpawnedAllowedTarget", pawn).GetValue <bool>()) { __result = null; return(false); } Region region = pawn.GetRegion(RegionType.Set_Passable); if (region == null) { __result = null; return(false); } var allows = false; TraverseParms traverseParms = TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false); RegionEntryPredicate entryCondition = (Region from, Region r) => { allows = r.Allows(traverseParms, false); if (allows) { return(true); } return(false); }; Region reg = null; RegionProcessor regionProcessor = delegate(Region r) { if (r.IsDoorway && r?.ListerThings?.AllThings?.Any(x => x is Building_DoorRegionHandler) == false) { //Log.Message("Doorway disallowed"); return(false); } if (!r.IsForbiddenEntirely(pawn)) { reg = r; return(true); } return(false); }; RegionTraverser.BreadthFirstTraverse(region, entryCondition, regionProcessor, 9999, RegionType.Set_Passable); if (reg == null) { //Log.Message(pawn.LabelShort + " No region found"); __result = null; return(false); } IntVec3 c; if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, null, out c)) { //Log.Message(pawn.LabelShort + " Failed to find random cell in region unforbidden"); __result = null; return(false); } __result = new Job(JobDefOf.Goto, c); return(false); }