Szerző Téma: Adminrendszer készítés. /Az alapok/  (Megtekintve 6189 alkalommal)

Nem elérhető BoOy

  • 3209
  • 2013-as év szkriptere
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Dátum: 2013. Szeptember 01. - 20:46:37 »
+3
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!
« Utoljára szerkesztve: 2013. Szeptember 02. - 14:50:07 írta Benceee »

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Válasz #1 Dátum: 2013. Szeptember 01. - 20:48:30 »
0
Spoiler for 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. :)

Nem elérhető BoOy

  • 3209
  • 2013-as év szkriptere
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Válasz #2 Dátum: 2013. Szeptember 01. - 20:51:12 »
0
Idézetet írta: Flash date=1378061310\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"42313\" data-ipsquote-contentclass=\"forums_Topic
Spoiler for 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

Adminrendszer készítés. /Az alapok/
« Válasz #3 Dátum: 2013. Szeptember 01. - 21:01:12 »
0
Jó kezdõknek kaptál valamit!
http://www.abload.de/

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Válasz #4 Dátum: 2013. Szeptember 01. - 21:04:54 »
0
[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]

Nem elérhető Rupert

  • 2301
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Válasz #5 Dátum: 2013. Szeptember 01. - 21:09:41 »
0
É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.
« Utoljára szerkesztve: 2013. Szeptember 01. - 21:12:43 írta Rupert »

Nem elérhető BoOy

  • 3209
  • 2013-as év szkriptere
    • Profil megtekintése
Adminrendszer készítés. /Az alapok/
« Válasz #6 Dátum: 2013. Szeptember 01. - 22:12:31 »
0
Idézetet írta: Rupert date=1378062581\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"42313\" data-ipsquote-contentclass=\"forums_Topic
É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 ;)
« Utoljára szerkesztve: 2013. Szeptember 01. - 22:16:57 írta BoOy »

Adminrendszer készítés. /Az alapok/
« Válasz #7 Dátum: 2016. Október 24. - 18:53:22 »
0
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

Re:Adminrendszer készítés. /Az alapok/
« Válasz #8 Dátum: 2020. Február 22. - 10:40:38 »
0
Kijavítottam 2 warningot a 48-49-es sorban. Lehet csak nálam volt, de mindegyis. Ki lett javítva.
Idézet
#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íntu 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;
}


Itt lenne a teljes script.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal