?? packets.cpp
字號:
// 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));}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -