⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packets.cpp

📁 WYD Server 753 (Development)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* 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 + -