aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-05-02 00:05:01 +0200
committerShauren <shauren.trinity@gmail.com>2015-05-02 00:05:01 +0200
commit48ee1f003347910a48183f768501c1080fc40269 (patch)
tree697366fef52fafc824dff259816f4185930b607b /src
parente4abbc09266d5878d0a03b04f3d72ea68549997f (diff)
Core/Misc: Moved Position to its own file
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp147
-rw-r--r--src/server/game/Entities/Object/Object.h136
-rw-r--r--src/server/game/Entities/Object/Position.cpp182
-rw-r--r--src/server/game/Entities/Object/Position.h225
-rw-r--r--src/server/game/Spells/Spell.cpp6
5 files changed, 411 insertions, 285 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 68650bdff59..c2f7718438e 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1408,62 +1408,6 @@ bool Object::PrintIndexError(uint32 index, bool set) const
return false;
}
-bool Position::operator==(Position const &a)
-{
- return (G3D::fuzzyEq(a.m_positionX, m_positionX) &&
- G3D::fuzzyEq(a.m_positionY, m_positionY) &&
- G3D::fuzzyEq(a.m_positionZ, m_positionZ) &&
- G3D::fuzzyEq(a._orientation, _orientation));
-}
-
-bool Position::HasInLine(WorldObject const* target, float width) const
-{
- if (!HasInArc(float(M_PI), target))
- return false;
- width += target->GetObjectSize();
- float angle = GetRelativeAngle(target);
- return std::fabs(std::sin(angle)) * GetExactDist2d(target->GetPositionX(), target->GetPositionY()) < width;
-}
-
-std::string Position::ToString() const
-{
- std::stringstream sstr;
- sstr << "X: " << m_positionX << " Y: " << m_positionY << " Z: " << m_positionZ << " O: " << _orientation;
- return sstr.str();
-}
-
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer)
-{
- float x, y, z, o;
- buf >> x >> y >> z >> o;
- streamer.Pos->Relocate(x, y, z, o);
- return buf;
-}
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer)
-{
- buf << streamer.Pos->GetPositionX();
- buf << streamer.Pos->GetPositionY();
- buf << streamer.Pos->GetPositionZ();
- return buf;
-}
-
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer)
-{
- float x, y, z;
- buf >> x >> y >> z;
- streamer.Pos->Relocate(x, y, z);
- return buf;
-}
-
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer)
-{
- buf << streamer.Pos->GetPositionX();
- buf << streamer.Pos->GetPositionY();
- buf << streamer.Pos->GetPositionZ();
- buf << streamer.Pos->GetOrientation();
- return buf;
-}
-
void MovementInfo::OutDebug()
{
TC_LOG_DEBUG("misc", "MOVEMENT INFO");
@@ -1823,92 +1767,6 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m
return distsq < maxdist * maxdist;
}
-void Position::RelocateOffset(const Position & offset)
-{
- m_positionX = GetPositionX() + (offset.GetPositionX() * std::cos(GetOrientation()) + offset.GetPositionY() * std::sin(GetOrientation() + float(M_PI)));
- m_positionY = GetPositionY() + (offset.GetPositionY() * std::cos(GetOrientation()) + offset.GetPositionX() * std::sin(GetOrientation()));
- m_positionZ = GetPositionZ() + offset.GetPositionZ();
- SetOrientation(GetOrientation() + offset.GetOrientation());
-}
-
-void Position::GetPositionOffsetTo(const Position & endPos, Position & retOffset) const
-{
- float dx = endPos.GetPositionX() - GetPositionX();
- float dy = endPos.GetPositionY() - GetPositionY();
-
- retOffset.m_positionX = dx * std::cos(GetOrientation()) + dy * std::sin(GetOrientation());
- retOffset.m_positionY = dy * std::cos(GetOrientation()) - dx * std::sin(GetOrientation());
- retOffset.m_positionZ = endPos.GetPositionZ() - GetPositionZ();
- retOffset.SetOrientation(endPos.GetOrientation() - GetOrientation());
-}
-
-Position Position::GetPositionWithOffset(Position const& offset) const
-{
- Position ret(*this);
- ret.RelocateOffset(offset);
- return ret;
-}
-
-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 Position::GetAngle(const float x, const float y) const
-{
- float dx = x - GetPositionX();
- float dy = y - GetPositionY();
-
- float ang = std::atan2(dy, dx);
- ang = (ang >= 0) ? ang : 2 * float(M_PI) + ang;
- return ang;
-}
-
-void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) const
-{
- float dx = GetPositionX() - x;
- float dy = GetPositionY() - y;
-
- if (std::fabs(dx) < 0.001f && std::fabs(dy) < 0.001f)
- {
- float angle = (float)rand_norm()*static_cast<float>(2*M_PI);
- vcos = std::cos(angle);
- vsin = std::sin(angle);
- }
- else
- {
- float dist = std::sqrt((dx*dx) + (dy*dy));
- vcos = dx / dist;
- vsin = dy / dist;
- }
-}
-
-bool Position::HasInArc(float arc, const Position* obj, float border) const
-{
- // always have self in arc
- if (obj == this)
- return true;
-
- // move arc to range 0.. 2*pi
- arc = NormalizeOrientation(arc);
-
- float angle = GetAngle(obj);
- angle -= _orientation;
-
- // move angle to range -pi ... +pi
- angle = NormalizeOrientation(angle);
- if (angle > float(M_PI))
- angle -= 2.0f * float(M_PI);
-
- float lborder = -1 * (arc/border); // in range -pi..0
- float rborder = (arc/border); // in range 0..pi
- return ((angle >= lborder) && (angle <= rborder));
-}
-
bool WorldObject::IsInBetween(const WorldObject* obj1, const WorldObject* obj2, float size) const
{
if (!obj1 || !obj2)
@@ -2042,11 +1900,6 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
}
}
-bool Position::IsPositionValid() const
-{
- return Trinity::IsValidMapCoord(m_positionX, m_positionY, m_positionZ, _orientation);
-}
-
float WorldObject::GetGridActivationRange() const
{
if (ToPlayer())
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 04d5f306076..b4b66bd5121 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -20,6 +20,7 @@
#define _OBJECT_H
#include "Common.h"
+#include "Position.h"
#include "UpdateMask.h"
#include "GridReference.h"
#include "ObjectDefines.h"
@@ -263,141 +264,6 @@ class Object
Object& operator=(Object const& right) = delete;
};
-struct Position
-{
- Position(float x = 0, float y = 0, float z = 0, float o = 0)
- : m_positionX(x), m_positionY(y), m_positionZ(z), _orientation(NormalizeOrientation(o)) { }
-
- Position(Position const& loc) { Relocate(loc); }
-
- struct PositionXYZStreamer
- {
- explicit PositionXYZStreamer(Position& pos) : Pos(&pos) { }
- Position* Pos;
- };
-
- struct PositionXYZOStreamer
- {
- explicit PositionXYZOStreamer(Position& pos) : Pos(&pos) { }
- Position* Pos;
- };
-
- float m_positionX;
- float m_positionY;
- float m_positionZ;
-// Better to limit access to _orientation field, to guarantee the value is normalized
-private:
- float _orientation;
-
-public:
- bool operator==(Position const &a);
-
- inline bool operator!=(Position const &a)
- {
- return !(operator==(a));
- }
-
- void Relocate(float x, float y)
- { m_positionX = x; m_positionY = y;}
- void Relocate(float x, float y, float z)
- { m_positionX = x; m_positionY = y; m_positionZ = z; }
- void Relocate(float x, float y, float z, float orientation)
- { m_positionX = x; m_positionY = y; m_positionZ = z; SetOrientation(orientation); }
- void Relocate(Position const &pos)
- { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; SetOrientation(pos._orientation); }
- void Relocate(Position const* pos)
- { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; SetOrientation(pos->_orientation); }
- void RelocateOffset(Position const &offset);
- void SetOrientation(float orientation)
- { _orientation = NormalizeOrientation(orientation); }
-
- float GetPositionX() const { return m_positionX; }
- float GetPositionY() const { return m_positionY; }
- float GetPositionZ() const { return m_positionZ; }
- float GetOrientation() const { return _orientation; }
-
- void GetPosition(float &x, float &y) const
- { x = m_positionX; y = m_positionY; }
- void GetPosition(float &x, float &y, float &z) const
- { x = m_positionX; y = m_positionY; z = m_positionZ; }
- void GetPosition(float &x, float &y, float &z, float &o) const
- { x = m_positionX; y = m_positionY; z = m_positionZ; o = _orientation; }
-
- Position GetPosition() const
- {
- return *this;
- }
-
- Position::PositionXYZStreamer PositionXYZStream()
- {
- return PositionXYZStreamer(*this);
- }
- Position::PositionXYZOStreamer PositionXYZOStream()
- {
- return PositionXYZOStreamer(*this);
- }
-
- bool IsPositionValid() const;
-
- float GetExactDist2dSq(float x, float y) const
- { float dx = m_positionX - x; float dy = m_positionY - y; return dx*dx + dy*dy; }
- float GetExactDist2d(const float x, const float y) const
- { return std::sqrt(GetExactDist2dSq(x, y)); }
- float GetExactDist2dSq(Position const* pos) const
- { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy; }
- float GetExactDist2d(Position const* pos) const
- { return std::sqrt(GetExactDist2dSq(pos)); }
- float GetExactDistSq(float x, float y, float z) const
- { float dz = m_positionZ - z; return GetExactDist2dSq(x, y) + dz*dz; }
- float GetExactDist(float x, float y, float z) const
- { return std::sqrt(GetExactDistSq(x, y, z)); }
- float GetExactDistSq(Position const* pos) const
- { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz; }
- float GetExactDist(Position const* pos) const
- { return std::sqrt(GetExactDistSq(pos)); }
-
- void GetPositionOffsetTo(Position const & endPos, Position & retOffset) const;
- Position GetPositionWithOffset(Position const& offset) const;
-
- float GetAngle(Position const* pos) const;
- float GetAngle(float x, float y) const;
- float GetRelativeAngle(Position const* pos) const
- { return GetAngle(pos) - _orientation; }
- float GetRelativeAngle(float x, float y) const { return GetAngle(x, y) - _orientation; }
- void GetSinCos(float x, float y, float &vsin, float &vcos) const;
-
- bool IsInDist2d(float x, float y, float dist) const
- { return GetExactDist2dSq(x, y) < dist * dist; }
- bool IsInDist2d(Position const* pos, float dist) const
- { return GetExactDist2dSq(pos) < dist * dist; }
- bool IsInDist(float x, float y, float z, float dist) const
- { return GetExactDistSq(x, y, z) < dist * dist; }
- bool IsInDist(Position const* pos, float dist) const
- { return GetExactDistSq(pos) < dist * dist; }
- bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
- bool HasInLine(WorldObject const* target, float width) const;
- std::string ToString() const;
-
- // modulos a radian orientation to the range of 0..2PI
- static float NormalizeOrientation(float o)
- {
- // fmod only supports positive numbers. Thus we have
- // to emulate negative numbers
- if (o < 0)
- {
- float mod = o *-1;
- mod = std::fmod(mod, 2.0f * static_cast<float>(M_PI));
- mod = -mod + 2.0f * static_cast<float>(M_PI);
- return mod;
- }
- return std::fmod(o, 2.0f * static_cast<float>(M_PI));
- }
-};
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
-
struct MovementInfo
{
// common
diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp
new file mode 100644
index 00000000000..e31b913a25a
--- /dev/null
+++ b/src/server/game/Entities/Object/Position.cpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Position.h"
+#include "ByteBuffer.h"
+
+bool Position::operator==(Position const &a)
+{
+ return (G3D::fuzzyEq(a.m_positionX, m_positionX) &&
+ G3D::fuzzyEq(a.m_positionY, m_positionY) &&
+ G3D::fuzzyEq(a.m_positionZ, m_positionZ) &&
+ G3D::fuzzyEq(a.m_orientation, m_orientation));
+}
+
+void Position::RelocateOffset(const Position & offset)
+{
+ m_positionX = GetPositionX() + (offset.GetPositionX() * std::cos(GetOrientation()) + offset.GetPositionY() * std::sin(GetOrientation() + float(M_PI)));
+ m_positionY = GetPositionY() + (offset.GetPositionY() * std::cos(GetOrientation()) + offset.GetPositionX() * std::sin(GetOrientation()));
+ m_positionZ = GetPositionZ() + offset.GetPositionZ();
+ SetOrientation(GetOrientation() + offset.GetOrientation());
+}
+
+bool Position::IsPositionValid() const
+{
+ return Trinity::IsValidMapCoord(m_positionX, m_positionY, m_positionZ, m_orientation);
+}
+
+void Position::GetPositionOffsetTo(const Position & endPos, Position & retOffset) const
+{
+ float dx = endPos.GetPositionX() - GetPositionX();
+ float dy = endPos.GetPositionY() - GetPositionY();
+
+ retOffset.m_positionX = dx * std::cos(GetOrientation()) + dy * std::sin(GetOrientation());
+ retOffset.m_positionY = dy * std::cos(GetOrientation()) - dx * std::sin(GetOrientation());
+ retOffset.m_positionZ = endPos.GetPositionZ() - GetPositionZ();
+ retOffset.SetOrientation(endPos.GetOrientation() - GetOrientation());
+}
+
+Position Position::GetPositionWithOffset(Position const& offset) const
+{
+ Position ret(*this);
+ ret.RelocateOffset(offset);
+ return ret;
+}
+
+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 Position::GetAngle(float x, float y) const
+{
+ float dx = x - GetPositionX();
+ float dy = y - GetPositionY();
+
+ float ang = std::atan2(dy, dx);
+ ang = (ang >= 0) ? ang : 2 * float(M_PI) + ang;
+ return ang;
+}
+
+void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) const
+{
+ float dx = GetPositionX() - x;
+ float dy = GetPositionY() - y;
+
+ if (std::fabs(dx) < 0.001f && std::fabs(dy) < 0.001f)
+ {
+ float angle = (float)rand_norm()*static_cast<float>(2 * M_PI);
+ vcos = std::cos(angle);
+ vsin = std::sin(angle);
+ }
+ else
+ {
+ float dist = std::sqrt((dx*dx) + (dy*dy));
+ vcos = dx / dist;
+ vsin = dy / dist;
+ }
+}
+
+bool Position::HasInArc(float arc, const Position* obj, float border) const
+{
+ // always have self in arc
+ if (obj == this)
+ return true;
+
+ // move arc to range 0.. 2*pi
+ arc = NormalizeOrientation(arc);
+
+ float angle = GetAngle(obj);
+ angle -= m_orientation;
+
+ // move angle to range -pi ... +pi
+ angle = NormalizeOrientation(angle);
+ if (angle > float(M_PI))
+ angle -= 2.0f * float(M_PI);
+
+ float lborder = -1 * (arc / border); // in range -pi..0
+ float rborder = (arc / border); // in range 0..pi
+ return ((angle >= lborder) && (angle <= rborder));
+}
+
+bool Position::HasInLine(Position const* pos, float width) const
+{
+ if (!HasInArc(float(M_PI), pos))
+ return false;
+
+ float angle = GetRelativeAngle(pos);
+ return std::fabs(std::sin(angle)) * GetExactDist2d(pos->GetPositionX(), pos->GetPositionY()) < width;
+}
+
+std::string Position::ToString() const
+{
+ std::stringstream sstr;
+ sstr << "X: " << m_positionX << " Y: " << m_positionY << " Z: " << m_positionZ << " O: " << m_orientation;
+ return sstr.str();
+}
+
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYStreamer const& streamer)
+{
+ buf << streamer.Pos->GetPositionX();
+ buf << streamer.Pos->GetPositionY();
+ return buf;
+}
+
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYStreamer const& streamer)
+{
+ float x, y;
+ buf >> x >> y;
+ streamer.Pos->Relocate(x, y);
+ return buf;
+}
+
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer)
+{
+ buf << streamer.Pos->GetPositionX();
+ buf << streamer.Pos->GetPositionY();
+ buf << streamer.Pos->GetPositionZ();
+ return buf;
+}
+
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer)
+{
+ float x, y, z;
+ buf >> x >> y >> z;
+ streamer.Pos->Relocate(x, y, z);
+ return buf;
+}
+
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer)
+{
+ buf << streamer.Pos->GetPositionX();
+ buf << streamer.Pos->GetPositionY();
+ buf << streamer.Pos->GetPositionZ();
+ buf << streamer.Pos->GetOrientation();
+ return buf;
+}
+
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer)
+{
+ float x, y, z, o;
+ buf >> x >> y >> z >> o;
+ streamer.Pos->Relocate(x, y, z, o);
+ return buf;
+}
diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h
new file mode 100644
index 00000000000..5bd37567811
--- /dev/null
+++ b/src/server/game/Entities/Object/Position.h
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef Trinity_game_Position_h__
+#define Trinity_game_Position_h__
+
+#include "Common.h"
+
+class ByteBuffer;
+
+struct Position
+{
+ Position(float x = 0, float y = 0, float z = 0, float o = 0)
+ : m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(NormalizeOrientation(o)) { }
+
+ Position(Position const& loc) { Relocate(loc); }
+
+ struct PositionXYStreamer
+ {
+ explicit PositionXYStreamer(Position& pos) : Pos(&pos) { }
+ Position* Pos;
+ };
+
+ struct PositionXYZStreamer
+ {
+ explicit PositionXYZStreamer(Position& pos) : Pos(&pos) { }
+ Position* Pos;
+ };
+
+ struct PositionXYZOStreamer
+ {
+ explicit PositionXYZOStreamer(Position& pos) : Pos(&pos) { }
+ Position* Pos;
+ };
+
+ float m_positionX;
+ float m_positionY;
+ float m_positionZ;
+ // Better to limit access to _orientation field, to guarantee the value is normalized
+private:
+ float m_orientation;
+
+public:
+ bool operator==(Position const &a);
+
+ inline bool operator!=(Position const &a)
+ {
+ return !(operator==(a));
+ }
+
+ void Relocate(float x, float y)
+ {
+ m_positionX = x; m_positionY = y;
+ }
+
+ void Relocate(float x, float y, float z)
+ {
+ m_positionX = x; m_positionY = y; m_positionZ = z;
+ }
+
+ void Relocate(float x, float y, float z, float orientation)
+ {
+ m_positionX = x; m_positionY = y; m_positionZ = z; SetOrientation(orientation);
+ }
+
+ void Relocate(Position const &pos)
+ {
+ m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; SetOrientation(pos.m_orientation);
+ }
+
+ void Relocate(Position const* pos)
+ {
+ m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; SetOrientation(pos->m_orientation);
+ }
+
+ void RelocateOffset(Position const &offset);
+
+ void SetOrientation(float orientation)
+ {
+ m_orientation = NormalizeOrientation(orientation);
+ }
+
+ float GetPositionX() const { return m_positionX; }
+ float GetPositionY() const { return m_positionY; }
+ float GetPositionZ() const { return m_positionZ; }
+ float GetOrientation() const { return m_orientation; }
+
+ void GetPosition(float &x, float &y) const
+ {
+ x = m_positionX; y = m_positionY;
+ }
+
+ void GetPosition(float &x, float &y, float &z) const
+ {
+ x = m_positionX; y = m_positionY; z = m_positionZ;
+ }
+
+ void GetPosition(float &x, float &y, float &z, float &o) const
+ {
+ x = m_positionX; y = m_positionY; z = m_positionZ; o = m_orientation;
+ }
+
+ Position GetPosition() const { return *this; }
+
+ Position::PositionXYStreamer PositionXYStream() { return PositionXYStreamer(*this); }
+ Position::PositionXYZStreamer PositionXYZStream() { return PositionXYZStreamer(*this); }
+ Position::PositionXYZOStreamer PositionXYZOStream() { return PositionXYZOStreamer(*this); }
+
+ bool IsPositionValid() const;
+
+ float GetExactDist2dSq(float x, float y) const
+ {
+ float dx = m_positionX - x; float dy = m_positionY - y; return dx*dx + dy*dy;
+ }
+
+ float GetExactDist2d(const float x, const float y) const
+ {
+ return std::sqrt(GetExactDist2dSq(x, y));
+ }
+
+ float GetExactDist2dSq(Position const* pos) const
+ {
+ float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy;
+ }
+
+ float GetExactDist2d(Position const* pos) const
+ {
+ return std::sqrt(GetExactDist2dSq(pos));
+ }
+
+ float GetExactDistSq(float x, float y, float z) const
+ {
+ float dz = m_positionZ - z; return GetExactDist2dSq(x, y) + dz*dz;
+ }
+
+ float GetExactDist(float x, float y, float z) const
+ {
+ return std::sqrt(GetExactDistSq(x, y, z));
+ }
+
+ float GetExactDistSq(Position const* pos) const
+ {
+ float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz;
+ }
+
+ float GetExactDist(Position const* pos) const
+ {
+ return std::sqrt(GetExactDistSq(pos));
+ }
+
+ void GetPositionOffsetTo(Position const & endPos, Position & retOffset) const;
+ Position GetPositionWithOffset(Position const& offset) const;
+
+ float GetAngle(Position const* pos) const;
+ float GetAngle(float x, float y) const;
+ float GetRelativeAngle(Position const* pos) const
+ {
+ return GetAngle(pos) - m_orientation;
+ }
+
+ float GetRelativeAngle(float x, float y) const { return GetAngle(x, y) - m_orientation; }
+ void GetSinCos(float x, float y, float &vsin, float &vcos) const;
+
+ bool IsInDist2d(float x, float y, float dist) const
+ {
+ return GetExactDist2dSq(x, y) < dist * dist;
+ }
+
+ bool IsInDist2d(Position const* pos, float dist) const
+ {
+ return GetExactDist2dSq(pos) < dist * dist;
+ }
+
+ bool IsInDist(float x, float y, float z, float dist) const
+ {
+ return GetExactDistSq(x, y, z) < dist * dist;
+ }
+
+ bool IsInDist(Position const* pos, float dist) const
+ {
+ return GetExactDistSq(pos) < dist * dist;
+ }
+
+ bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
+ bool HasInLine(Position const* pos, float width) const;
+ std::string ToString() const;
+
+ // modulos a radian orientation to the range of 0..2PI
+ static float NormalizeOrientation(float o)
+ {
+ // fmod only supports positive numbers. Thus we have
+ // to emulate negative numbers
+ if (o < 0)
+ {
+ float mod = o *-1;
+ mod = std::fmod(mod, 2.0f * static_cast<float>(M_PI));
+ mod = -mod + 2.0f * static_cast<float>(M_PI);
+ return mod;
+ }
+ return std::fmod(o, 2.0f * static_cast<float>(M_PI));
+ }
+};
+
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
+ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
+ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
+
+#endif // Trinity_game_Position_h__
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index e8da248160b..3490fab3415 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4313,7 +4313,7 @@ void Spell::SendResurrectRequest(Player* target)
// for player resurrections the name is looked up by guid
std::string const sentName(m_caster->GetTypeId() == TYPEID_PLAYER
? "" : m_caster->GetNameForLocaleIdx(target->GetSession()->GetSessionDbLocaleIndex()));
-
+
WorldPackets::Spells::ResurrectRequest resurrectRequest;
resurrectRequest.ResurrectOffererGUID = m_caster->GetGUID();
resurrectRequest.ResurrectOffererVirtualRealmAddress = GetVirtualRealmAddress();
@@ -7502,7 +7502,7 @@ bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target)
}
else if (_spellInfo->HasAttribute(SPELL_ATTR0_CU_CONE_LINE))
{
- if (!_caster->HasInLine(target, _caster->GetObjectSize()))
+ if (!_caster->HasInLine(target, _caster->GetObjectSize() + target->GetObjectSize()))
return false;
}
else
@@ -7519,7 +7519,7 @@ WorldObjectSpellTrajTargetCheck::WorldObjectSpellTrajTargetCheck(float range, Po
bool WorldObjectSpellTrajTargetCheck::operator()(WorldObject* target)
{
// return all targets on missile trajectory (0 - size of a missile)
- if (!_caster->HasInLine(target, 0))
+ if (!_caster->HasInLine(target, target->GetObjectSize()))
return false;
return WorldObjectSpellAreaTargetCheck::operator ()(target);
}