Portal SAMP
[Ajuda] Erro ao inserir dados DOF2 em uma variável - 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] Erro ao inserir dados DOF2 em uma variável (/showthread.php?tid=4630)



Erro ao inserir dados DOF2 em uma variável - Ryzen_ - 16/03/2024

Boa tarde pessoal! Estou com um erro onde ao tentar pegar os dados de alguns arquivos (CLANS) utilizando DOF2_Get, e tentar salvar os mesmos dentro de uma variável, simplesmente não funciona. Irei deixar o código e explicar melhor abaixo do mesmo.

clans.inc
Código PHP:
enum Clans {
    cNome[30],
    cMembros,
    bool:cLider
}

new 
ClanInfo[MAX_CLANS][Clans];

stock CreateClan(playerid, const nomeclan[]) {
    new id GenerateClanID();

    if (id MAX_CLANS) return SendClientMessage(playeridVermelho"O número máximo de clans foi atingido!");

    format(Filesizeof(File), PASTA_CLANSid);
    DOF2_CreateFile(File);
    DOF2_SetString(File"Organizacao"nomeclan);
    DOF2_SetInt(File"Membros"0);
    DOF2_SetBool(File"Lider"false);

    DOF2_SaveFile();
    return 1;
}

stock GenerateClanID() {
    for (new 0MAX_CLANSi++) {
        format(Filesizeof(File), PASTA_CLANSi);
        if (!DOF2_FileExists(File)) return i;
    }

    return 0;
}

