diff --git a/zone/command.cpp b/zone/command.cpp index bd1626f85..31cc9aa19 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -1799,15 +1799,7 @@ void command_itemtest(Client *c, const Seperator *sep) void command_gassign(Client *c, const Seperator *sep) { if (sep->IsNumber(1) && c->GetTarget() && c->GetTarget()->IsNPC()) - { - auto npcBind = c->GetTarget()->CastToNPC()->m_SpawnPoint; - database.AssignGrid( - c, - npcBind.m_X, - npcBind.m_Y, - atoi(sep->arg[1]) - ); - } + database.AssignGrid(c, c->GetTarget()->CastToNPC()->m_SpawnPoint, atoi(sep->arg[1])); else c->Message(0,"Usage: #gassign [num] - must have an npc target!"); } diff --git a/zone/position.cpp b/zone/position.cpp index 6f9a31d29..ddbe429af 100644 --- a/zone/position.cpp +++ b/zone/position.cpp @@ -9,11 +9,16 @@ xy_location::xy_location(float x, float y) : m_Y(y) { } -const xy_location xy_location::operator -(const xy_location& rhs) { +xy_location xy_location::operator -(const xy_location& rhs) const { xy_location minus(m_X - rhs.m_X, m_Y - rhs.m_Y); return minus; } +xy_location xy_location::operator +(const xy_location& rhs) const { + xy_location addition(m_X + rhs.m_X, m_Y + rhs.m_Y); + return addition; +} + xyz_heading::xyz_heading(float x, float y, float z, float heading) : m_X(x), m_Y(y), @@ -91,11 +96,11 @@ xyz_location::operator xy_location() const { return xy_location(m_X, m_Y); } -const xyz_location xyz_location::operator -(const xyz_location& rhs) const { +xyz_location xyz_location::operator -(const xyz_location& rhs) const { return xyz_location(m_X - rhs.m_X, m_Y - rhs.m_Y, m_Z - rhs.m_Z); } -const xyz_location xyz_location::operator +(const xyz_location& rhs) const { +xyz_location xyz_location::operator +(const xyz_location& rhs) const { return xyz_location(m_X + rhs.m_X, m_Y + rhs.m_Y, m_Z + rhs.m_Z); } @@ -117,6 +122,50 @@ std::string to_string(const xy_location &position){ return StringFormat("(%.3f, %.3f)", position.m_X,position.m_Y); } +/** +* Produces the non square root'ed distance between the two points within the XY plane. +*/ +float ComparativeDistance(const xy_location& point1, const xy_location& point2) { + auto diff = point1 - point2; + return diff.m_X * diff.m_X + diff.m_Y * diff.m_Y; +} + +/** +* Produces the distance between the two points on the XY plane. +*/ +float Distance(const xy_location& point1, const xy_location& point2) { + return sqrt(ComparativeDistance(point1, point2)); +} + +/** +* Produces the non square root'ed distance between the two points. +*/ +float ComparativeDistance(const xyz_location& point1, const xyz_location& point2) { + auto diff = point1 - point2; + return diff.m_X * diff.m_X + diff.m_Y * diff.m_Y + diff.m_Z * diff.m_Z; +} + +/** +* Produces the distance between the two points. +*/ +float Distance(const xyz_location& point1, const xyz_location& point2) { + return sqrt(ComparativeDistance(point1, point2)); +} + +/** +* Produces the distance between the two points within the XY plane. +*/ +float DistanceNoZ(const xyz_location& point1, const xyz_location& point2) { + return Distance(static_cast(point1),static_cast(point2)); +} + +/** +* Produces the non square root'ed distance between the two points within the XY plane. +*/ +float ComparativeDistanceNoZ(const xyz_location& point1, const xyz_location& point2) { + return ComparativeDistance(static_cast(point1),static_cast(point2)); +} + /** * Determines if 'position' is within (inclusive) the axis aligned * box (3 dimensional) formed from the points minimum and maximum. diff --git a/zone/position.h b/zone/position.h index 77c09603e..fd66ede5f 100644 --- a/zone/position.h +++ b/zone/position.h @@ -27,7 +27,8 @@ public: xy_location(float x = 0.0f, float y = 0.0f); - const xy_location operator -(const xy_location& rhs); + xy_location operator -(const xy_location& rhs) const; + xy_location operator +(const xy_location& rhs) const; }; class xyz_location { @@ -43,8 +44,8 @@ public: operator xy_location() const; - const xyz_location operator -(const xyz_location& rhs) const; - const xyz_location operator +(const xyz_location& rhs) const; + xyz_location operator -(const xyz_location& rhs) const; + xyz_location operator +(const xyz_location& rhs) const; void ABS_XYZ(); bool isOrigin() const { return m_X == 0 && m_Y == 0 && m_Z == 0;} @@ -86,4 +87,11 @@ std::string to_string(const xy_location &position); bool IsWithinAxisAlignedBox(const xyz_location &position, const xyz_location &minimum, const xyz_location &maximum); bool IsWithinAxisAlignedBox(const xy_location &position, const xy_location &minimum, const xy_location &maximum); +float ComparativeDistance(const xy_location& point1, const xy_location& point2); +float Distance(const xy_location& point1, const xy_location& point2); +float ComparativeDistance(const xyz_location& point1, const xyz_location& point2); +float Distance(const xyz_location& point1, const xyz_location& point2); +float DistanceNoZ(const xyz_location& point1, const xyz_location& point2); +float ComparativeDistanceNoZ(const xyz_location& point1, const xyz_location& point2); + #endif diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index bd012daca..12a81254e 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -1046,15 +1046,14 @@ bool ZoneDatabase::GetWaypoints(uint32 grid, uint16 zoneid, uint32 num, wplist* return true; } -void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) +void ZoneDatabase::AssignGrid(Client *client, const xy_location& location, uint32 grid) { int matches = 0, fuzzy = 0, spawn2id = 0; - float dbx = 0, dby = 0; // looks like most of the stuff in spawn2 is straight integers // so let's try that first std::string query = StringFormat("SELECT id, x, y FROM spawn2 WHERE zone = '%s' AND x = %i AND y = %i", - zone->GetShortName(), (int)x, (int)y); + zone->GetShortName(), (int)location.m_X, (int)location.m_Y); auto results = QueryDatabase(query); if(!results.Success()) { LogFile->write(EQEMuLog::Error, "Error querying spawn2 '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); @@ -1068,7 +1067,7 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) query = StringFormat("SELECT id,x,y FROM spawn2 WHERE zone='%s' AND " "ABS( ABS(x) - ABS(%f) ) < %f AND " "ABS( ABS(y) - ABS(%f) ) < %f", - zone->GetShortName(), x, _GASSIGN_TOLERANCE, y, _GASSIGN_TOLERANCE); + zone->GetShortName(), location.m_X, _GASSIGN_TOLERANCE, location.m_Y, _GASSIGN_TOLERANCE); results = QueryDatabase(query); if (!results.Success()) { LogFile->write(EQEMuLog::Error, "Error querying fuzzy spawn2 '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); @@ -1094,8 +1093,7 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) auto row = results.begin(); spawn2id = atoi(row[0]); - dbx = atof(row[1]); - dby = atof(row[2]); + xy_location dbLocation = xy_location(atof(row[1]), atof(row[2])); query = StringFormat("UPDATE spawn2 SET pathgrid = %d WHERE id = %d", grid, spawn2id); results = QueryDatabase(query); @@ -1120,7 +1118,7 @@ void ZoneDatabase::AssignGrid(Client *client, float x, float y, uint32 grid) return; } - float difference = sqrtf(pow(fabs(x - dbx) , 2) + pow(fabs(y - dby), 2)); + float difference = sqrtf(pow(fabs(location.m_X - dbLocation.m_X) , 2) + pow(fabs(location.m_Y - dbLocation.m_Y), 2)); client->Message(0, "Grid assign: spawn2 id = %d updated - fuzzy match: deviation %f", spawn2id, difference); } diff --git a/zone/zonedb.h b/zone/zonedb.h index f196e5127..9e0d50e3f 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -370,7 +370,7 @@ public: uint8 GetGridType(uint32 grid, uint32 zoneid); uint8 GetGridType2(uint32 grid, uint16 zoneid); bool GetWaypoints(uint32 grid, uint16 zoneid, uint32 num, wplist* wp); - void AssignGrid(Client *client, float x, float y, uint32 id); + void AssignGrid(Client *client, const xy_location& location, uint32 id); int GetHighestGrid(uint32 zoneid); int GetHighestWaypoint(uint32 zoneid, uint32 gridid);