コード例 #1
0
        //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);
        }
コード例 #2
0
        //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);
        }