Sziasztok. Nemrég kezdtem el foglalkozni a y_ini include fájlal és egy Regisztrációs script tutorialt írtam róla.
Elõször is kezdjük az include hozzáadásával(.pwn fájl elejére):
#include <YSI\\y_ini>
Szükségünk lesz még: sscanf, zcmd és dudb include fájlokra is. (parancsok és jelszókhoz)
#include <dudb>
#include <sscanf2>
#include <zcmd>
Most definiáljuk a regisztráció és belépés dialogot.
#define DIALOG_REG 1 //regisztrációs dialog
#define DIALOG_BELEP 2 //belépés dialog
Definiáljuk a fájlok mentési/beolvasási helyét.
#define PATH \"/enmodom/%s.ini\" //scriptfiles/enmodom mappát hozzuk létre, és ide fogja menteni a regisztrált játékosok adatait
Egy enumba tároljuk el a változókat.
enum iKarakter
{
pPass, //jelszó
pCash, //pénzünk
pKills, //ölések száma
pDeaths, //halálok száma
pScore //pontunk
}
new Jatekosinfo[MAX_PLAYERS][iKarakter];
Létrehozunk egy funkciót a játékos adatainak betöltésére:
forward Adattoltes_data(playerid,name[],value[]);
public Adattoltes_data(playerid,name[],value[])
{
INI_Int(\"Password\",Jatekosinfo[playerid][pPass]);
INI_Int(\"Cash\",Jatekosinfo[playerid][pCash]);
INI_Int(\"Kills\",Jatekosinfo[playerid][pKills]);
INI_Int(\"Deaths\",Jatekosinfo[playerid][pDeaths]);
INI_Int(\"Score\",Jatekosinfo[playerid][pScore]);
return 1;
}
Hozzunk létre egy sima stock funkciót:
stock Jatekosadatok(playerid)
{
new string[128],jatekosnev[MAX_PLAYER_NAME]; //létre hozunk egy szövegtárolót és a játékos nevének is egy tárolót
GetPlayerName(playerid,jatekosnev,sizeof(jatekosnev)); //lekérdezzük a játékos nevét
format(string,sizeof(string),PATH,jatekosnev); //megformáljuk az .ini fájl nevét
return string;
}
Most megnézzük, ha a játékos csatlakozik, regisztrálva van-e vagy most kell neki.
public OnPlayerConnect(playerid)
{
if(fexist(Jatekosadatok(playerid)))//\"fexist\" funkciót használjuk a fájl keresésére, hogy regisztrálva van e már a játékos aki csatlakozott.
{
INI_ParseFile(Jatekosadatok(playerid), \"Adattoltes_%s\", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid, DIALOG_BELEP, DIALOG_STYLE_INPUT,\"Bejelentkezés\",\"Írd be a jelszód a belépéshez\",\"Belép\",\"Bezár\");
}
else//ha nincs regisztrálva
{
ShowPlayerDialog(playerid, DIALOG_REG, DIALOG_STYLE_INPUT,\"Regisztráció folyamatban\",\"Írj be egy jelszót a regisztrációhoz!\",\"Regisztrálás\",\"Bezár\");
}
return 1;
}
Kialakítjuk a dialogokat:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid )
{
case DIALOG_REG:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REG, DIALOG_STYLE_INPUT, \"Regisztráció folyamatban\",\"Helytelen jelszót írtál be.\\nÍrj be egy jelszót a regisztrációhoz\",\"Regisztrálás\",\"Bezár\");
new INI:File = INI_Open(Jatekosadatok(playerid));//megnyitjuk a játékos fájlját.
INI_SetTag(File,\"data\");//fájl elõtagát állíthatjuk be
INI_WriteInt(File,\"Password\",udb_hash(inputtext)); //jelszót elmentjük
INI_WriteInt(File,\"Cash\",0); //Pénz beállítás
INI_WriteInt(File,\"Kills\",0); //Ölések száma
INI_WriteInt(File,\"Deaths\",0);//Halálozások száma
INI_WriteInt(File,\"Score\",0);//Pont száma
INI_Close(File);
Jatekosinfo[playerid][pCash]=10000; //Megadjuk a kezdõpénzt
}
}
case DIALOG_BELEP:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == Jatekosinfo[playerid][pPass])//Ha a beírt jelszó egyezik a fájlban tároltéval.
{
INI_ParseFile(Jatekosadatok(playerid), \"Adattoltes_%s\", .bExtra = true, .extra = playerid); //betöltjük a játékos adatait a fájlból.
}
else //ha nem egyezik a jelszó
{
ShowPlayerDialog(playerid, DIALOG_BELEP, DIALOG_STYLE_INPUT,\"Bejelentkezés\",\"Helytelen jelszó.\\nÍrd be a jelszód a belépéshez.\",\"Belép\",\"Bezár\");
}
return 1;
}
}
}
return 1;
}
Most mentsük el az adatokat, ha a játékos kilép:
public OnPlayerDisconnect(playerid, reason)
{
new INI:File = INI_Open(Jatekosadatok(playerid));
INI_SetTag(File,\"data\");
INI_WriteInt(File,\"Cash\",Jatekosinfo[playerid][pCash]);
INI_WriteInt(File,\"Kills\",Jatekosinfo[playerid][pKills]);
INI_WriteInt(File,\"Deaths\",Jatekosinfo[playerid][pDeaths]);
INI_WriteInt(File,\"Score\",Jatekosinfo[playerid][pScore]);
INI_Close(File);
return 1;
}
Írjuk meg, hogy ha meghal a játékos vagy megöl valakit, akkor növelje a statisztikát
public OnPlayerDeath(playerid, killerid, reason)
{
Jatekosinfo[killerid][pKills]++; //Ölések számát megnöveljük 1el
Jatekosinfo[playerid][pDeaths]++;//Halálozások számát megnöveljük 1el
return 1;
}
Pénz használata:
new Text:penzem; //Textdraw a pénznek
OnPlayerConnect-hez írjuk be a textdrawra vonatkozó funkciókat:
penzem = TextDrawCreate(500,140,\"Cash: 0\");
TextDrawFont(penzem,3);
TextDrawLetterSize(penzem,0.2,1.9);
TextDrawColor(penzem,0x00FF00FF);
TextDrawSetOutline(penzem,true);
TextDrawSetProportional(penzem,true);
TextDrawSetShadow(penzem,1);
OnPlayerDisconnect-hez:
TextDrawDestroy(penzem);
Regisztráció és Belépés után adjuk hozzá a következõ módon:
SetTimerEx(\"cashupdate\",3500,true,\"i\",playerid); //elindítunk egy timert a pénz frissítésére 3,5mp-enként
TextDrawShowForPlayer(playerid, penzem); //megjelnítjük a textdrawot
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid )
{
case DIALOG_REG:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REG, DIALOG_STYLE_INPUT, \"Regisztráció folyamatban\",\"Helytelen jelszót írtál be.\\nÍrj be egy jelszót a regisztrációhoz\",\"Regisztrálás\",\"Bezár\");
new INI:File = INI_Open(Jatekosadatok(playerid));//megnyitjuk a játékos fájlját.
INI_SetTag(File,\"data\");//fájl elõtagát állíthatjuk be
INI_WriteInt(File,\"Password\",udb_hash(inputtext)); //jelszót elmentjük
INI_WriteInt(File,\"Cash\",0); //Pénzünk
INI_WriteInt(File,\"Kills\",0); //Ölések száma
INI_WriteInt(File,\"Deaths\",0);//Halálozások száma
INI_WriteInt(File,\"Score\",0);//Pont száma
INI_Close(File);
Jatekosinfo[playerid][pCash]=10000;//kezdõpénzt adunk
SetTimerEx(\"cashupdate\",3500,true,\"i\",playerid); //elindítunk egy timert a pénz frissítésére 3,5mp-enként
TextDrawShowForPlayer(playerid, penzem); //megjelnítjük a textdrawot
}
}
case DIALOG_BELEP:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == Jatekosinfo[playerid][pPass])//Ha a beírt jelszó egyezik a fájlban tároltéval.
{
INI_ParseFile(Jatekosadatok(playerid), \"Adattoltes_%s\", .bExtra = true, .extra = playerid); //betöltjük a játékos adatait a fájlból.
SetTimerEx(\"cashupdate\",3500,true,\"i\",playerid); //elindítunk egy timert a pénz frissítésére 3,5mp-enként
TextDrawShowForPlayer(playerid, penzem); //megjelnítjük a textdrawot
}
else //ha nem egyezik a jelszó
{
ShowPlayerDialog(playerid, DIALOG_BELEP, DIALOG_STYLE_INPUT,\"Bejelentkezés\",\"Helytelen jelszó.\\nÍrd be a jelszód a belépéshez.\",\"Belép\",\"Bezár\");
}
return 1;
}
}
}
return 1;
}
//Pénzfrissítõ funkció
forward cashupdate(playerid);
public cashupdate(playerid)
{
new penzstring[40];//tároló a pénz kiírására
new enpenzem = Jatekosinfo[playerid][pCash];//változó a pénzünknek
format(penzstring,sizeof(penzstring),\"Cash: %d\",enpenzem); //megformázzuk a szöveget
TextDrawSetString(penzem,penzstring);
return 1;
}
Most pedig egy alap parancs, hogy megnézzük, hogy tudjuk kezelni a pénzünket.
CMD:fegyvert(playerid,params[])
{
new ammoam;//töltény változó
new gunid;//fegyver id-nek változó
if(sscanf(params,\"ii\",gunid,ammoam)) return SendClientMessage(playerid,0xAA3333AA,\"Használat: /fegyvert <fegyverid> <töltény>\");//ellenõrizzük, hogy jól írta be a parancsot
if((ammoam*35) > Jatekosinfo[playerid][pCash]) return SendClientMessage(playerid,0xAA3333AA,\"Nincs elég pénzed!\"); //ellenõrizzük van-e elég pénze (töltény 35Pénzbe kerül darabja)
GivePlayerWeapon(playerid,gunid,ammoam);//fegyvert adunk a játékosnak
Jatekosinfo[playerid][pCash]=Jatekosinfo[playerid][pCash]-(ammoam*35);//levonjuk a töltények árát
return 1;
}
Letöltés teljesbe:
http://www.solidfiles.com/d/e979b7b1dd/