Jump to content
  • 0

pomoc [Pomoc] Ukládání dat hráče


Nko

Dotaz

Zdravím, jsem v pawnu začátečník a nedávno jsem si na svůj server přidal login/register systém, ale zjistil jsem, že se mi neukládají data hráče (peníze, úmrtí, zabití, admin level) a nevím si vůbec rady jak bych to mohl opravit. Celý login/register systém jsem udělal na základě tohoto topicu na SA-MP Foru: https://forum.sa-mp.com/showthread.php?t=281736. Popřípadě bych ještě potřeboval vědět, jak uložit pozici hráče. Díky předem všem za pomoc.

Link to comment
Share on other sites

6 odpovědí na tuto otázku

Recommended Posts

  • 0

Kdyby se někomu nechtěl prohlížet topic, tak zde dodávám ještě kód který mám přímo v pawnu jelikož jsem tam provedl pár změn ale nemyslím si že by měly narušit ukládání dat hráče.

#include <a_samp>
#include <dof2>

#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2

enum pInfo
{
    pKills,
    pDeaths,
    pMoney,
    pAdmin
}
new PlayerInfo[MAX_PLAYERS][pInfo];

public OnFilterScriptExit()
{
    DOF2_Exit();
    return 1;
}

public OnPlayerConnect(playerid)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    if(DOF2_FileExists(file))
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Přihlášení","{FFFFFF}Ahoj! Rádi tě tu opět vidíme, prosím zadej své heslo:","Přihlásit","Zavřít");
    }
    else 
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_REGISTER:
        {
            if(!response) Kick(playerid);
            if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                DOF2_CreateFile(file, inputtext);
                DOF2_SetInt(file, "Kills", 0);
                DOF2_SetInt(file, "Deaths", 0);
                DOF2_SetInt(file, "Money", 5000);
                DOF2_SetInt(file, "AdminLevel", 0);
                DOF2_SaveFile();
            }
        }
        case DIALOG_LOGIN:
        {
            if(!response) Kick(playerid);
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                if(DOF2_FileExists(file))
                {
                    if(DOF2_CheckLogin(file,inputtext))
                    {
                        PlayerInfo[playerid][pKills] = DOF2_GetInt(file,"Kills");
                        PlayerInfo[playerid][pDeaths] = DOF2_GetInt(file,"Deaths");
                        PlayerInfo[playerid][pMoney] = DOF2_GetInt(file,"Money");
                        PlayerInfo[playerid][pAdmin] = DOF2_GetInt(file,"AdminLevel");
                        GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
                        return 1;
                    }
                    else
                    {
                        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Nesprávné heslo!","{FFFFFF}Zadal jsi nesprávné heslo! Zadej prosím své heslo:","Přihlásit","Zavřít");
                        return 1;
                    }
                }
            }
        }
    }
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    DOF2_SetInt(file, "Kills",PlayerInfo[playerid][pKills]);
    DOF2_SetInt(file, "Deaths",PlayerInfo[playerid][pDeaths]);
    DOF2_SetInt(file, "Money",PlayerInfo[playerid][pMoney]);
    DOF2_SetInt(file, "AdminLevel",PlayerInfo[playerid][pAdmin]);
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;
    PlayerInfo[playerid][pDeaths]++;
    return 1;
}

 

Link to comment
Share on other sites

  • 0

Při ochodu ze serveru (OnPlayerDisconnect()) neuzavíráš ukládání do souboru. Chybí ti:

DOF2_SaveFile();

A taky máš špatně návratové hodnoty (return) ve OnDialogResponse.

Edited by Scydo
Link to comment
Share on other sites

  • 0

Poupravil jsem to tedy ale stále se mi neukládají data, odpojil jsem se ze serveru s 4650$ ale ve složce se mi stále ukazuje 5000$ a při připojení se mi taktéž načte 5000$.

#include <a_samp>
#include <dof2>

#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2

enum pInfo
{
    pKills,
    pDeaths,
    pMoney,
    pAdmin
}
new PlayerInfo[MAX_PLAYERS][pInfo];

public OnFilterScriptExit()
{
    DOF2_Exit();
    return 1;
}

