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

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: AnthonyGates - 2014. Június 07. - 22:54:30

Cím: Melyiket válasszam?
Írta: AnthonyGates - 2014. Június 07. - 22:54:30
Üdv! Középhaladó scripter vagyok, most egy új, lõdözõs modot készítenék. Kérdésem lenne:
Melyik parancsfeldolgozót használjam?
Milyen módon tároljam az adatokat? Fájlalapon szeretném, melyik a legmegbíhatóbb módszer?
Cím: Melyiket válasszam?
Írta: Pedró - 2014. Június 07. - 23:05:57
ZCMD
dfile, vagy esetleg MySQL (de az nem helyi-fájl-alapú)
Cím: Melyiket válasszam?
Írta: AnthonyGates - 2014. Június 07. - 23:14:34
Tudom, hogy az SQL lenne a legmegfelelõbb, viszont sampban valamiért nem hajlandó együtt dolgozni velem. PHPban semmi baj.
Cím: Melyiket válasszam?
Írta: KovaNovik - 2014. Június 08. - 11:20:52
Parancsfeldolgozónak YCMD. Azzal parancsonként megadhatod a hozzá tartozó segítséget, szóval a helpnél mindig csak pár sor lesz mindem parancsot kiíratni. Rengeteg plusz funkciója van, és gyorsabb is a ZCMD-nél.
Mentéshez pedig MySQL. Ha most kezded (legalábbis pawnban), az R38-al tedd.
Ennek a futásához kell ez a pakk: http://www.microsoft.com/en-us/download/details.aspx?id=30679
Ha 32 bites a Windowsod, csak az x86-osat tedd fel, ha 64 bites, elõször az x86-osat, majd az x64-eset. A honlapon ki lehet választani melyiket szeretnéd. Rendszergazdaként kell futtatni!
Ha - a legtöbb hosthoz hasonlóan - linuxod van, és nem akarod a libek telepítésével piszkálni a konfigost (amit ugye csak õ, mint root tud megtenni), használd a mysql_static.so fájlt.
A legmegfelelõbb plugint innen szedheted le: https://github.com/pBlueG/SA-MP-MySQL/releases
Röviden annyi, hogy létrehozol egy globális változót, mondjuk
new Kapcs;

 és egyet, hogy a késõbb formázott queryket tároljuk. Pl. Mindig a játékos nevét formázzuk ebbe. Tehát:
 
new Kapcs, query[500];

 
OnGameModeInit-hez megadod, hogy az Kapcs változó értéke az legyen, ami a csatlakozásod (mysql adatbázissal való kapcsolatod) id-je. Ez azért kell, mert ez a verzió több kapcsolatot is támogat, akár használod, akár nem.
 
Kapcs = mysql_connect(...)

 
Az ilyeneket ki lehet lesni wikirõl.
Ami még fontos: OnGameModeExit-nél (miután mindent mentettünk persze) le kell zárni a kapcsolatot, mert a microsoft sz*rján keresztül tovább futna a kapcsolat, ami a következõ indításnál hibákat okozhat.
 
