mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 10:31:29 +00:00
Added distance functions for position
This commit is contained in:
parent
2b7ecfdb2c
commit
ad506ece4d
@ -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!");
|
||||
}
|
||||
|
||||
@ -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<xy_location>(point1),static_cast<xy_location>(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<xy_location>(point1),static_cast<xy_location>(point2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if 'position' is within (inclusive) the axis aligned
|
||||
* box (3 dimensional) formed from the points minimum and maximum.
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user