(01/04/2024 13:34)pushline Escreveu: Complementando o que o samuel falou, eu faria assim: (e não recomendo fazer stock pra funções já que stocks ocupam mais memória e só servem pra includes)Stock ocupa mais memória? Não sabia. Pelo que me foi dito, era recomendado utilizar publics apenas em callbacks, e fora delas, utilizar apenas a stock. Quem criou o sistema de LoadAccount foi um outro membro da equipe, pois partiu dele a decisão de ir do DOF2 para o MySQL (Apenas nas contas, os demais sistemas ficaram em DOF, tais como o sistema de clans). Obrigado pelas respostas Samuel e Pushline, me ajudou a dar uma clareada. O que o outro membro da equipe fez, se encontra atualmente dessa forma (Na função CreateAccount(), creio que também tenha algo de errado, podem verificar por favor? Também notei que ele usou mysql_query() nela):
Código PHP:new Query[255];
mysql_format(Query, sizeof(Query), "SELECT * FROM tabela_players WHERE username = '%e' LIMIT 1", nome_player);
mysql_tquery(MYSQL_DEFAULT_HANDLE, Query, "LoadAccount", "i", playerid); // esse "i" podes acrescentar mais argumentos, tais como string ("s"), float ("f") e etc (array n passa se eu n me engano).
forward LoadAccount(playerid); // se fosse colocar no tquery "iii", teria que ter 3 parametros no forward + public.
public LoadAccount(playerid)
{
if(!cache_num_rows())
{
return SendClientMessage(playerid, -1, "Player inexistente.");
}
cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
cache_get_value_name(0, "Senha", PlayerInfo[playerid][pSenha]);
cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
cache_get_value_int(0, "EXP", PlayerInfo[playerid][pExp]);
cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pGrana]);
cache_get_value_int(0, "Saldo", PlayerInfo[playerid][pSaldo]);
cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
cache_get_value_float(0, "PosX", PlayerInfo[playerid][pPosX]);
cache_get_value_float(0, "PosY", PlayerInfo[playerid][pPosY]);
cache_get_value_float(0, "PosZ", PlayerInfo[playerid][pPosZ]);
cache_get_value_int(0, "Sede", PlayerInfo[playerid][pSede]);
cache_get_value_int(0, "Fome", PlayerInfo[playerid][pFome]);
cache_get_value_int(0, "Sono", PlayerInfo[playerid][pSono]);
cache_get_value_int(0, "Sexo", PlayerInfo[playerid][pSkin]);
cache_get_value_float(0, "Vida", PlayerInfo[playerid][pVida]);
cache_get_value_float(0, "Colete", PlayerInfo[playerid][pColete]);
return 1;
}
Função LoadAccount() presente no arquivo "login.inc":
Código PHP:
stock LoadAccount(playerid) {
//format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
SetCameraBehindPlayer(playerid);
CancelSelectTextDraw(playerid);
StopAudioStreamForPlayer(playerid);
DeletePVar(playerid, "hash");
print("LoadAccount chamada");
// HUD
ShowPlayerGlobalHUDStats(playerid);
ShowPlayerHUDStats(playerid);
PlayerTextDrawShow(playerid, relogio[playerid]);
ShowTextData(playerid);
// Stats system
SetPlayerProgressBarValue(playerid, StatsBar[playerid][0], float(PlayerInfo[playerid][pFome]));
SetPlayerProgressBarValue(playerid, StatsBar[playerid][1], float(PlayerInfo[playerid][pSede]));
SetPlayerProgressBarValue(playerid, StatsBar[playerid][2], float(PlayerInfo[playerid][pSono]));
// Timers
TimerHunger[playerid] = SetTimerEx("HungerTimer", 1200000, true, "i", playerid);
TimerSono[playerid] = SetTimerEx("SonoTimer", 2400000, true, "i", playerid);
TimerSede[playerid] = SetTimerEx("SedeTimer", 900000, true, "i", playerid);
ClockTimer[playerid] = SetTimerEx("Clock", 1000, true, "i", playerid);
TimerSegundos[playerid] = SetTimerEx("AtualizarSegundos", 1000, true, "i", playerid);
SetTimerEx("SetPlayerCashInTime", 1300, false, "ii", playerid, GetPlayerCash(playerid));
KillTimer(TimerExpirarLogin[playerid]);
TogglePlayerSpectating(playerid, false);
SetSpawnInfo(playerid, NO_TEAM, PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pPosX], PlayerInfo[playerid][pPosY], PlayerInfo[playerid][pPosZ], 0.3040, WEAPON_FIST, 0, WEAPON_FIST, 0, WEAPON_FIST, 0);
SpawnPlayer(playerid);
SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]);
SetPlayerJobColor(playerid, GetPlayerJob(playerid));
SetPlayerClanColor(playerid, GetPlayerClan(playerid));
SetPVarInt(playerid, "exp", gettime());
format(STRX, sizeof(STRX), "%d", GetPlayerWanted(playerid));
PlayerTextDrawSetString(playerid, PlayerHUD[playerid][0], STRX);
SetPVarInt(playerid, "AFKUpdate", gettime());
DeletePVar(playerid, "unhashedpassword");
PlayerInfo[playerid][pLogado] = true;
SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
cache_get_value_name(0, "Senha", PlayerInfo[playerid][pSenha]);
cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
cache_get_value_int(0, "EXP", PlayerInfo[playerid][pExp]);
cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pGrana]);
cache_get_value_int(0, "Saldo", PlayerInfo[playerid][pSaldo]);
cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
cache_get_value_float(0, "PosX", PlayerInfo[playerid][pPosX]);
cache_get_value_float(0, "PosY", PlayerInfo[playerid][pPosY]);
cache_get_value_float(0, "PosZ", PlayerInfo[playerid][pPosZ]);
cache_get_value_int(0, "Sede", PlayerInfo[playerid][pSede]);
cache_get_value_int(0, "Fome", PlayerInfo[playerid][pFome]);
cache_get_value_int(0, "Sono", PlayerInfo[playerid][pSono]);
cache_get_value_int(0, "Sexo", PlayerInfo[playerid][pSkin]);
cache_get_value_float(0, "Vida", PlayerInfo[playerid][pVida]);
cache_get_value_float(0, "Colete", PlayerInfo[playerid][pColete]);
if(PlayerInfo[playerid][pInterior] > 0) {
SetTimerEx("SetInterior", 200, false, "i", playerid);
}
SetPlayerHealth(playerid, PlayerInfo[playerid][pVida]);
SetPlayerArmour(playerid, PlayerInfo[playerid][pColete]);
TogglePlayerControllable(playerid, false);
SetTimerEx("DestogglePlayerControllable", 300, false, "i", playerid);
return 1;
}
Funções presentes no arquivo da GM:
Código PHP:
forward CreateAccount(playerid);
public CreateAccount(playerid) {
new query[500], email[128];
GetPVarString(playerid, "unconfirmedemail", email);
PlayerInfo[playerid][pID] = cache_insert_id();
PlayerInfo[playerid][pLevel] = 0;
PlayerInfo[playerid][pExp] = 0;
PlayerInfo[playerid][pGrana] = 5000;
PlayerInfo[playerid][pSaldo] = 0;
PlayerInfo[playerid][pAdmin] = 0;
PlayerInfo[playerid][pPosX] = 1154.4115;
PlayerInfo[playerid][pPosY] = -1747.7765;
PlayerInfo[playerid][pPosZ] = 13.5703;
PlayerInfo[playerid][pFome] = 100;
PlayerInfo[playerid][pSede] = 100;
PlayerInfo[playerid][pSono] = 100;
PlayerInfo[playerid][pVida] = 100.0;
PlayerInfo[playerid][pColete] = 0.0;
mysql_format(conn, query, sizeof(query), "SELECT * FROM jogadores WHERE ID='%i'", PlayerInfo[playerid][pID]);
mysql_query(conn, query);
LoadAccount(playerid);
//DOF2_SetString(file, "Email", email);
DeletePVar(playerid, "unconfirmedemail");
DeletePVar(playerid, "hash");
print("CreateAccount Chamada");
SetPlayerJob(playerid, PROF_DESEMPREGADO);
CancelSelectTextDraw(playerid);
ShowPlayerDialog(playerid, DIALOG_GENDER, DIALOG_STYLE_MSGBOX, "Gênero - Escolha seu Gênero", "{FFFFFF}Escolha seu Gênero", "Masculino", "Feminino");
return 1;
}
forward OnPassCheck(playerid);
public OnPassCheck(playerid) {
if(bcrypt_is_equal()) {
PlayerInfo[playerid][pLogado] = true;
LoadAccount(playerid);
SendClientMessage(playerid, Marrom, "| INFO | %s de volta, %s | Último login: %s", PlayerInfo[playerid][pSexo] ? "Bem-vindo" : "Bem-vinda", GetPlayerNameEx(playerid), DOF2_GetString(File, "UltimoLogin"));
} else {
PlayerInfo[playerid][pTentativas]++;
SendClientMessage(playerid, Vermelho, "| ERRO | Senha inválida");
}
return 1;
}
Função OnPlayerConnect (Creio que o problema em não carregar os dados no momento em que é feito o login, possa estar contido nisso. Já que não vejo chamada alguma do LoadAccount ao player se conectar):
Código PHP:
public OnPlayerConnect(playerid) {
PlayerInfo[playerid][pLogado] = false;
LoadBan(playerid);
if(!strcmp(GetPlayerNameEx(playerid), "Ninguem")) return Kick(playerid);
else if(IsTextIP(GetPlayerNameEx(playerid))) return Kick(playerid);
LoadPlayerTextDraws(playerid);
LoadPlayerProgressBars(playerid);
PreloadAnimLibs(playerid);
LoadSocialMediaMap(playerid);
new Random = random(MAX_SONGS), song[128];
format(song, sizeof(song), "%s", musicas[Random]);
PlayAudioStreamForPlayer(playerid, song);
return 1;
}
Att.: Em "mysql_format(Query, sizeof(Query), "SELECT * FROM tabela_players WHERE username = '%e' LIMIT 1", nome_player);", o que seria o "nome_player"? A variável responsável por armazenar o nick do jogador, tal como "PlayerInfo[playerid][pName]"?
Att-2: Creio ter entendido já. Provavelmente é uma forma de pegar o nick do player através do ID, que no meu caso seria "GetPlayerNameEx(playerid)", correto?