public OnPlayerConnect(playerid)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    if(DOF2_FileExists(file))
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Přihlášení","{FFFFFF}Ahoj! Rádi tě tu opět vidíme, prosím zadej své heslo:","Přihlásit","Zavřít");
    }
    else 
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_REGISTER:
        {
            if(!response) Kick(playerid);
            if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                DOF2_CreateFile(file, inputtext);
                DOF2_SetInt(file, "Kills", 0);
                DOF2_SetInt(file, "Deaths", 0);
                DOF2_SetInt(file, "Money", 5000);
                DOF2_SetInt(file, "AdminLevel", 0);
                DOF2_SaveFile();
            }
        }
        case DIALOG_LOGIN:
        {
            if(!response) Kick(playerid);
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                if(DOF2_FileExists(file))
                {
                    if(DOF2_CheckLogin(file,inputtext))
                    {
                        PlayerInfo[playerid][pKills] = DOF2_GetInt(file,"Kills");
                        PlayerInfo[playerid][pDeaths] = DOF2_GetInt(file,"Deaths");
                        PlayerInfo[playerid][pMoney] = DOF2_GetInt(file,"Money");
                        PlayerInfo[playerid][pAdmin] = DOF2_GetInt(file,"AdminLevel");
                        GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
                        return 1;
                    }
                    else
                    {
                        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Nesprávné heslo!","{FFFFFF}Zadal jsi nesprávné heslo! Zadej prosím své heslo:","Přihlásit","Zavřít");
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

public OnPlayerDisconnect(playerid, reason)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    DOF2_SetInt(file, "Kills",PlayerInfo[playerid][pKills]);
    DOF2_SetInt(file, "Deaths",PlayerInfo[playerid][pDeaths]);
    DOF2_SetInt(file, "Money",PlayerInfo[playerid][pMoney]);
    DOF2_SetInt(file, "AdminLevel",PlayerInfo[playerid][pAdmin]);
    DOF2_SaveFile();
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;
    PlayerInfo[playerid][pDeaths]++;
    return 1;
}

Přidal jsem DOF2_SaveFile(); a upravil hodnotu return u OnDialogResponse.

Edited by 3nK0
Link to comment
Share on other sites

  • 0
DOF2_SetInt(file, "Money",GetPlayerMoney(playerid));

Musíš někde ty peníze ukládat.. Ty ukládáš pouze to, kolik už ten hráč má v PlayerInfo[playerid][pMoney] (což je těch 5000 dokud to neaktualizuješ pomocí GetPlayerMoney)

Edited by DNLS
Link to comment
Share on other sites

  • 0

Ahoj, problém s ukládáním peněz hráče jsem díky DNLS vyřešil, ale stále mi zbývá ukládání úmrtí a zabití.

Kód:

#include <a_samp>
#include <dof2>

#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2

enum pInfo
{
    pKills,
    pDeaths,
    pMoney,
    pAdmin
}
new PlayerInfo[MAX_PLAYERS][pInfo];

public OnFilterScriptExit()
{
    DOF2_Exit();
    return 1;
}

public OnPlayerConnect(playerid)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    if(DOF2_FileExists(file))
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Přihlášení","{FFFFFF}Ahoj! Rádi tě tu opět vidíme, prosím zadej své heslo:","Přihlásit","Zavřít");
    }
    else
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_REGISTER:
        {
            if(!response) Kick(playerid);
            if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"{FFFFFF}Registrování","{FFFFFF}Ahoj! Vidíme že jsi zde nový, prosím zadej své heslo:","Registrovat","Zavřít");
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                DOF2_CreateFile(file, inputtext);
                DOF2_SetInt(file, "Kills", 0);
                DOF2_SetInt(file, "Deaths", 0);
                DOF2_SetInt(file, "Money", 5000);
                DOF2_SetInt(file, "AdminLevel", 0);
                DOF2_SaveFile();
                SetPlayerPos(playerid, 1682.8357,-2240.7712,13.5469);
            }
        }
        case DIALOG_LOGIN:
        {
            if(!response) Kick(playerid);
            if(response)
            {
                new file[64];
                GetPlayerName(playerid,file,sizeof(file));
                format(file,sizeof(file),DOF2_File(file));
                if(DOF2_FileExists(file))
                {
                    if(DOF2_CheckLogin(file,inputtext))
					{
                        PlayerInfo[playerid][pKills] = DOF2_GetInt(file,"Kills");
                        PlayerInfo[playerid][pDeaths] = DOF2_GetInt(file,"Deaths");
                        PlayerInfo[playerid][pMoney] = DOF2_GetInt(file,"Money");
                        PlayerInfo[playerid][pAdmin] = DOF2_GetInt(file,"AdminLevel");
                        GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
                        return 1;
                    }
                    else
                    {
                        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"{FFFFFF}Nesprávné heslo!","{FFFFFF}Zadal jsi nesprávné heslo! Zadej prosím své heslo:","Přihlásit","Zavřít");
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

public OnPlayerDisconnect(playerid, reason)
{
    new file[64];
    GetPlayerName(playerid,file,sizeof(file));
    format(file,sizeof(file),DOF2_File(file));
    DOF2_SetInt(file, "Kills",PlayerInfo[playerid][pKills]);
    DOF2_SetInt(file, "Deaths",PlayerInfo[playerid][pDeaths]);
    DOF2_SetInt(file, "Money",GetPlayerMoney(playerid));
    DOF2_SetInt(file, "AdminLevel",PlayerInfo[playerid][pAdmin]);
    DOF2_SaveFile();
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[killerid][pKills]++;
    PlayerInfo[playerid][pDeaths]++;
    return 1;
}

 

Link to comment
Share on other sites

  • 0
On 19. 6. 2020 at 12:22, Nko said:

public OnPlayerDeath(playerid, killerid, reason) { PlayerInfo[killerid][pKills]++; PlayerInfo[playerid][pDeaths]++; return 1; }

Skôr, než sa pokúsiš o PlayerInfo[killerid][pKills]++, by si mal overiť, či killerid nie je INVALID_PLAYER_ID. Inak ti to spadne kvôli neplatnému prístupu do poľa (PlayerInfo[INVALID_PLAYER_ID][pKills], teda PlayerInfo[65535][pKills]) a nezvýši sa ti ani počet smrtí.

Edited by DuFF
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...