111 lines
3.1 KiB
C++
111 lines
3.1 KiB
C++
#include "pch.h"
|
|
#include "Log.h"
|
|
#include "l2c_utils.h"
|
|
#include "net/GameClient/GameClient.h"
|
|
#include "ClientPacketHandler.h"
|
|
#include "ServerPackets.h"
|
|
#include "GS.h"
|
|
|
|
ClientPacketHandler::ClientPacketHandler( GameClient *cl )
|
|
{
|
|
m_cl = cl;
|
|
}
|
|
|
|
ClientPacketHandler::~ClientPacketHandler()
|
|
{
|
|
m_cl = NULL;
|
|
}
|
|
|
|
void ClientPacketHandler::handlePacket( L2GamePacket *pack )
|
|
{
|
|
L2GamePacket *reply = NULL;
|
|
unsigned char opcode = pack->getByteAt(2);
|
|
|
|
switch( m_cl->getState() )
|
|
{
|
|
case CLIENT_STATE_CONNECTED:
|
|
{
|
|
switch( opcode )
|
|
{
|
|
case 0x0E: reply = ProtocolVersion( pack ); break;
|
|
case 0x2B: reply = AuthLogin( pack ); break;
|
|
default: invalidPacket( pack, opcode, 0 ); break;
|
|
}
|
|
} break;
|
|
case CLIENT_STATE_AUTHED:
|
|
{
|
|
switch( opcode )
|
|
{
|
|
case 0x00: reply = Logout( pack ); break;
|
|
case 0x0C: reply = CharacterCreate( pack ); break;
|
|
case 0x12: reply = CharacterSelect( pack ); break;
|
|
case 0x13: reply = NewCharacter( pack ); break;
|
|
case 0xD0:
|
|
{
|
|
unsigned int opcode2 = pack->getByteAt(3) | (pack->getByteAt(4) << 8);
|
|
switch( opcode2 )
|
|
{
|
|
case 0x0036: reply = RequestGotoLobby( pack ); break;
|
|
default: invalidPacket( pack, opcode, opcode2 ); break;
|
|
}
|
|
} break;
|
|
default: invalidPacket( pack, opcode, 0 ); break;
|
|
}
|
|
} break;
|
|
case CLIENT_STATE_IN_GAME:
|
|
{
|
|
switch( opcode )
|
|
{
|
|
case 0x00: reply = Logout( pack ); break;
|
|
case 0xD0:
|
|
{
|
|
unsigned int opcode2 = pack->getByteAt(3) | (pack->getByteAt(4) << 8);
|
|
switch( opcode2 )
|
|
{
|
|
case 0x0001: break; // RequestManorList
|
|
default: invalidPacket( pack, opcode, opcode2 ); break;
|
|
}
|
|
} break;
|
|
default: invalidPacket( pack, opcode, 0 ); break;
|
|
}
|
|
} break;
|
|
}
|
|
|
|
if( reply )
|
|
{
|
|
m_cl->sendPacket( reply, true ); // true - delete reply immediately
|
|
}
|
|
}
|
|
|
|
void ClientPacketHandler::invalidPacket( L2GamePacket *p, unsigned int opcode, unsigned int opcode2 )
|
|
{
|
|
unsigned int plen = p->getPacketSize();
|
|
unsigned char *buf = (unsigned char *)p->getBytesPtr();
|
|
ClientState st = m_cl->getState();
|
|
wchar_t sn[32] = {0};
|
|
wcscpy( sn, L"Unknown" );
|
|
switch( st )
|
|
{
|
|
case CLIENT_STATE_OFFLINE: wcscpy( sn, L"OFFLINE" ); break;
|
|
case CLIENT_STATE_CONNECTED: wcscpy( sn, L"CONNECTED" ); break;
|
|
case CLIENT_STATE_AUTHED: wcscpy( sn, L"AUTHED" ); break;
|
|
case CLIENT_STATE_IN_GAME: wcscpy( sn, L"IN_GAME" ); break;
|
|
}
|
|
if( opcode2 == 0 )
|
|
LogWarning( L"%s: Invalid packet 0x%02X (len %u) in state: [%s]", m_cl->toString(), opcode, plen, sn );
|
|
else
|
|
LogWarning( L"%s: Invalid packet 0x%02X:%04X (len %u) in state: [%s]", m_cl->toString(), opcode, opcode2, plen, sn );
|
|
unsigned int i = 0;
|
|
while( i < plen )
|
|
{
|
|
wchar_t str[32] = {0};
|
|
swprintf( str, 32, L"%02X ", buf[i] );
|
|
LogFull( false, false, RGB(200,200,200), RGB(0,0,0), str );
|
|
if( i>0 && (i%16 == 0) ) LogFull( false, true, RGB(200,200,200), RGB(0,0,0), L"" );
|
|
i++;
|
|
}
|
|
LogFull( false, true, RGB(128,0,0), RGB(255,255,255), L"" );
|
|
LogFull( false, true, RGB(128,0,0), RGB(255,255,255), L"dump end" );
|
|
}
|
|
|