Jump to content
  • 0

pomoc "Pokročilejší" ukládání...


snake3321

Dotaz

Zdravím,

tak máte mě tu zase. Tentokrát jsem se rozhodl udělat si o trochu těžší script... Každopádně je tam zase plno chyb, počítal jsem s tím... Včera jsem pochopil na 100% úplnej základ ukládání za co jsem opravdu rád, takže si už uložím třeba peníze, nebo kolik hráč zabil hráčů, nebo kolikrát umřel... Prostě prakticky vše ale jen pojednom... Dnes jsem chtěl ukládat více věcí, takže třeba peníze, kolik hráč zabil hráčů a kolikrát zemřel, to bylo pro mě složité a popravdě jsem ani nevěděl jak na to :d, takže úkolem scriptu bylo: při připojení hráče se zjistí, zda hráč má vytvořenou složku se svým jménem, pokud ne, vytvoří se. To bohužel funguje jen z 20%, složku to vytvoří, ale místo jména hráče to napíše %s což tedy taky nevím jak udělat, aby to ukládalo pod jménem hráče. Další problém byl ten, že pokud si hráč zobrazil dialog když se připojil ukázala se tam číslice jen u peněz, u killů a umrtí ne. Dál jsem to už netestoval... Prosím o pomoc, do pawna jsem se tedy pustil opravdu dost a mám velký zájem naučit se ho, tak prosím o trpělivost se mnou :). Předem děkuji.

 

Kód:

#include <a_samp>
#include <zcmd>
#include <DOF2>
 
#define path "/Hraci/%s.txt"
 
enum pInfo
{
pCash,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
new playername[MAX_PLAYER_NAME];
 
public OnPlayerConnect(playerid)
{
new string[256];
if(!DOF2_FileExists(path)){ DOF2_CreateFile(path);}
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, playername, "Penize");
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, playername, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, playername, "Umrti");
format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid]);
ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}
 
public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
GetPlayerName(playerid, playername, sizeof(playername));
DOF2_SetInt(path, playername, PlayerInfo[playerid][pKills]);
DOF2_SetInt(path, playername, PlayerInfo[playerid][pDeaths]);
return 1;
}
 
public OnPlayerDisconnect(playerid, reason)
{
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
DOF2_SetInt(path, playername, PlayerInfo[playerid][pCash], "Penize");
return 1;
}
 
CMD:mon(playerid, params[])
{
GivePlayerMoney(playerid, 57456);
return 1;
}
 
CMD:stats(playerid, params[])
{
    new string[256];
if(!DOF2_FileExists(path)){ DOF2_CreateFile(path);}
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, playername, "Penize");
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, playername, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, playername, "Umrti");
format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid]);
ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}
Link to comment
Share on other sites

9 odpovědí na tuto otázku

Recommended Posts

  • 0

Nejdříve si musíš cestu naformátovat, to je důvod proč se ti místo hráčova jména zobrazuje %s:

new cesta[31]; //Hraci\ + Jméno(max. 24 znaků) + \0 = 31 znaků
format(cesta, sizeof(cesta), path, PlayerName(playerid));

Ještě stock na zjištění jména:

stock PlayerName(playerid)
{
    new Name[24 + 1];
    GetPlayerName(playerid, Name, sizeof(Name));
    return Name;
}

Toto:

PlayerInfo[playerid][pCash] = DOF2_GetInt(path, playername, "Penize");
.
.
je blbost (žádný playername, tu nepotřebujeme, stačí pouze cesta), správně takto:
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, "Penize");

Bodejť by se ti to zobrazovalo, dkyž tu máš pouze toto:

format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid]); //PlayerInfo[playerid] --> new PlayerInfo[MAX_PLAYERS][pInfo]; Něco ti tu chybí nemyslíš? A to 3x 

Takto správně:

format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);

Tohle je zbytečné:

