GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Leírások/Útmutatók => A témát indította: mr_rich - 2012. Április 06. - 21:03:13

Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: mr_rich - 2012. Április 06. - 21:03:13
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/
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Rupert - 2012. Április 08. - 11:00:29
Szép leírás, kezdõknek nagyon hasznos lehet!  ;)
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Kovacs_Bela - 2012. Április 08. - 18:21:58
Ja! Fõleg hogy én nem értettem belõle semmit! XD.. lehet  azért mert haladó vagyok?xD
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Neax_Neax - 2012. Április 25. - 15:12:14
: ) Valaki adna nekem egy Linket ahonnan letölthetném a YSI/y_ini includé-t ? mert sehonnan nemtalálom :(
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Pedró - 2012. Április 25. - 16:52:22
a ysi-re keress rá..
www.google.com  - \"google a barátod\"
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Neax_Neax - 2012. Április 25. - 17:55:59
Jó már nemkell .
am  a Script tele van Hibákkal
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: [PlayZone]Rulexface - 2012. Április 25. - 17:59:41
Idézetet írta: Neax_Neax date=1335369359\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"19734\" data-ipsquote-contentclass=\"forums_Topic
Jó már nemkell .
am  a Script tele van Hibákkal
 
Ahoz hogy letudt fordítani hibamentesen éppen kell a letöltött cucc is a szerverbe te.. istenek emberiség
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Neax_Neax - 2012. Április 25. - 18:33:55
-.-
 megvan minden nem az #include-kkal van a baj hanem a sorokkal .
pl : jatekosinfo \"
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: tonyo - 2012. Április 26. - 13:01:40
A leírás igényesen legyen leírva, ne úgy hogy \'hogy ezt másold ide, oda, amoda\', \'ezt hagyd békén\' stb![/quote]
Innen idézve. Amit te írtál az inkább leírás, mint tutorial. Egy kezdõ ebbõl kb. semmit nem fog érteni...
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Neax_Neax - 2012. Április 26. - 15:55:25
Pl: Én most kezdtem a Scriptelést (már Tudok 45% -ban Kb ) És ebbol nemértek semmit sem :(
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: tonyo - 2012. Április 26. - 16:10:05
Nem csoda, mivel sehol semmi magyarázat, elõzetes ismeret nélkül nem csoda, ha valaki nem igazán érti.
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Neax_Neax - 2012. Április 26. - 18:54:45
Segitenél nekem akkor ? Lécci
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Caesar - 2012. Június 09. - 20:13:40
Jol leirtad az lenne a kérdésem hogy lehet e keresztezni egy driftszámlálóüval az adatok mentését hogy a drift pontot mentse ?
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: kurta999 - 2012. Június 09. - 21:19:06
Csak egy észrevétel.
Jelen esetben ha valaki meghal úgy, hogy nem játékos ölte meg (killerid = INVALID_PLAYERI_ID), akkor túlcsordulás lesz, mivel a Jatekosinfo elsõ cella mérete MAX_PLAYERS, de viszont itt 65535 lesz. (pKills-re értednõ..)
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Extasy449 - 2012. Augusztus 25. - 21:37:27
Nem értem mi a baj, beraktam(és meg is írtam), mind2 próbálkozásnál betölt, nem hoz be semmit csak a  skinválasztót a betöltõhelynél, és ha rámegyek hogy spawn, elkezd villogni a képernyõ és azt irja: \"stay within the worlds\" vagy valami hasonló..

Dupla hozzászólás automatikusan összefûzve. ( 2012. Augusztus 26. - 18:38:22 )

És hogyha én a sima pénzel akarom megoldani? Arról tudnál írni?
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Yakuza™ - 2012. Augusztus 27. - 14:39:20
Idézetet írta: Extasy449 date=1345923447\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"19734\" data-ipsquote-contentclass=\"forums_Topic
Nem értem mi a baj, beraktam(és meg is írtam), mind2 próbálkozásnál betölt, nem hoz be semmit csak a  skinválasztót a betöltõhelynél, és ha rámegyek hogy spawn, elkezd villogni a képernyõ és azt irja: \"stay within the worlds\" vagy valami hasonló..

Dupla hozzászólás automatikusan összefûzve. ( 2012. Augusztus 26. - 18:38:22 )

És hogyha én a sima pénzel akarom megoldani? Arról tudnál írni?
 
A mappákat létrehoztad a scriptfiles mappába?
Cím: [Leírás]Egyszerû regisztrációs rendszer
Írta: Extasy449 - 2012. Augusztus 28. - 23:02:42
Idézetet írta: Yakuza™ date=1346071160\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"19734\" data-ipsquote-contentclass=\"forums_Topic


Nem értem mi a baj, beraktam(és meg is írtam), mind2 próbálkozásnál betölt, nem hoz be semmit csak a  skinválasztót a betöltõhelynél, és ha rámegyek hogy spawn, elkezd villogni a képernyõ és azt irja: \"stay within the worlds\" vagy valami hasonló..

Dupla hozzászólás automatikusan összefûzve. ( 2012. Augusztus 26. - 18:38:22 )

És hogyha én a sima pénzel akarom megoldani? Arról tudnál írni?
 
A mappákat létrehoztad a scriptfiles mappába?
 
[/quote]
Azóta már megcsináltam, de köszönöm, hogy segíteni szeretnél :D