From e7d0275ae259b00c2afaca8e1c775327e8cecc0f Mon Sep 17 00:00:00 2001 From: Yaki Khadafi Date: Sun, 12 Aug 2012 12:53:15 +0300 Subject: [PATCH] [0067] Set- canfly/forcemoveroot/waterwalk packets, SMSG_PLAY_SPELL_VISUAL Signed-off-by: Yaki Khadafi --- src/game/Level3.cpp | 6 +-- src/game/MiscHandler.cpp | 32 ++++++-------- src/game/MovementHandler.cpp | 17 ++++---- src/game/MovementStructures.h | 76 ++++++++++++++++++++++++++++++++++ src/game/NPCHandler.cpp | 11 +++-- src/game/Opcodes.cpp | 23 +++++------ src/game/Opcodes.h | 19 ++++----- src/game/Player.cpp | 24 +++++++---- src/game/Spell.cpp | 6 +-- src/game/SpellAuras.cpp | 41 +++++------------- src/game/Unit.cpp | 78 +++++++++++++++++++++++++++++++++++ src/game/Unit.h | 6 +++ src/shared/revision_nr.h | 2 +- 13 files changed, 237 insertions(+), 104 deletions(-) diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 4107d7439..4fa4a50bd 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -5980,10 +5980,8 @@ bool ChatHandler::HandleGMFlyCommand(char* args) if (!target) target = m_session->GetPlayer(); - WorldPacket data(12); - data.SetOpcode(value ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY); - data << target->GetPackGUID(); - data << uint32(0); // unknown + WorldPacket data; + target->BuildMoveSetCanFlyPacket(&data, value, 0); target->SendMessageToSet(&data, true); PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args); return true; diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 103d70d1f..14730b622 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -296,9 +296,8 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recv_data*/) if ((GetPlayer()->GetPositionZ() < height + 0.1f) && !(GetPlayer()->IsInWater())) GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); - WorldPacket data(SMSG_FORCE_MOVE_ROOT, (8 + 4)); // guess size - data << GetPlayer()->GetPackGUID(); - data << (uint32)2; + WorldPacket data; + GetPlayer()->BuildForceMoveRootPacket(&data, true, 2); SendPacket(&data); GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); } @@ -327,10 +326,8 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket& /*recv_data*/) // not remove flags if can't free move - its not set in Logout request code. if (GetPlayer()->CanFreeMove()) { - //!we can move again - data.Initialize(SMSG_FORCE_MOVE_UNROOT, 8); // guess size - data << GetPlayer()->GetPackGUID(); - data << uint32(0); + //! we can move again + GetPlayer()->BuildForceMoveRootPacket(&data, false, 0); SendPacket(&data); //! Stand Up @@ -1034,13 +1031,16 @@ void WorldSession::HandleFeatherFallAck(WorldPacket& recv_data) DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK"); // not used - recv_data.rpos(recv_data.wpos()); // prevent warnings spam + recv_data.rfinish(); // prevent warnings spam + /* + bitsream packet + */ } void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data) { // not used - recv_data.rpos(recv_data.wpos()); // prevent warnings spam + recv_data.rfinish(); // prevent warnings spam /* bitsream packet */ @@ -1048,8 +1048,8 @@ void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data) void WorldSession::HandleMoveRootAck(WorldPacket& recv_data) { - // no used - recv_data.rpos(recv_data.wpos()); // prevent warnings spam + // not used + recv_data.rfinish(); // prevent warnings spam /* bitsream packet */ @@ -1490,20 +1490,14 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recv_data) { // fly mode on/off DEBUG_LOG("WORLD: CMSG_MOVE_SET_CAN_FLY_ACK"); - // recv_data.hexlike(); - ObjectGuid guid; MovementInfo movementInfo; - - recv_data >> guid.ReadAsPacked(); - recv_data >> Unused(); // unk recv_data >> movementInfo; - recv_data >> Unused(); // unk2 - if (_player->GetMover()->GetObjectGuid() != guid) + if (_player->GetMover()->GetObjectGuid() != movementInfo.GetGuid()) { DEBUG_LOG("WorldSession::HandleMoveSetCanFlyAckOpcode: player %s, mover %s, received %s, ignored", - _player->GetGuidStr().c_str(), _player->GetMover()->GetGuidStr().c_str(), guid.GetString().c_str()); + _player->GetGuidStr().c_str(), _player->GetMover()->GetGuidStr().c_str(), movementInfo.GetGuid().GetString().c_str()); return; } diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 1ce427a37..1ec3a2791 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -468,26 +468,23 @@ void WorldSession::HandleMoveHoverAck(WorldPacket& recv_data) { DEBUG_LOG("CMSG_MOVE_HOVER_ACK"); - ObjectGuid guid; // guid - unused + recv_data.rfinish(); + /* MovementInfo movementInfo; - - recv_data >> guid.ReadAsPacked(); - recv_data >> Unused(); // unk1 recv_data >> movementInfo; - recv_data >> Unused(); // unk2 + */ } void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recv_data) { DEBUG_LOG("CMSG_MOVE_WATER_WALK_ACK"); - ObjectGuid guid; // guid - unused - MovementInfo movementInfo; + recv_data.rfinish(); - recv_data >> guid.ReadAsPacked(); - recv_data >> Unused(); // unk1 + /* + MovementInfo movementInfo; recv_data >> movementInfo; - recv_data >> Unused(); // unk2 + */ } void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) diff --git a/src/game/MovementStructures.h b/src/game/MovementStructures.h index 012c1495b..2caadc241 100644 --- a/src/game/MovementStructures.h +++ b/src/game/MovementStructures.h @@ -88,6 +88,7 @@ enum MovementStatusElements MSETransportTime, MSETransportTime2, MSETransportTime3, + MSEMovementCounter, MSEEnd, MSE_COUNT }; @@ -2035,6 +2036,79 @@ MovementStatusElements MovementFallResetSequence[] = MSEEnd, }; +MovementStatusElements MovementSetCanFlyAckSequence[] = +{ + MSEPositionY, + MSEMovementCounter, + MSEPositionX, + MSEPositionZ, + MSEGuidBit3, + MSEHasTimestamp, + MSEGuidBit4, + MSEGuidBit0, + MSEHasOrientation, + MSEHasFallData, + MSEGuidBit2, + MSEGuidBit5, + MSEHasSplineElevation, + MSEHasMovementFlags2, + MSEHasUnknownBit, + MSEGuidBit7, + MSEHasSpline, + MSEGuidBit6, + MSEGuidBit1, + MSEHasMovementFlags, + MSEHasTransportData, + MSEHasPitch, + MSETransportGuidBit3, + MSETransportGuidBit1, + MSETransportGuidBit2, + MSEHasTransportTime3, + MSEHasTransportTime2, + MSETransportGuidBit0, + MSETransportGuidBit5, + MSETransportGuidBit7, + MSETransportGuidBit4, + MSETransportGuidBit6, + MSEFlags2, + MSEFlags, + MSEHasFallDirection, + MSEGuidByte1, + MSEGuidByte0, + MSEGuidByte2, + MSEGuidByte3, + MSEGuidByte7, + MSEGuidByte6, + MSEGuidByte4, + MSEGuidByte5, + MSETransportTime2, + MSETransportGuidByte6, + MSETransportTime, + MSETransportTime3, + MSETransportGuidByte7, + MSETransportPositionZ, + MSETransportGuidByte3, + MSETransportPositionY, + MSETransportGuidByte5, + MSETransportPositionX, + MSETransportGuidByte2, + MSETransportPositionO, + MSETransportSeat, + MSETransportGuidByte1, + MSETransportGuidByte0, + MSETransportGuidByte4, + MSEFallTime, + MSEFallCosAngle, + MSEFallHorizontalSpeed, + MSEFallSinAngle, + MSEFallVerticalSpeed, + MSEPitch, + MSEPositionO, + MSETimestamp, + MSESplineElevation, + MSEEnd, +}; + MovementStatusElements* GetMovementStatusElementsSequence(uint16 opcode) { switch(opcode) @@ -2047,6 +2121,8 @@ MovementStatusElements* GetMovementStatusElementsSequence(uint16 opcode) return MovementFallResetSequence; case CMSG_MOVE_JUMP: return MovementJumpSequence; + case CMSG_MOVE_SET_CAN_FLY_ACK: + return MovementSetCanFlyAckSequence; case CMSG_MOVE_SET_FACING: return MovementSetFacingSequence; case CMSG_MOVE_SET_PITCH: diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 456384ed1..690b42fdc 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -292,14 +292,13 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recv_data) _player->ModifyMoney(-int32(nSpellCost)); - WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer - data << ObjectGuid(guid); - data << uint32(0xB3); // index from SpellVisualKit.dbc + // visual effect on trainer + WorldPacket data; + unit->BuildSendPlayVisualPacket(&data, 0xB3, false); SendPacket(&data); - data.Initialize(SMSG_PLAY_SPELL_IMPACT, 12); // visual effect on player - data << _player->GetObjectGuid(); - data << uint32(0x016A); // index from SpellVisualKit.dbc + // visual effect on player + _player->BuildSendPlayVisualPacket(&data, 0x016A, true); SendPacket(&data); // learn explicitly or cast explicitly diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index cb1c9a1d0..8bd5085b1 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -285,8 +285,8 @@ void InitializeOpcodes() OPCODE(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //OPCODE(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); OPCODE(SMSG_MONSTER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(CMSG_MOVE_SET_RAW_POSITION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(SMSG_FORCE_RUN_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -295,10 +295,10 @@ void InitializeOpcodes() //OPCODE(CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAckOpcodes); //OPCODE(SMSG_FORCE_SWIM_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAckOpcodes); - //OPCODE(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); - //OPCODE(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); + OPCODE(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); + OPCODE(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); //OPCODE(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(MSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); OPCODE(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); @@ -568,11 +568,10 @@ void InitializeOpcodes() //OPCODE(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCastSpellOpcode ); //OPCODE(MSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblemOpcode ); //OPCODE(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode); - //OPCODE(SMSG_PLAY_SPELL_VISUAL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(SMSG_PLAY_SPELL_VISUAL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_ZONEUPDATE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleZoneUpdateOpcode ); //OPCODE(SMSG_PARTYKILLLOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(SMSG_COMPRESSED_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(SMSG_PLAY_SPELL_IMPACT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_GM_SET_SECURITY_GROUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(CMSG_GM_NUKE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -789,7 +788,7 @@ void InitializeOpcodes() //OPCODE(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode ); //OPCODE(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode ); //OPCODE(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleFeatherFallAck ); - //OPCODE(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); + OPCODE(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); //OPCODE(CMSG_MOVE_NOT_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveNotActiveMoverOpcode ); //OPCODE(SMSG_PLAY_SOUND, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldStatusOpcode ); @@ -904,9 +903,9 @@ void InitializeOpcodes() //OPCODE(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(MSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); //OPCODE(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - //OPCODE(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //OPCODE(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode ); + OPCODE(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + OPCODE(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode ); //OPCODE(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); //OPCODE(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); //OPCODE(CMSG_ARENA_TEAM_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index 2904fb3e5..f4a1545f3 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -279,8 +279,8 @@ enum Opcodes CMSG_MOVE_SET_PITCH = 0x7312, // 4.3.4 15595 MSG_MOVE_WORLDPORT_ACK = 0x10DD, SMSG_MONSTER_MOVE = 0x6E17, // 4.3.4 15595 - SMSG_MOVE_WATER_WALK = 0x10DF, - SMSG_MOVE_LAND_WALK = 0x10E0, + SMSG_MOVE_WATER_WALK = 0x75B1, // 4.3.4 15595 + SMSG_MOVE_LAND_WALK = 0x34B7, // 4.3.4 15595 CMSG_MOVE_CHARM_PORT_CHEAT = 0x10E1, CMSG_MOVE_SET_RAW_POSITION = 0x10E2, SMSG_FORCE_RUN_SPEED_CHANGE = 0x10E3, @@ -289,10 +289,10 @@ enum Opcodes CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x10E6, SMSG_FORCE_SWIM_SPEED_CHANGE = 0x10E7, CMSG_FORCE_SWIM_SPEED_CHANGE_ACK = 0x10E8, - SMSG_FORCE_MOVE_ROOT = 0x10E9, - CMSG_FORCE_MOVE_ROOT_ACK = 0x10EA, - SMSG_FORCE_MOVE_UNROOT = 0x10EB, - CMSG_FORCE_MOVE_UNROOT_ACK = 0x10EC, + SMSG_FORCE_MOVE_ROOT = 0x7DA0, // 4.3.4 15595 + CMSG_FORCE_MOVE_ROOT_ACK = 0x701E, // 4.3.4 15595 + SMSG_FORCE_MOVE_UNROOT = 0x7DB4, // 4.3.4 15595 + CMSG_FORCE_MOVE_UNROOT_ACK = 0x7808, // 4.3.4 15595 MSG_MOVE_ROOT = 0x10ED, MSG_MOVE_UNROOT = 0x10EE, MSG_MOVE_HEARTBEAT = 0x3914, // 4.3.4 15595 @@ -553,11 +553,10 @@ enum Opcodes CMSG_PET_CAST_SPELL = 0x11F1, MSG_SAVE_GUILD_EMBLEM = 0x11F2, MSG_TABARDVENDOR_ACTIVATE = 0x11F3, - SMSG_PLAY_SPELL_VISUAL = 0x11F4, + SMSG_PLAY_SPELL_VISUAL = 0x55A5, // 4.3.4 15595 CMSG_ZONEUPDATE = 0x11F5, SMSG_PARTYKILLLOG = 0x11F6, SMSG_COMPRESSED_UPDATE_OBJECT = 0x11F7, - SMSG_PLAY_SPELL_IMPACT = 0x11F8, SMSG_EXPLORATION_EXPERIENCE = 0x11F9, CMSG_GM_SET_SECURITY_GROUP = 0x11FA, CMSG_GM_NUKE = 0x11FB, @@ -774,7 +773,7 @@ enum Opcodes CMSG_REQUEST_RAID_INFO = 0x12CE, CMSG_MOVE_TIME_SKIPPED = 0x12CF, CMSG_MOVE_FEATHER_FALL_ACK = 0x12D0, - CMSG_MOVE_WATER_WALK_ACK = 0x12D1, + CMSG_MOVE_WATER_WALK_ACK = 0x3B00, // 4.3.4 15595 CMSG_MOVE_NOT_ACTIVE_MOVER = 0x12D2, SMSG_PLAY_SOUND = 0x12D3, CMSG_BATTLEFIELD_STATUS = 0x12D4, @@ -891,7 +890,7 @@ enum Opcodes MSG_MOVE_STOP_SWIM_CHEAT = 0x1343, SMSG_MOVE_SET_CAN_FLY = 0x3DA1, // 4.3.4 15595 SMSG_MOVE_UNSET_CAN_FLY = 0x15A2, // 4.3.4 15595 - CMSG_MOVE_SET_CAN_FLY_ACK = 0x1346, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x790C, // 4.3.4 15595 CMSG_MOVE_SET_FLY = 0x1347, CMSG_SOCKET_GEMS = 0x1348, CMSG_ARENA_TEAM_CREATE = 0x1349, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 03b2da894..0cc2c1153 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4418,16 +4418,23 @@ void Player::SetMovement(PlayerMovementType pType) WorldPacket data; switch (pType) { - case MOVE_ROOT: data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4); break; - case MOVE_UNROOT: data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4); break; - case MOVE_WATER_WALK: data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4); break; - case MOVE_LAND_WALK: data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4); break; + case MOVE_ROOT: + case MOVE_UNROOT: + { + BuildForceMoveRootPacket(&data, pType == MOVE_ROOT, 0); + break; + } + case MOVE_WATER_WALK: + case MOVE_LAND_WALK: + { + BuildMoveWaterWalkPacket(&data, pType == MOVE_WATER_WALK, 0); + break; + } default: sLog.outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.", pType); return; } - data << GetPackGUID(); - data << uint32(0); + GetSession()->SendPacket(&data); } @@ -20468,9 +20475,8 @@ void Player::SendInitialPacketsAfterAddToMap() // manual send package (have code in ApplyModifier(true,true); that don't must be re-applied. if (HasAuraType(SPELL_AURA_MOD_ROOT)) { - WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); - data2 << GetPackGUID(); - data2 << (uint32)2; + WorldPacket data2; + BuildForceMoveRootPacket(&data2, true, 2); SendMessageToSet(&data2, true); } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index d86fa4f03..3b41c73c6 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4544,9 +4544,9 @@ void Spell::SendPlaySpellVisual(uint32 SpellID) if (m_caster->GetTypeId() != TYPEID_PLAYER) return; - WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 8 + 4); - data << m_caster->GetObjectGuid(); - data << uint32(SpellID); // spell visual id? + WorldPacket data; + m_caster->BuildSendPlayVisualPacket(&data, SpellID, false); + ((Player*)m_caster)->GetSession()->SendPacket(&data); } diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 61aa04c09..9d9fa7370 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -3280,12 +3280,7 @@ void Aura::HandleAuraWaterWalk(bool apply, bool Real) return; WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_WATER_WALK, 8 + 4); - else - data.Initialize(SMSG_MOVE_LAND_WALK, 8 + 4); - data << GetTarget()->GetPackGUID(); - data << uint32(0); + GetTarget()->BuildMoveWaterWalkPacket(&data, apply, 0); GetTarget()->SendMessageToSet(&data, true); } @@ -4450,9 +4445,8 @@ void Aura::HandleAuraModStun(bool apply, bool Real) target->SetStandState(UNIT_STAND_STATE_STAND);// in 1.5 client } - WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8); - data << target->GetPackGUID(); - data << uint32(0); + WorldPacket data; + target->BuildForceMoveRootPacket(&data, true, 0); target->SendMessageToSet(&data, true); // Summon the Naj'entus Spine GameObject on target if spell is Impaling Spine @@ -4508,9 +4502,8 @@ void Aura::HandleAuraModStun(bool apply, bool Real) if (target->getVictim() && target->isAlive()) target->SetTargetGuid(target->getVictim()->GetObjectGuid()); - WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8 + 4); - data << target->GetPackGUID(); - data << uint32(0); + WorldPacket data; + target->BuildForceMoveRootPacket(&data, false, 0); target->SendMessageToSet(&data, true); } @@ -4742,9 +4735,8 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) if (target->GetTypeId() == TYPEID_PLAYER) { - WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); - data << target->GetPackGUID(); - data << (uint32)2; + WorldPacket data; + target->BuildForceMoveRootPacket(&data, true, 2); target->SendMessageToSet(&data, true); // Clear unit movement flags @@ -4791,9 +4783,8 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) if (target->GetTypeId() == TYPEID_PLAYER) { - WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10); - data << target->GetPackGUID(); - data << (uint32)2; + WorldPacket data; + target->BuildForceMoveRootPacket(&data, false, 2); target->SendMessageToSet(&data, true); } } @@ -4969,12 +4960,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real) if (m_modifier.m_auraname == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED) { WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); - else - data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); - data << target->GetPackGUID(); - data << uint32(0); // unknown + target->BuildMoveSetCanFlyPacket(&data, apply, 0); target->SendMessageToSet(&data, true); // Players on flying mounts must be immune to polymorph @@ -6886,12 +6872,7 @@ void Aura::HandleAuraAllowFlight(bool apply, bool Real) // allow fly WorldPacket data; - if (apply) - data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); - else - data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); - data << GetTarget()->GetPackGUID(); - data << uint32(0); // unk + GetTarget()->BuildMoveSetCanFlyPacket(&data, apply, 0); GetTarget()->SendMessageToSet(&data, true); } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 09c064757..cec12e745 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -246,6 +246,9 @@ void MovementInfo::Read(ByteBuffer& data, uint16 opcode) if (hasTransportData && si.hasTransportTime3) data >> fallTime; break; + case MSEMovementCounter: + data.read_skip(); + break; default: MANGOS_ASSERT(false && "Wrong movement status element"); break; @@ -427,6 +430,9 @@ void MovementInfo::Write(ByteBuffer& data, uint16 opcode) const if (hasTransportData && si.hasTransportTime3) data << uint32(fallTime); break; + case MSEMovementCounter: + data << uint32(0); + break; default: MANGOS_ASSERT(false && "Wrong movement status element"); break; @@ -11569,3 +11575,75 @@ bool Unit::IsSplineEnabled() const { return movespline->Initialized(); } + +void Unit::BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value) +{ + if (apply) + { + data->Initialize(SMSG_FORCE_MOVE_ROOT, 13); + data->WriteGuidMask<2, 7, 6, 0, 5, 4, 1, 3>(GetObjectGuid()); + data->WriteGuidBytes<1, 0, 2, 5>(GetObjectGuid()); + *data << uint32(value); + data->WriteGuidBytes<3, 4, 7, 6>(GetObjectGuid()); + } + else + { + data->Initialize(SMSG_FORCE_MOVE_UNROOT, 13); + data->WriteGuidMask<0, 1, 3, 7, 5, 2, 4, 6>(GetObjectGuid()); + data->WriteGuidBytes<3, 6, 1>(GetObjectGuid()); + *data << uint32(value); + data->WriteGuidBytes<2, 0, 7, 4, 5>(GetObjectGuid()); + } +} + +void Unit::BuildMoveSetCanFlyPacket(WorldPacket* data, bool apply, uint32 value) +{ + if (apply) + { + data->Initialize(SMSG_MOVE_SET_CAN_FLY, 13); + data->WriteGuidMask<1, 6, 5, 0, 7, 4, 2, 3>(GetObjectGuid()); + data->WriteGuidBytes<6, 3>(GetObjectGuid()); + *data << uint32(value); + data->WriteGuidBytes<2, 1, 4, 7, 0, 5>(GetObjectGuid()); + } + else + { + data->Initialize(SMSG_MOVE_UNSET_CAN_FLY, 13); + data->WriteGuidMask<1, 4, 2, 5, 0, 3, 6, 7>(GetObjectGuid()); + data->WriteGuidBytes<4, 6>(GetObjectGuid()); + *data << uint32(value); + data->WriteGuidBytes<1, 0, 2, 3, 5, 7>(GetObjectGuid()); + } +} + +void Unit::BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impact) +{ + data->Initialize(SMSG_PLAY_SPELL_VISUAL, 21); + *data << uint32(0); // unk, seems always 0 + *data << uint32(value); + *data << uint32(impact ? 1 : 0); + + data->WriteGuidMask<4, 7, 5, 3, 1, 2, 0, 6>(GetObjectGuid()); + data->WriteGuidBytes<0, 4, 1, 6, 7, 2, 3, 5>(GetObjectGuid()); +} + + +void Unit::BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value) +{ + if (apply) + { + data->Initialize(SMSG_MOVE_WATER_WALK, 13); + data->WriteGuidMask<4, 7, 6, 0, 1, 3, 5, 2>(GetObjectGuid()); + data->WriteGuidBytes<0, 5, 2>(GetObjectGuid()); + *data << uint32(value); + data->WriteGuidBytes<7, 3, 4, 1, 6>(GetObjectGuid()); + } + else + { + data->Initialize(SMSG_MOVE_LAND_WALK, 13); + data->WriteGuidMask<5, 1, 6, 2, 3, 4, 0, 7>(GetObjectGuid()); + data->WriteGuidBytes<6, 1, 7, 5, 4, 0, 3, 2>(GetObjectGuid()); + *data << uint32(value); + } +} + diff --git a/src/game/Unit.h b/src/game/Unit.h index 34d8b352c..2c8887140 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1955,6 +1955,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool IsSplineEnabled() const; + // Packet builders + void BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value); + void BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value); + void BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impact); + void BuildMoveSetCanFlyPacket(WorldPacket* data, bool apply, uint32 value); + protected: explicit Unit(); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 81ad956a3..e9d521be2 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "0066" + #define REVISION_NR "0067" #endif // __REVISION_NR_H__