CMD:stats(playerid, params[])
{
    new string[256];
if(!DOF2_FileExists(path)){ DOF2_CreateFile(path);}
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, playername, "Penize");
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, playername, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, playername, "Umrti");
format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid]);
ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}

Proč? Veškerá data jsi přece načetl do proměnných, proč je tedy znovu číst?

CMD:stats(playerid, params[])
{
    new string[128];
    format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
    ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}

OnPlayerDisconnect: To máš celkem dobře, akorát zase odstraň to GetPlayerName, a naformátuj si tam cestu jako u Connectu, samozřejmě zase odstraň playername z DOF2_SetInt (stačí ti zase cesta, tag (či jak se to jmenuje) a Proměnná z které ty data chceš uložit. ;)

 

Samozřejmě ti tu ještě chybí nějaká registrace a login. Ale to si určitě napíšeš sám, ať se to naučíš. 

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Děkuju moc za tvou pomoc :), začal jsem to pomalinku chápat i tohle, udělal jsem vše podle tebe ale pořád tu mám jeden error a warning. Ten error tedy nechápu jelikož jsem žádný takovýto format ještě neformatoval...

 

Takže můj kód po úpravě:

 

 

#include <a_samp>
#include <zcmd>
#include <DOF2>
 
#define path "/Hraci/%s.txt"
 
new cesta[31];
format(cesta, sizeof(cesta), path, PlayerName(playerid));
 
stock PlayerName(playerid)
{
new Name[24 + 1]+
GetPlayerName(playerid, Name, sizeof(Name));
return Name;
}
 
enum pInfo
{
pCash,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
new playername[MAX_PLAYER_NAME];
 
public OnPlayerConnect(playerid)
{
new string[256];
if(!DOF2_FileExists(path)){ DOF2_CreateFile(path);}
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, "Penize");
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, "Umrti");
format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}
 
public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
GetPlayerName(playerid, playername, sizeof(playername));
DOF2_SetInt(path, playername, PlayerInfo[playerid][pKills]);
DOF2_SetInt(path, playername, PlayerInfo[playerid][pDeaths]);
return 1;
}
 
public OnPlayerDisconnect(playerid, reason)
{
PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, "Umrti");
DOF2_SetInt(path, "Penize", PlayerInfo[playerid][pCash]);
DOF2_SetInt(path, "Penize", PlayerInfo[playerid][pKills]);
DOF2_SetInt(path, "Penize", PlayerInfo[playerid][pDeaths]);
return 1;
}
 
CMD:mon(playerid, params[])
{
GivePlayerMoney(playerid, 57456);
return 1;
}
 
CMD:stats(playerid, params[])
{
    new string[256];
if(!DOF2_FileExists(path)){ DOF2_CreateFile(path);}
GetPlayerName(playerid, playername, sizeof(playername));
PlayerInfo[playerid][pCash] = DOF2_GetInt(path, playername, "Penize");
PlayerInfo[playerid][pKills] = DOF2_GetInt(path, playername, "Zabil");
PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, playername, "Umrti");
format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid]);
ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
return 1;
}

 

 

 

Error a warning:

C:\Users\***\Desktop\test - kopie.pwn(8) : error 021: symbol already defined: "format"
C:\Users\***\Desktop\test - kopie.pwn(78) : warning 203: symbol is never used: "cesta"
Link to comment
Share on other sites

  • 0

Ještě něco málo k tomu enumu a k formatu, abys pochopil proč to tak je.

 

O enumu se dá říct, že je to block proměnných (ve skutečnosti konstant). ZDE pěkně sepsané. - Určitě se najde někdo. kdo to vysvětlí lépe. :d

a tím new PlayerInfo[MAX_PLAYERS][pInfo]; vytváříš pole polí, kde první "pole" uchovává playerid a druhé konstanty z enumu pInfo. Takže jak vidíš enum ti dost ulehčí práci...

Tímto server vytvoří:

