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

📄 packets.cpp

📁 WYD Server 753 (Development)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    // Header    pGS_5h *charPacket = (pGS_5h*)buf;    charPacket->Header.packetSize = sizeof(pGS_5h);    charPacket->Header.opCode = 0x005;    charPacket->Header.clientID = pServer->Header.clientID;    charPacket->isReSend = true;    charPacket->charinfo = pServer->charinfo;    // Le todos os personagens do client    fread(charPacket->Character, sizeof(sCharacter), 4, fp);    // Envia o pacote para mandar o client para o char list    cClient::Send(sSock, charPacket, sizeof(pGS_5h));    // Retorna o valor original da cidadania    bchar->Equip[0].EFV3 = bCitizen;    fclose(fp);}// Deleta o personagemvoid cPacket::RequestDeleteChar(sSocket &sSock, pDB_6h *pServer){    // Prevençao contra o crash    pServer->charindex &= 3;    // Verifica se existe um personagem neste slot    if((pServer->charinfo & (1 << pServer->charindex)) == 0)    { // Nao existe personagem neste slot        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(ERRORDELETESLOT));        return ;    }    FILE *fp = Server.OpenFile(pServer->charname, "rb", CHARACTER);    if(fp == NULL)    { // Nao foi possivel encontrar o arquivo do personagem        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(GENERALERROR), "RequestDeleteChar/Charname");        return ;    }    fread(buf, 16, 1, fp);    fclose(fp);    if(strcmp(buf, pServer->username) != 0)    { // Este personagem nao é desta conta        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(GENERALERROR), "RequestDeleteChar/Username");        return ;    }    fp = Server.OpenFile(pServer->username, "r+b", ACCOUNT);    if(fp == NULL)    { // Nao foi possivel encontrar a conta do client        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(ERRORCREATEACC), pServer->username);        return ;    }    // Modifica a variavel que sera escrita no arquivo    *(u32*)buf = 0;    // Vai para o offset do personagem que sera deletado    fseek(fp, sizeof(sAccount) + (sizeof(sCharacter) * pServer->charindex), SEEK_SET);    // Zera somente o inicio do nome    fwrite(buf, sizeof(u32), 1, fp);    fseek(fp, sizeof(sAccount), SEEK_SET);    // Deleta o personagem na informacao da conta    pServer->charinfo ^= (1 << pServer->charindex);    // Header    pGS_5h *charPacket = (pGS_5h*)buf;    charPacket->Header.packetSize = sizeof(pGS_5h);    charPacket->Header.opCode = 0x005;    charPacket->Header.clientID = pServer->Header.clientID;    charPacket->isReSend = true;    charPacket->charinfo = pServer->charinfo;    // Le todos os personagens do client    fread(charPacket->Character, sizeof(sCharacter), 4, fp);    fclose(fp);    // Envia o pacote para mandar o client para o char list    cClient::Send(sSock, charPacket, sizeof(pGS_5h));    if(remove(Server.GetFileDir(pServer->charname, CHARACTER)) != 0)    { // Erro ao deletar o arquivo do personagem        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(ERRORDELETECHAR));        return ;    }}// Manda as informacoes do personagemvoid cPacket::RequestEnterGame(sSocket &sSock, pDB_7h *pServer){    // Prevençao contra o crash    pServer->charindex &= 3;    // Verifica se existe um personagem neste slot    if((pServer->charinfo & (1 << pServer->charindex)) == 0)    { // Nao existe personagem neste slot        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(GENERALERROR), "RequestEnterGame/CharInfo");        return ;    }    // Abre o arquivo da conta do client    FILE *fp = Server.OpenFile(pServer->username, "r+b", ACCOUNT);    if(fp == NULL)    { // Nao foi possivel encontrar a conta do client        SendServerMessage(sSock, pServer->Header.clientID,            Server.GetMessage(ERRORCREATEACC), pServer->username);        return ;    }    // Vai para o offset do personagem    fseek(fp, sizeof(sAccount) + (sizeof(sCharacter) * pServer->charindex), SEEK_SET);    // Header    pGS_6h *charPacket = (pGS_6h*)buf;    charPacket->Header.packetSize = sizeof(pGS_6h);    charPacket->Header.opCode = 0x006;    charPacket->Header.clientID = pServer->Header.clientID;    charPacket->charIndex = pServer->charindex;    // Le as informacoes do personagem    fread(&charPacket->Character, sizeof(sCharacter), 1, fp);    fclose(fp);    // Envia o pacote para mandar o client para o jogo    cClient::Send(sSock, charPacket, sizeof(pGS_6h));}
// Salva as informacoes do personagem
void cPacket::RequestSaveCharacter(sSocket &sSock, pDB_8h *pServer)
{
    // Prevençao contra o crash
    pServer->charIndex &= 3;

    // Abre o arquivo da conta do client
    FILE *fp = Server.OpenFile(pServer->userName, "r+b", ACCOUNT);
    if(fp == NULL)
    { // Nao foi possivel encontrar a conta do client
        Log(WARN, "OpenFile failed in cPacket::RequestSaveCharacter.");
        return ;
    }

    // Vai para o offset do personagem
    fseek(fp, sizeof(sAccount) + (sizeof(sCharacter) * pServer->charIndex), SEEK_SET);

    // Escreve as informacoes do personagem
    fwrite(&pServer->Character, sizeof(sCharacter), 1, fp);
    fclose(fp);

    Log(INFO, "Save Character [%s].", pServer->Character.Name);
}

