diff options
Diffstat (limited to 'src/server/game/Handlers/MiscHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 64 |
1 files changed, 24 insertions, 40 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 64673eb3eb..a1c09fb47d 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -468,7 +468,7 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequ GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); } - GetPlayer()->SetRooted(true); + GetPlayer()->SetRooted(true, true, true); GetPlayer()->SetUnitFlag(UNIT_FLAG_STUNNED); } @@ -492,7 +492,7 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCance // not remove flags if can't free move - its not set in Logout request code. if (GetPlayer()->CanFreeMove()) { - GetPlayer()->SetRooted(false); + GetPlayer()->SetRooted(false, true, true); GetPlayer()->SetStandState(UNIT_STAND_STATE_STAND); GetPlayer()->RemoveUnitFlag(UNIT_FLAG_STUNNED); @@ -1138,45 +1138,18 @@ void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data) LOG_DEBUG("network", "Received whois command from player {} for character {}", GetPlayer()->GetName(), charname); } -void WorldSession::HandleComplainOpcode(WorldPacket& recv_data) +void WorldSession::HandleComplainOpcode(WorldPackets::Misc::Complain& packet) { LOG_DEBUG("network", "WORLD: CMSG_COMPLAIN"); - uint8 spam_type; // 0 - mail, 1 - chat - ObjectGuid spammer_guid; - uint32 unk1 = 0; - uint32 unk2 = 0; - uint32 unk3 = 0; - uint32 unk4 = 0; - std::string description = ""; - recv_data >> spam_type; // unk 0x01 const, may be spam type (mail/chat) - recv_data >> spammer_guid; // player guid - switch (spam_type) - { - case 0: - recv_data >> unk1; // const 0 - recv_data >> unk2; // probably mail id - recv_data >> unk3; // const 0 - break; - case 1: - recv_data >> unk1; // probably language - recv_data >> unk2; // message type? - recv_data >> unk3; // probably channel id - recv_data >> unk4; // unk random value - recv_data >> description; // spam description string (messagetype, channel name, player name, message) - break; - } - // NOTE: all chat messages from this spammer automatically ignored by spam reporter until logout in case chat spam. // if it's mail spam - ALL mails from this spammer automatically removed by client // Complaint Received message - WorldPacket data(SMSG_COMPLAIN_RESULT, 1); - data << uint8(0); - SendPacket(&data); + SendPacket(WorldPackets::Misc::ComplainResult().Write()); LOG_DEBUG("network", "REPORT SPAM: type {}, {}, unk1 {}, unk2 {}, unk3 {}, unk4 {}, message {}", - spam_type, spammer_guid.ToString(), unk1, unk2, unk3, unk4, description); + packet.SpamType, packet.SpammerGuid.ToString(), packet.Unk1, packet.Unk2, packet.Unk3, packet.Unk4, packet.Description); } void WorldSession::HandleRealmSplitOpcode(WorldPacket& recv_data) @@ -1517,6 +1490,8 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) { LOG_DEBUG("network", "WORLD: {}", GetOpcodeNameForLogging((Opcodes)recv_data.GetOpcode())); + Opcodes opcode = (Opcodes)recv_data.GetOpcode(); + ObjectGuid guid; uint32 counter; uint32 isApplied; @@ -1534,7 +1509,8 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) movementInfo.guid = guid; ReadMovementInfo(recv_data, &movementInfo); - recv_data >> isApplied; + if (opcode != CMSG_MOVE_GRAVITY_DISABLE_ACK && opcode != CMSG_MOVE_GRAVITY_ENABLE_ACK) + recv_data >> isApplied; sScriptMgr->AnticheatSetCanFlybyServer(_player, movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)); @@ -1543,6 +1519,19 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) mover->m_movementInfo.flags = movementInfo.GetMovementFlags(); + // old map - async processing, ignore + if (counter <= _player->GetMapChangeOrderCounter()) + return; + + if (!ProcessMovementInfo(movementInfo, mover, plrMover, recv_data)) + { + recv_data.rfinish(); // prevent warnings spam + return; + } + + if (_player->GetPendingFlightChange() == counter && opcode == CMSG_MOVE_SET_CAN_FLY_ACK) + _player->SetPendingFlightChange(false); + Opcodes response; switch (recv_data.GetOpcode()) @@ -1551,17 +1540,12 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) case CMSG_MOVE_FEATHER_FALL_ACK: response = MSG_MOVE_FEATHER_FALL; break; case CMSG_MOVE_WATER_WALK_ACK: response = MSG_MOVE_WATER_WALK; break; case CMSG_MOVE_SET_CAN_FLY_ACK: response = MSG_MOVE_UPDATE_CAN_FLY; break; + case CMSG_MOVE_GRAVITY_DISABLE_ACK: response = MSG_MOVE_GRAVITY_CHNG; break; + case CMSG_MOVE_GRAVITY_ENABLE_ACK: response = MSG_MOVE_GRAVITY_CHNG; break; default: return; } - if (!ProcessMovementInfo(movementInfo, mover, plrMover, recv_data)) - { - recv_data.rfinish(); // prevent warnings spam - return; - } - WorldPacket data(response, 8); - data << guid.WriteAsPacked(); WriteMovementInfo(&data, &movementInfo); _player->m_mover->SendMessageToSet(&data, _player); } |