PlayerInfo[0][pCash];
PlayerInfo[0][pKills];
PlayerInfo[0][pDeaths];
PlayerInfo[1][pCash];
PlayerInfo[1][pKills];
PlayerInfo[1][pDeaths];
PlayerInfo[2][pCash];
PlayerInfo[2][pKills];
PlayerInfo[2][pDeaths];
... až    [999]

1000 proměnných je dost velké číslo a proto se někdy používá MAX_PLAYERS_EX, který si předem nadefinuješ většinou na počet slotů tvého serveru. ;)

 

format se používá pro "naformátování" textu. Především tam, kde využiješ proměnných. Na místo, kam chceš dosadit proměnnou napíšeš tzv. specifikátor (%s. %d, ...), který ti určí zda dosazená proměnná má být string, či int nebo třeba desetinné číslo. TADY seznam specifikátorů. Proměnné následně zapíšeš ve stejném pořadí za "," tedy jako další parametry.

 

Edit:

 

 

#include <a_samp>
#include <zcmd>
#include <DOF2>

#define path "/Hraci/%s.txt"

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

stock PlayerName(playerid)
{
	new Name[24 + 1]+
	GetPlayerName(playerid, Name, sizeof(Name));
	return Name;
}

public OnPlayerConnect(playerid)
{
	new string[128],
		cesta[31];
	format(cesta, sizeof(cesta), path, PlayerName(playerid));
	if(!DOF2_FileExists(path)){
		//tady nějaká ta registrace
		DOF2_CreateFile(path);
		//nastavení hodnot na 0 (default)
	}
	
	PlayerInfo[playerid][pCash] = DOF2_GetInt(path, "Penize");
	PlayerInfo[playerid][pKills] = DOF2_GetInt(path, "Zabil");
	PlayerInfo[playerid][pDeaths] = DOF2_GetInt(path, "Umrti");
	format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
	ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	PlayerInfo[killerid][pKills]++;
	PlayerInfo[playerid][pDeaths]++;
	//Tady jsi zase zjišťovál jméno a ukládal hodnoty, což je zase zbytečné jelikož hodnoty ukládáš při hráčově odpojení
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	//Tady jsi zase četl ze souboru, to stejné jako u CMD:stats --> taky zbytečné hodnoty už jsi jednou načetl do paměti tam zůstanou dokud se hráč neodpojí (respektive tam zůstanou i po odpojení akorát se vynulují)
	new cesta[31];
	format(cesta, sizeof(cesta), path, PlayerName(playerid));
	DOF2_SetInt(path, "Penize", PlayerInfo[playerid][pCash]);
	DOF2_SetInt(path, "Zabil", PlayerInfo[playerid][pKills]);
	DOF2_SetInt(path, "Umrti", PlayerInfo[playerid][pDeaths]);
	return 1;
}

CMD:mon(playerid, params[])
{
	GivePlayerMoney(playerid, 57456);
	return 1;
}

CMD:stats(playerid, params[])
{
    new string[128];
    format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
    ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
    return 1;
} 

 

 

 

Nemůžeš formátovat tu cestu globálně, jelikož potřebuješ playerid a to ty prostě nemáš. Vytvořit proměnnou cesta jako globální klidně můžeš, ale jelikož to použiješ jen 2x, tak to zase nemá cenu.

Edited by GaRGoyLeS
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Tak tedy udělal jsem vše dle tebe a stále mi to ukládá do složky né pod jménem hráče ale pod jménem: %s, poté jsem tedy použil můj nemilý způsob CTRL + V a okopíroval to od tebe jelikož jsem nevěděl, zda tam někde nemám chybu, hledal jsem a nenašel, ale proto kdybych ji přehlídl jsem na rychlo radši použil teď CTRL + V...

Link to comment
Share on other sites

  • 0

To proto, že jsem idiot a zapomněl jsem změnit proměnnou "path" na nově vytvořenou a naformátovanou "cesta" :d

 

 

