From 9a0fe48e703df16553fc684a61a4ed5d3cb3ff1e Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 14 Sep 2019 18:23:58 +0200 Subject: [PATCH] Core/Movement: fixed packet structure for SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY and SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY * enabled CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK --- src/server/game/Entities/Player/Player.cpp | 14 ++---- src/server/game/Entities/Unit/Unit.cpp | 11 ++++- .../game/Movement/MovementStructures.cpp | 49 +++++++++++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 2 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 3 -- 5 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 29fb558e5a..515d41ff31 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27971,16 +27971,10 @@ VoidStorageItem* Player::GetVoidStorageItem(uint64 id, uint8& slot) const void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) { - static Opcodes const swimToFlyTransOpcodeTable[2] = - { - SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, - SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY - }; - - WorldPacket data(swimToFlyTransOpcodeTable[apply], 15); - data.appendPackGUID(GetGUID()); - data << uint32(m_movementCounter++); - SendDirectMessage(&data); + if (apply) + Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send(); + else + Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send(); } void Player::SendMovementSetCollisionHeight(float height) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 314c20e5cb..7162d20cc6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14354,7 +14354,9 @@ bool Unit::SetCanFly(bool enable, bool packetOnly) { AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_SPLINE_ELEVATION); - AddExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); + if (GetTypeId() == TYPEID_PLAYER) + AddExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); + SetFall(false); } else @@ -14362,8 +14364,13 @@ bool Unit::SetCanFly(bool enable, bool packetOnly) if (IsFlying() && !IsLevitating()) SetFall(true); RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_MASK_MOVING_FLY); - RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); + + if (GetTypeId() == TYPEID_PLAYER) + RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); } + + if (Player* player = ToPlayer()) + player->SendMovementSetCanTransitionBetweenSwimAndFly(enable); } if (enable) diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index 3964b16da2..eab37f5e5c 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -5489,6 +5489,51 @@ MovementStatusElements const MoveUpdateFlightBackSpeed[] = MSEEnd }; +MovementStatusElements const MoveSetCanTransitionBetweenSwimAndFly[] = +{ + MSEHasGuidByte4, + MSEHasGuidByte5, + MSEHasGuidByte7, + MSEHasGuidByte0, + MSEHasGuidByte2, + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasGuidByte3, + MSEGuidByte0, + MSEGuidByte6, + MSEGuidByte1, + MSEGuidByte2, + MSEGuidByte5, + MSEGuidByte4, + MSEGuidByte7, + MSECounter, + MSEGuidByte3, + MSEEnd, +}; + + +MovementStatusElements const MoveUnsetCanTransitionBetweenSwimAndFly[] = +{ + MSEHasGuidByte3, + MSEHasGuidByte4, + MSEHasGuidByte7, + MSEHasGuidByte0, + MSEHasGuidByte6, + MSEHasGuidByte1, + MSEHasGuidByte5, + MSEHasGuidByte2, + MSEGuidByte5, + MSEGuidByte2, + MSEGuidByte7, + MSEGuidByte0, + MSECounter, + MSEGuidByte6, + MSEGuidByte4, + MSEGuidByte3, + MSEGuidByte1, + MSEEnd, +}; + void Movement::ExtraMovementStatusElement::ReadNextElement(ByteBuffer& packet) { MovementStatusElements const element = _elements[_index++]; @@ -5834,6 +5879,10 @@ MovementStatusElements const* GetMovementStatusElementsSequence(Opcodes opcode) return MoveGravityEnable; case SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED: return MoveUpdateFlightBackSpeed; + case SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY: + return MoveSetCanTransitionBetweenSwimAndFly; + case SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY: + return MoveUnsetCanTransitionBetweenSwimAndFly; default: break; } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 433f830afa..d1e12eff82 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -454,7 +454,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_NOT_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveNotActiveMover ); DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode ); - DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HEIGHT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetCollisionHeightAck ); DEFINE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode ); DEFINE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode ); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b6e5f52cb2..b97957c29f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2733,9 +2733,6 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode return; } - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->SendMovementSetCanTransitionBetweenSwimAndFly(apply); - target->SetCanFly(apply); if (!apply && target->GetTypeId() == TYPEID_UNIT && !target->IsLevitating())