?? packets.cpp
字號:
/* by My Destiny Team */
#include "basedef.h"
#include "packets.h"
#include "server.h"// Funcoes para o tratamento dos pacotes
cPacket Packet;
// Buffer para escrita dos pacoteschar buf[8192];
cPacket::cPacket()
{
}
cPacket::~cPacket()
{
}
// Verifica e executa o pacote enviado pelo client
void cPacket::ClientControl(sSocket &sSock, pHeader *pServer)
{ cClient *Client = (cClient*)List.Get(sSock.clientID); if(Client == NULL && pServer->opCode != 0x20D) { /* Client Invalido */ Log(WARN, "check INVALID CLIENT: clientID = %d", sSock.clientID); return ; }
switch(pServer->opCode)
{
case 0x020D: /* Login Packet */ break; case 0x03A0: Log(INFO, "Ping..."); /* Ping */ break; // Pacotes da Database case 0x020F: RequestCreateChar(Client, sSock, (u8*)pServer); break; case 0x0211: RequestDeleteChar(Client, sSock, (u8*)pServer); break; case 0x0213: RequestEnterGame(Client, sSock, (u8*)pServer); break; case 0x0215: RequestReturnCharList(Client, sSock, (u8*)pServer); break;
default: Log(INFO, "[ClientControl] Unknown Packet 0x%03X.",
pServer->opCode); break;
}
}
// Verifica e executa o pacote enviado pela databasevoid cPacket::DBControl(sSocket &sSock, pHeader *pServer){ if(pServer->clientID != INVALID_ID) { // ID valido cClient *Client = (cClient*)List.Get(pServer->clientID); if(Client == NULL) { // Client Invalido Log(WARN, "check INVALID CLIENT: clientID = %d", pServer->clientID); return ; } // Atualiza a informacao do client Client->qDataServ = false; // Pacotes que sao para os clients switch(pServer->opCode) { case 0x002: RequestMessage(sSock, Client, (pGS_2h*)pServer); break; case 0x003: RequestDisconnectClient(sSock, (pGS_3h*)pServer); break; case 0x004: RequestAccount(sSock, Client, (pGS_4h*)pServer); break; case 0x005: RequestCharList(sSock, Client, (pGS_5h*)pServer); break; case 0x006: RequestCharacter(sSock, Client, (pGS_6h*)pServer); break; default: Log(NORMAL, "[DBControl] Unknown Packet 0x%03X.", pServer->opCode); break; } } else { // Pacote utilizado somente para o servidor switch(pServer->opCode) { case 0x001: RequestLog(sSock, (pGS_1h*)pServer); break; default: Log(NORMAL, "[DBControl] Unknown Packet 0x%03X.", pServer->opCode); break; } }}/** Pacotes enviados pelo client**/// Pacote para o login do client
void cPacket::RequestLogin(cClient *Client, sSocket &sSock, pCL_20Dh *pServer)
{ if(Client->qDataServ) { // Client ja enviou o pedido de login SendServerMessage(sSock, Server.GetMessage(DATABASEQUERY)); } else if(pServer->cliVer < CLIENT_VERSION) { // Client Invalido SendServerMessage(sSock, Server.GetMessage(WRONGCLIENT)); } else { // Header pDB_3h *pPacket = (pDB_3h*)pak; pPacket->Header.packetSize = sizeof(pDB_3h); pPacket->Header.opCode = 0x003; pPacket->Header.clientID = sSock.clientID; // Nome e senha do client strncpy(pPacket->username, pServer->userName, 16); strncpy(pPacket->password, pServer->passWord, 12); // Envia o pacote cClient::Send(Server.GetDatabaseSocket(), pak, len); // Atualiza a informacao do client Client->qDataServ = true; return ; } Server.DeleteSocket(sSock);
}
// Pacote para a criacao do personagemvoid cPacket::RequestCreateChar(cClient *Client, sSocket &sSock, u8 *pServer){ if(Client->qDataServ) { // Client ja enviou um pedido para criar um personagem SendServerMessage(sSock, Server.GetMessage(DATABASEQUERY)); return ; } // Header pDB_5h *pPacket = (pDB_5h*)pak; pPacket->Header.packetSize = sizeof(pDB_5h); pPacket->Header.opCode = 0x005; pPacket->Header.clientID = sSock.clientID; // Posicao do personagem pPacket->charindex = GetInt(12); // Informacoes dos personagens pPacket->charinfo = Client->Account.Info.Flag.CharInfo; // Nome do usuario strncpy(pPacket->username, Client->Account.Username, 16); // Nome do personagem strncpy(pPacket->charname, ptr(16), 16); // Classe do personagem pPacket->charclass = GetInt(32); // Envia o pacote cClient::Send(Server.GetDatabaseSocket(), pak, len); // Atualiza a informacao do client Client->qDataServ = true;}// Envia o pedido para a database, para apagar o personagemvoid cPacket::RequestDeleteChar(cClient *Client, sSocket &sSock, u8 *pServer){ if(Client->qDataServ) { // Client ja enviou um pedido para deletar SendServerMessage(sSock, Server.GetMessage(DATABASEQUERY)); return ; } else if(strcmp(ptr(32), Client->Account.Password) != 0) { // Client errou a senha SendServerMessage(sSock, Server.GetMessage(INVALIDPASSWORD)); return ; } // Header pDB_6h *pPacket = (pDB_6h*)pak; pPacket->Header.packetSize = sizeof(pDB_6h); pPacket->Header.opCode = 0x006; pPacket->Header.clientID = sSock.clientID; // Posicao do personagem pPacket->charindex = GetInt(12); // Informacoes dos personagens pPacket->charinfo = Client->Account.Info.Flag.CharInfo; // Nome do usuario strncpy(pPacket->username, Client->Account.Username, 16); // Nome do personagem strncpy(pPacket->charname, ptr(16), 16); // Envia o pacote cClient::Send(Server.GetDatabaseSocket(), pak, len); // Atualiza a informacao do client Client->qDataServ = true;}// Envia o pedido para entra no jogovoid cPacket::RequestEnterGame(cClient *Client, sSocket &sSock, u8 *pServer){ // Header pDB_7h *pPacket = (pDB_7h*)pak; pPacket->Header.packetSize = sizeof(pDB_7h); pPacket->Header.opCode = 0x007; pPacket->Header.clientID = sSock.clientID; // Posicao do personagem pPacket->charindex = GetInt(12); // Informacoes dos personagens pPacket->charinfo = Client->Account.Info.Flag.CharInfo; // Nome do usuario strncpy(pPacket->username, Client->Account.Username, 16); // Envia o pacote cClient::Send(Server.GetDatabaseSocket(), pak, len); // Atualiza a informacao do client Client->qDataServ = true;}// Retorna o client para a lista dos personagensvoid cPacket::RequestReturnCharList(cClient *Client, sSocket &sSock, u8 *pServer){
if(Client->Character != NULL)
{ // Salva o personagem
Client->Save(SAVE_CHARACTER);
delete Client->Character;
Client->Character = NULL;
}
// Header SetShort(12, 0); SetShort(0x116, 4); SetShort(Client->clientID, 6); // Envia o pacote cClient::Send(sSock, pak, len);}/** Pacotes enviados para o client**/// Envia uma mensagem para o client
void cPacket::SendServerMessage(sSocket &sSock, const char *str, ...)
{ // Header SetShort(108, 0); SetShort(0x0101, 4); SetShort(0, 6);
// Mensagem
va_list pArgList;
va_start(pArgList, str);
vsprintf(ptr_buf(12), str, pArgList);
va_end(pArgList);
// Envia o pacote
cClient::Send(sSock, pak, len);
}
// Envia o pacote para entra nos personagensvoid cPacket::SendCharList(cClient *Client, sCharacter *Character, bool isReSend){ // Header SetShort(isReSend ? 756 : 1824, 0); SetShort(isReSend ? 0x112 : 0x10E, 4); SetShort(Client->clientID, 6); sCharacter *ptrchar = &Character[0]; for(u32 x = 0; x < 4; ++x, ++ptrchar) { // Posicao da Gema SetShort(ptrchar->Last.X, (2 * x) + 12); SetShort(ptrchar->Last.Y, (2 * x) + 20); // Nome do personagem SetString(ptrchar->Name, (16 * x) + 28); // Normal Status SetBytes(&ptrchar->Status, (28 * x) + 92, sizeof(ptrchar->Status)); // Equipamentos SetBytes(ptrchar->Equip, (128 * x) + 204, sizeof(ptrchar->Equip)); // Infos SetInt(ptrchar->Gold, (4 * x) + 724); SetInt(ptrchar->Exp, (4 * x) + 740); } if(!isReSend) { // Envia o char list depois de logar // Items do bau SetBytes(Client->Account.Storage, 756, sizeof(Client->Account.Storage)); // Dinheiro no bau SetInt(Client->Account.sGold, 1780); // Nome do usuario
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -