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