stock LoadClans() {
    for (new 0MAX_CLANSi++) {
        format(Filesizeof(File), PASTA_CONTASi);
        if (!DOF2_FileExists(File)) continue;


        format(STRXsizeof(STRX), "%s"DOF2_GetString(File"Organizacao"));
        strcat(ClanInfo[i][cNome], STRXsizeof(STRX));
        // ClanInfo[i][cNome] = DOF2_GetString(File, "Organizacao");
        ClanInfo[i][cMembros] = DOF2_GetInt(File"Membros");
        ClanInfo[i][cLider] = DOF2_GetBool(File"Lider");
    }

    return 1;


/darlider
Código PHP:
CMD:darlider(playeridparams[]) {
    new targetididclanbool:lider;

    if (GetPlayerAdminLevel(playerid) < 5) return 1;
    if (sscanf(params"ui"targetididclan)) return SendClientMessage(playeridVermelho"Use: /darlider [id] [organização]");

    // for (new i = 0; i < MAX_CLANS; i++) {
    //     format(File, sizeof(File), PASTA_CLANS, i);
    //     if (DOF2_FileExists(File) && idclan == i) break; 
    // }

    lider ClanInfo[idclan][cLider];
    // lider = DOF2_GetBool(File, "Lider");
    if (!IsPlayerConnected(targetid)) return SendClientMessage(playeridVermelho"Jogador não conectado!");
    if (PlayerInfo[targetid][pCargo] == 5) return SendClientMessage(playeridVermelho"Esse player já é líder de uma organização!");
    if (lider == true) return SendClientMessage(playeridVermelho"Essa organização já possui um líder!");

    PlayerInfo[targetid][pOrganizacao] = idclan;
    PlayerInfo[targetid][pCargo] = 5;
    ClanInfo[idclan][cLider] = true;
    // DOF2_SetBool(File, "Lider", true);

    SendClientMessage(playeridazul_claro"Você colocou %s como líder da organização {FF0000}%s{40AEFF}!"GetPlayerNameEx(targetid), ClanInfo[idclan][cNome]);
    SendClientMessage(targetidazul_claro"Parabéns! Você foi nomeado como líder da organização {FF0000}%s{40AEFF}!"ClanInfo[idclan][cNome]);

    DOF2_SaveFile();

    return 1;


Meu objetivo era colocar o LoadClans() no OnGameModeInit, para que ele fosse carregado sempre que o server fosse reiniciado, e os valores ficarem sempre salvos nas variáveis (Pra não precisar ficar mudando diretamente), mas simplesmente não funciona. Já tentei alterar o format, utilizar uma nova variável, mudar o tamanho, utilizar strcat, setar diretamente, nenhuma deu certo. Apenas funciona caso eu deixe o loop "for" ativo, e insira os valores diretamente utilizando o "DOF2_Set" para alterar para "true" por exemplo. O que poderia estar ocasionando isso? Ah, e caso tenha algum erro no meu código que não tenha a ver com o problema em si, podem me corrigir também.


RE: Erro ao inserir dados DOF2 em uma variável - Maycon_Felipe - 17/03/2024

Troque PASTA_CONTAS para PASTA_CLANS
Código:
stock LoadClans() {
    for (new i = 0; i < MAX_CLANS; i++) {
        format(File, sizeof(File), PASTA_CONTAS, i); // ERRO Troque PASTA_CONTAS para PASTA_CLANS
        if (!DOF2_FileExists(File)) continue;


        format(STRX, sizeof(STRX), "%s", DOF2_GetString(File, "Organizacao"));
        strcat(ClanInfo[i][cNome], STRX, sizeof(STRX));
        // ClanInfo[i][cNome] = DOF2_GetString(File, "Organizacao");
        ClanInfo[i][cMembros] = DOF2_GetInt(File, "Membros");
        ClanInfo[i][cLider] = DOF2_GetBool(File, "Lider");
    }

    return 1;
}

Outro erro que vi é aqui, se você não macrou a função nativa SendClientMessage,você não vai conseguir exibir o nome e outras informações sem formatar o texto antes..
Código:
new string[128];
    format(string, sizeof(string), "Você colocou %s como líder da organização {FF0000}%s{40AEFF}!",  GetPlayerNameEx(targetid), ClanInfo[idclan][cNome]);
    SendClientMessage(playerid, azul_claro, string);
    format(string, sizeof(string), "Parabéns! Você foi nomeado como líder da organização {FF0000}%s{40AEFF}!", ClanInfo[idclan][cNome]);
    SendClientMessage(targetid, azul_claro, string);



RE: Erro ao inserir dados DOF2 em uma variável - White_Blue - 17/03/2024

(17/03/2024 02:56)Maycon_Felipe Escreveu: Troque PASTA_CONTAS para PASTA_CLANS
Código:
stock LoadClans() {
    for (new i = 0; i < MAX_CLANS; i++) {
        format(File, sizeof(File), PASTA_CONTAS, i); // ERRO Troque PASTA_CONTAS para PASTA_CLANS
        if (!DOF2_FileExists(File)) continue;


        format(STRX, sizeof(STRX), "%s", DOF2_GetString(File, "Organizacao"));
        strcat(ClanInfo[i][cNome], STRX, sizeof(STRX));
        // ClanInfo[i][cNome] = DOF2_GetString(File, "Organizacao");
        ClanInfo[i][cMembros] = DOF2_GetInt(File, "Membros");
        ClanInfo[i][cLider] = DOF2_GetBool(File, "Lider");
    }

    return 1;
}

Outro erro que vi é aqui, se você não macrou a função nativa SendClientMessage,você não vai conseguir exibir o nome e outras informações sem formatar o texto antes..
Código:
    new string[128];
    format(string, sizeof(string), "Você colocou %s como líder da organização {FF0000}%s{40AEFF}!",  GetPlayerNameEx(targetid), ClanInfo[idclan][cNome]);
    SendClientMessage(playerid, azul_claro, string);
    format(string, sizeof(string), "Parabéns! Você foi nomeado como líder da organização {FF0000}%s{40AEFF}!", ClanInfo[idclan][cNome]);
    SendClientMessage(targetid, azul_claro, string);

Ele provavelmente está usando open.mp ou Y_va. O open.mp permite o uso de especificadores de formatação nativamente, sem a necessidade de formatação adicional. Por outro lado, o Y_va redireciona automaticamente a função SendClientMessage para uma versão modificada que permite o uso de especificadores de formatação.


RE: Erro ao inserir dados DOF2 em uma variável - Maycon_Felipe - 18/03/2024

(17/03/2024 08:52)White_Blue Escreveu: Ele provavelmente está usando open.mp ou Y_va. O open.mp permite o uso de especificadores de formatação nativamente, sem a necessidade de formatação adicional. Por outro lado, o Y_va redireciona automaticamente a função SendClientMessage para uma versão modificada que permite o uso de especificadores de formatação.

Interessante, realmente tava por fora dessa. Eu tava achando que ele tinha macrado a função e caso não tivesse iria dar problemas kk


RE: Erro ao inserir dados DOF2 em uma variável - Ryzen_ - 19/03/2024

(17/03/2024 02:56)Maycon_Felipe Escreveu: Troque PASTA_CONTAS para PASTA_CLANS
Código:
stock LoadClans() {
    for (new i = 0; i < MAX_CLANS; i++) {
        format(File, sizeof(File), PASTA_CONTAS, i); // ERRO Troque PASTA_CONTAS para PASTA_CLANS
        if (!DOF2_FileExists(File)) continue;


        format(STRX, sizeof(STRX), "%s", DOF2_GetString(File, "Organizacao"));
        strcat(ClanInfo[i][cNome], STRX, sizeof(STRX));
        // ClanInfo[i][cNome] = DOF2_GetString(File, "Organizacao");
        ClanInfo[i][cMembros] = DOF2_GetInt(File, "Membros");
        ClanInfo[i][cLider] = DOF2_GetBool(File, "Lider");
    }

    return 1;
}

Outro erro que vi é aqui, se você não macrou a função nativa SendClientMessage,você não vai conseguir exibir o nome e outras informações sem formatar o texto antes..
Código:
    new string[128];
    format(string, sizeof(string), "Você colocou %s como líder da organização {FF0000}%s{40AEFF}!",  GetPlayerNameEx(targetid), ClanInfo[idclan][cNome]);
    SendClientMessage(playerid, azul_claro, string);
    format(string, sizeof(string), "Parabéns! Você foi nomeado como líder da organização {FF0000}%s{40AEFF}!", ClanInfo[idclan][cNome]);
    SendClientMessage(targetid, azul_claro, string);

Muito obrigado pela ajuda White e Maycon, consegui resolver. O erro realmente estava apenas em ter colocado PASTA_CONTAS ao invés de PASTA_CLANS, um erro bobo devido a falta de atenção no momento. Agradeço pela ajuda de vocês. Ah, e estou usando o open.mp mesmo.