Jump to content
  • 0

pomoc Ukladanie Y_INI zlyhalo


Danny

Dotaz

Zdravím,

 

mám menší problém. Pre svôj registračný systém používam y_ini od Y_Lessa.

 

Všetko ukľadám do súborov pomocov enumerátoru.

 

V enumerátori používam pJob, ako array pre povolania. pJob = 0 je nezamestnaný, 1 je policajt, 2 je právnik a podobne..

 

v OnPlayerSpawn, to mám nastavené takto:

 

 

if(PlayerInfo[playerid][pJob] == 1)

{

SetPlayerPos(.....);

SetPlayerColor(....);

}

 

Logicky by to malo fungovať, aj to funguje.. avšak! Akonáhle sa prihlásim za INÝ účet, ale s rovnakým ID tak som policajt. Nerozumiem tomu lebo logicky všetko čo ukladám, ukľadám rovnakým štýlom a ešte nikdy sa mi nestalo, že by napríklad dve rovnaké IDčka mali rovnaké štatistiky. Ukladám aj napríklad pSuicide, čo sú sebevraždy a nikdy som na ID 0 na 2ch účtoch nemal rovnaký počet sebevrážd. Stalo sa mi to len s týmto.

 

 

Preto by som vás poprosil o rady.. premýšľal som ako to spraviť. Resetoval som po pripojení hráča všetky jeho štatistiky pomocou takejto jednoduchej loop:

for(new i; pInfo: i < pInfo; i++) PlayerInfo[playerid][pInfo:i] = 0;

A potom som HESLO (pPass) načítal pri pripojení na server (ostatné štatistiky sa normálne načítajú PO prihlásení teda po vyplnení dialógu).

 

Avšak.. aj napriek tomu že som HESLO načítal po pripojení.. keď som sa pokúšal prihlásiť z účtu.. tak som mal heslo nastavené na hodnotu 0, čiže som sa nemohol prihlásiť pod heslom, pod ktorým som sa zaregistroval.

 

Potreboval by som pomôcť v riešení tejto zapeklitej situácie.. dovolím si povedať že to nieje entry level pawn.. preto s tým mám problémy ale snaď sa tu nájde nejaká zručná hlava, ktorá mi s tým fikne..vďaka. :-)

Link to comment
Share on other sites

13 odpovědí na tuto otázku

Recommended Posts

  • 0

Premenne sa resetuju len po restarte serveru.

 

Priklad:

Pripoji sa hrac s ID 0

Odpoji sa hrac s ID 0 a premenne na ID 0 ostanu v pamati

Pripoji sa hrac 2 na ID 0 a ostanu mu premenne minuleho hraca

 

Takze uz vies kde je chyba, vyresetuj premenne najlepsie asi ked sa prvy hrac odpoji a potom nacitaj ked sa druhy hrac pripoji..

 

K tomu heslu: Zrejme nacitas heslo skor ako vyresetujes premennu

Edited by Sanios
Link to comment
Share on other sites

  • 0

Hele po tom co jsi napsal ten problem mě napdalo to taky vyzkoušet u meho GM..a taky se mi to stalo..koukal jsem na google a pomohl mi pouze ten jednoduchej loop ale nic víc žádný načítání jsem tam už nedával a funguje to :) takže smaž to načítání hesla z těch dialogu :)

Link to comment
Share on other sites

  • 0

To Sanios:

 

Nie, heslo nenačítavam skôr. Najprv mám v OnPlayerConnect vyresetovanie, a až následne načítavam heslo.

 

Inak, čo sa týka toho druhého.. čiže to mám resetovať v OnPlayerDisconnect, a len z OnPlayerConnect to zmazať? Načítanie hesla v ňom mám riadne ponechať?

 

 

 

To vladasavel:

 

Prosímťa, z ktorých konkrétne?

 

 

 

To QWER:

 

Takže, mám hlavný public kde načítavam všetky dáta:

forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
	INI_Int("Penez",PlayerInfo[playerid][pCash]);
	INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
	INI_Int("Zabiti",PlayerInfo[playerid][pKills]);
    INI_Int("Umrti",PlayerInfo[playerid][pDeaths]);
 	return 1;
}

odtiaľto som načítanie Pass teda vymazal, keďže ho načítavam PO pripojení a nie PO prihlásení

 

Samotné všetky tieto údaje, načítavam teda PO prihlásení, konkrétne v dialógu prihlásenia:

INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);

Údaje v OnPlayerConnect resetujem:

for(new i; pInfo: i < pInfo; i++) PlayerInfo[playerid][pInfo:i] = 0;

a následne načítam heslo (hneď potom v OnPlayerConnect, teda PO pripojení)

	if(fexist(UserPath(playerid)))
	{
		INI_ParseFile(UserPath(playerid), "LoadUserPassword_%s", .bExtra = true, .extra = playerid);
  		ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Prihlasenie",""COL_WHITE"Zadaj svoje heslo pre prihlasenie..","Prihlasit","Odpojit");
	}
	else
	{
 		ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registracia",""COL_WHITE"Zadaj heslo pre zaregistrovanie.","Registrovat","Odpojit");
	}

A načítavam to rovnako, ako dáta, mám to hneď pod publicom:

forward LoadUserPassword_data(playerid, name[], value[]);
public LoadUserPassword_data(playerid, name[], value[])
{
    INI_Int("Heslo",PlayerInfo[playerid][pPass]);
    return 1;
}

Myslím si že toto sú všetky kódy, ktoré by ste mohli potrebovať.

 

Ešte v OnPlayerDisconnect ukľadám všetky údaje:

	new INI:File = INI_Open(UserPath(playerid));
	INI_SetTag(File,"data");
	INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
	INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
	INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
	INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
	INI_Close(File);

Za každú pomoc, prípadné objasnenie/priblíženie príčiny budem móc vďačný...:-)

Link to comment
Share on other sites

  • 0

Myslím konkrétně smazat to načítání toho hesla LoadUserPassword...Já tam nechal v connectu jen ten loop a ted to jde bez problémů;)

čím to bylo to sám nevím ale taky by mě zajímalo co bylo špatně

Link to comment
Share on other sites

  • 0

Hele QWERe ja to tak mám taky a hashuju pomoci stocku udb_hash a nedělá to žádnej prodblém a nic takže nechápu proč tě to tak rozčílilo..a když se koukneš na několik tutorialu na samp forum tak to co je pres udb_hash tak to ukládájí jako int a co používaj Whirlpool tak ukládají heslo jako String

Link to comment
Share on other sites

  • 0

Dobre, nerad by som bol aby to tu lockli.

 

Vlado mozes mi poslat pastebin na funkcny kod? Alebo skratka popisat, ako si to opravil? NIeje mozne ze by to tebe fachalo, a mne nie. Vdaka.

Link to comment
Share on other sites

  • 0

 

#include
#include

#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4

#define PATH "/Users/%s.ini"

#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"

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

forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Password",PlayerInfo[playerid][pPass]);
INI_Int("Cash",PlayerInfo[playerid][pCash]);
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
INI_Int("Kills",PlayerInfo[playerid][pKills]);
INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
return 1;
}

stock UserPath(playerid)
{
new string[128],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(string,sizeof(string),PATH,playername);
return string;
}

stock udb_hash(buf[]) {
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n {
s1 = (s1 + buf[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}


public OnPlayerConnect(playerid)
{
if(fexist(UserPath(playerid)))
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_WHITE"Type your password below to login.","Login","Quit");
}
else
{
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Registering...",""COL_WHITE"Type your password below to register a new account.","Register","Quit");
}
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
INI_Close(File);
return 1;
}

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

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid )
{
case DIALOG_REGISTER:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Registering...",""COL_RED"You have entered an invalid password.\n"COL_WHITE"Type your password below to register a new account.","Register","Quit");
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Password",udb_hash(inputtext));
INI_WriteInt(File,"Cash",0);
INI_WriteInt(File,"Admin",0);
INI_WriteInt(File,"Kills",0);
INI_WriteInt(File,"Deaths",0);
INI_Close(File);

SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Great! Your Y_INI system works perfectly. Relog to save your stats!","Ok","");
}
}

case DIALOG_LOGIN:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"You have successfully logged in!","Ok","");
}
else
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Login",""COL_RED"You have entered an incorrect password.\n"COL_WHITE"Type your password below to login.","Login","Quit");
}
return 1;
}
}
}
return 1;
}



Krásny y_ini Register system :) neviem čo vymýšľaš :);>\y_ini>

Link to comment
Share on other sites

  • 0

coze?? toto co ma byt za radu? ja nepotrebujem kopirovat incie register scripty, i ked tento je urobeny na celkom podobny sposob, nevidim v nom riesenie mojho problemu

Link to comment
Share on other sites

  • 0

Správa od QWERA

>

>

>

>

Hele QWERe ja to tak mám taky a hashuju pomoci stocku udb_hash a nedělá to žádnej prodblém a nic takže nechápu proč tě to tak rozčílilo..a když se koukneš na několik tutorialu na samp forum tak to co je pres udb_hash tak to ukládájí jako int a co používaj Whirlpool tak ukládají heslo jako String

ty si slepý? JASNE SA VYJADRIL

Coze? :d nie nemam heslo integer

či to si len tak napísal aby si rozpútal flame? ty si teda dobrý knot

 

 

>

>

>

Aha, a ako by to malo byt podla spravnosti? Prosim pouc ma, diky :)

INI_String Edited by SpiRinG
Link to comment
Share on other sites

  • 0

k čemu se vyjádřil ? nikde nenapsal proč tam má být string a ne integer ;) a kdybych byl slepej tak nevidim žádnej příspěvěk takže se navážej do někoho jinýho :)

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