public Spot TryAddSpot(Spot wasAt, Location isAt) { Spot isAtSpot = FindClosestSpot(isAt, WantedStepLength); if (isAtSpot == null) { isAtSpot = GetSpot(isAt); if (isAtSpot == null) { Spot s = new Spot(isAt); s = AddSpot(s); isAtSpot = s; } if (isAtSpot.GetFlag(Spot.FLAG_BLOCKED)) { isAtSpot.SetFlag(Spot.FLAG_BLOCKED, false); Log("Cleared blocked flag"); } if (wasAt != null) { wasAt.AddPathTo(isAtSpot); isAtSpot.AddPathTo(wasAt); } List <Spot> sl = FindAllSpots(isAtSpot.location, MaxStepLength); int connected = 0; foreach (Spot other in sl) { if (other != isAtSpot) { other.AddPathTo(isAtSpot); isAtSpot.AddPathTo(other); connected++; // Log(" connect to " + other.location); } } Log("Learned a new spot at " + isAtSpot.location + " connected to " + connected + " other spots"); wasAt = isAtSpot; } else { if (wasAt != null && wasAt != isAtSpot) { // moved to an old spot, make sure they are connected wasAt.AddPathTo(isAtSpot); isAtSpot.AddPathTo(wasAt); } wasAt = isAtSpot; } return(wasAt); }
// Connect according to MPQ data public Spot AddAndConnectSpot(Spot s) { s = AddSpot(s); List <Spot> close = FindAllSpots(s.location, MaxStepLength); if (!s.GetFlag(Spot.FLAG_MPQ_MAPPED)) { foreach (Spot cs in close) { if (cs.HasPathTo(this, s) && s.HasPathTo(this, cs) || cs.IsBlocked()) { } else if (!triangleWorld.IsStepBlocked(s.X, s.Y, s.Z, cs.X, cs.Y, cs.Z, toonHeight, toonSize, null)) { float mid_x = (s.X + cs.X) / 2; float mid_y = (s.Y + cs.Y) / 2; float mid_z = (s.Z + cs.Z) / 2; float stand_z; int flags; if (triangleWorld.FindStandableAt(mid_x, mid_y, mid_z - WantedStepLength * .75f, mid_z + WantedStepLength * .75f, out stand_z, out flags, toonHeight, toonSize)) { s.AddPathTo(cs); cs.AddPathTo(s); } } } } return(s); }
// Connect according to MPQ data public Spot AddAndConnectSpot(Spot s) { s = AddSpot(s); List<Spot> close = FindAllSpots(s.location, MaxStepLength); if (!s.GetFlag(Spot.FLAG_MPQ_MAPPED)) { foreach (Spot cs in close) { if (cs.HasPathTo(this, s) && s.HasPathTo(this, cs) || cs.IsBlocked()) { } else if (!triangleWorld.IsStepBlocked(s.X, s.Y, s.Z, cs.X, cs.Y, cs.Z, toonHeight, toonSize, null)) { float mid_x = (s.X + cs.X) / 2; float mid_y = (s.Y + cs.Y) / 2; float mid_z = (s.Z + cs.Z) / 2; float stand_z; int flags; if (triangleWorld.FindStandableAt(mid_x, mid_y, mid_z - WantedStepLength * .75f, mid_z + WantedStepLength * .75f, out stand_z, out flags, toonHeight, toonSize)) { s.AddPathTo(cs); cs.AddPathTo(s); } } } } return s; }
// Per spot: // uint32 magic // uint32 reserved; // uint32 flags; // float x; // float y; // float z; // uint32 no_paths // for each path // float x; // float y; // float z; public bool Load(string baseDir) { string fileName = FileName(); string filenamebin = baseDir + fileName; System.IO.Stream stream = null; System.IO.BinaryReader file = null; int n_spots = 0; int n_steps = 0; try { stream = System.IO.File.OpenRead(filenamebin); if (stream != null) { file = new System.IO.BinaryReader(stream); if (file != null) { uint magic = file.ReadUInt32(); if (magic == FILE_MAGIC) { uint type; while ((type = file.ReadUInt32()) != FILE_ENDMAGIC) { n_spots++; uint reserved = file.ReadUInt32(); uint flags = file.ReadUInt32(); float x = file.ReadSingle(); float y = file.ReadSingle(); float z = file.ReadSingle(); uint n_paths = file.ReadUInt32(); if (x != 0 && y != 0) { Spot s = new Spot(x, y, z); s.flags = flags; for (uint i = 0; i < n_paths; i++) { n_steps++; float sx = file.ReadSingle(); float sy = file.ReadSingle(); float sz = file.ReadSingle(); s.AddPathTo(sx, sy, sz); } AddSpot(s); } } } } } } catch (System.IO.FileNotFoundException e) { Console.WriteLine(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } if (file != null) { file.Close(); } if (stream != null) { stream.Close(); } Log("Loaded " + fileName + " " + n_spots + " spots " + n_steps + " steps"); modified = false; return false; }
public Spot TryAddSpot(Spot wasAt, Location isAt) { Spot isAtSpot = FindClosestSpot(isAt, WantedStepLength); if (isAtSpot == null) { isAtSpot = GetSpot(isAt); if (isAtSpot == null) { Spot s = new Spot(isAt); s = AddSpot(s); isAtSpot = s; } if (isAtSpot.GetFlag(Spot.FLAG_BLOCKED)) { isAtSpot.SetFlag(Spot.FLAG_BLOCKED, false); Log("Cleared blocked flag"); } if (wasAt != null) { wasAt.AddPathTo(isAtSpot); isAtSpot.AddPathTo(wasAt); } List<Spot> sl = FindAllSpots(isAtSpot.location, MaxStepLength); int connected = 0; foreach (Spot other in sl) { if (other != isAtSpot) { other.AddPathTo(isAtSpot); isAtSpot.AddPathTo(other); connected++; // Log(" connect to " + other.location); } } Log("Learned a new spot at " + isAtSpot.location + " connected to " + connected + " other spots"); wasAt = isAtSpot; } else { if (wasAt != null && wasAt != isAtSpot) { // moved to an old spot, make sure they are connected wasAt.AddPathTo(isAtSpot); isAtSpot.AddPathTo(wasAt); } wasAt = isAtSpot; } return wasAt; }
// Per spot: // uint32 magic // uint32 reserved; // uint32 flags; // float x; // float y; // float z; // uint32 no_paths // for each path // float x; // float y; // float z; public bool Load(string baseDir) { string fileName = FileName(); string filenamebin = baseDir + fileName; System.IO.Stream stream = null; System.IO.BinaryReader file = null; int n_spots = 0; int n_steps = 0; try { stream = System.IO.File.OpenRead(filenamebin); if (stream != null) { file = new System.IO.BinaryReader(stream); if (file != null) { uint magic = file.ReadUInt32(); if (magic == FILE_MAGIC) { uint type; while ((type = file.ReadUInt32()) != FILE_ENDMAGIC) { n_spots++; uint reserved = file.ReadUInt32(); uint flags = file.ReadUInt32(); float x = file.ReadSingle(); float y = file.ReadSingle(); float z = file.ReadSingle(); uint n_paths = file.ReadUInt32(); Spot s = new Spot(x, y, z); s.flags = flags; for (uint i = 0; i < n_paths; i++) { n_steps++; float sx = file.ReadSingle(); float sy = file.ReadSingle(); float sz = file.ReadSingle(); s.AddPathTo(sx, sy, sz); } AddSpot(s); } } } } } catch (System.IO.FileNotFoundException e) { PPather.WriteLine(e.Message); } catch (System.IO.DirectoryNotFoundException e) { PPather.WriteLine(e.Message); } if (file != null) { file.Close(); } if (stream != null) { stream.Close(); } Log("Loaded " + fileName + " " + n_spots + " spots " + n_steps + " steps"); modified = false; return(false); }