diff options
author | Shauren <shauren.trinity@gmail.com> | 2013-03-15 20:09:48 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2013-03-15 20:09:48 +0100 |
commit | e58e05d9d5da894447b81ded17c3b8fd9f4820a8 (patch) | |
tree | e41b9ed702da6dc1063e8bddd0f270c2d47f0d7b /src/server/game/Handlers/MovementHandler.cpp | |
parent | 51b9e6d2c947d2151af09d7a25af45ff75b0d530 (diff) | |
parent | 11846f5990f5af421ff2fc087925245f61b4ac84 (diff) |
Merge branch '4.3.4' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/game/Handlers/MovementHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 160 |
1 files changed, 91 insertions, 69 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 6f1c2a30d5e..d4ba2ec7b7b 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -31,7 +31,7 @@ #include "InstanceSaveMgr.h" #include "ObjectMgr.h" -void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleMoveWorldportAckOpcode(WorldPacket& /*recvPacket*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: got MSG_MOVE_WORLDPORT_ACK."); HandleMoveWorldportAckOpcode(); @@ -188,16 +188,33 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData) +void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "MSG_MOVE_TELEPORT_ACK"); - uint64 guid; - - recvData.readPackGUID(guid); + ObjectGuid guid; uint32 flags, time; - recvData >> flags >> time; - sLog->outDebug(LOG_FILTER_NETWORKIO, "Guid " UI64FMTD, guid); + recvPacket >> flags >> time; + + guid[5] = recvPacket.ReadBit(); + guid[0] = recvPacket.ReadBit(); + guid[1] = recvPacket.ReadBit(); + guid[6] = recvPacket.ReadBit(); + guid[3] = recvPacket.ReadBit(); + guid[7] = recvPacket.ReadBit(); + guid[2] = recvPacket.ReadBit(); + guid[4] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guid[4]); + recvPacket.ReadByteSeq(guid[2]); + recvPacket.ReadByteSeq(guid[7]); + recvPacket.ReadByteSeq(guid[6]); + recvPacket.ReadByteSeq(guid[5]); + recvPacket.ReadByteSeq(guid[1]); + recvPacket.ReadByteSeq(guid[3]); + recvPacket.ReadByteSeq(guid[0]); + + sLog->outDebug(LOG_FILTER_NETWORKIO, "Guid " UI64FMTD, uint64(guid)); sLog->outDebug(LOG_FILTER_NETWORKIO, "Flags %u, time %u", flags, time/IN_MILLISECONDS); Player* plMover = _player->m_mover->ToPlayer(); @@ -239,9 +256,9 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData) GetPlayer()->ProcessDelayedOperations(); } -void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) +void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) { - uint16 opcode = recvData.GetOpcode(); + uint16 opcode = recvPacket.GetOpcode(); Unit* mover = _player->m_mover; @@ -252,46 +269,41 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck if (plrMover && plrMover->IsBeingTeleported()) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } /* extract packet */ - uint64 guid; - - recvData.readPackGUID(guid); - MovementInfo movementInfo; - movementInfo.guid = guid; - ReadMovementInfo(recvData, &movementInfo); - - recvData.rfinish(); // prevent warnings spam + GetPlayer()->ReadMovementInfo(recvPacket, &movementInfo); // prevent tampered movement data - if (guid != mover->GetGUID()) + if (movementInfo.guid != mover->GetGUID()) + { + sLog->outError(LOG_FILTER_NETWORKIO, "HandleMovementOpcodes: guid error"); return; - + } if (!movementInfo.pos.IsPositionValid()) { - recvData.rfinish(); // prevent warnings spam + sLog->outError(LOG_FILTER_NETWORKIO, "HandleMovementOpcodes: Invalid Position"); return; } /* handle special cases */ - if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) + if (movementInfo.t_guid) { // transports size limited // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) if (movementInfo.t_pos.GetPositionX() > 50 || movementInfo.t_pos.GetPositionY() > 50 || movementInfo.t_pos.GetPositionZ() > 50) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.t_pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.t_pos.GetPositionY(), movementInfo.pos.GetPositionZ() + movementInfo.t_pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.t_pos.GetOrientation())) { - recvData.rfinish(); // prevent warnings spam + recvPacket.rfinish(); // prevent warnings spam return; } @@ -340,7 +352,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) { GameObject* go = mover->GetMap()->GetGameObject(movementInfo.t_guid); if (!go || go->GetGoType() != GAMEOBJECT_TYPE_TRANSPORT) - movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; + movementInfo.t_guid = 0; } } else if (plrMover && plrMover->GetTransport()) // if we were on a transport, leave @@ -362,17 +374,16 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) plrMover->SetInWater(!plrMover->IsInWater() || plrMover->GetBaseMap()->IsUnderWater(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ())); } - /*----------------------*/ - - /* process position-change */ - WorldPacket data(opcode, recvData.size()); movementInfo.time = getMSTime(); movementInfo.guid = mover->GetGUID(); - WriteMovementInfo(&data, &movementInfo); - mover->SendMessageToSet(&data, _player); - mover->m_movementInfo = movementInfo; + /*----------------------*/ + /* process position-change */ + WorldPacket data(SMSG_PLAYER_MOVE, recvPacket.size()); + _player->WriteMovementInfo(data); + mover->SendMessageToSet(&data, _player); + // this is almost never true (not sure why it is sometimes, but it is), normally use mover->IsVehicle() if (mover->GetVehicle()) { @@ -386,7 +397,9 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) { plrMover->UpdateFallInformationIfNeed(movementInfo, opcode); - if (movementInfo.pos.GetPositionZ() < -500.0f) + AreaTableEntry const* zone = GetAreaEntryByAreaID(plrMover->GetAreaId()); + float depth = zone ? zone->MaxDepth : -500.0f; + if (movementInfo.pos.GetPositionZ() < depth) { if (!(plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player))) { @@ -410,7 +423,6 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) { uint32 opcode = recvData.GetOpcode(); - sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); /* extract packet */ uint64 guid; @@ -432,7 +444,7 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) MovementInfo movementInfo; movementInfo.guid = guid; - ReadMovementInfo(recvData, &movementInfo); + GetPlayer()->ReadMovementInfo(recvData, &movementInfo); recvData >> newspeed; /*----------------*/ @@ -444,21 +456,25 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" }; + /* switch (opcode) { - case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; - case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; - case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; - case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; - case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; - case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; - case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; - case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; - case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; + //case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; + //case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; + //case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; + //case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; + //case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; + //case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; + //case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; + //case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; + //case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; default: sLog->outError(LOG_FILTER_NETWORKIO, "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; } + */ + sLog->outError(LOG_FILTER_NETWORKIO, "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); + return; // skip all forced speed changes except last and unexpected // in run/mounted case used one ACK and it must be skipped.m_forced_speed_changes[MOVE_RUN} store both. @@ -486,17 +502,34 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) } } -void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recvData) +void WorldSession::HandleSetActiveMoverOpcode(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_SET_ACTIVE_MOVER"); - uint64 guid; - recvData >> guid; + ObjectGuid guid; + + guid[7] = recvPacket.ReadBit(); + guid[2] = recvPacket.ReadBit(); + guid[1] = recvPacket.ReadBit(); + guid[0] = recvPacket.ReadBit(); + guid[4] = recvPacket.ReadBit(); + guid[5] = recvPacket.ReadBit(); + guid[6] = recvPacket.ReadBit(); + guid[3] = recvPacket.ReadBit(); + + recvPacket.ReadByteSeq(guid[3]); + recvPacket.ReadByteSeq(guid[2]); + recvPacket.ReadByteSeq(guid[4]); + recvPacket.ReadByteSeq(guid[0]); + recvPacket.ReadByteSeq(guid[5]); + recvPacket.ReadByteSeq(guid[1]); + recvPacket.ReadByteSeq(guid[6]); + recvPacket.ReadByteSeq(guid[7]); if (GetPlayer()->IsInWorld()) { if (_player->m_mover->GetGUID() != guid) - sLog->outError(LOG_FILTER_NETWORKIO, "HandleSetActiveMoverOpcode: incorrect mover guid: mover is " UI64FMTD " (%s - Entry: %u) and should be " UI64FMTD, guid, GetLogNameForGuid(guid), GUID_ENPART(guid), _player->m_mover->GetGUID()); + sLog->outError(LOG_FILTER_NETWORKIO, "HandleSetActiveMoverOpcode: incorrect mover guid: mover is " UI64FMTD " (%s - Entry: %u) and should be " UI64FMTD, uint64(guid), GetLogNameForGuid(guid), GUID_ENPART(guid), _player->m_mover->GetGUID()); } } @@ -504,14 +537,8 @@ void WorldSession::HandleMoveNotActiveMover(WorldPacket &recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER"); - uint64 old_mover_guid; - recvData.readPackGUID(old_mover_guid); - MovementInfo mi; - ReadMovementInfo(recvData, &mi); - - mi.guid = old_mover_guid; - + GetPlayer()->ReadMovementInfo(recvData, &mi); _player->m_movementInfo = mi; } @@ -527,21 +554,16 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket& recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_KNOCK_BACK_ACK"); - uint64 guid; - recvData.readPackGUID(guid); + MovementInfo movementInfo; + GetPlayer()->ReadMovementInfo(recvData, &movementInfo); - if (_player->m_mover->GetGUID() != guid) + if (_player->m_mover->GetGUID() != movementInfo.guid) return; - recvData.read_skip<uint32>(); // unk - - MovementInfo movementInfo; - ReadMovementInfo(recvData, &movementInfo); - _player->m_movementInfo = movementInfo; - WorldPacket data(MSG_MOVE_KNOCK_BACK, 66); - data.appendPackGUID(guid); + WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, 66); + data.appendPackGUID(movementInfo.guid); _player->BuildMovementPacket(&data); // knockback specific info @@ -563,7 +585,7 @@ void WorldSession::HandleMoveHoverAck(WorldPacket& recvData) recvData.read_skip<uint32>(); // unk MovementInfo movementInfo; - ReadMovementInfo(recvData, &movementInfo); + GetPlayer()->ReadMovementInfo(recvData, &movementInfo); recvData.read_skip<uint32>(); // unk2 } @@ -578,7 +600,7 @@ void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recvData) recvData.read_skip<uint32>(); // unk MovementInfo movementInfo; - ReadMovementInfo(recvData, &movementInfo); + GetPlayer()->ReadMovementInfo(recvData, &movementInfo); recvData.read_skip<uint32>(); // unk2 } @@ -588,9 +610,9 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recvData) if (!_player->isAlive() || _player->isInCombat()) return; - uint64 summoner_guid; + uint64 summonerGuid; bool agree; - recvData >> summoner_guid; + recvData >> summonerGuid; recvData >> agree; _player->SummonIfPossible(agree); |