📄 server.cpp
字号:
if(clientid == -1) return ; // Client nao foi encontrado Log(WARN, "cServer::DeleteAccount failed.");}// Procura o id do servidor//// Retorna -1 se o ip nao foi encontrado// Retorna o id do servidor caso foi encontrados32 cServer::GetServerIndex(const char *ip){ for(u32 x = 0; x < 10; x++) if(strcmp(srvList[x], ip) == 0) return x; return -1;}// Procura o id do admin//// Retorna -1 se o ip nao foi encontrado// Retorna o id do admin caso foi encontrados32 cServer::GetAdminIndex(const char *ip){ for(u32 x = 0; x < 10; x++) if(strcmp(adminList[x], ip) == 0) return x; return -1;}// Le o arquivo de configuração do personagem ou npcvoid cServer::ReadCharacter(const char *file, sCharacter *ptrchar){ FILE *fp = fopen(file, "r"); if(fp == NULL) { /* not found */ Log(WARN, Server.GetMessage(ERRORLOADED), file); return ; } // Apaga todas as informacoes do personagem memset(ptrchar, 0, sizeof(sCharacter)); // Seta o valor padrao da barra de skill memset(ptrchar->qSkillBar1, 0xFF, 4); memset(ptrchar->qSkillBar2, 0xFF, 16); // Zera as skills em uso memset(ptrchar->Skill, 0, sizeof(sSkill) * 16); int data[8]; sItem *ptritem = NULL; sSkill *ptrskill = NULL; while(fgets(buf, sizeof(buf), fp)) { if(buf[0] == '#' || buf[0] == '\n') continue; memset(cmd, 0, sizeof(cmd)); memset(data, 0, sizeof(data)); sscanf(buf, "%[^( ](%d,%d,%d,%d,%d,%d,%d,%d)", cmd, &data[0], &data[1], &data[2], &data[3], &data[4], &data[5], &data[6], &data[7]); // Seta todas as letras para minusculo for(u32 x = 0; x < strlen(cmd); x++) cmd[x] = tolower(cmd[x]); if(strcmp(cmd, "setpos") == 0) { ptrchar->Last.X = data[0]; ptrchar->Last.Y = data[1]; } else if(strcmp(cmd, "setlevel") == 0) ptrchar->Status.Level = data[0]; else if(strcmp(cmd, "setattack") == 0) ptrchar->Status.Attack = data[0]; else if(strcmp(cmd, "setdefense") == 0) ptrchar->Status.Defense = data[0]; else if(strcmp(cmd, "setmerchant") == 0)
{ ptrchar->Status.Merchant.Flag.Merchant = data[0];
ptrchar->Status.Merchant.Flag.charDir = data[1];
} else if(strcmp(cmd, "setspeed") == 0) ptrchar->Status.MoveSpeed = data[0]; else if(strcmp(cmd, "sethp") == 0) { ptrchar->Status.cHP = data[0]; ptrchar->Status.mHP = data[1]; } else if(strcmp(cmd, "setmp") == 0) { ptrchar->Status.cMP = data[0]; ptrchar->Status.mMP = data[1]; } else if(strcmp(cmd, "setstr") == 0) ptrchar->Status.STR = data[0]; else if(strcmp(cmd, "setint") == 0) ptrchar->Status.INT = data[0]; else if(strcmp(cmd, "setdex") == 0) ptrchar->Status.DEX = data[0]; else if(strcmp(cmd, "setcon") == 0) ptrchar->Status.CON = data[0]; else if(strcmp(cmd, "setwmaster") == 0) ptrchar->Status.wMaster = data[0]; else if(strcmp(cmd, "setfmaster") == 0) ptrchar->Status.fMaster = data[0]; else if(strcmp(cmd, "setsmaster") == 0) ptrchar->Status.sMaster = data[0]; else if(strcmp(cmd, "settmaster") == 0) ptrchar->Status.tMaster = data[0]; else if(strcmp(cmd, "setequip") == 0) { ptritem = &ptrchar->Equip[data[0]]; ptritem->ItemID = data[1]; ptritem->EF1 = data[2]; ptritem->EFV1 = data[3]; ptritem->EF2 = data[4]; ptritem->EFV2 = data[5]; ptritem->EF3 = data[6]; ptritem->EFV3 = data[7]; } else if(strcmp(cmd, "setinv") == 0) { ptritem = &ptrchar->Inventory[data[0]]; ptritem->ItemID = data[1]; ptritem->EF1 = data[2]; ptritem->EFV1 = data[3]; ptritem->EF2 = data[4]; ptritem->EFV2 = data[5]; ptritem->EF3 = data[6]; ptritem->EFV3 = data[7]; } else if(strcmp(cmd, "setskill") == 0) { ptrskill = &ptrchar->Skill[data[0]]; ptrskill->Effect = data[1]; ptrskill->Master = data[2]; ptrskill->effVal = data[3]; ptrskill->sTime = (data[4] / 8); } else if(strcmp(cmd, "setstatuspoints") == 0) ptrchar->pStatus = data[0]; else if(strcmp(cmd, "setmasterpoints") == 0) ptrchar->pMaster = data[0]; else if(strcmp(cmd, "setskillpoints") == 0) ptrchar->pSkill = data[0]; else if(strcmp(cmd, "setregen") == 0) { ptrchar->rHP = data[0]; ptrchar->rMP = data[1]; } else if(strcmp(cmd, "setresist") == 0) { ptrchar->Resist.Flag.Resist1 = data[0]; ptrchar->Resist.Flag.Resist2 = data[1]; ptrchar->Resist.Flag.Resist3 = data[2]; ptrchar->Resist.Flag.Resist4 = data[3]; } else if(strcmp(cmd, "sethold") == 0) ptrchar->Hold = data[0]; else if(strcmp(cmd, "setrace") == 0) ptrchar->Race = data[0]; else if(strcmp(cmd, "setcity") == 0) { ptrchar->City.Flag.ID = data[0]; ptrchar->City.Flag.nop = data[1]; } else if(strcmp(cmd, "setclass") == 0) ptrchar->charClass = data[0]; else if(strcmp(cmd, "setgold") == 0) ptrchar->Gold = data[0]; else if(strcmp(cmd, "setexp") == 0) ptrchar->Exp = data[0]; else if(strcmp(cmd, "setkpoint") == 0) ptrchar->kPoint = data[0]; else if(strcmp(cmd, "setkillpoint") == 0) { ptrchar->currentKill = data[0]; ptrchar->totalKill = data[1]; } else if(strcmp(cmd, "setcritical") == 0) ptrchar->Critical = data[0]; else Log(INFO, "Invalid command (%s): \"%\"", file, cmd); } memcpy(&ptrchar->bStatus, &ptrchar->Status, sizeof(sStatus)); fclose(fp); Log(NORMAL, Server.GetMessage(LOADEDFILE), file);}
// Recebe o primeiro pacote do client
//
// Retorna false se o client nao enviou o hello packet
// Retorna true se o client foi logado com sucesso
bool cServer::Login(sSocket &sSock)
{ if(!sSock.Info.Flag.sHello) { /* n enviou o pacote de hello */ if(4 == recv(sSock.Sock, buf, 4, 0)) { /* tamanho valido */ if(*(u32*)buf == 0x1F11F311) { /* pacote valido */ sSock.Info.Flag.sHello = true; return true; } } DeleteSocket(sSock); } else if(cSocket::Login(sSock))
{ /* new client */ s32 indexServer; char *ip = inet_ntoa(sSock.socketInfo.sin_addr); pDB_1h *pServer = (pDB_1h*)GetPointerPacket(); if(pServer->isGameServer == 1) indexServer = GetServerIndex(ip); else indexServer = GetAdminIndex(ip); if(indexServer != -1) { /* gameserver valido */ indexServer++;
cClient *Client = (cClient*)List.Insert(indexServer);
if(Client == NULL)
{ /* lista cheia */ Log(WARN, GetMessage(MAXCLIENTLIST));
Packet.SendLogMessage(sSock, GetMessage(MAXCLIENTLIST));
}
else
{ /* client adicionado */
sSock.clientID = indexServer; Client->Socket = &sSock;
Log(NORMAL, GetMessage(CLIENTCONNECTED), sSock.clientID,
ip, ntohs(sSock.socketInfo.sin_port));
currUser++; RefStatusBar();
return true;
} } else { /* send log */ Log(WARN, GetMessage(IPNOTFOUND), ip); Packet.SendLogMessage(sSock, GetMessage(IPNOTFOUND), ip); } DeleteSocket(sSock);
}
return false;
}
// Trata o pacote recebido//// Retorna false se o pacote eh invalido// Retorna true se o pacote eh validovoid cServer::ReceivedPacket(sSocket &sSock, pHeader *pServer)
{ Packet.PacketControl(sSock, (pHeader*)GetPointerPacket());
}
// Deleta o socket da listavoid cServer::DeleteSocket(s32 id){ DeleteSocket(cSocket::Get(id));}
// Deleta o socket da lista
void cServer::DeleteSocket(sSocket &sSock)
{
cSocket::DeleteSocket(sSock);
if(sSock.clientID != INVALID_SERVERINDEX)
{ /* deleta o client do servidor */
currUser--; RefStatusBar();
// Deleta os clients conectados nesse servidor DeleteAccount(sSock.clientID, -1);
Log(NORMAL, GetMessage(CLIENTDISCONNECTED), sSock.clientID);
List.Remove(sSock.clientID);
}
}
// Retorna a mensagemconst char *cServer::GetMessage(u32 id) const { return language[id]; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -