From e47b9c85992624fb39ed90c8e3ddf35c93db90a5 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 23 Feb 2020 10:59:57 +0100 Subject: [PATCH] Core/Movement: converted SMSG_MOVE_SET_COLLISION_HEIGHT to packet class and handle reason bits to match sniff behaivior --- src/server/game/Entities/Player/Player.cpp | 14 +++++---- src/server/game/Entities/Player/Player.h | 3 +- src/server/game/Entities/Unit/Unit.cpp | 7 ++--- src/server/game/Miscellaneous/SharedDefines.h | 6 ++++ .../game/Movement/MovementStructures.cpp | 27 ---------------- .../game/Server/Packets/MovementPackets.cpp | 31 +++++++++++++++++++ .../game/Server/Packets/MovementPackets.h | 13 ++++++++ 7 files changed, 62 insertions(+), 39 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ca3867f9704..b96c66c6521 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1823,7 +1823,7 @@ void Player::SetObjectScale(float scale) SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, scale * DEFAULT_WORLD_OBJECT_SIZE); SetFloatValue(UNIT_FIELD_COMBATREACH, scale * DEFAULT_COMBAT_REACH); if (IsInWorld()) - SendMovementSetCollisionHeight(GetCollisionHeight()); + SendMovementSetCollisionHeight(GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_SCALE); } bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const @@ -27852,12 +27852,14 @@ void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send(); } -void Player::SendMovementSetCollisionHeight(float height) +void Player::SendMovementSetCollisionHeight(float height, UpdateCollisionHeightReason reason) { - static MovementStatusElements const heightElement = MSEExtraFloat; - Movement::ExtraMovementStatusElement extra(&heightElement); - extra.Data.floatData = height; - Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_SET_COLLISION_HEIGHT, NULL_OPCODE, &extra).Send(); + WorldPackets::Movement::MoveSetCollisionHeight packet; + packet.Height = height; + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + packet.Reason = reason; + SendDirectMessage(packet.Write()); } std::string Player::GetMapAreaAndZoneString() const diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 736198208ef..aa4c80798b4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -83,6 +83,7 @@ enum InventoryType : uint8; enum ItemClass : uint8; enum LootError : uint8; enum LootType : uint8; +enum UpdateCollisionHeightReason : uint8; typedef std::deque PlayerMails; @@ -2358,7 +2359,7 @@ class TC_GAME_API Player : public Unit, public GridObject These methods are only sent to the current unit. */ void SendMovementSetCanTransitionBetweenSwimAndFly(bool apply); - void SendMovementSetCollisionHeight(float height); + void SendMovementSetCollisionHeight(float height, UpdateCollisionHeightReason reason); 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 4a61a8871da..f3de12b0238 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8219,7 +8219,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) if (charm->GetTypeId() == TYPEID_UNIT) charm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - player->SendMovementSetCollisionHeight(player->GetCollisionHeight()); + player->SendMovementSetCollisionHeight(player->GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_MOUNT); } RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT); @@ -8234,10 +8234,7 @@ void Unit::Dismount() RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT); if (Player* thisPlayer = ToPlayer()) - { - SendUpdateToSet(); - thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight()); - } + thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_MOUNT); WorldPacket data(SMSG_DISMOUNT, 8); data << GetPackGUID(); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index c41b5c71ac0..f1b81b3986c 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4288,6 +4288,12 @@ enum ContentLevels : uint8 MAX_CONTENT }; +enum UpdateCollisionHeightReason : uint8 +{ + UPDATE_COLLISION_HEIGHT_MOUNT = 0, + UPDATE_COLLISION_HEIGHT_SCALE = 1 +}; + #define MAX_CREATURE_SPELL_DATA_SLOT 4 #endif diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index 4c3b2bd1ce1..542cbcffe3b 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -4654,31 +4654,6 @@ MovementStatusElements const MoveSetPitchRate[] = MSEEnd, }; -MovementStatusElements const MoveSetCollisionHeight[] = -{ - MSEZeroBit, - MSEZeroBit, - MSEHasGuidByte6, - MSEHasGuidByte1, - MSEHasGuidByte4, - MSEHasGuidByte7, - MSEHasGuidByte5, - MSEHasGuidByte2, - MSEHasGuidByte0, - MSEHasGuidByte3, - MSEGuidByte6, - MSEGuidByte0, - MSEGuidByte4, - MSEGuidByte3, - MSEGuidByte5, - MSECounter, - MSEGuidByte1, - MSEGuidByte2, - MSEGuidByte7, - MSEExtraElement, - MSEEnd, -}; - MovementStatusElements const SplineMoveSetWalkMode[] = { MSEHasGuidByte7, @@ -5774,8 +5749,6 @@ MovementStatusElements const* GetMovementStatusElementsSequence(uint32 opcode) return MovementSetCanFlyAck; case CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK: return MovementSetCanTransitionBetweenSwimAndFlyAck; - case SMSG_MOVE_SET_COLLISION_HEIGHT: - return MoveSetCollisionHeight; case CMSG_MOVE_SET_COLLISION_HEIGHT_ACK: return MovementSetCollisionHeightAck; case SMSG_MOVE_UPDATE_COLLISION_HEIGHT: diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index f34fc0eb077..2d305c7a23a 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -64,3 +64,34 @@ WorldPacket const* WorldPackets::Movement::NewWorld::Write() _worldPacket << Pos.GetPositionY(); return &_worldPacket; } + +WorldPacket const* WorldPackets::Movement::MoveSetCollisionHeight::Write() +{ + _worldPacket.WriteBits(Reason, 2); + _worldPacket.WriteBit(MoverGUID[6]); + _worldPacket.WriteBit(MoverGUID[1]); + _worldPacket.WriteBit(MoverGUID[4]); + _worldPacket.WriteBit(MoverGUID[7]); + _worldPacket.WriteBit(MoverGUID[5]); + _worldPacket.WriteBit(MoverGUID[2]); + _worldPacket.WriteBit(MoverGUID[0]); + _worldPacket.WriteBit(MoverGUID[3]); + + _worldPacket.FlushBits(); + + _worldPacket.WriteByteSeq(MoverGUID[6]); + _worldPacket.WriteByteSeq(MoverGUID[0]); + _worldPacket.WriteByteSeq(MoverGUID[4]); + _worldPacket.WriteByteSeq(MoverGUID[3]); + _worldPacket.WriteByteSeq(MoverGUID[5]); + + _worldPacket << uint32(SequenceIndex); + + _worldPacket.WriteByteSeq(MoverGUID[1]); + _worldPacket.WriteByteSeq(MoverGUID[2]); + _worldPacket.WriteByteSeq(MoverGUID[7]); + + _worldPacket << float(Height); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index eec0ad38a9e..de8488f7325 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -75,6 +75,19 @@ namespace WorldPackets int32 MapID = 0; Position Pos; }; + + class MoveSetCollisionHeight final : public ServerPacket + { + public: + MoveSetCollisionHeight() : ServerPacket(SMSG_MOVE_SET_COLLISION_HEIGHT, 15) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + uint32 SequenceIndex = 0; + float Height = 1.0f; + UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT; + }; } }