// Salva as informacoes da conta e do personagem
void cPacket::RequestSaveAccountAndCharacter(sSocket &sSock, pDB_9h *pServer)
{
    // Prevençao contra o crash
    pServer->charindex &= 3;

    FILE *fp = Server.OpenFile(pServer->account.Username, "r+b", ACCOUNT);
    if(fp != NULL)
    { // Escreve a conta no arquivo do client
        fwrite(&pServer->account, sizeof(sAccount), 1, fp);

        // Vai para o offset do personagem
        fseek(fp, sizeof(sCharacter) * pServer->charindex, SEEK_CUR);

        // Escreve as informacoes do personagem
        fwrite(&pServer->character, sizeof(sCharacter), 1, fp);
        fclose(fp);

        // Deleta a conta dos usuarios conectados
        Server.DeleteAccount(sSock.clientID, pServer->Header.clientID);

        Log(INFO, "Save Account [%s] and Character [%s].",
            pServer->account.Username, pServer->character.Name);
    }
    else
    { // Nao foi possivel abrir o arquivo da conta
        Log(INFO, "check INVALID USERNAME: \"%s\"", pServer->account.Username);
    }
}
// Envia o log para o servidor
void cPacket::SendLogMessage(sSocket &sSock, const char *str, ...)
{    // Header
    pGS_1h *pServer = (pGS_1h*)buf2;
    pServer->Header.packetSize = sizeof(pGS_1h);
    pServer->Header.opCode = 0x001;
    pServer->Header.clientID = INVALID_ID;
    // Escreve a mensagem
    va_list pArgList;
	va_start(pArgList, str);
	vsprintf(pServer->strMessage, str, pArgList);
	va_end(pArgList);
    // Envia o pacote do log
	cClient::Send(sSock, pServer, sizeof(pGS_1h));
}

// Envia o log para o servidorvoid cPacket::SendServerMessage(sSocket &sSock, u32 clientID, const char *str, ...){    // Header    pGS_2h *pServer = (pGS_2h*)buf2;    pServer->Header.packetSize = sizeof(pGS_2h);    pServer->Header.opCode = 0x002;    pServer->Header.clientID = clientID;    // Escreve a mensagem    va_list pArgList;	va_start(pArgList, str);	vsprintf(pServer->strMessage, str, pArgList);	va_end(pArgList);    // Envia o pacote da mensagem	cClient::Send(sSock, pServer, sizeof(pGS_2h));}// Desconecta o client no servidorvoid cPacket::SendDisconnectClient(sSocket &sSock, u32 clientID){    // Header    pGS_3h *pServer = (pGS_3h*)buf2;    pServer->Header.packetSize = sizeof(pGS_3h);    pServer->Header.opCode = 0x003;    pServer->Header.clientID = clientID;    // Envia o pacote para desconectar o client	cClient::Send(sSock, pServer, sizeof(pGS_3h));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -