diff options
| author | treeston <treeston.mmoc@gmail.com> | 2016-05-31 22:49:28 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-06-10 19:17:34 +0200 |
| commit | 19fa504ff5a51ded47f516640fc57deb6793547a (patch) | |
| tree | 01a2f670a8ce305aed4c28c793960432c2654555 | |
| parent | 7db377c7f9743226ee18a496af8d2569917c15c9 (diff) | |
Entities/Unit: Fix speed update packets if player is being moved by something else.
Closes #17184
Closes #17254
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 20 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 3 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fe8cb996135..03213a48b28 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12033,7 +12033,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) pet->SetSpeedRate(mtype, m_speed_rate[mtype]); } - if (m_movedPlayer) // unit controlled by a player. + if (Player* playerMover = GetPlayerMover()) // unit controlled by a player. { // Send notification to self. this packet is only sent to one client (the client of the player concerned by the change). WorldPacket self; @@ -12043,7 +12043,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) if (mtype == MOVE_RUN) self << uint8(1); // unknown byte added in 2.1.0 self << float(GetSpeed(mtype)); - m_movedPlayer->GetSession()->SendPacket(&self); + playerMover->GetSession()->SendPacket(&self); // Send notification to other players. sent to every clients (if in range) except one: the client of the player concerned by the change. WorldPacket data; @@ -12051,7 +12051,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) data << GetPackGUID(); BuildMovementPacket(&data); data << float(GetSpeed(mtype)); - SendMessageToSet(&data, false); + playerMover->SendMessageToSet(&data, false); } else // unit controlled by AI. { @@ -13577,6 +13577,20 @@ void CharmInfo::SetSpellAutocast(SpellInfo const* spellInfo, bool state) } } +Unit* Unit::GetMover() const +{ + if (Player const* player = ToPlayer()) + return player->m_mover; + return nullptr; +} + +Player* Unit::GetPlayerMover() const +{ + if (Unit* mover = GetMover()) + return mover->ToPlayer(); + return nullptr; +} + bool Unit::isFrozen() const { return HasAuraState(AURA_STATE_FROZEN); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b23aff3ed8e..3603f207bf0 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1685,7 +1685,8 @@ class TC_GAME_API Unit : public WorldObject CharmInfo* InitCharmInfo(); void DeleteCharmInfo(); void UpdateCharmAI(); - //Player* GetMoverSource() const; + Unit* GetMover() const; + Player* GetPlayerMover() const; Player* m_movedPlayer; SharedVisionList const& GetSharedVisionList() { return m_sharedVision; } void AddPlayerToVision(Player* player); |
