diff options
-rw-r--r-- | src/server/game/Entities/Object/Position.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 5 |
3 files changed, 13 insertions, 7 deletions
diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index 6e94539b107..78fb88abd9c 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -231,6 +231,9 @@ public: explicit WorldLocation(uint32 mapId = MAPID_INVALID, float x = 0.f, float y = 0.f, float z = 0.f, float o = 0.f) : Position(x, y, z, o), m_mapId(mapId) { } + WorldLocation(uint32 mapId, Position const& position) + : Position(position), m_mapId(mapId) { } + WorldLocation(WorldLocation const& loc) : Position(loc), m_mapId(loc.GetMapId()) { } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d972d9a5cc5..e37cc2f01f7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14907,21 +14907,23 @@ bool Unit::IsFalling() const return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING | MOVEMENTFLAG_FALLING_FAR) || movespline->isFalling(); } -void Unit::NearTeleportTo(float x, float y, float z, float orientation, bool casting /*= false*/) +void Unit::NearTeleportTo(Position const& pos, bool casting /*= false*/) { DisableSpline(); if (GetTypeId() == TYPEID_PLAYER) - ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0)); + { + WorldLocation target(GetMapId(), pos); + ToPlayer()->TeleportTo(target, TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0)); + } else { - Position pos = {x, y, z, orientation}; SendTeleportPacket(pos); - UpdatePosition(x, y, z, orientation, true); + UpdatePosition(pos, true); UpdateObjectVisibility(); } } -void Unit::SendTeleportPacket(Position& pos) +void Unit::SendTeleportPacket(Position const& pos) { // SMSG_MOVE_UPDATE_TELEPORT is sent to nearby players to signal the teleport // SMSG_MOVE_TELEPORT is sent to self in order to trigger CMSG_MOVE_TELEPORT_ACK and update the position server side diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f296d54abc9..68042afd6c2 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1673,8 +1673,9 @@ class TC_GAME_API Unit : public WorldObject void SendSpellDamageResist(Unit* target, uint32 spellId); void SendSpellDamageImmune(Unit* target, uint32 spellId, bool isPeriodic); - void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false); - void SendTeleportPacket(Position& pos); + void NearTeleportTo(Position const& pos, bool casting = false); + void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false) { NearTeleportTo(Position(x, y, z, orientation), casting); } + void SendTeleportPacket(Position const& pos); virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false); // returns true if unit's position really changed virtual bool UpdatePosition(const Position &pos, bool teleport = false); |