aboutsummaryrefslogtreecommitdiff
path: root/src/game/Object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/Object.cpp')
-rw-r--r--src/game/Object.cpp146
1 files changed, 28 insertions, 118 deletions
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 45ffbc36c4e..7d365b35710 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -1079,9 +1079,16 @@ bool Object::PrintIndexError(uint32 index, bool set) const
return false;
}
+bool Position::IsInLine(const Unit * const target, float distance, float width) const
+{
+ if(!HasInArc(M_PI, target) || !target->IsWithinDist3d(m_positionX, m_positionY, m_positionZ, distance)) return false;
+ width += target->GetObjectSize();
+ float angle = GetRelativeAngle(target);
+ return abs(sin(angle)) * GetExactDist2d(target->GetPositionX(), target->GetPositionY()) < width;
+}
+
WorldObject::WorldObject()
- : m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL),
- m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f), m_currMap(NULL)
+ : WorldLocation(), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL), m_currMap(NULL)
, m_zoneScript(NULL)
, m_isActive(false), m_isWorldObject(false)
, m_name("")
@@ -1159,74 +1166,6 @@ InstanceData* WorldObject::GetInstanceData()
Map *map = GetMap();
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
}
- //slow
-float WorldObject::GetDistance(const WorldObject* obj) const
-{
- float dx = GetPositionX() - obj->GetPositionX();
- float dy = GetPositionY() - obj->GetPositionY();
- float dz = GetPositionZ() - obj->GetPositionZ();
- float sizefactor = GetObjectSize() + obj->GetObjectSize();
- float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor;
- return ( dist > 0 ? dist : 0);
-}
-
-float WorldObject::GetDistance2d(float x, float y) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- float sizefactor = GetObjectSize();
- float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor;
- return ( dist > 0 ? dist : 0);
-}
-
-float WorldObject::GetExactDistance2d(const float x, const float y) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- return sqrt((dx*dx) + (dy*dy));
-}
-
-float WorldObject::GetDistance(float x, float y, float z) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- float dz = GetPositionZ() - z;
- float sizefactor = GetObjectSize();
- float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor;
- return ( dist > 0 ? dist : 0);
-}
-
-float WorldObject::GetExactDistSq(float x, float y, float z) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- float dz = GetPositionZ() - z;
- return dx*dx + dy*dy + dz*dz;
-}
-
-float WorldObject::GetDistance2dSq(float x, float y) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- return dx*dx + dy*dy;
-}
-
-float WorldObject::GetExactDistSq(const WorldObject *obj) const
-{
- float dx = GetPositionX() - obj->GetPositionX();
- float dy = GetPositionY() - obj->GetPositionY();
- float dz = GetPositionZ() - obj->GetPositionZ();
- return dx*dx + dy*dy + dz*dz;
-}
-
-float WorldObject::GetDistance2d(const WorldObject* obj) const
-{
- float dx = GetPositionX() - obj->GetPositionX();
- float dy = GetPositionY() - obj->GetPositionY();
- float sizefactor = GetObjectSize() + obj->GetObjectSize();
- float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor;
- return ( dist > 0 ? dist : 0);
-}
float WorldObject::GetDistanceZ(const WorldObject* obj) const
{
@@ -1236,29 +1175,6 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const
return ( dist > 0 ? dist : 0);
}
-bool WorldObject::IsWithinDist3d(float x, float y, float z, float dist2compare) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- float dz = GetPositionZ() - z;
- float distsq = dx*dx + dy*dy + dz*dz;
-
- float maxdist = dist2compare + GetObjectSize();
-
- return distsq < maxdist * maxdist;
-}
-
-bool WorldObject::IsWithinDist2d(float x, float y, float dist2compare) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
- float distsq = dx*dx + dy*dy;
-
- float maxdist = dist2compare + GetObjectSize();
-
- return distsq < maxdist * maxdist;
-}
-
bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const
{
float dx = GetPositionX() - obj->GetPositionX();
@@ -1380,14 +1296,14 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m
return distsq < maxdist * maxdist;
}
-float WorldObject::GetAngle(const WorldObject* obj) const
+float Position::GetAngle(const Position *obj) const
{
if(!obj) return 0;
return GetAngle( obj->GetPositionX(), obj->GetPositionY() );
}
// Return angle in range 0..2*pi
-float WorldObject::GetAngle( const float x, const float y ) const
+float Position::GetAngle( const float x, const float y ) const
{
float dx = x - GetPositionX();
float dy = y - GetPositionY();
@@ -1397,7 +1313,7 @@ float WorldObject::GetAngle( const float x, const float y ) const
return ang;
}
-void WorldObject::GetSinCos(const float x, const float y, float &vsin, float &vcos)
+void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) const
{
float dx = GetPositionX() - x;
float dy = GetPositionY() - y;
@@ -1416,14 +1332,12 @@ void WorldObject::GetSinCos(const float x, const float y, float &vsin, float &vc
}
}
-bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
+bool Position::HasInArc(float arc, const Position *obj) const
{
// always have self in arc
if(obj == this)
return true;
- float arc = arcangle;
-
// move arc to range 0.. 2*pi
while( arc >= 2.0f * M_PI )
arc -= 2.0f * M_PI;
@@ -1465,7 +1379,7 @@ bool WorldObject::IsInBetween(const WorldObject *obj1, const WorldObject *obj2,
size = GetObjectSize() / 2;
float angle = obj1->GetAngle(this) - obj1->GetAngle(obj2);
- return abs(sin(angle)) * GetExactDistance2d(obj1->GetPositionX(), obj1->GetPositionY()) < size;
+ return abs(sin(angle)) * GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY()) < size;
}
void WorldObject::GetRandomPoint( float x, float y, float z, float distance, float &rand_x, float &rand_y, float &rand_z) const
@@ -1498,7 +1412,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const
z = new_z+ 0.05f; // just to be sure that we are not a few pixel under the surface
}
-bool WorldObject::IsPositionValid() const
+bool Position::IsPositionValid() const
{
return Trinity::IsValidMapCoord(m_positionX,m_positionY,m_positionZ,m_orientation);
}
@@ -1754,7 +1668,7 @@ void WorldObject::AddObjectToRemoveList()
map->AddObjectToRemoveList(this);
}
-TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float angle, uint32 vehId, SummonPropertiesEntry const *properties, uint32 duration, Unit *summoner)
+TempSummon *Map::SummonCreature(uint32 entry, const Position &pos, SummonPropertiesEntry const *properties, uint32 duration, Unit *summoner, uint32 vehId)
{
uint32 mask = UNIT_MASK_SUMMON;
if(properties)
@@ -1805,13 +1719,13 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a
default: return NULL;
}
- if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, vehId, team, x, y, z, angle))
+ if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, vehId, team, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()))
{
delete summon;
return NULL;
}
- summon->SetHomePosition(x, y, z, angle);
+ summon->SetHomePosition(pos);
summon->InitStats(duration);
Add((Creature*)summon);
@@ -1833,22 +1747,18 @@ void WorldObject::SetZoneScript()
}
}
-TempSummon* WorldObject::SummonCreature(uint32 entry, float x, float y, float z, float ang, uint32 vehId, TempSummonType spwtype, uint32 duration)
+TempSummon* WorldObject::SummonCreature(uint32 entry, const Position &pos, TempSummonType spwtype, uint32 duration, uint32 vehId) const
{
- Map *map = FindMap();
- if(!map)
- return NULL;
-
- if (x == 0.0f && y == 0.0f && z == 0.0f)
- GetClosePoint(x, y, z, GetObjectSize());
-
- TempSummon *pCreature = map->SummonCreature(entry, x, y, z, ang, vehId, NULL, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : NULL);
- if(!pCreature)
- return NULL;
-
- pCreature->SetTempSummonType(spwtype);
+ if(Map *map = FindMap())
+ {
+ if(TempSummon *summon = map->SummonCreature(entry, pos, NULL, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : NULL))
+ {
+ summon->SetTempSummonType(spwtype);
+ return summon;
+ }
+ }
- return pCreature;
+ return NULL;
}
Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration)