public bool Allows(TraverseParms tp, bool isDestination) { if (tp.mode == TraverseMode.PassAllDestroyableThings || tp.mode == TraverseMode.PassAllDestroyableThingsNotWater || type.Passable()) { if ((int)tp.maxDanger < 3 && tp.pawn != null) { Danger danger = DangerFor(tp.pawn); if (isDestination || danger == Danger.Deadly) { Region region = tp.pawn.GetRegion(RegionType.Set_All); if ((region == null || (int)danger > (int)region.DangerFor(tp.pawn)) && (int)danger > (int)tp.maxDanger) { return(false); } } } switch (tp.mode) { case TraverseMode.ByPawn: if (door != null) { ByteGrid avoidGrid = tp.pawn.GetAvoidGrid(); if (avoidGrid != null && avoidGrid[door.Position] == 255) { return(false); } if (tp.pawn.HostileTo(door)) { return(door.CanPhysicallyPass(tp.pawn) || tp.canBash); } return(door.CanPhysicallyPass(tp.pawn) && !door.IsForbiddenToPass(tp.pawn)); } return(true); case TraverseMode.NoPassClosedDoors: return(door == null || door.FreePassage); case TraverseMode.PassDoors: return(true); case TraverseMode.PassAllDestroyableThings: return(true); case TraverseMode.NoPassClosedDoorsOrWater: return(door == null || door.FreePassage); case TraverseMode.PassAllDestroyableThingsNotWater: return(true); default: throw new NotImplementedException(); } } return(false); }