Portal SAMP
[Ajuda] Salvamento de vida, colete, arma e munição utilizando DOF2 - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Salvamento de vida, colete, arma e munição utilizando DOF2 (/showthread.php?tid=4110)



Salvamento de vida, colete, arma e munição utilizando DOF2 - Alfarr Heimrik - 22/10/2023

Olá a todos. Comecei a programar recentemente, por isso venho tendo tantos conflitos.
Obrigado a todos que se dispuserem a ajudar.

Código PHP:
stock sDados(playerid// Salvar os dados do player
{
    if(
DOF2_FileExists(Arquivo(playerid)))
    {
    
        new Float:VidaFloat:ColeteArmaMunicaoString[20];
        
DOF2_SetInt(Arquivo(playerid), "Dinheiro"GetPlayerMoney(playerid));
        
DOF2_SetInt(Arquivo(playerid), "Score"GetPlayerScore(playerid));
        
GetPlayerHealth(playeridVida);
        
DOF2_SetFloat(Arquivo(playerid), "Vida"Vida);
        
GetPlayerArmour(playeridColete);
        
DOF2_SetFloat(Arquivo(playerid), "Colete"Colete);
          for(new 013i++)
        {
                        GetPlayerWeaponData(playeridiArmaMunicao);
            
format(String20"Arma %d"i);
            
DOF2_SetInt(Arquivo(playerid), StringArma);
            
format(String20"Municao %d"i);
            
DOF2_SetInt(Arquivo(playerid), StringMunicao);
        }
        
DOF2_SaveFile();
        return 
1;
    }
    return 
0;
}

stock cDados(playerid// Carregar os dados do player
{
        new Float:VidaFloat:ColeteArmaMunicaoString[20];
    
GivePlayerMoney(playeridDOF2_GetInt(Arquivo(playerid), "Dinheiro"));
    
SetPlayerScore(playeridDOF2_GetInt(Arquivo(playerid), "Score"));
    
Vida DOF2_SetFloat(Arquivo(playerid), "Vida"Vida);
    
SetPlayerHealth(playeridVida);
    
Colete DOF2_SetFloat(Arquivo(playerid), "Colete"Colete);
    
SetPlayerArmour(playeridColete);
        ResetPlayerWeapons(playerid);
    for(new 
013i++)
    {
                format(String20"Arma %d"i);
        
Arma DOF2_SetInt(Arquivo(playerid), StringArma);
        
format(String20"Municao %d"i);
        
Municao DOF2_SetInt(Arquivo(playerid), StringMunicao);
        
GivePlayerWeapon(playeridArmaMunicao);
    }



Algumas coisas eu mesmo fiz, outras coisas eu aprendi no YT.
Acredito que o sistema de salvamento esta funcionando, pois o arquivo em sriptfiles é atualizado.
O problema é que quando eu entro no servidor, as informações de vida, colete, arma e munição não são setadas.

Anteriormente eu tentei fazaer o codigo da seguinte maneira:
Código PHP:
DOF2_SetFloat(Arquivo(playerid), "Vida"GetPlayerHealth(playerid)); para salvar
SetPlayerHealth
(playeridDOF2_GetFloat(Arquivo(playerid), "Vida")); para setar 

Mas estava com muitos erros, na verdade nem sei se estava certo.
Estou usando o mesmo estilo de linha de código para salvar e setar o dinheiro do jogador.
Código PHP:
DOF2_SetInt(Arquivo(playerid), "Dinheiro"GetPlayerMoney(playerid));
DOF2_SetInt(Arquivo(playerid), "Score"GetPlayerScore(playerid));


GivePlayerMoney(playeridDOF2_GetInt(Arquivo(playerid), "Dinheiro"));
SetPlayerScore(playeridDOF2_GetInt(Arquivo(playerid), "Score")); 



Uma outra questão. O que vocês acham sobre o salvamento de dados utilizando aquela enum la no topo da gamemode?
Eu não estou utilizando ela, na verdade tem apenas uma variavel que é o pLogado, para um sistema de registro mais elaborado no futuro.

Obrigado a todos que leram.


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - leonardos08bt - 22/10/2023

No carregar dados, você está salvando a conta; não carregando.
em vez de DOF2_SetInt, DOF2_GetInt.
em vez de DOF2_SetFloat, DOF2_GetFloat


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - Alfarr Heimrik - 22/10/2023

(22/10/2023 10:48)leonardos08bt Escreveu: No carregar dados, você está salvando a conta; não carregando.
em vez de DOF2_SetInt, DOF2_GetInt.
em vez de DOF2_SetFloat, DOF2_GetFloat

Obrigado por responder! Eu fiz as alterações e o colete foi carregado, no entanto, a vida e as armas não foram.
Poderia explanar meus erros?

Código PHP:
stock cDados(playerid// Carregar os dados do player
{
    new Float:VidaFloat:ColeteArmaMunicaoString[20];
    
GivePlayerMoney(playeridDOF2_GetInt(Arquivo(playerid), "Dinheiro"));
    
SetPlayerScore(playeridDOF2_GetInt(Arquivo(playerid), "Score"));
    
Vida DOF2_GetFloat(Arquivo(playerid), "Vida");
    
SetPlayerHealth(playeridVida);
    
Colete DOF2_GetFloat(Arquivo(playerid), "Colete");
    
SetPlayerArmour(playeridColete);
    ResetPlayerWeapons(playerid);
    for(new 
013i++)
    {
        format(String20"Arma %d"i);
        
Arma DOF2_GetInt(Arquivo(playerid), String);
        
format(String20"Municao %d"i);
        
Municao DOF2_GetInt(Arquivo(playerid), String);
        
GivePlayerWeapon(playeridArmaMunicao);
    }




RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - leonardos08bt - 22/10/2023

Atualize a include DOF2 para essa versão: https://pastebin.com/p2KAgAin


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - zBreno - 22/10/2023

https://github.com/Los/LHouse/releases


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - Alfarr Heimrik - 23/10/2023

(22/10/2023 19:47)leonardos08bt Escreveu: Atualize a include DOF2 para essa versão: https://pastebin.com/p2KAgAin

(22/10/2023 20:46)zBreno Escreveu: https://github.com/Los/LHouse/releases

Não funcionou.
Vou deixar todo meu código de salvamento abaixo.

OnDialogResponse
Código PHP:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == Dialog_Registro)
    {
    
    if(response)
    
    {
    
        if(strlen(inputtext) < || strlen(inputtext) > 16) return SendClientMessage(playerid, -1"{CFCFCF}||{FF0000}ERRO{CFCFCF}|| Sua senha deve conter entre 4 a 16 caracteres."), ShowPlayerDialog(playeridDialog_RegistroDIALOG_STYLE_INPUT"Kuatros Roleplay""{FFFFFF}Crie uma senha com uma quantidade de caracteres que esteja entre 4 - 16.\nStatus de conta: {FF0000}Não registrada!""Confirmar""Sair");
    
        DOF2_CreateFile(Arquivo(playerid));
    
        DOF2_SetString(Arquivo(playerid), "Senha"inputtext);
    
        DOF2_SaveFile();
    
        SetSpawnInfo(playerid0261730.0288, -2241.143113.5396182.5398000000);
    
        SpawnPlayer(playerid);
    
        TogglePlayerControllable(playerid1);
    
        SetCameraBehindPlayer(playerid);
    
        Player[playerid][pLogado] = 1;
    
        SendClientMessage(playerid, -1"{CFCFCF}||{00FF00}KUATROS{CFCFCF}|| Parabéns por estar registrado no servidor! Estamos te dando alguns privilégios por ser um novato.");
    
        GivePlayerMoney(playerid2500);
    
    }
    
    else
    
    {
    
        Kick(playerid);
    
    }
    
    return 1;
    }
    if(
dialogid == Dialog_Login)
    {
    
    if(response)
    
    {
    
        if(strcmp(inputtextDOF2_GetString(Arquivo(playerid), "Senha")) == 0)
    
        {
                SetSpawnInfo(playerid0261730.0288, -2241.143113.5396182.5398000000);
    
            SpawnPlayer(playerid);
    
            TogglePlayerControllable(playerid1);
    
            SetCameraBehindPlayer(playerid);
    
            Player[playerid][pLogado] = 1;
    
            SendClientMessage(playerid, -1"{CFCFCF}||{00FF00}KUATROS{CFCFCF}|| Bem vindo novamente! Obrigado por estar conosco.");
            }
    
        else
    
        {
                
SendClientMessage(playerid, -1"{CFCFCF}||{FF0000}ERRO{CFCFCF}|| Sua senha está incorreta."); ShowPlayerDialog(playeridDialog_LoginDIALOG_STYLE_PASSWORD"Kuatros Roleplay""{FFFFFF}Digite sua senha criada anteriormente, para conectar-se ao servidor.\nStatus de conta: {00FF00}Registrada!""Confirmar""Sair");
            }
    
    }
    
    else
    
    {
    
          Kick(playerid);
    
    }
    }
    return 
1;



Stock's
Código PHP:
stock pName(playerid// Pegar o nickname do player
{
 new 
Nome[MAX_PLAYER_NAME];
 
GetPlayerName(playeridNomeMAX_PLAYER_NAME);
 return 
Nome;
}

stock Arquivo(playerid// Diretório de contas
{
 new 
String[100];
 
format(String100"Contas/%s.ini"pName(playerid));
 return 
String;
}

stock sDados(playerid// Salvar os dados do player
{
 if(
DOF2_FileExists(Arquivo(playerid)))
 {
 
    new Float:VidaFloat:ColeteArmaMunicaoString[20];
 
DOF2_SetInt(Arquivo(playerid), "Dinheiro"GetPlayerMoney(playerid));
 
DOF2_SetInt(Arquivo(playerid), "Score"GetPlayerScore(playerid));
 
GetPlayerHealth(playeridVida);
 
DOF2_SetFloat(Arquivo(playerid), "Vida"Vida);
 
GetPlayerArmour(playeridColete);
 
DOF2_SetFloat(Arquivo(playerid), "Colete"Colete);
  for(new 013i++)
 {
            GetPlayerWeaponData(playeridiArmaMunicao);
 
format(String20"Arma%d"i);
 
DOF2_SetInt(Arquivo(playerid), StringArma);
 
format(String20"Municao%d"i);
 
DOF2_SetInt(Arquivo(playerid), StringMunicao);
 }
 
DOF2_SaveFile();
 return 
1;
 }
 return 
0;
}

stock cDados(playerid// Carregar os dados do player
{
    new Float:VidaFloat:ColeteArmaMunicaoString[20];
 
GivePlayerMoney(playeridDOF2_GetInt(Arquivo(playerid), "Dinheiro"));
 
SetPlayerScore(playeridDOF2_GetInt(Arquivo(playerid), "Score"));
 
Vida DOF2_GetFloat(Arquivo(playerid), "Vida");
 
SetPlayerHealth(playeridVida);
 
Colete DOF2_GetFloat(Arquivo(playerid), "Colete");
 
SetPlayerArmour(playeridColete);
    ResetPlayerWeapons(playerid);
 for(new 
013i++)
 {
        format(String20"Arma%d"i);
 
Arma DOF2_GetInt(Arquivo(playerid), String);
 
format(String20"Municao%d"i);
 
Municao DOF2_GetInt(Arquivo(playerid), String);
 
GivePlayerWeapon(playeridArmaMunicao);
 }
}

stock GivePlayerWeaponKU(playeridGunAmmo)
{
    new gunname[32];
 
GivePlayerWeapon(playeridGunAmmo);
 
GetWeaponName(Gungunnamesizeof(gunname));
 
SetPVarInt(playeridgunnameGetPVarInt(playeridgunname) +Ammo);



Notei que a vida não esta salvando, mas está igual ao colete... Eu não entendo.


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - leonardos08bt - 23/10/2023

Você está carregando o dados do jogador quando o jogador acerta a senha?
É necessário


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - pushline - 23/10/2023

N sei se tem algo a ver com tag mismatch do getfloat, mas testa isso ai

Código PHP:
stock pName(playerid// Pegar o nickname do player
{
    new 
Nome[MAX_PLAYER_NAME];
    
GetPlayerName(playeridNomeMAX_PLAYER_NAME);
    return 
Nome;
}

stock Arquivo(playerid// Diretório de contas
{
    new 
String[100];
    
format(String100"Contas/%s.ini"pName(playerid));
    return 
String;
}

stock sDados(playerid// Salvar os dados do player
{
    if(
DOF2_FileExists(Arquivo(playerid)))
    {
        new 
Float:VidaFloat:ColeteArmaMunicaoString[20];
        
        
DOF2_SetInt(Arquivo(playerid), "Dinheiro"GetPlayerMoney(playerid));
        
DOF2_SetInt(Arquivo(playerid), "Score"GetPlayerScore(playerid));
    
        
GetPlayerHealth(playeridVida);
        
GetPlayerArmour(playeridColete);
        
DOF2_SetFloat(Arquivo(playerid), "Vida"Vida);
        
DOF2_SetFloat(Arquivo(playerid), "Colete"Colete);

        for(new 
013i++)
        {
            
GetPlayerWeaponData(playeridiArmaMunicao);
            
format(String20"Arma%d"i);
            
DOF2_SetInt(Arquivo(playerid), StringArma);
            
format(String20"Municao%d"i);
            
DOF2_SetInt(Arquivo(playerid), StringMunicao);
        }

        
DOF2_SaveFile();
        return 
1;
    }
    
    return 
0;
}

stock cDados(playerid// Carregar os dados do player
{
    new 
Float:VidaFloat:ColeteArmaMunicaoString[20];

    
GivePlayerMoney(playeridDOF2_GetInt(Arquivo(playerid), "Dinheiro"));
    
SetPlayerScore(playeridDOF2_GetInt(Arquivo(playerid), "Score"));

    
Vida Float:DOF2_GetFloat(Arquivo(playerid), "Vida");
    
Colete Float:DOF2_GetFloat(Arquivo(playerid), "Colete");
    
SetPlayerHealth(playeridVida);
    
SetPlayerArmour(playeridColete);

    
ResetPlayerWeapons(playerid);

    for(new 
013i++)
    {
        
format(String20"Arma%d"i);
        
Arma DOF2_GetInt(Arquivo(playerid), String);
        
format(String20"Municao%d"i);
        
Municao DOF2_GetInt(Arquivo(playerid), String);
        
GivePlayerWeapon(playeridArmaMunicao);
    }
}

stock GivePlayerWeaponKU(playeridGunAmmo)
{
    new 
gunname[32];
    
GivePlayerWeapon(playeridGunAmmo);
    
GetWeaponName(Gungunnamesizeof(gunname));
    
SetPVarInt(playeridgunnameGetPVarInt(playeridgunname) +Ammo);




RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - Alfarr Heimrik - 23/10/2023

(23/10/2023 09:09)leonardos08bt Escreveu: Você está carregando o dados do jogador quando o jogador acerta a senha?
É necessário
Leonardo. Eu passei a fazer isso deu tudo certo, tanto as armas quanto colete e vida estão sendo carregados, mas por que tem que fazer isso? Por que os dados precisam ser carregados la na dialog de login e não no onplayerconect?




(23/10/2023 09:22)pushline Escreveu: N sei se tem algo a ver com tag mismatch do getfloat, mas testa isso ai

Código PHP:
stock pName(playerid// Pegar o nickname do player
{..........................................................
................................ 
Amigo, não deu certo. Era a situação acima mesmo. Eu estava carregando os dados no local errado ....


Obrigado por me ajudar gente, vocês são fenomenais! Espero um dia chegar ao nível de conhecimento de vocês.


RE: Salvamento de vida, colete, arma e munição utilizando DOF2 - leonardos08bt - 23/10/2023

(23/10/2023 12:28)Alfarr Heimrik Escreveu:
(23/10/2023 09:09)leonardos08bt Escreveu: Você está carregando o dados do jogador quando o jogador acerta a senha?
É necessário
Leonardo. Eu passei a fazer isso deu tudo certo, tanto as armas quanto colete e vida estão sendo carregados, mas por que tem que fazer isso? Por que os dados precisam ser carregados la na dialog de login e não no onplayerconect?




(23/10/2023 09:22)pushline Escreveu: N sei se tem algo a ver com tag mismatch do getfloat, mas testa isso ai

Código PHP:
stock pName(playerid// Pegar o nickname do player
{..........................................................
................................ 
Amigo, não deu certo. Era a situação acima mesmo. Eu estava carregando os dados no local errado ....


Obrigado por me ajudar gente, vocês são fenomenais! Espero um dia chegar ao nível de conhecimento de vocês.

Em questão "Por que os dados precisam ser carregados la na dialog de login e não no onplayerconect?":
Você pode carregar na onplayerconnect ou na diálog de login após acertar a senha, do jeito que você quiser. Mas uma das melhores ou a melhor opção para fazer isso é após o Player logar. Não vejo problemas em carregar na onplayerconnect, eu já fiz isso mas particularmente prefiro na diálog de login. (Eu utilizo salvamento e carregamento em MySQL, não sei se tem interferência mas acho que não)