Core/Packets: Added utility class for handlers using new packet classes

This commit is contained in:
Shauren
2014-11-03 02:11:15 +01:00
parent e797133b0c
commit 839166eddf
3 changed files with 773 additions and 736 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,7 @@ enum OpcodeMisc : uint32
MAX_OPCODE = 0x1FFF,
NUM_OPCODE_HANDLERS = (MAX_OPCODE + 1),
UNKNOWN_OPCODE = (0xFFFF + 1),
NULL_OPCODE = 0
NULL_OPCODE = 0xBADD
};
// CMSGs 6.0.3.19103
@@ -1431,21 +1431,22 @@ class WorldSession;
class WorldPacket;
class WorldSession;
typedef void(WorldSession::*pOpcodeHandler)(WorldPacket& recvPacket);
#if defined(__GNUC__)
#pragma pack(1)
#else
#pragma pack(push, 1)
#endif
struct OpcodeHandler
class OpcodeHandler
{
OpcodeHandler() {}
OpcodeHandler(char const* _name, SessionStatus _status, PacketProcessing _processing, pOpcodeHandler _handler)
: Handler(_handler), Name(_name), Status(_status), ProcessingPlace(_processing) {}
public:
OpcodeHandler(char const* _name, SessionStatus _status, PacketProcessing _processing)
: Name(_name), Status(_status), ProcessingPlace(_processing) { }
virtual ~OpcodeHandler() { }
virtual void Call(WorldSession* session, WorldPacket& packet) const = 0;
pOpcodeHandler Handler;
char const* Name;
SessionStatus Status;
PacketProcessing ProcessingPlace;
@@ -1485,11 +1486,10 @@ class OpcodeTable
}
private:
template<bool isInValidRange>
void ValidateAndSetOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing, pOpcodeHandler handler);
template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)>
void ValidateAndSetOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing);
template<bool isInValidRange>
void ValidateAndSetOpcode(OpcodeServer opcode, char const* name, SessionStatus status, PacketProcessing processing, pOpcodeHandler handler);
void ValidateAndSetOpcode(OpcodeServer opcode, char const* name, SessionStatus status);
OpcodeHandler* _internalTableClient[NUM_OPCODE_HANDLERS];
OpcodeHandler* _internalTableServer[NUM_OPCODE_HANDLERS];

View File

@@ -380,7 +380,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
else if (_player->IsInWorld())
{
sScriptMgr->OnPacketReceive(this, *packet);
(this->*opHandle->Handler)(*packet);
opHandle->Call(this, *packet);
LogUnprocessedTail(packet);
}
// lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer
@@ -393,7 +393,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
{
// not expected _player or must checked in packet hanlder
sScriptMgr->OnPacketReceive(this, *packet);
(this->*opHandle->Handler)(*packet);
opHandle->Call(this, *packet);
LogUnprocessedTail(packet);
}
break;
@@ -405,7 +405,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
else
{
sScriptMgr->OnPacketReceive(this, *packet);
(this->*opHandle->Handler)(*packet);
opHandle->Call(this, *packet);
LogUnprocessedTail(packet);
}
break;
@@ -423,7 +423,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
m_playerRecentlyLogout = false;
sScriptMgr->OnPacketReceive(this, *packet);
(this->*opHandle->Handler)(*packet);
opHandle->Call(this, *packet);
LogUnprocessedTail(packet);
break;
case STATUS_NEVER: