Erros ao utilizar MySQL - Ryzen_ - 31/03/2024
Olá pessoal, boa noite a todos. Comecei a usar o MySQL em conjunto com o PAWN agora, no open.mp, mas me deparei com alguns erros que até o momento não entendi muito bem como os resolver. Segue abaixo o chat log:
[font="Fira Code", Consolas, "Courier New", monospace][31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_float: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_float: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_float: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[31/03/2024 23:43:35] [ERROR] cache_get_value_name_int: no active cache
[/font]
Código PHP: 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]);
O que poderia causar os problemas relacionados ao cache? Desde já, agradeço a todos que contribuirem. Muito obrigado.
Att.: Não sei se tem a ver com esses possíveis erros do log, mas ao logar, se eu apenas quitar do servidor e entrar novamente, ele carrega tudo certinho, as informações da conta (Mas tenho certeza que é devido ao fato de eu ainda não ter feito o reset das informações ao desconectar), mas se eu fecho o servidor e abro novamente, as informações não são carregadas do banco de dados.
RE: Erros ao utilizar MySQL - samuelmatheus0502 - 01/04/2024
tenta dar uma olhada como que ta o mysql_query antes de puxar essas informações, da uma olhada se não tem nada de errado
RE: Erros ao utilizar MySQL - pushline - 01/04/2024
Você fez com tquery ou query normal? Se for tquery, só consegues retornar os dados em uma callback. Se quiseres fazer na mesma função/public há de ser com Cache: e usando _query (não recomendado esta segunda opção).
RE: Erros ao utilizar MySQL - Ryzen_ - 01/04/2024
(01/04/2024 08:09)pushline Escreveu: Você fez com tquery ou query normal? Se for tquery, só consegues retornar os dados em uma callback. Se quiseres fazer na mesma função/public há de ser com Cache: e usando _query (não recomendado esta segunda opção).
Fiz utilizando tquery. Poderia me dar um breve tutorial ou resumo sobre a utilização do Cache? Seria melhor utilizar assim, ou com a callback? Atualmente ele é uma função stock chamada de LoadAccount(playerid)
RE: Erros ao utilizar MySQL - samuelmatheus0502 - 01/04/2024
Ryzen, você teria que revisar a linha que está chamando essa função loadAccount, deve ter algo assim
Código: mysql_tquery(ConexaoSQL, Query, "sua_função", "i", playerid); // ConexaoSQL = sua variável de conexão com o DB, Query = sua variável de string da consulta, utilize as do seu gamemode
porque você estaria chamando a consulta com a linha acima e posteriormente faria uma callback em format de public, fazendo uma
Código: forward sua_função(parametros);
public sua_função(parametros){
return 1;
}
Dei só um exemplo, espero que tenha clareado
Eu faria assim
Essa linha você adicionaria onde está fazendo sua verificação desejada
Código: new Query[90];
mysql_tquery( sua variavel de conexao com DB, Query, "LoadAccount", "i", playerid);
No final do gamemode substituiria sua stok pela public
Código: forward LoadAccount(playerid);
public LoadAccount(playerid){
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;
}
RE: Erros ao utilizar MySQL - pushline - 01/04/2024
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)
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; }
RE: Erros ao utilizar MySQL - Ryzen_ - 01/04/2024
(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)
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; }
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):
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?
RE: Erros ao utilizar MySQL - samuelmatheus0502 - 01/04/2024
(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)
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; }
tinha esquecido dessa linha, mysql_format(Query, sizeof(Query), "SELECT * FROM tabela_players WHERE username = '%e' LIMIT 1", nome_player);
e da validação das linhas no DB
valeu por lembrar
RE: Erros ao utilizar MySQL - White_Blue - 01/04/2024
(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)
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; }
stock = funções (que tecnicamente é apenas uma palavra-chave para dizer para o compilador ignroar a função caso a mesma não for utilizada);
public = callbacks/eventos;
Se usa stock para funções e publics apenas devem ser usadas para eventos. Não é questão de memória.
RE: Erros ao utilizar MySQL - Ryzen_ - 01/04/2024
(01/04/2024 14:28)White_Blue Escreveu: (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)
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; }
stock = funções (que tecnicamente é apenas uma palavra-chave para dizer para o compilador ignroar a função caso a mesma não for utilizada);
public = callbacks/eventos;
Se usa stock para funções e publics apenas devem ser usadas para eventos. Não é questão de memória.
Era isso o que eu sabia, fiquei meio confuso quando falaram sobre o uso de memória. Pode dar uma olhada na mensagem anterior que postei aqui no tópico?
|