Jelentkezz be, hogy követhesd  
Követő(k) 0
BoOy

Adminrendszer készítés. /Az alapok/

8 hozzászólás ebben a témában

Sziasztok. Sok kezdõ szkriptelõnek lesz hasznos szerintem ez a kis leírás. Ebbe a témába leírom nektek hogyan kezdjétek el ezt az egészet. Mint minden admin rendszerben feltûnik az, hogy bizonyos szintek vannak ezek lehetnek bármennyi. 3 include-ot ajánlok, elsõ a dini - mentésre megfelelõ, a második az sscanf a parancsok paramétereinek megadására, és a zcmd - a parancsok miatt.

Körülmények, hozzávalók:

*A fájlokat rakd a megadott helyre.*

  • Illetve a szkript íráshoz a PAWNO program, amit megtalálsz a szervermappa/pawno mappába.

Ha ezek megvannak kezdõdhet is a szkriptelés. Indítsd el a pawno-t, hogy kezdjünk egy üres sorral.

A szkript elejére írjuk azokat include-okat, amiket beszeretnénk tölteni.

#include <a_samp>
#include <dini>
#include <sscanf2>

Figyelem! Az include neve legyen az, amilyen néven beraktad a .inc fájlt include mappába.

Például: szervermappa/pawno/include/farkas.inc

Akkor az include neve legyen ez: #include <farkas>

Ha ezzel megvagyunk vegyük fel az adatokat, és hogy mit szeretnénk menteni. Ez esetbe,admin szintet, halál,pénzt, illetve pontot fogunk elmenteni. Pár dologra van egy lekérdezõ funkció ami segít nekünk. Példa: GetPlayerMoney,GetPlayerScore.

Szükségünkre az enum(enumerátor) funkciót használjuk, ezzel tároljuk az adatokat.

enum pdata  // létrehozunk egy új változócsoportot
{
       Level,// A szint értéke
       Death,//A halálok száma
       Money,//A pénz értéke
       Score //A pont értéke
}

Ha ez megvan adjunk hozzá egy változót amivel az adott játékosnak a pdata adattárolóból betudunk tölteni.

new PlayerInfo[MAX_PLAYERS][pdata];

Ezt a változók fogjuk használni. A MAX_PLAYERS jelzi a játékosid-t, a pdata az adattároló neve.

Na elõször is kezdjük például a halál adatával:

Amikor meghalsz az OnPlayerDeath eljárás hívódik le. Ezért alatta növeljük a halál értékét 1-el.

public OnPlayerDeath(playerid, killerid, reason)
{
        PlayerInfo[playerid][Death]++; //növeltük az értéket 1-el.
return 1;
}

Most a pénzre és a pontokra azért nem térnék rá mivel azt egyszerû módon csak menteni kell.

Következõ az admin szintek. Ezt egyben egy paranccsal fogom megmutatni, és azt is hogy tudsz egy másik játékosnak adni admint. Ez a parancs a /setlevel lesz.

CMD:setlevel(playerid,params[])
{
new playerid2,level;
if(sscanf(params,"id",playerid2,level)) return SendClientMessage(playerid,-1,"HASZNÁLAT: /setlevel [játékosid] [szint 0-5]");
if(playerid2 == INVALID_PLAYER_ID)return SendClientMessage(playerid,-1,"Rossz játékos ID");
if(level < 0 || level > 5)return SendClientMessage(playerid,-1,"HASZNÁLAT: /setlevel [játékosid] [szint 0-5]");
if(PlayerInfo[playerid][Level] < 5) return SendClientMessage(playerid,-1,"A parancs használatához legalább 5-ös színtû adminnak kell lenned.");
PlayerInfo[playerid2][Level] = level;
SendClientMessage(playerid,-1,"Sikeresen átállítottad az admin szintjét!");
    SendClientMessage(playerid2,-1,"Sikeresen át lett állítva az admin szinted!");
return 1;
}

playerid2-nek neveztük el a másik játékos id-jét. És a Level adatját átállítottuk a megadott "level" értékre.

Mentés - Betöltés:

Most kezdjük el a dini-t használni. Adminszinteknél legegyszerûbb, ha a játékos kilépésénél vagyis az OnPlayerDisconnect eljárás alá rakjuk a mentést, illetve a betöltést a játékos csatlakozásánál az OnPlayerConnect eljárás alá tesszük.

Kezdjük a mentéssel:

public OnPlayerDisconnect(playerid, reason) //Ugye amikor lecsatlakozik a játékos:
{
new string[128],name[MAX_PLAYER_NAME]; //létrehozunk egy formátumot, és egy nevet.
GetPlayerName(playerid,name,sizeof(name)); //Lekérdezzük a játékos nevét
format(string,sizeof(string),"%s.ini",name); //A nevéhez hozzácsatoljuk a fájl típusát.
if(dini_Exists(string)) //Ha létezik a fájl:
{
    dini_IntSet("Szint",PlayerInfo[playerid][Level]); //Beállítjuk a "Szint" nevû csoportot,
    dini_IntSet("Halalok",PlayerInfo[playerid][Death]); //Beállítjuk a "Halalok" nevû csoportot,
    dini_IntSet("Penz",GetPlayerMoney(playerid));//Beállítjuk a "Penz" nevû csoportot,
    dini_IntSet("Pont",GetPlayerScore(playerid));//Beállítjuk a "Pont" nevû csoportot,
}
return 1;
}

A betöltés:

A betöltés pedig így néz ki:

public OnPlayerConnect(playerid)
{
new string[128],name[MAX_PLAYER_NAME]; //Ugyan úgy létrehozunk egy formátumot....
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"%s.ini",name); // a nevéhez hozzátesszük a fájlt típusát...
if(dini_Exists(string))
{
	PlayerInfo[playerid][Level] = dini_Int(string,"Level"); //Lekérdezzük a "Level" csoport értékét.
	PlayerInfo[playerid][Death] = dini_Int(string,"Halalok");//Lekérdezzük a "Halalok" csoport értékét.
	GivePlayerMoney(playerid,dini_Int(string,"Penz"));//Lekérdezzük a "Penz" csoport értékét, és utána hozzáadjuk a pénzt.
	SetPlayerScore(playerid,dini_Int(string,"Pont"));//Lekérdezzük a "Pont" csoport értékét, és utána beállítjuk a pontjait.
}
else
{
    dini_Create(string); //FONTOS: hogyha nem található a játékos fájlja akkor hozzunk létre egy fájlt.
}
return 1;
}

Teljes szkript:

#include <a_samp>
#include <dini>
#include <sscanf2>
#include <zcmd>

enum pdata //az adattároló neve
{
       Level,// A szint értéke
       Death,//A halálok száma
       Money,//A pénz értéke
       Score //A pont értéke
}

new PlayerInfo[MAX_PLAYERS][pdata];

public OnFilterScriptInit()
{
return 1;
}

public OnFilterScriptExit()
{
return 1;
}

public OnPlayerConnect(playerid)
{
new string[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"%s.ini",name);
if(dini_Exists(string))
{
	PlayerInfo[playerid][Level] = dini_Int(string,"Level");
	PlayerInfo[playerid][Death] = dini_Int(string,"Halalok");
	GivePlayerMoney(playerid,dini_Int(string,"Penz"));
	SetPlayerScore(playerid,dini_Int(string,"Pont"));
}
else
{
    dini_Create(string);
}
return 1;
}

CMD:setlevel(playerid,params[])
{
new playerid2,level;
if(sscanf(params,"id",playerid2,level)) return SendClientMessage(playerid,-1,"HASZNÁLAT: /setlevel [játékosid] [szint 0-5]");
if(playerid2 == INVALID_PLAYER_ID)return SendClientMessage(playerid,-1,"Rossz játékos ID");
if(level < 0 || level > 5)return SendClientMessage(playerid,-1,"HASZNÁLAT: /setlevel [játékosid] [szint 0-5]");
if(PlayerInfo[playerid][Level] < 5) return SendClientMessage(playerid,-1,"A parancs használatához legalább 5-ös színtû adminnak kell lenned.");
PlayerInfo[playerid2][Level] = level;
SendClientMessage(playerid,-1,"Sikeresen átállítottad az admin szintjét!");
    SendClientMessage(playerid2,-1,"Sikeresen át lett állítva az admin szinted!");
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
new string[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"%s.ini",name);
if(dini_Exists(string))
{
    dini_IntSet(string,"Szint",PlayerInfo[playerid][Level]);
    dini_IntSet(string,"Halalok",PlayerInfo[playerid][Death]);
    dini_IntSet(string,"Penz",GetPlayerMoney(playerid));
    dini_IntSet(string,"Pont",GetPlayerScore(playerid));
}
return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[playerid][Death]++; //növeltük az értéket 1-el.
return 1;
}

Megjegyzés: Az adminszkriptekhez ajánlatos regisztráció rendszereket készíteni, de az már más tészta.

Remélem segítettem!

