From c87cca2d2134b7164bba743010db6d9466730c61 Mon Sep 17 00:00:00 2001 From: Olion Date: Sun, 2 Jul 2017 15:59:13 +0300 Subject: [PATCH] CMSG_MOVE_SET_RAW_POSITION handling. ToDo: use also MSG_MOVE_SET_RAW_POSITION_ACK. --- src/game/Server/Opcodes.cpp | 12 ++++++------ src/game/Server/WorldSession.h | 1 + src/game/WorldHandlers/MiscHandler.cpp | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index 907d5ae8..3114363c 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -123,7 +123,7 @@ void Opcodes::BuildOpcodeList() /*0x03C*/ StoreOpcode(SMSG_CHAR_DELETE, "SMSG_CHAR_DELETE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x03D*/ StoreOpcode(CMSG_PLAYER_LOGIN, "CMSG_PLAYER_LOGIN", STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandlePlayerLoginOpcode); /*[-ZERO] Need check */ /*0x03E*/ StoreOpcode(SMSG_NEW_WORLD, "SMSG_NEW_WORLD", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x03F*/ StoreOpcode(SMSG_TRANSFER_PENDING, "SMSG_TRANSFER_PENDING", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x03F*/ StoreOpcode(SMSG_TRANSFER_PENDING, "SMSG_TRANSFER_PENDING", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x040*/ StoreOpcode(SMSG_TRANSFER_ABORTED, "SMSG_TRANSFER_ABORTED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x041*/ StoreOpcode(SMSG_CHARACTER_LOGIN_FAILED, "SMSG_CHARACTER_LOGIN_FAILED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x042*/ StoreOpcode(SMSG_LOGIN_SETTIMESPEED, "SMSG_LOGIN_SETTIMESPEED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); @@ -285,7 +285,7 @@ void Opcodes::BuildOpcodeList() /*0x0DE*/ StoreOpcode(SMSG_MOVE_WATER_WALK, "SMSG_MOVE_WATER_WALK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x0DF*/ StoreOpcode(SMSG_MOVE_LAND_WALK, "SMSG_MOVE_LAND_WALK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x0E0*/ StoreOpcode(MSG_MOVE_SET_RAW_POSITION_ACK, "MSG_MOVE_SET_RAW_POSITION_ACK", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL); - /*0x0E1*/ StoreOpcode(CMSG_MOVE_SET_RAW_POSITION, "CMSG_MOVE_SET_RAW_POSITION", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL); + /*0x0E1*/ StoreOpcode(CMSG_MOVE_SET_RAW_POSITION, "CMSG_MOVE_SET_RAW_POSITION", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveSetRawPosition); /*0x0E2*/ StoreOpcode(SMSG_FORCE_RUN_SPEED_CHANGE, "SMSG_FORCE_RUN_SPEED_CHANGE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x0E3*/ StoreOpcode(CMSG_FORCE_RUN_SPEED_CHANGE_ACK, "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAckOpcodes); /*0x0E4*/ StoreOpcode(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); @@ -519,9 +519,9 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x1C8*/ StoreOpcode(SMSG_FISH_NOT_HOOKED, "SMSG_FISH_NOT_HOOKED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x1C9*/ StoreOpcode(SMSG_FISH_ESCAPED, "SMSG_FISH_ESCAPED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x1CA*/ StoreOpcode(CMSG_BUG, "CMSG_BUG", STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleBugOpcode); - /*[-ZERO] Need check */ /*0x1CB*/ StoreOpcode(SMSG_NOTIFICATION, "SMSG_NOTIFICATION", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x1CB*/ StoreOpcode(SMSG_NOTIFICATION, "SMSG_NOTIFICATION", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x1CC*/ StoreOpcode(CMSG_PLAYED_TIME, "CMSG_PLAYED_TIME", STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandlePlayedTime); - /*[-ZERO] Need check */ /*0x1CD*/ StoreOpcode(SMSG_PLAYED_TIME, "SMSG_PLAYED_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x1CD*/ StoreOpcode(SMSG_PLAYED_TIME, "SMSG_PLAYED_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x1CE*/ StoreOpcode(CMSG_QUERY_TIME, "CMSG_QUERY_TIME", STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleQueryTimeOpcode); /*[-ZERO] Need check */ /*0x1CF*/ StoreOpcode(SMSG_QUERY_TIME_RESPONSE, "SMSG_QUERY_TIME_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x1D0*/ StoreOpcode(SMSG_LOG_XPGAIN, "SMSG_LOG_XPGAIN", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); @@ -755,8 +755,8 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x2B6*/ StoreOpcode(SMSG_SCRIPT_MESSAGE, "SMSG_SCRIPT_MESSAGE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x2B7*/ StoreOpcode(SMSG_DUEL_COUNTDOWN, "SMSG_DUEL_COUNTDOWN", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2B8*/ StoreOpcode(SMSG_AREA_TRIGGER_MESSAGE, "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x2B9*/ StoreOpcode(CMSG_TOGGLE_HELM, "CMSG_TOGGLE_HELM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingHelmOpcode); - /*[-ZERO] Need check */ /*0x2BA*/ StoreOpcode(CMSG_TOGGLE_CLOAK, "CMSG_TOGGLE_CLOAK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingCloakOpcode); + /*0x2B9*/ StoreOpcode(CMSG_TOGGLE_HELM, "CMSG_TOGGLE_HELM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingHelmOpcode); + /*0x2BA*/ StoreOpcode(CMSG_TOGGLE_CLOAK, "CMSG_TOGGLE_CLOAK", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingCloakOpcode); /*0x2BB*/ StoreOpcode(SMSG_MEETINGSTONE_JOINFAILED, "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2BC*/ StoreOpcode(SMSG_PLAYER_SKINNED, "SMSG_PLAYER_SKINNED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2BD*/ StoreOpcode(SMSG_DURABILITY_DAMAGE_DEATH, "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); diff --git a/src/game/Server/WorldSession.h b/src/game/Server/WorldSession.h index 8fe32005..4a9f76b5 100644 --- a/src/game/Server/WorldSession.h +++ b/src/game/Server/WorldSession.h @@ -709,6 +709,7 @@ class WorldSession void HandleWardenDataOpcode(WorldPacket& recv_data); void HandleWorldTeleportOpcode(WorldPacket& recv_data); + void HandleMoveSetRawPosition(WorldPacket& recv_data); void HandleMinimapPingOpcode(WorldPacket& recv_data); void HandleRandomRollOpcode(WorldPacket& recv_data); void HandleFarSightOpcode(WorldPacket& recv_data); diff --git a/src/game/WorldHandlers/MiscHandler.cpp b/src/game/WorldHandlers/MiscHandler.cpp index cff9c02d..065a7362 100644 --- a/src/game/WorldHandlers/MiscHandler.cpp +++ b/src/game/WorldHandlers/MiscHandler.cpp @@ -1065,6 +1065,27 @@ void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recv_data) { SendNotification(LANG_YOU_NOT_HAVE_PERMISSION); } } +void WorldSession::HandleMoveSetRawPosition(WorldPacket& recv_data) +{ + DEBUG_LOG("WORLD: Received opcode CMSG_MOVE_SET_RAW_POSITION from %s", GetPlayer()->GetGuidStr().c_str()); + // write in client console: setrawpos x y z o + // For now, it is implemented like worldport but on the same map. Consider using MSG_MOVE_SET_RAW_POSITION_ACK. + float PosX, PosY, PosZ, PosO; + recv_data >> PosX >> PosY >> PosZ >> PosO; + //DEBUG_LOG("Set to: X=%f, Y=%f, Z=%f, orient=%f", PosX, PosY, PosZ, PosO); + + if (!GetPlayer()->IsInWorld() || GetPlayer()->IsTaxiFlying()) + { + DEBUG_LOG("Player '%s' (GUID: %u) in a transfer, ignore setrawpos command.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); + return; + } + + if (GetSecurity() >= SEC_ADMINISTRATOR) + { GetPlayer()->TeleportTo(GetPlayer()->GetMapId(), PosX, PosY, PosZ, PosO); } + else + { SendNotification(LANG_YOU_NOT_HAVE_PERMISSION); } +} + void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received opcode CMSG_WHOIS");