Szerző Téma: Enum használata, mentések dinivel.  (Megtekintve 6292 alkalommal)

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Enum használata, mentések dinivel.
« Dátum: 2013. Január 06. - 15:40:34 »
+4
Helló mindenkinek! Mivel sokan kérnek segítséget az enum használatával ezért gondoltam csinálok egy tiszta leírás, hogy mindenki tudja meg csinálni a saját mentését amit szeretne menteni ez lehet admin színt, pénz, pont, szám. Az enum segítségével más szóval \"mátrix\" segítségével tudunk tárolni adatokat egy adott játékosnak vagy több játékosnak a szerveren is, létre tudunk hozni egy külön szám tárolót is..
Mód elejére:
 

#include <a_samp> //samp inc..
#include <dini> //dini inc segítségével tudjuk menteni az adatokat
#include <zcmd> //parancs feldolgozó

 
Létrehozunk 2 tárolót amiben a nevet és azt a számot tárolyuk el majd..
 

new nev[MAX_PLAYER_NAME]; //nevet tárolunk
new szam[100]; //számot tárolunk el, a száz az a karakterlánc száma ezt lehet nagyobbítani..

 
Ebben az apró kodban létrehozok egy enumot amiben az \"admin\" színtet fogom tárolni vagyis ez lehet egy szám vagy akár egy szöveg..
 

enum pInfo
{
admin //admin ebben tárolunk
}
new PlayerInfo[MAX_PLAYERS][pInfo]; //A módban defináljuk a pInfo enumot mátrixot..

 
OnPlayerDisconnect alatt lementjük a játékosnak az adatait vagyis ha lelép a szerverrõl a dini segítségével lementjük egy fáljba a játékosnak az adatait, számot.
 

