public static bool TryRecoverFromUnwalkablePosition(bool error, Pawn pawn) { bool flag = false; for (int i = 0; i < GenRadial.RadialPattern.Length; i++) { IntVec3 intVec = pawn.Position + GenRadial.RadialPattern[i]; if (PatchStartPath.PawnCanOccupy(intVec, pawn)) { if (intVec == pawn.Position) { return(true); } pawn.Position = intVec; pawn.Notify_Teleported(true, false); flag = true; break; } } if (!flag) { pawn.Destroy(DestroyMode.Vanish); } return(flag); }
public static bool Prefix(Pawn_PathFollower __instance) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (pawn.RaceProps.Animal) { TerrainDef terrain = pawn.Position.GetTerrain(pawn.Map); if (terrain.HasTag("TKKN_Swim") || terrain.HasTag("TKKN_Lava")) { if (!PatchStartPath.PawnCanOccupy(pawn.Position, pawn) && !PatchStartPath.TryRecoverFromUnwalkablePosition(true, pawn)) { return(false); } } } return(true); }