public static bool TryFindDirectFleeDestination(IntVec3 root, float dist, Pawn pawn, out IntVec3 result) { for (int i = 0; i < 30; i++) { result = root + IntVec3.FromVector3(Vector3Utility.HorizontalVectorFromAngle((float)Rand.RangeSeeded(0, 360, Find.TickManager.TicksAbs + pawn.thingIDNumber)) * dist); if (result.Walkable(pawn.Map) && result.DistanceToSquared(pawn.Position) < result.DistanceToSquared(root) && GenSight.LineOfSight(root, result, pawn.Map, true, null, 0, 0)) { return(true); } } Region region = pawn.GetRegion(RegionType.Set_Passable); for (int j = 0; j < 30; j++) { Region region2 = CellFinder.RandomRegionNear(region, 15, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), null, null, RegionType.Set_Passable); IntVec3 randomCell = region2.RandomCell; if (randomCell.Walkable(pawn.Map) && (float)(root - randomCell).LengthHorizontalSquared > dist * dist) { using (PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, randomCell, pawn, PathEndMode.OnCell)) { if (PawnPathUtility.TryFindCellAtIndex(pawnPath, (int)dist + 3, out result)) { return(true); } } } } result = pawn.Position; return(false); }
public static bool TryFindDirectFleeDestination(IntVec3 root, float dist, Pawn pawn, out IntVec3 result) { for (int i = 0; i < 30; i++) { result = root + IntVec3.FromVector3(Vector3Utility.HorizontalVectorFromAngle(Rand.Range(0, 360)) * dist); if (result.Walkable(pawn.Map) && result.DistanceToSquared(pawn.Position) < result.DistanceToSquared(root) && GenSight.LineOfSight(root, result, pawn.Map, skipFirstCell: true)) { return(true); } } Region region = pawn.GetRegion(); for (int j = 0; j < 30; j++) { IntVec3 randomCell = CellFinder.RandomRegionNear(region, 15, TraverseParms.For(pawn)).RandomCell; if (randomCell.Walkable(pawn.Map) && (float)(root - randomCell).LengthHorizontalSquared > dist * dist) { using (PawnPath path = pawn.Map.pathFinder.FindPath(pawn.Position, randomCell, pawn)) { if (PawnPathUtility.TryFindCellAtIndex(path, (int)dist + 3, out result)) { return(true); } } } } result = pawn.Position; return(false); }
protected override Job TryGiveJob(Pawn pawn) { IntVec3 position = pawn.Position; bool flag = !pawn.Map.fogGrid.IsFogged(position); bool flag2 = flag; Job result; if (flag2) { TraverseParms traverseParams = TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, true); JobDef named = DefDatabase <JobDef> .GetNamed("MO_Kill", true); bool flag3 = pawn.jobs.curJob == null || (pawn.jobs.curJob.def != named && pawn.jobs.curJob.checkOverrideOnExpire); bool flag4 = flag3; if (flag4) { Pawn pawn2 = JobGiver_Kill.FindMeatyPrey(pawn, traverseParams); bool flag5 = pawn2 != null; bool flag6 = flag5; if (flag6) { PawnPath pawnPath = pawn.Map.pathFinder.FindPath(pawn.Position, pawn2, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), PathEndMode.OnCell); IntVec3 intVec = new IntVec3(); Building_Door building_Door = PawnPathUtility.FirstBlockingBuilding(pawnPath, out intVec, pawn) as Building_Door; pawnPath.ReleaseToPool(); bool flag7 = building_Door != null; bool flag8 = flag7; if (flag8) { bool flag9 = !building_Door.Open; bool flag10 = flag9; if (flag10) { return(new Job(DefDatabase <JobDef> .GetNamed("MO_CrushDoor", true), intVec, building_Door) { maxNumMeleeAttacks = 4, expiryInterval = 500 }); } } // error return(new Job(named) { targetA = pawn2, maxNumMeleeAttacks = 4, killIncappedTarget = true, expiryInterval = 500 }); } } result = null; } else { result = null; } return(result); }