diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-06-10 19:57:49 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-06-10 19:57:49 +0200 |
commit | ee2b8b4e87164328e9e7133a6d654f7ac6cd5f8c (patch) | |
tree | 59115aac56b612557f5ff5f192177f92fd56f497 /src | |
parent | 051d4036247e196801f40d4cb7826978f970cd99 (diff) |
Core/PacketIO: Fixed sending wrong movement packets to nearby players that require ACK response
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 112 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 |
4 files changed, 84 insertions, 41 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index da964ef691f..b9ba699b7d0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25789,14 +25789,6 @@ void Player::DeleteGarrison() } } -void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) -{ - WorldPackets::Movement::MoveSetFlag packet(apply ? SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY : SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY); - packet.MoverGUID = GetGUID(); - packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); -} - void Player::SendMovementSetCollisionHeight(float height) { WorldPackets::Movement::MoveSetCollisionHeight setCollisionHeight; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5ff09881eb3..3c630c42fda 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2457,10 +2457,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void ValidateMovementInfo(MovementInfo* mi); - /*! These methods send different packets to the client in apply and unapply case. - These methods are only sent to the current unit. - */ - void SendMovementSetCanTransitionBetweenSwimAndFly(bool apply); void SendMovementSetCollisionHeight(float height); bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c53389d89a2..76c91b05df7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13506,12 +13506,16 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/) { SMSG_MOVE_SPLINE_ROOT, SMSG_MOVE_ROOT } }; - if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER) + if (Player* playerMover = GetPlayerMover()) // unit controlled by a player. { WorldPackets::Movement::MoveSetFlag packet(rootOpcodeTable[apply][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -14991,8 +14995,9 @@ void Unit::SendTeleportPacket(Position& pos) WorldPackets::Movement::MoveUpdateTeleport moveUpdateTeleport; moveUpdateTeleport.movementInfo = &m_movementInfo; + Unit* broadcastSource = this; - if (GetTypeId() == TYPEID_PLAYER) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveTeleport moveTeleport; moveTeleport.MoverGUID = GetGUID(); @@ -15002,7 +15007,9 @@ void Unit::SendTeleportPacket(Position& pos) moveTeleport.TransportGUID = GetTransGUID(); moveTeleport.Facing = pos.GetOrientation(); moveTeleport.SequenceIndex = m_movementCounter++; - ToPlayer()->SendDirectMessage(moveTeleport.Write()); + playerMover->SendDirectMessage(moveTeleport.Write()); + + broadcastSource = playerMover; } else { @@ -15014,7 +15021,7 @@ void Unit::SendTeleportPacket(Position& pos) } // Broadcast the packet to everyone except self. - SendMessageToSet(moveUpdateTeleport.Write(), false); + broadcastSource->SendMessageToSet(moveUpdateTeleport.Write(), false); } bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport) @@ -15395,14 +15402,16 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/) { SMSG_MOVE_SPLINE_DISABLE_GRAVITY, SMSG_MOVE_DISABLE_GRAVITY } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(gravityOpcodeTable[disable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15473,16 +15482,19 @@ bool Unit::SetCanFly(bool enable) { SMSG_MOVE_SPLINE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - if (!enable && player) + if (!enable && GetTypeId() == TYPEID_PLAYER) ToPlayer()->SetFallInformation(0, GetPositionZ()); - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(flyOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15513,14 +15525,16 @@ bool Unit::SetWaterWalking(bool enable, bool packetOnly /*= false */) { SMSG_MOVE_SPLINE_SET_WATER_WALK, SMSG_MOVE_SET_WATER_WALK } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(waterWalkingOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15551,14 +15565,16 @@ bool Unit::SetFeatherFall(bool enable, bool packetOnly /*= false */) { SMSG_MOVE_SPLINE_SET_FEATHER_FALL, SMSG_MOVE_SET_FEATHER_FALL } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(featherFallOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15604,14 +15620,16 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/) { SMSG_MOVE_SPLINE_SET_HOVER, SMSG_MOVE_SET_HOVERING } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(hoverOpcodeTable[enable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15639,14 +15657,16 @@ bool Unit::SetCollision(bool disable) { SMSG_MOVE_SPLINE_DISABLE_COLLISION, SMSG_MOVE_DISABLE_COLLISION } }; - bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; - - if (player) + if (Player* playerMover = GetPlayerMover()) { WorldPackets::Movement::MoveSetFlag packet(collisionOpcodeTable[disable][1]); packet.MoverGUID = GetGUID(); packet.SequenceIndex = m_movementCounter++; - SendMessageToSet(packet.Write(), true); + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); } else { @@ -15658,6 +15678,40 @@ bool Unit::SetCollision(bool disable) return true; } +bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable) +{ + if (GetTypeId() != TYPEID_PLAYER) + return false; + + if (enable == HasExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS)) + return false; + + if (enable) + AddExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); + else + RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); + + static OpcodeServer const swimToFlyTransOpcodeTable[2] = + { + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY + }; + + if (Player* playerMover = GetPlayerMover()) + { + WorldPackets::Movement::MoveSetFlag packet(swimToFlyTransOpcodeTable[enable]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + playerMover->SendDirectMessage(packet.Write()); + + WorldPackets::Movement::MoveUpdate moveUpdate; + moveUpdate.movementInfo = &m_movementInfo; + playerMover->SendMessageToSet(moveUpdate.Write(), false); + } + + return true; +} + void Unit::SendSetVehicleRecId(uint32 vehicleId) { if (Player* player = ToPlayer()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3a7d25c9ef5..05149a4cd0a 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1678,6 +1678,7 @@ class TC_GAME_API Unit : public WorldObject bool SetFeatherFall(bool enable, bool packetOnly = false); bool SetHover(bool enable, bool packetOnly = false); bool SetCollision(bool disable); + bool SetCanTransitionBetweenSwimAndFly(bool enable); void SendSetVehicleRecId(uint32 vehicleId); void SetInFront(WorldObject const* target); |