3 emberek kedveli ezt

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

[spoiler=ADMIN MODE: ON]Bõvítsd a leírást, 1 percet kapsz :D

Amúgy tényleg és ha valaki pl változók helyett inkább PVar-ar akarja írni vagy dini helyett mysql-al? arra is írhatnál valamit. :)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

[spoiler=ADMIN MODE: ON]Bõvítsd a leírást, 1 percet kapsz :D

Amúgy tényleg és ha valaki pl változók helyett inkább PVar-ar akarja írni vagy dini helyett mysql-al? arra is írhatnál valamit. :)

Haha de vicces vagy :D

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

[mod]Egész jó, esetleg a scriptben használt enumerátorokkal és a mentésekkel meg a hasonló nagyobb kaliberû dolgokkal linkelhetnél pár leírást a végén, de így is elég jó. Áthelyezve.[/mod]

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Értékelem a segítõ szándékod, de véleményem szerint nem eléggé igényes ahhoz, hogy a kezdõket megfelelõen segítse és megértesse a scriptelés alapköveit.

Ami nagyon szemet szúrt, az az enumerátor, ahogy te próbálod értelmezni. Az enumerátor nem "adattároló", sõt. Adattárolónak a változókat / static-okat nevezném. Az enumerátor egy olyan csoportot képez, amin keresztül adatra lehet hivatkozni. ( A tárolást a csoporton, tehát az enumerátoron belüli "változó" végzi! )

enum adatok // létrehozunk egy új változócsoportot
{
adminszint, // adattároló
penz, // -,,-
pont // -,, -
}

new adatlekeres[MAX_PLAYERS][adatok]; // és lényegében ITT definiálunk egy olyan globális tömböt, amiben egy adott játékos adott információjára tudunk hivatkozni.

A másik, az sscanf nem csak a parancsok miatt hasznosak, lényegében nem is térsz rá arra, hogy mire jó, mikor kell használni, ami természetesen a karakterláncok feldarabolása / szétválasztása. Egyelõre ennyit vettem észre.

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Értékelem a segítõ szándékod, de véleményem szerint nem eléggé igényes ahhoz, hogy a kezdõket megfelelõen segítse és megértesse a scriptelés alapköveit.

Ami nagyon szemet szúrt, az az enumerátor, ahogy te próbálod értelmezni. Az enumerátor nem "adattároló", sõt. Adattárolónak a változókat / static-okat nevezném. Az enumerátor egy olyan csoportot képez, amin keresztül adatra lehet hivatkozni. ( A tárolást a csoporton, tehát az enumerátoron belüli "változó" végzi! )

enum adatok // létrehozunk egy új változócsoportot
{
adminszint, // adattároló
penz, // -,,-
pont // -,, -
}

new adatlekeres[MAX_PLAYERS][adatok]; // és lényegében ITT definiálunk egy olyan globális tömböt, amiben egy adott játékos adott információjára tudunk hivatkozni.

A másik, az sscanf nem csak a parancsok miatt hasznosak, lényegében nem is térsz rá arra, hogy mire jó, mikor kell használni, ami természetesen a karakterláncok feldarabolása / szétválasztása. Egyelõre ennyit vettem észre.

Õõ az a baj Rupert én értem hogy ezek mit jelentenek csak hogy épp ezt akarom elérni hogy a kezdõ szkripterek szemszögébõl nézve értésék mirõl beszélünk, hiába írom le hogy megszetségteleníthetetlenségeskedéseitekért nem fogják tudni hogy ez az ember mirõl is beszél :)

Ezért akartam más mondatokkal elmagyarázni hogy tényleg valamit értsenek belõle.

"azért a tanárod is csak elmagyarázza a dolgokat utána tanítatja meg veled a leckét ;)"

Még egy megjegyzés hogy az sscanf-ra csak a parancsok miatt tértem rá, ez nem az sscanf leírásáról szól ;).

u.i: Snoop meglesz, és bõvíteni fogom ;)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Hát... Most mit ne mondjak, 2 hét volt a mostani adminrendszerem. De egyébként Kb. egy szinten van ezzel :) :D "+" , mert aki ebből nem tanúl, akkor semmiből

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Regisztrálj vagy jelentkezz be, hogy válaszolhass

Csak felhasználóként kommentelhetsz.

Regisztrálj

Légy közösségünk tagja még ma! Csak fél perc.


Regisztrálok

Jelentkezz be

Már van felhasználód? Lépj be!


Bejelentkezek
Jelentkezz be, hogy követhesd  
Követő(k) 0