mysql_close(Kapcs);

 
Most jön a fõ rész, a query!
A queryk közül 2 használatos: query, tquery.
A query lefut, és rögtön utána lehet lekérni dolgokat. Ezt már kevésbé használják, mert laggoltathatja a szervert, mert nem külön szálon fut, nekem speciel van, hogy le sem kéri teljesen, már ugrik tovább (0-s adatokat használ, meg töktudja. Figyelem! A query után nem kell lekérni az eredményt (mint r6-ban, rögtön lehet mysql_fetch_field_content_intet használni, ami azt hiszem oszlopnévre  és sorra kérdezi le a dolgot, a másik meg oszlop-és sorszámra (ez ciklusoknál hasznos.
A mysql tquery. Ez azért jó, mert valahogyan külön szálon futtatja le a queryt, így pár tized milliszekundum (!) (pl. 0.560 ms) alatt lefut egy hosszabb query is! Miben más? Abban, hogy, ha el akarjuk tárolni az eredményt, meg kell adni neki egy eljárást, ahol meglegyen az eredmény, szabadon lekérdezgethetünk, ilyesmi, nem kell free_result. Példa, mikor kell eljárás, mikor nem:
Itt nem kellett plusz eljárás, mert miután beállította a pénzét 1500-ra, konkrétan (majdnem) lesz*rhatjuk, milyen eredményt dobott vissza.
 
new nev[25];
GetPlayerName(playerid, nev, sizeof(nev));
format(query, 150, \"UPDATE jatekosok SET Penz = \'1500\' WHERE Nev = \'%s\'\", nev);
mysql_tquery(Kapcs, query);

 
Itt pedig kell, mert a lekért adatokat fel szeretnénk használni:
 
//...
format(query, 150, \"SELECT * FROM jatekosok WHERE Nev = \'%s\'\", nev);
mysql_tquery(Kapcs, query, \"JatekosAdatBetoltott\", \"d\", playerid);
forward JatekosAdatBetoltott(playerid);
public JatekosAdatBetoltott(playerid) {
if(!cache_num_rows()) //nincs regisztrálva
else //regisztrálva van
return 1;
}

 
Még kitérnék a mysql_formatra: ez hasonló a formathoz, csak bele lehet formázni escapelt stringeket is (%s helyett %e), amit gondolom tudsz, micsoda, ha már php-ben használtad. Megakadályozza az SQL injectiont.
 
mysql_format(Kapcs, query, 256, \"SELECT * from jatekosok WHERE Nev = %s AND Jelszo = SHA1(\'%e\')\");

 
Így, ha jelszóhoz olyat ír, azt átírja másra, így a rendszered biztonságban lesz.
Hogy kell adatokat lekérni kiválasztás után?
Ezekre a wiki azt mondja, valami cachet aktiválni kell hozzá, érdekes, én csak simán használom, és gyors is, jó is, nem is dob a logba warningot (pedig log_all-ra van téve).
Sor- és oszlopszám alapján:
cache_get_row
cache_get_row_int
cache_get_row_float
Sorszám és oszlopnév alapján:
cache_get_field_content
cache_get_field_content_int
cache_get_field_content_float
Ha valami nagyon máshogy volt PHP-ban, és nem jól magyaráztam, itt lesz egy kis segítség: http://wiki.sa-mp.com/wiki/MySQL/R33#Cache_functions
Egyelõre ennyi. Sok szerencsét, további jó scriptelést! A hibákért elõre is elnézést kívánok, telefonról voltam. =)
U.i.: ha PHP-ban értetted, itt is fogod.
U.i.2.: Ha nem akarod mindig a forwardot és a publicot is kiírni:
 
#define Fgv:%0(%1) forward %0(%1); public %0(%1)

 
És akkor csak így használod:
 
Fgv:JatekosAdatBetoltott(playerid) {
//...
    return 1;
}
Cím: Melyiket válasszam?
Írta: AnthonyGates - 2014. Június 07. - 22:54:30
Üdv! Középhaladó scripter vagyok, most egy új, lõdözõs modot készítenék. Kérdésem lenne:
Melyik parancsfeldolgozót használjam?
Milyen módon tároljam az adatokat? Fájlalapon szeretném, melyik a legmegbíhatóbb módszer?
Cím: Melyiket válasszam?
Írta: Pedró - 2014. Június 07. - 23:05:57
ZCMD
dfile, vagy esetleg MySQL (de az nem helyi-fájl-alapú)
Cím: Melyiket válasszam?
Írta: AnthonyGates - 2014. Június 07. - 23:14:34
Tudom, hogy az SQL lenne a legmegfelelõbb, viszont sampban valamiért nem hajlandó együtt dolgozni velem. PHPban semmi baj.
Cím: Melyiket válasszam?
Írta: KovaNovik - 2014. Június 08. - 11:20:52
Parancsfeldolgozónak YCMD. Azzal parancsonként megadhatod a hozzá tartozó segítséget, szóval a helpnél mindig csak pár sor lesz mindem parancsot kiíratni. Rengeteg plusz funkciója van, és gyorsabb is a ZCMD-nél.
Mentéshez pedig MySQL. Ha most kezded (legalábbis pawnban), az R38-al tedd.
Ennek a futásához kell ez a pakk: http://www.microsoft.com/en-us/download/details.aspx?id=30679
Ha 32 bites a Windowsod, csak az x86-osat tedd fel, ha 64 bites, elõször az x86-osat, majd az x64-eset. A honlapon ki lehet választani melyiket szeretnéd. Rendszergazdaként kell futtatni!
Ha - a legtöbb hosthoz hasonlóan - linuxod van, és nem akarod a libek telepítésével piszkálni a konfigost (amit ugye csak õ, mint root tud megtenni), használd a mysql_static.so fájlt.
A legmegfelelõbb plugint innen szedheted le: https://github.com/pBlueG/SA-MP-MySQL/releases
Röviden annyi, hogy létrehozol egy globális változót, mondjuk
new Kapcs;

 és egyet, hogy a késõbb formázott queryket tároljuk. Pl. Mindig a játékos nevét formázzuk ebbe. Tehát:
 
new Kapcs, query[500];

 
OnGameModeInit-hez megadod, hogy az Kapcs változó értéke az legyen, ami a csatlakozásod (mysql adatbázissal való kapcsolatod) id-je. Ez azért kell, mert ez a verzió több kapcsolatot is támogat, akár használod, akár nem.
 
Kapcs = mysql_connect(...)

 
Az ilyeneket ki lehet lesni wikirõl.
Ami még fontos: OnGameModeExit-nél (miután mindent mentettünk persze) le kell zárni a kapcsolatot, mert a microsoft sz*rján keresztül tovább futna a kapcsolat, ami a következõ indításnál hibákat okozhat.
 
mysql_close(Kapcs);

 
Most jön a fõ rész, a query!
A queryk közül 2 használatos: query, tquery.
A query lefut, és rögtön utána lehet lekérni dolgokat. Ezt már kevésbé használják, mert laggoltathatja a szervert, mert nem külön szálon fut, nekem speciel van, hogy le sem kéri teljesen, már ugrik tovább (0-s adatokat használ, meg töktudja. Figyelem! A query után nem kell lekérni az eredményt (mint r6-ban, rögtön lehet mysql_fetch_field_content_intet használni, ami azt hiszem oszlopnévre  és sorra kérdezi le a dolgot, a másik meg oszlop-és sorszámra (ez ciklusoknál hasznos.
A mysql tquery. Ez azért jó, mert valahogyan külön szálon futtatja le a queryt, így pár tized milliszekundum (!) (pl. 0.560 ms) alatt lefut egy hosszabb query is! Miben más? Abban, hogy, ha el akarjuk tárolni az eredményt, meg kell adni neki egy eljárást, ahol meglegyen az eredmény, szabadon lekérdezgethetünk, ilyesmi, nem kell free_result. Példa, mikor kell eljárás, mikor nem:
Itt nem kellett plusz eljárás, mert miután beállította a pénzét 1500-ra, konkrétan (majdnem) lesz*rhatjuk, milyen eredményt dobott vissza.
 
new nev[25];
GetPlayerName(playerid, nev, sizeof(nev));
format(query, 150, \"UPDATE jatekosok SET Penz = \'1500\' WHERE Nev = \'%s\'\", nev);
mysql_tquery(Kapcs, query);

 
Itt pedig kell, mert a lekért adatokat fel szeretnénk használni:
 
//...
format(query, 150, \"SELECT * FROM jatekosok WHERE Nev = \'%s\'\", nev);
mysql_tquery(Kapcs, query, \"JatekosAdatBetoltott\", \"d\", playerid);
forward JatekosAdatBetoltott(playerid);
public JatekosAdatBetoltott(playerid) {
if(!cache_num_rows()) //nincs regisztrálva
else //regisztrálva van
return 1;
}

 
Még kitérnék a mysql_formatra: ez hasonló a formathoz, csak bele lehet formázni escapelt stringeket is (%s helyett %e), amit gondolom tudsz, micsoda, ha már php-ben használtad. Megakadályozza az SQL injectiont.
 
mysql_format(Kapcs, query, 256, \"SELECT * from jatekosok WHERE Nev = %s AND Jelszo = SHA1(\'%e\')\");

 
Így, ha jelszóhoz olyat ír, azt átírja másra, így a rendszered biztonságban lesz.
Hogy kell adatokat lekérni kiválasztás után?
Ezekre a wiki azt mondja, valami cachet aktiválni kell hozzá, érdekes, én csak simán használom, és gyors is, jó is, nem is dob a logba warningot (pedig log_all-ra van téve).
Sor- és oszlopszám alapján:
cache_get_row
cache_get_row_int
cache_get_row_float
Sorszám és oszlopnév alapján:
cache_get_field_content
cache_get_field_content_int
cache_get_field_content_float
Ha valami nagyon máshogy volt PHP-ban, és nem jól magyaráztam, itt lesz egy kis segítség: http://wiki.sa-mp.com/wiki/MySQL/R33#Cache_functions
Egyelõre ennyi. Sok szerencsét, további jó scriptelést! A hibákért elõre is elnézést kívánok, telefonról voltam. =)
U.i.: ha PHP-ban értetted, itt is fogod.
U.i.2.: Ha nem akarod mindig a forwardot és a publicot is kiírni:
 
#define Fgv:%0(%1) forward %0(%1); public %0(%1)

 
És akkor csak így használod:
 
Fgv:JatekosAdatBetoltott(playerid) {
//...
    return 1;
}
Cím: Melyiket válasszam?
Írta: Awide - 2014. Június 12. - 13:20:00
Tároláshoz az Y_Ini-t vagy dof2-t tudom ajánlani, õk egyenlõre a leggyorsabbak, amennyira én tudom.
Cím: Melyiket válasszam?
Írta: TengeriMalac - 2014. Június 12. - 18:52:00
gyerekek.. SQLite? mi a f@sznak van a SAMPban ha senki nem használja?? :O
ha egy géprõl fut a szervereddel, akkor PHPban is tudod használni.. >.>
Cím: Melyiket válasszam?
Írta: KovaNovik - 2014. Június 25. - 22:46:03
Minek van a sampban a kocsi streamer, ha csak akadályoz? Minek van a sampban fájlkezelõ, ha lassú és használhatatlanul bugos?
Cím: Melyiket válasszam?
Írta: blackdog476 - 2014. Július 04. - 01:25:12
Idézetet írta: KovaNovik date=1403729163\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"48629\" data-ipsquote-contentclass=\"forums_Topic
Minek van a sampban a kocsi streamer, ha csak akadályoz? Minek van a sampban fájlkezelõ, ha lassú és használhatatlanul bugos?
 
kíváncsi lennék Te hogy târolnád a fájlokat az alap filekezelõ nélkül
Cím: Melyiket válasszam?
Írta: DragonSoul - 2014. Július 04. - 06:50:16
Off:
 
 lõdözõs

 

legmegbíhatóbb

 
..
Cím: Melyiket válasszam?
Írta: blackdog476 - 2014. Július 04. - 07:25:10

Idézetet írta: DragonSoul date=1404449416\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"48629\" data-ipsquote-contentclass=\"forums_Topic
Off:
 
 lõdözõs

 

legmegbíhatóbb

 
..
 
jólvanna. ilyeneket illik spoiler tagbe rakni.  amúgy igen, lõdözõs: www.goo.gl/17im2j