#include <a_samp>
#include <zcmd>
#include <DOF2>

#define path "/Hraci/%s.txt"

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

stock PlayerName(playerid)
{
	new Name[24 + 1]+
	GetPlayerName(playerid, Name, sizeof(Name));
	return Name;
}

public OnPlayerConnect(playerid)
{
	new string[128],
		cesta[31];
	format(cesta, sizeof(cesta), path, PlayerName(playerid));
	if(!DOF2_FileExists(path)){
		//tady nějaká ta registrace
		DOF2_CreateFile(cesta);
		//nastavení hodnot na 0 (default)
	}
	
	PlayerInfo[playerid][pCash] = DOF2_GetInt(cesta, "Penize");
	PlayerInfo[playerid][pKills] = DOF2_GetInt(cesta, "Zabil");
	PlayerInfo[playerid][pDeaths] = DOF2_GetInt(cesta, "Umrti");
	format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
	ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	PlayerInfo[killerid][pKills]++;
	PlayerInfo[playerid][pDeaths]++;
	//Tady jsi zase zjišťovál jméno a ukládal hodnoty, což je zase zbytečné jelikož hodnoty ukládáš při hráčově odpojení
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	//Tady jsi zase četl ze souboru, to stejné jako u CMD:stats --> taky zbytečné hodnoty už jsi jednou načetl do paměti tam zůstanou dokud se hráč neodpojí (respektive tam zůstanou i po odpojení akorát se vynulují)
	new cesta[31];
	format(cesta, sizeof(cesta), path, PlayerName(playerid));
	DOF2_SetInt(cesta, "Penize", PlayerInfo[playerid][pCash]);
	DOF2_SetInt(cesta, "Zabil", PlayerInfo[playerid][pKills]);
	DOF2_SetInt(cesta, "Umrti", PlayerInfo[playerid][pDeaths]);
	return 1;
}

CMD:mon(playerid, params[])
{
	GivePlayerMoney(playerid, 57456);
	return 1;
}

CMD:stats(playerid, params[])
{
    new string[128];
    format(string, sizeof(string), "{00FFFF}Peníze: %d\n{00FFFF}Zabil: %d\n{00FFFF}Umřel: %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths]);
    ShowPlayerDialog(playerid, 367, DIALOG_STYLE_MSGBOX, "{00FF00}Tvé statistiky", string, "Zavřít", "");
    return 1;
} 

 

 

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0

To bude tím, že tam nic neukládáš :d

if(!DOF2_FileExists(path))
{
Zobrazíš dialog REGISTER
}

OnDialog...
REGISTER:{
    DOF2_CreateFile(cesta, inputtext);//nevím jestli to s tím inputtextem takhle funguje, ale všude píší, že jo , jinak na heslo použi nějakej HASH třeba Whirpool
    DOF2_SetInt(cesta, "Penize", 1000);//nastavíš defaultní hodnoty, peníze mu musíš potom givnout
    DOF2_SetInt(cesta, "Zabil", 0);
    DOF2_SetInt(cesta, "Umrti", 0);
    DOF2_SaveFile();

LOGIN: ....
}
Link to comment
Share on other sites

  • 0

Právě, že když jsem dělal to svoje jednoduchý ukládání co mi ukládalo jen jednu hodnotu, stačilo když jsem třeba dotyčnýmu givnul money a on se odpojil, potom se to uložilo a automaticky zapsalo, no zkusím to takhle, kdyby cokoliv dám vědět :d, každopádně díky.


Tak něják jsem se s tím popral :d, neukládalo mi to, jelikož jsem byl zvyklej na Dini, kde jsem nějáký DOF2(Dini)_SaveFile(); nepotřeboval, také mi tam chyběla funkce na zjištění peněz co hráč má... Nyní to ukládá, nevím co a jak u toho když někoho někdo zabije, to později otestuju :d Pro teď děkuji za tvůj čas, moc jsi mi pomohl :)

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...