-
Sziasztok! Egy igen furcsa problémával fordulnék most hozzátok. Nemrég elkezdtem írni egy játékmódot, amiben úgy döntöttem, hogy a BlueG által készített R38-as plugint fogom használni. ORM-et használok, mert ezzel egyszerûbb menteni / betölteni, hiszen automatikusan legenerálja a queryket.
Ezt maga maddinat0r, a plugin készítõje írta:

A játékos adatait enumokban tartom, és lecsatlakozáskor elmentem az adatbázisba.
A függvénykönyvtárak, melyeket használok:
#include <a_samp>
#include <sscanf2>
#include <zcmd>
#include <streamer>
#include <a_mysql>
#include <crashdetect>
A makrók, amiket használok:
#define fuggveny%0(%1) forward%0(%1); public%0(%1)
A játékosok adatait tartalmazó enum így néz ki:
enum eJatAd
{
ORM:ORMSzam,
ABSzam,
Belepve,
ProcSzam[256],
AdminSzint,
Nev[MAX_PLAYER_NAME+1],
KiirNev[MAX_PLAYER_NAME+1],
Jelszo[32],
Fagyasztva,
Kinezet,
Penz,
Float:Elet,
Float:Melleny,
Vilag,
Belso,
Float:KoordX,
Float:KoordY,
Float:KoordZ,
Float:KoordF,
}
new JatAd[LegfJatekos][eJatAd];
Megjegyz. (csak, hogy értsétek minden részét): a \"LegfJatekos\" \"MAX_PLAYERS\"-ként van definiálva. A SimaUzenet függvény csak 3 sorrá darabolja az SCM-et, mert így használhatóbb számomra. Az UzenetMindenki függvény pedig csak a belépett játékosoknak küldi el az üzenetet. A Kirug függvény egy késleltetett kick, a KirugIndok és KirugIndokNev pedig ír mellé indokot is. Ezek mellett az Uzenet függvény az a Y_Less által készített fajta, ami lényegében egy SendFormatMessage, ami nem csak define, hanem függvény, így bõvíthetõ több argumentummal. Az UzenetMindenki függvény ugyanez, csak mindenkinek elküldi. A Lefagyaszt és Kiolvaszt függvény csak egy fagyasztás, és kiolvasztás, annyi különbséggel, hogy itt a változóját is átállítja, ami késõbb lesz használva olyan helyeken, ahol fagyasztástól függ a script.
Nos, bele is kezdenék a játékmódba:
public OnGameModeInit()
{
mysql_log(LOG_ALL, LOG_TYPE_HTML);
ABKapcs = mysql_connect(ABHoszt, ABFelh, ABAd, ABJelsz);
return 1;
}
public OnGameModeExit()
{
SimaUzenetMindenki(Feher, \"A szerver leállítása folyamatban...\");
for(new a = 0; a < LegfJatekos; a++)
{
if(JatAd[a][belepve] == 1 && JatAd[a][ABSzam] != 0) MentJatAd(a);
}
mysql_close(ABKapcs);
return 1;
}
//Itt lekéri a szériaszámát, és megnézi RP-s-e a neve. Ha igen, akkor kiveszi belõle az alsóvonást, és beleteszi mindezt a KiirNev változójába.
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][ABSzam], \"ABSzam\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belepve], \"Belepve\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][AdminSzint], \"AdminSzint\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][Nev], MAX_PLAYER_NAME+1, \"Nev\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][KiirNev], MAX_PLAYER_NAME+1, \"KiirNev\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][Jelszo], MAX_PLAYER_NAME+1, \"Jelszo\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Fagyasztva], \"Fagyasztva\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Kinezet], \"Kinezet\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Penz], \"Penz\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][Elet], \"Elet\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][Melleny], \"Melleny\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Vilag], \"Vilag\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belso], \"Belso\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordX], \"KoordX\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordY], \"KoordY\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordZ], \"KoordZ\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordF], \"KoordF\");
orm_setkey(JatAd[playerid][ORMSzam], \"ABSzam\");
orm_select(JatAd[playerid][ORMSzam], \"AmikorJatAdBet\", \"d\", playerid);
}
És most jön a \"problémás rész\", azért idézõjelben, mert tudom, hogy nem itt van a probléma, de itt látszik meg.
fuggveny AmikorJatAdBet(playerid)
{
switch(orm_errno(JatAd[playerid][ORMSzam]))
{
case ERROR_OK: ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat.\", \"Belép!\", \"Kilép!\");
case ERROR_NO_DATA: ShowPlayerDialog(playerid, RegisztrDialog, DIALOG_STYLE_PASSWORD, \"Regisztráció\", \"Kérlek írd be a jelszavadat.\", \"Regisztrál!\", \"Kilép!\");
}
Uzenet(playerid, Feher, \"ABSzam: %d | ORMSzam: %d | Nev: %s | KiirNev: %s | Jelszo: %s | Kinezet: %d | Penz: %d | Elet: %f | Melleny: %f...\", JatAd[playerid][ABSzam], JatAd[playerid][ORMSzam], JatAd[playerid][KiirNev], JatAd[playerid][Jelszo], JatAd[playerid][Kinezet], JatAd[playerid][Penz], JatAd[playerid][Elet], JatAd[playerid][Melleny]);
}
Megjegyz: A végén az üzenet azért van ott, hogy kiírja, hogy tényleg 0-k-e az adatai, és azért hozza be mindig a regisztrációs dialogot, hát.. igen.
A dialogoknál:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case RegisztrDialog:
{
if(!response) return Kirug(playerid);
if(4 > strlen(inputtext) || strlen(inputtext) > 24) return ShowPlayerDialog(playerid, RegisztrDialog, DIALOG_STYLE_PASSWORD, \"Regisztráció\", \"Kérlek írd be a jelszavadat. \\n A jelszavadnak 0-24 karakter között kell lennie!\", \"Regisztrál!\", \"Kilép!\");
new TitkJelsz[129];
WP_Hash(TitkJelsz, sizeof(TitkJelsz), inputtext);
format(JatAd[playerid][Jelszo], 24, \"%s\", TitkJelsz);
RegisztrJat(playerid);
}
case BelepDialog:
{
if(!response) return Kirug(playerid);
if(4 > strlen(inputtext) || strlen(inputtext) > 24) return ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat. \\n A jelszavadnak 0-24 karakter között kell lennie!\", \"Belép!\", \"Kilép!\");
new TitkJelsz[129];
WP_Hash(TitkJelsz, sizeof(TitkJelsz), inputtext);
if(strcmp(JatAd[playerid][Jelszo], TitkJelsz) != 0) return ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat. \\n Az általad beírt jelszó hibás!\", \"Belép!\", \"Kilép!\");
BelepJat(playerid);
}
}
return 1;
}
Íme a RegisztrJat, a BelepJat, és a függvények, melyeket azok használnak:
stock RegisztrJat(playerid)
{
SetSpawnInfo(playerid, 0, 7, 1743.0239, -1864.4617, 13.5738, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
JatAd[playerid][belepve] = 1;
printf(\"%s beregisztrált a szerverre.\", JatAd[playerid][KiirNev]);
SimaUzenet(playerid, Feher, \"Sikeresen regisztráltál a kSAMP szerverére!\");
JatAd[playerid][Penz] = 185000;
SimaUzenet(playerid, Feher, \"Kezdésnek kaptál az államtól 185.000Ft-ot!\");
orm_save(JatAd[playerid][ORMSzam], \"MentJatAd\", \"d\", playerid);
}
stock BelepJat(playerid)
{
JatAd[playerid][belepve] = 1;
printf(\"%s belépett a szerverre.\", JatAd[playerid][KiirNev]);
SimaUzenet(playerid, Feher, \"Sikeresen beléptél a kSAMP szerverére!\");
BeallJatAd(playerid);
//TogglePlayerSpectating(playerid, false);
JatAd[playerid][belepve] = 1;
SimaUzenet(playerid, Feher, \"Sikeresen bejelentkeztél! Jó játékot!\");
MentJatAd(playerid);
}
fuggveny MentJatAd(playerid)
{
JatAd[playerid][Kinezet] = GetPlayerSkin(playerid);
GetPlayerHealth(playerid, JatAd[playerid][Elet]);
GetPlayerArmour(playerid, JatAd[playerid][Melleny]);
JatAd[playerid][Vilag] = GetPlayerVirtualWorld(playerid);
JatAd[playerid][belso] = GetPlayerInterior(playerid);
GetPlayerPos(playerid, JatAd[playerid][KoordX], JatAd[playerid][KoordY], JatAd[playerid][KoordZ]);
GetPlayerFacingAngle(playerid, JatAd[playerid][KoordF]);
orm_save(JatAd[playerid][ORMSzam]);
}
fuggveny BeallJatAd(playerid)
{
SetSpawnInfo(playerid, 0, JatAd[playerid][Kinezet], JatAd[playerid][KoordX], JatAd[playerid][KoordY], JatAd[playerid][KoordZ], JatAd[playerid][KoordF], 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
SetPlayerHealth(playerid, JatAd[playerid][Elet]);
SetPlayerArmour(playerid, JatAd[playerid][Melleny]);
SetPlayerVirtualWorld(playerid, JatAd[playerid][Vilag]);
SetPlayerInterior(playerid, JatAd[playerid][belso]);
//Fegyverek hozzáadása
printf(\"%s adatai beállítva megfelelõ értékre!\", JatAd[playerid][KiirNev]);
}
Már 1000 féleképpen próbáltam, de nem megy.
Ha csak a bejelentkezés dialogot hozom ki, akkor sem lépteti be teljesen, illetve belépteti, csak 0-s adatokkal, ami nem egészen jó.
Az adatbázisban teljesen jól beteszi az adatokat:

Megjegyz.: A wikin azt írja, az orm_save akkor updatel, ha be van regelve, és akkor insertel, ha nincs. Az orm_loadra pedig azt írja \"...teknikailag ugyanaz, mint az orm_load.\". Mégis csak a jelenlegi felállásban ment egyátalán, betölteni viszont semmilyen kombinációban nem tölt.
Valakinek nincs valami tuti tippje / tapasztalata, hogy mi okozhatja ezt a problémát, mert kezd idegesítõvé válni.
Szerk.: A MySQL tábla felépítése ilyen:
//Maga a szerkezet:
CREATE TABLE IF NOT EXISTS `jatekosok` (
`ABSzam` int(11) NOT NULL AUTO_INCREMENT,
`Belepve` tinyint(1) NOT NULL,
`AdminSzint` int(11) NOT NULL,
`Nev` varchar(24) NOT NULL,
`KiirNev` varchar(24) NOT NULL,
`Jelszo` varchar(24) NOT NULL,
`Fagyasztva` tinyint(1) NOT NULL,
`Kinezet` int(11) NOT NULL,
`Penz` int(11) NOT NULL,
`Elet` float NOT NULL,
`Melleny` float NOT NULL,
`Vilag` int(11) NOT NULL,
`Belso` int(11) NOT NULL,
`KoordX` float NOT NULL,
`KoordY` float NOT NULL,
`KoordZ` float NOT NULL,
`KoordF` float NOT NULL,
PRIMARY KEY (`ABSzam`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
//Itt pedig az adatok, amiket teljesen jól elmentett.
INSERT INTO `jatekosok` (`ABSzam`, `Belepve`, `AdminSzint`, `Nev`, `KiirNev`, `Jelszo`, `Fagyasztva`, `Kinezet`, `Penz`, `Elet`, `Melleny`, `Vilag`, `Belso`, `KoordX`, `KoordY`, `KoordZ`, `KoordF`) VALUES
(1, 0, 0, \'Layne_Konnor\', \'Layne Konnor\', \'FD9D94340DBD72C11B37EBB\', 0, 7, 185000, 100, 0, 0, 0, 1742.72, -1852.12, 13.4141, 0);
-
A te dolgod, hogy mit használsz, de szerintem használj cachet. Sokkal egyszerûbb, jobb, gyorsabb megírni, talán a mûködése is gyorsabb, stb. Az ormhoz nem is nagyon értek, sosem akartam használni. Szóval az ormmal kapcsolatban sajnos nem tudok neked segíteni. :(
[mod]Végre egy, hogy is mondjam, szép téma. ;) :thumbsup:[/mod]
-
Nem értek az ORM-hoz, de én R6-ban például ezt így oldanám meg:
Te megoldásod:
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belepve], \"Belepve\");
Enyém:
new data[16+1];
mysql_fetch_field_row(data, \"Belepve\"); JatAd[playerid][belepve] = strval(data);
-
Doboka98: a te megoldásodnál a queryhez is hozzá kell adni, a lekéréshez is, mindenhova. Az ORM-nél csak az ORM táblájához hozzáadod a változókat egy helyen, és onnantól egy sorral elmenti, automatikuson legenerálja, lefuttatja a queryt, nem kell ott is újraírnod. Ezt próbáltam végig magyarázni, felülre tettem is egy képet, miért használom ezt. Maddinat0r, a plugin fejlesztõjének a hozzászólása az.
Emellett az ORMSzam az a RAMban lévõ ORM adatbázisban a helye, amit mentek, amibe betöltök. Azadatbázisban az ID-je az ABSzam. Mindenesetre kaptál egy pluszt.
-
Utánanéztem az ORM-nak, meg eleve az R38-as pluginnak (mert olvastam másik topicban, hogy mondtad, hogy könnyebb), de nekem érthetetlenek a dolgok. Jelenleg maradok az R6 pluginnál, elvégre az is jobb, mint a fájlmentés.
Szerintem próbálkozhatsz a hivatalos fórumon is.
-
Köszönöm szépen a segítséget mindenkinek, sikerült megoldanom, habár (az igazat megvallva) egyik sem vitt közelebb a megoldáshoz.
Aki a késõbbiekben hasonló problémával találkozna, az a következõt tegye:
Az ORM-es változók hozzáadása után állítsa a kulcsot a névre, ez nálam
orm_setkey(JatAd[playerid][ORMSzam], \"Nev\");
,
majd, amikor betöltõdtek az adatai, az orm_load/select után, vagy amit az meghívott callbackben, miután elõhozta a megfelelõ dialogot:
orm_setkey(JatAd[playerid][ORMSzam], \"ABSzam\");
.
Nagyon örülök, hogy megoldódott, mindenkinek további jó scriptelést kívánok.
Megjegyz.: A témát zártam, megoldottá nyilvánítottam.
-
Sziasztok! Egy igen furcsa problémával fordulnék most hozzátok. Nemrég elkezdtem írni egy játékmódot, amiben úgy döntöttem, hogy a BlueG által készített R38-as plugint fogom használni. ORM-et használok, mert ezzel egyszerûbb menteni / betölteni, hiszen automatikusan legenerálja a queryket.
Ezt maga maddinat0r, a plugin készítõje írta:

A játékos adatait enumokban tartom, és lecsatlakozáskor elmentem az adatbázisba.
A függvénykönyvtárak, melyeket használok:
#include <a_samp>
#include <sscanf2>
#include <zcmd>
#include <streamer>
#include <a_mysql>
#include <crashdetect>
A makrók, amiket használok:
#define fuggveny%0(%1) forward%0(%1); public%0(%1)
A játékosok adatait tartalmazó enum így néz ki:
enum eJatAd
{
ORM:ORMSzam,
ABSzam,
Belepve,
ProcSzam[256],
AdminSzint,
Nev[MAX_PLAYER_NAME+1],
KiirNev[MAX_PLAYER_NAME+1],
Jelszo[32],
Fagyasztva,
Kinezet,
Penz,
Float:Elet,
Float:Melleny,
Vilag,
Belso,
Float:KoordX,
Float:KoordY,
Float:KoordZ,
Float:KoordF,
}
new JatAd[LegfJatekos][eJatAd];
Megjegyz. (csak, hogy értsétek minden részét): a \"LegfJatekos\" \"MAX_PLAYERS\"-ként van definiálva. A SimaUzenet függvény csak 3 sorrá darabolja az SCM-et, mert így használhatóbb számomra. Az UzenetMindenki függvény pedig csak a belépett játékosoknak küldi el az üzenetet. A Kirug függvény egy késleltetett kick, a KirugIndok és KirugIndokNev pedig ír mellé indokot is. Ezek mellett az Uzenet függvény az a Y_Less által készített fajta, ami lényegében egy SendFormatMessage, ami nem csak define, hanem függvény, így bõvíthetõ több argumentummal. Az UzenetMindenki függvény ugyanez, csak mindenkinek elküldi. A Lefagyaszt és Kiolvaszt függvény csak egy fagyasztás, és kiolvasztás, annyi különbséggel, hogy itt a változóját is átállítja, ami késõbb lesz használva olyan helyeken, ahol fagyasztástól függ a script.
Nos, bele is kezdenék a játékmódba:
public OnGameModeInit()
{
mysql_log(LOG_ALL, LOG_TYPE_HTML);
ABKapcs = mysql_connect(ABHoszt, ABFelh, ABAd, ABJelsz);
return 1;
}
public OnGameModeExit()
{
SimaUzenetMindenki(Feher, \"A szerver leállítása folyamatban...\");
for(new a = 0; a < LegfJatekos; a++)
{
if(JatAd[a][belepve] == 1 && JatAd[a][ABSzam] != 0) MentJatAd(a);
}
mysql_close(ABKapcs);
return 1;
}
//Itt lekéri a szériaszámát, és megnézi RP-s-e a neve. Ha igen, akkor kiveszi belõle az alsóvonást, és beleteszi mindezt a KiirNev változójába.
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][ABSzam], \"ABSzam\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belepve], \"Belepve\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][AdminSzint], \"AdminSzint\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][Nev], MAX_PLAYER_NAME+1, \"Nev\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][KiirNev], MAX_PLAYER_NAME+1, \"KiirNev\");
orm_addvar_string(JatAd[playerid][ORMSzam], JatAd[playerid][Jelszo], MAX_PLAYER_NAME+1, \"Jelszo\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Fagyasztva], \"Fagyasztva\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Kinezet], \"Kinezet\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Penz], \"Penz\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][Elet], \"Elet\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][Melleny], \"Melleny\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][Vilag], \"Vilag\");
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belso], \"Belso\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordX], \"KoordX\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordY], \"KoordY\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordZ], \"KoordZ\");
orm_addvar_float(JatAd[playerid][ORMSzam], JatAd[playerid][KoordF], \"KoordF\");
orm_setkey(JatAd[playerid][ORMSzam], \"ABSzam\");
orm_select(JatAd[playerid][ORMSzam], \"AmikorJatAdBet\", \"d\", playerid);
}
És most jön a \"problémás rész\", azért idézõjelben, mert tudom, hogy nem itt van a probléma, de itt látszik meg.
fuggveny AmikorJatAdBet(playerid)
{
switch(orm_errno(JatAd[playerid][ORMSzam]))
{
case ERROR_OK: ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat.\", \"Belép!\", \"Kilép!\");
case ERROR_NO_DATA: ShowPlayerDialog(playerid, RegisztrDialog, DIALOG_STYLE_PASSWORD, \"Regisztráció\", \"Kérlek írd be a jelszavadat.\", \"Regisztrál!\", \"Kilép!\");
}
Uzenet(playerid, Feher, \"ABSzam: %d | ORMSzam: %d | Nev: %s | KiirNev: %s | Jelszo: %s | Kinezet: %d | Penz: %d | Elet: %f | Melleny: %f...\", JatAd[playerid][ABSzam], JatAd[playerid][ORMSzam], JatAd[playerid][KiirNev], JatAd[playerid][Jelszo], JatAd[playerid][Kinezet], JatAd[playerid][Penz], JatAd[playerid][Elet], JatAd[playerid][Melleny]);
}
Megjegyz: A végén az üzenet azért van ott, hogy kiírja, hogy tényleg 0-k-e az adatai, és azért hozza be mindig a regisztrációs dialogot, hát.. igen.
A dialogoknál:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case RegisztrDialog:
{
if(!response) return Kirug(playerid);
if(4 > strlen(inputtext) || strlen(inputtext) > 24) return ShowPlayerDialog(playerid, RegisztrDialog, DIALOG_STYLE_PASSWORD, \"Regisztráció\", \"Kérlek írd be a jelszavadat. \\n A jelszavadnak 0-24 karakter között kell lennie!\", \"Regisztrál!\", \"Kilép!\");
new TitkJelsz[129];
WP_Hash(TitkJelsz, sizeof(TitkJelsz), inputtext);
format(JatAd[playerid][Jelszo], 24, \"%s\", TitkJelsz);
RegisztrJat(playerid);
}
case BelepDialog:
{
if(!response) return Kirug(playerid);
if(4 > strlen(inputtext) || strlen(inputtext) > 24) return ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat. \\n A jelszavadnak 0-24 karakter között kell lennie!\", \"Belép!\", \"Kilép!\");
new TitkJelsz[129];
WP_Hash(TitkJelsz, sizeof(TitkJelsz), inputtext);
if(strcmp(JatAd[playerid][Jelszo], TitkJelsz) != 0) return ShowPlayerDialog(playerid, BelepDialog, DIALOG_STYLE_PASSWORD, \"Bejelentkezés\", \"Kérlek írd be a jelszavadat. \\n Az általad beírt jelszó hibás!\", \"Belép!\", \"Kilép!\");
BelepJat(playerid);
}
}
return 1;
}
Íme a RegisztrJat, a BelepJat, és a függvények, melyeket azok használnak:
stock RegisztrJat(playerid)
{
SetSpawnInfo(playerid, 0, 7, 1743.0239, -1864.4617, 13.5738, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
JatAd[playerid][belepve] = 1;
printf(\"%s beregisztrált a szerverre.\", JatAd[playerid][KiirNev]);
SimaUzenet(playerid, Feher, \"Sikeresen regisztráltál a kSAMP szerverére!\");
JatAd[playerid][Penz] = 185000;
SimaUzenet(playerid, Feher, \"Kezdésnek kaptál az államtól 185.000Ft-ot!\");
orm_save(JatAd[playerid][ORMSzam], \"MentJatAd\", \"d\", playerid);
}
stock BelepJat(playerid)
{
JatAd[playerid][belepve] = 1;
printf(\"%s belépett a szerverre.\", JatAd[playerid][KiirNev]);
SimaUzenet(playerid, Feher, \"Sikeresen beléptél a kSAMP szerverére!\");
BeallJatAd(playerid);
//TogglePlayerSpectating(playerid, false);
JatAd[playerid][belepve] = 1;
SimaUzenet(playerid, Feher, \"Sikeresen bejelentkeztél! Jó játékot!\");
MentJatAd(playerid);
}
fuggveny MentJatAd(playerid)
{
JatAd[playerid][Kinezet] = GetPlayerSkin(playerid);
GetPlayerHealth(playerid, JatAd[playerid][Elet]);
GetPlayerArmour(playerid, JatAd[playerid][Melleny]);
JatAd[playerid][Vilag] = GetPlayerVirtualWorld(playerid);
JatAd[playerid][belso] = GetPlayerInterior(playerid);
GetPlayerPos(playerid, JatAd[playerid][KoordX], JatAd[playerid][KoordY], JatAd[playerid][KoordZ]);
GetPlayerFacingAngle(playerid, JatAd[playerid][KoordF]);
orm_save(JatAd[playerid][ORMSzam]);
}
fuggveny BeallJatAd(playerid)
{
SetSpawnInfo(playerid, 0, JatAd[playerid][Kinezet], JatAd[playerid][KoordX], JatAd[playerid][KoordY], JatAd[playerid][KoordZ], JatAd[playerid][KoordF], 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
SetPlayerHealth(playerid, JatAd[playerid][Elet]);
SetPlayerArmour(playerid, JatAd[playerid][Melleny]);
SetPlayerVirtualWorld(playerid, JatAd[playerid][Vilag]);
SetPlayerInterior(playerid, JatAd[playerid][belso]);
//Fegyverek hozzáadása
printf(\"%s adatai beállítva megfelelõ értékre!\", JatAd[playerid][KiirNev]);
}
Már 1000 féleképpen próbáltam, de nem megy.
Ha csak a bejelentkezés dialogot hozom ki, akkor sem lépteti be teljesen, illetve belépteti, csak 0-s adatokkal, ami nem egészen jó.
Az adatbázisban teljesen jól beteszi az adatokat:

Megjegyz.: A wikin azt írja, az orm_save akkor updatel, ha be van regelve, és akkor insertel, ha nincs. Az orm_loadra pedig azt írja \"...teknikailag ugyanaz, mint az orm_load.\". Mégis csak a jelenlegi felállásban ment egyátalán, betölteni viszont semmilyen kombinációban nem tölt.
Valakinek nincs valami tuti tippje / tapasztalata, hogy mi okozhatja ezt a problémát, mert kezd idegesítõvé válni.
Szerk.: A MySQL tábla felépítése ilyen:
//Maga a szerkezet:
CREATE TABLE IF NOT EXISTS `jatekosok` (
`ABSzam` int(11) NOT NULL AUTO_INCREMENT,
`Belepve` tinyint(1) NOT NULL,
`AdminSzint` int(11) NOT NULL,
`Nev` varchar(24) NOT NULL,
`KiirNev` varchar(24) NOT NULL,
`Jelszo` varchar(24) NOT NULL,
`Fagyasztva` tinyint(1) NOT NULL,
`Kinezet` int(11) NOT NULL,
`Penz` int(11) NOT NULL,
`Elet` float NOT NULL,
`Melleny` float NOT NULL,
`Vilag` int(11) NOT NULL,
`Belso` int(11) NOT NULL,
`KoordX` float NOT NULL,
`KoordY` float NOT NULL,
`KoordZ` float NOT NULL,
`KoordF` float NOT NULL,
PRIMARY KEY (`ABSzam`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
//Itt pedig az adatok, amiket teljesen jól elmentett.
INSERT INTO `jatekosok` (`ABSzam`, `Belepve`, `AdminSzint`, `Nev`, `KiirNev`, `Jelszo`, `Fagyasztva`, `Kinezet`, `Penz`, `Elet`, `Melleny`, `Vilag`, `Belso`, `KoordX`, `KoordY`, `KoordZ`, `KoordF`) VALUES
(1, 0, 0, \'Layne_Konnor\', \'Layne Konnor\', \'FD9D94340DBD72C11B37EBB\', 0, 7, 185000, 100, 0, 0, 0, 1742.72, -1852.12, 13.4141, 0);
-
A te dolgod, hogy mit használsz, de szerintem használj cachet. Sokkal egyszerûbb, jobb, gyorsabb megírni, talán a mûködése is gyorsabb, stb. Az ormhoz nem is nagyon értek, sosem akartam használni. Szóval az ormmal kapcsolatban sajnos nem tudok neked segíteni. :(
[mod]Végre egy, hogy is mondjam, szép téma. ;) :thumbsup:[/mod]
-
Nem értek az ORM-hoz, de én R6-ban például ezt így oldanám meg:
Te megoldásod:
orm_addvar_int(JatAd[playerid][ORMSzam], JatAd[playerid][belepve], \"Belepve\");
Enyém:
new data[16+1];
mysql_fetch_field_row(data, \"Belepve\"); JatAd[playerid][belepve] = strval(data);
-
Doboka98: a te megoldásodnál a queryhez is hozzá kell adni, a lekéréshez is, mindenhova. Az ORM-nél csak az ORM táblájához hozzáadod a változókat egy helyen, és onnantól egy sorral elmenti, automatikuson legenerálja, lefuttatja a queryt, nem kell ott is újraírnod. Ezt próbáltam végig magyarázni, felülre tettem is egy képet, miért használom ezt. Maddinat0r, a plugin fejlesztõjének a hozzászólása az.
Emellett az ORMSzam az a RAMban lévõ ORM adatbázisban a helye, amit mentek, amibe betöltök. Azadatbázisban az ID-je az ABSzam. Mindenesetre kaptál egy pluszt.
-
Utánanéztem az ORM-nak, meg eleve az R38-as pluginnak (mert olvastam másik topicban, hogy mondtad, hogy könnyebb), de nekem érthetetlenek a dolgok. Jelenleg maradok az R6 pluginnál, elvégre az is jobb, mint a fájlmentés.
Szerintem próbálkozhatsz a hivatalos fórumon is.
-
Köszönöm szépen a segítséget mindenkinek, sikerült megoldanom, habár (az igazat megvallva) egyik sem vitt közelebb a megoldáshoz.
Aki a késõbbiekben hasonló problémával találkozna, az a következõt tegye:
Az ORM-es változók hozzáadása után állítsa a kulcsot a névre, ez nálam
orm_setkey(JatAd[playerid][ORMSzam], \"Nev\");
,
majd, amikor betöltõdtek az adatai, az orm_load/select után, vagy amit az meghívott callbackben, miután elõhozta a megfelelõ dialogot:
orm_setkey(JatAd[playerid][ORMSzam], \"ABSzam\");
.
Nagyon örülök, hogy megoldódott, mindenkinek további jó scriptelést kívánok.
Megjegyz.: A témát zártam, megoldottá nyilvánítottam.