From 6ced2e979deeee3e3d8b4484d82e0f9a6b451974 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 22 Aug 2009 04:44:51 +0400 Subject: [PATCH] [8403] Fixed cast spell opcode parsing for some cases with additional data. --- src/game/MovementHandler.cpp | 9 +++++++++ src/game/SpellHandler.cpp | 20 ++++++++++++++++++++ src/shared/revision_nr.h | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 7b680d18c..b43eb2a8c 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -234,7 +234,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } if (!MaNGOS::IsValidMapCoord(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o)) + { + recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; + } /* handle special cases */ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) @@ -242,11 +245,17 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) // 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_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 50 ) + { + recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; + } if( !MaNGOS::IsValidMapCoord(movementInfo.x+movementInfo.t_x, movementInfo.y + movementInfo.t_y, movementInfo.z + movementInfo.t_z, movementInfo.o + movementInfo.t_o) ) + { + recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; + } // if we boarded a transport, add us to it if (plMover && !plMover->m_transport) diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp index 41d752315..2112325f2 100644 --- a/src/game/SpellHandler.cpp +++ b/src/game/SpellHandler.cpp @@ -289,7 +289,10 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // ignore for remote control state (for player case) Unit* mover = _player->m_mover; if(mover != _player && mover->GetTypeId()==TYPEID_PLAYER) + { + recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; + } sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u, unk_flags %u, data length = %i", spellId, cast_count, unk_flags, (uint32)recvPacket.size()); @@ -299,6 +302,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if(!spellInfo) { sLog.outError("WORLD: unknown spell id %u", spellId); + recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; } @@ -308,6 +312,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (!((Player*)mover)->HasActiveSpell (spellId) || IsPassiveSpell(spellId) ) { //cheater? kick? ban? + recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; } } @@ -317,6 +322,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) if (!((Creature*)mover)->HasSpell(spellId) || IsPassiveSpell(spellId) ) { //cheater? kick? ban? + recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; } } @@ -324,7 +330,21 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // client provided targets SpellCastTargets targets; if(!targets.read(&recvPacket,mover)) + { + recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; + } + + // some spell cast packet including more data (for projectiles?) + if (unk_flags & 0x02) + { + recvPacket.read_skip(); // unk1, coords? + recvPacket.read_skip(); // unk1, coords? + recvPacket.read_skip(); // >> 1 + recvPacket.read_skip(); // >> MSG_MOVE_STOP + MovementInfo movementInfo; + ReadMovementInfo(recvPacket, &movementInfo); + } // auto-selection buff level base at target level (in spellInfo) if(targets.getUnitTarget()) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a835f52e0..618f39f34 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 "8402" + #define REVISION_NR "8403" #endif // __REVISION_NR_H__