public OnPlayerDisconnect(playerid)
{
    GetPlayerName(playerid, nev, sizeof(nev)); //lekérdezzûk a játékosnak a nevét majd mikor létrehozza a mappát akkor a játékos nevévvel hozzuk létre..
    format(szam, sizeof(szam), \"/Szamok/%s.ini\",nev); //ide tárolyuk el az adatokat itt megadhatjuk a mappát.
    if(!dini_Exists(szam)) { //Ha létezik ez a játékos akkor nem hozza létre a mappát neki újra..
    } else {
    dini_IntSet(szam, \"Szam\", PlayerInfo[playerid][Pontok]);  //segítségével lementjük a PlayerInfo[playerid][Pontok] tárolóval a Szamok mappában.
    }
}

 
A csatlakozáskor az OnPlayerConnect függvényt kérdezi le elõszõr, ennek segítségével be tudjuk tölteni a játékosoknak az adatait a szerveren amit lementettünk az OnPlayerDisconnect alatt!
 

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, nev, sizeof(nev)); //lekérdezzûk a játékosnak a nevét.
    format(szam, sizeof(szam), \"/Szamok/%s.ini\",nev); //elõhívjuk a Szamok mappából azt a játékost amelyiknek be kell tölteni az adatokat.
    if(!dini_Exists(szam)) { //ha létezik a fálj akkor nem hozza létre..
    dini_Create(szam); //létrehozzunk egy fálj a játékos nevével.
    dini_IntSet(szam, \"Szam\", 0); //bele írjuk a játékos fáljába vagyis lenullázuk, hogy alap 0 -tól kezdjen.
    PlayerInfo[playerid][Pontok] = dini_Int(szam, \"Szam\"); //bele írja, hogy a játékos akkor csatlakozott vagyis nincs neki még semmi pontja.
    } else { //ha mégis van akkor elõhívjuk így is..
    PlayerInfo[playerid][Pontok] = dini_Int(szam, \"Szam\"); //Lekérdezzûk ha van a játékosnak akkor oda adjuk neki azokat a pontokat amiket szerezett!
    } //zárási rész..
    return 1;
}

 
Több féle képpen tudunk hozzá adni egy számot egy fáljba ez lehet:

++ segítségivel hozzá adunk 1 számot.

 

PlayerInfo[playerid][Pontok]++;

 
Hozzá tudunk adni több számot is vagyis:

Hozzá adtunk neki most 100 pontot amit le tudunk kérzni is, ezt a számot lehet növelni és csokkenteni is..

 

PlayerInfo[playerid][Pontok] += 100;

 
Ha le szeretnék a játékos pontjából, számából vonni egyy adott számot akkor:
- segítségével le tudjuk vonni a játékosnak azt a számot amit hozzá adtunk a pontjához.
 

PlayerInfo[playerid][Pontok] -= 100;

 
Le tudjuk a játékosnak vonni egyenként is vagyis:
Ennek segítségével le tudunk vonni 1 egy számjegyet..
 
PlayerInfo[playerid][Pontok]--;

 
Ennek segítségével le tudjuk kérdezni a játékosnak épp mennyi száma van mennyi pontja a karakterén
 
PlayerInfo[playerid][Pontok]

 
Szerintem nem nagyon nehéz ezeket megtanúlni fõleg ilyen enum tárolókat,  nem csak enumokat lehet meg csinálni több féle megoldása van amit létre tudunk hozni én  csak most így írtam le nektek :D
Vigyázzat! Hozzunk létre elõbb egy Szamok mappát a scriptfiles mappában amiben létre tudja hozni a szerver az adott fájlokat!!!
Több segítségért az enum használatáról itt lehet olvasni: http://sampforum.hu/index.php?topic=4044.0 a dini használatáról pedig itt: http://sampforum.hu/index.php?topic=3075.msg36705#msg36705
« Utoljára szerkesztve: 2013. Szeptember 02. - 14:51:30 írta Benceee »

Nem elérhető Rupert

  • 2301
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #1 Dátum: 2013. Január 06. - 16:17:04 »
0
1. Nem minden mátrix enum!! Mátrixot egy kétdimenziós tömbként is értelmezhetünk, pl. ez is egy mátrix:
 

new valtozo[MAX_PLAYERS][24];

 
2. KETREC? AZ MI? XD Nem karakterlánc? :doubt:
« Utoljára szerkesztve: 2013. Január 06. - 17:11:23 írta Rupert »

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #2 Dátum: 2013. Január 06. - 17:01:42 »
0
de bocsánat csak mindig úgy röviditem és nem javítottam :D Köszönöm az észrevételt! :)

Nem elérhető bendor

  • 2949
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #3 Dátum: 2013. Január 06. - 19:18:11 »
0
A dutils-t hol használod?
Ahogy láttam sehol,ergo felesleges betölteni.

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #4 Dátum: 2013. Január 06. - 20:20:16 »
0
Köszönöm, hogy szóltál mivel mindig oda írom és elfelejtem kivenni.. :D

Nem elérhető Shady

  • 313
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #5 Dátum: 2013. Január 06. - 22:38:05 »
0
Szerintem szép és érthetõ a leirásod. Grat hozzá :)

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #6 Dátum: 2013. Január 06. - 23:54:38 »
0
Részemrõl, szerintem felesleges a változókkal baszakodni, ha ott a PVar, GVar.

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #7 Dátum: 2013. Január 07. - 00:02:07 »
0
Tudom egyszerûbb de én inkább ezt csinálom nekem jobban megyen :D De arról is lehet :D

Nem elérhető bendor

  • 2949
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #8 Dátum: 2013. Január 07. - 07:07:40 »
0
En meg szimplan betoltok/mentek. Se var funkciokkal, se valtozokkal nem dolgozok.
Helytakarekos, de megis jo megoldas  ;)

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #9 Dátum: 2014. Május 26. - 20:43:25 »
0
Muszáj kiemelnem egy fontos dolgot.
Az enumerátorokban szereplõ deklarált értékek igazából konstansok. Tehát a
 

enum pInfo
{
admin = 5
};
new PlayerInfo[MAX_PLAYERS][pInfo];
printf(\"%i\", PlayerInfo[0][admin] );

 
kód esetén a kiírt érték NEM 5 lesz (apropó, az enumok után kell ;, mint bármelyik másik adatkezelõ struktúra esetén, ami itt kimaradt). A helyzet az, hogy az enumok gyakorlatilag konstansok, amelyekkel az indexeket pótoljuk.
Az enum kód megegyezik az alábbival:
 

const ADMIN = 0;
const LEVEL = 1;
new PlayerInfo[MAX_PLAYERS][2];
for( new i=0; i<MAX_PLAYERS; i++ )
{
  PlayerInfo[ADMIN] = 0;
  PlayerInfo[LEVEL] = 0;
  printf(\"%i\", PlayerInfo[ADMIN] );
}

 
A nagy különbség, hogy az enumok dinamikusan hozódnak létre. Vagyis, pl:
 

enum TEST
{
   e_ONE, // konstans értéke 0
   e_TWO,  //1
   e_THREE,  // 2
   e_FOUR = 12, // 12
   e_FIVE, // 13
   e_SIX // 14
};

 
Ez természetesen szükséges is, hiszen, ha pl létrehozunk egy stringet az enumban, akkor:
 

enum TEST
{
   e_ONE, // konstans értéke 0
   e_TWO,  //1
   e_THREE,  // 2
   e_FOUR[5], // 3, 4, 5, 6, 7
   e_FIVE, // 8
   e_SIX // 9
};

 
vagyis az enum konstansai igazodnak az adatstruktúrákhoz. Ha pl lekérdezzük az enumeráció adattípus nagyságát:
 

printf(\"%i\"_:TEST);

 
akkor az eredmény 9 lesz.


Az enumokat tagként lehet használni:
 

enum TEST
{
   e_ONE = 5, // konstans értéke 5
   e_TWO,  //6
};
new TEST:valtozo = e_ONE; //A változó értéke mostmár 1.

 
A fenti kódrészlet teljesen rendben van.


Másik nagyon fontos dolog, hogy az enumerációkat az esetek 99%-ában nagybetûvel kezdjük, és nem véletlenül. A legtöbb esetben az sem véletlen, ha kisbetûvel kezdjük õket (ha a személy érti a lényeget). Vannak ugyanis gyenge és erõs enumok. Az erõs enumokat nagybetûvel kezdjük, a gyengéket pedig nem:
 

enum TEST
{
   E_ONE = 5, // konstans értéke 5
   E_TWO,  //6
};
new valtozo = TEST:E_ONE; //Warning, mert a valtozo változónak nincs TEST tagje
enum e_TEST
{
   e_ONE = 5, // konstans értéke 5
   e_TWO,  //6
};
new valtozo = e_TEST:e_ONE; //Nincs warning
« Utoljára szerkesztve: 2014. Június 07. - 15:34:10 írta krisk »

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #10 Dátum: 2014. Május 26. - 21:06:32 »
0
Bocs, hogy offolok, de MAX_PLAYERS-el nem fogod tudni, mert az enum 0-tól számolja. MAX_PLAYERS-1-el esetleg.
ON: jó, hogy épp most váltottam, az sql-bõl direktben lekéregetõs megoldásra.

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #11 Dátum: 2014. Május 26. - 21:38:04 »
0
Nem ez volt a leírás lényege, ezért nem figyeltem, de valóban az én hibám, javítom.

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #12 Dátum: 2014. Május 26. - 20:43:25 »
0
Muszáj kiemelnem egy fontos dolgot.
Az enumerátorokban szereplõ deklarált értékek igazából konstansok. Tehát a
 

enum pInfo
{
admin = 5
};
new PlayerInfo[MAX_PLAYERS][pInfo];
printf(\"%i\", PlayerInfo[0][admin] );

 
kód esetén a kiírt érték NEM 5 lesz (apropó, az enumok után kell ;, mint bármelyik másik adatkezelõ struktúra esetén, ami itt kimaradt). A helyzet az, hogy az enumok gyakorlatilag konstansok, amelyekkel az indexeket pótoljuk.
Az enum kód megegyezik az alábbival:
 

const ADMIN = 0;
const LEVEL = 1;
new PlayerInfo[MAX_PLAYERS][2];
for( new i=0; i<MAX_PLAYERS; i++ )
{
  PlayerInfo[ADMIN] = 0;
  PlayerInfo[LEVEL] = 0;
  printf(\"%i\", PlayerInfo[ADMIN] );
}

 
A nagy különbség, hogy az enumok dinamikusan hozódnak létre. Vagyis, pl:
 

enum TEST
{
   e_ONE, // konstans értéke 0
   e_TWO,  //1
   e_THREE,  // 2
   e_FOUR = 12, // 12
   e_FIVE, // 13
   e_SIX // 14
};

 
Ez természetesen szükséges is, hiszen, ha pl létrehozunk egy stringet az enumban, akkor:
 

enum TEST
{
   e_ONE, // konstans értéke 0
   e_TWO,  //1
   e_THREE,  // 2
   e_FOUR[5], // 3, 4, 5, 6, 7
   e_FIVE, // 8
   e_SIX // 9
};

 
vagyis az enum konstansai igazodnak az adatstruktúrákhoz. Ha pl lekérdezzük az enumeráció adattípus nagyságát:
 

printf(\"%i\"_:TEST);

 
akkor az eredmény 9 lesz.


Az enumokat tagként lehet használni:
 

enum TEST
{
   e_ONE = 5, // konstans értéke 5
   e_TWO,  //6
};
new TEST:valtozo = e_ONE; //A változó értéke mostmár 1.

 
A fenti kódrészlet teljesen rendben van.


Másik nagyon fontos dolog, hogy az enumerációkat az esetek 99%-ában nagybetûvel kezdjük, és nem véletlenül. A legtöbb esetben az sem véletlen, ha kisbetûvel kezdjük õket (ha a személy érti a lényeget). Vannak ugyanis gyenge és erõs enumok. Az erõs enumokat nagybetûvel kezdjük, a gyengéket pedig nem:
 

enum TEST
{
   E_ONE = 5, // konstans értéke 5
   E_TWO,  //6
};
new valtozo = TEST:E_ONE; //Warning, mert a valtozo változónak nincs TEST tagje
enum e_TEST
{
   e_ONE = 5, // konstans értéke 5
   e_TWO,  //6
};
new valtozo = e_TEST:e_ONE; //Nincs warning
« Utoljára szerkesztve: 2014. Június 07. - 15:34:10 írta krisk »

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #13 Dátum: 2014. Május 26. - 21:06:32 »
0
Bocs, hogy offolok, de MAX_PLAYERS-el nem fogod tudni, mert az enum 0-tól számolja. MAX_PLAYERS-1-el esetleg.
ON: jó, hogy épp most váltottam, az sql-bõl direktben lekéregetõs megoldásra.

Nem elérhető krisk

  • 2380
    • Profil megtekintése
Enum használata, mentések dinivel.
« Válasz #14 Dátum: 2014. Május 26. - 21:38:04 »
0
Nem ez volt a leírás lényege, ezért nem figyeltem, de valóban az én hibám, javítom.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal