Jo script Grat! ;)Lepróbátad ? xD
Mindjárt meglesem a szkriptet,de én inkább a XAMPP-ot ajánlom,énis ezt használom és nagyon jó.(WAMP helyett)Akkor majd kipróbálom, de neked pedig a wamp menni szokott. Mostmeg nem akar online állpotba menni.
if(!inputtext[0])
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
public OnPlayerDisconnect(playerid, reason) return (GetPVarType(playerid, \"LoggedIn\")) ? SavePlayer(playerid) : 1;
A name-t itt egyhelyen használom, de máshol nem.Én is ezt mondom, ezért felesleges globálisan létrehozni elég a függvényben deklarálni. (pName(playerid))
Ezt a szervermappádba húzd, ne a pluginsba.Ha ott se lenne jó akkor próbáld ki úgy ha ide másolod:
[21:42:07] CMySQLHandler::CMySQLHandler() - Connecting to \"localhost\" | DB: \"samp\" | Username: \"root\" ...
[21:42:07] CMySQLHandler::Connect() - Unknown database \'samp\' (Error ID: 1049)
[21:42:07] >> mysql_ping( Connection handle: 0 )
[21:42:07] >> mysql_ping() - Invalid connection handle. (You set: 0, Highest connection handle ID is 1).
SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` smallint(7) NOT NULL auto_increment,
`name` varchar(24) NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(20) NOT NULL default \'0\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL auto_increment,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
A program nem indult el,mert MSVCR100.dll hiányzik a számítógépérõl.
A probléma megoldásához próbálja meg újratelepíteni a programot.
A program nem indult el,mert MSVCP100.dll hiányzik a számítógépérõl.
A probléma megoldásához próbálja meg újratelepíteni a programot.
Az eljárás belépési pontja(_invaild_parameter_noinfo_noreturn)nem található a DLL-ben (MSVCR100.dll).
MySQL.pwn(297) : error 025: function heading differs from prototype
Hogy átláthatóbb és jobban észrevehetõbb legyen,nyitottam egy új választ,remélem nem baj,na de térjünk a lényegre!A Filterscriptben kidob nekem egy error-t mégpedig ezt:A callback sql_query paraméterjét írd át arra, ami neked van az inc-ben. ( Asszem query )
MySQL.pwn(297) : error 025: function heading differs from prototype
És itt vajon mi lehet a baj?
A callback sql_query paraméterjét írd át arra, ami neked van az inc-ben. ( Asszem query )
Hogy átláthatóbb és jobban észrevehetõbb legyen,nyitottam egy új választ,remélem nem baj,na de térjünk a lényegre!A Filterscriptben kidob nekem egy error-t mégpedig ezt:
MySQL.pwn(297) : error 025: function heading differs from prototype
És itt vajon mi lehet a baj?
[/quote]
Milyen inc az a_mysql?
De az annyira nem lényeges,nincs sok szerepe,vagy igen,csak mert kihúztam?
De igazából az érdekelne hogy host-n hogy lehet ezt elindítani,hol tudom megnézni a mysql felhasználómat,mert sehol sem találom?!
Vagy tán a config.inc.php-ben van,mert már ezt is próbáltam de nem jó!?
Szerk:
A felhasználó megvan,csak annyit kell hogy?
#define MYSQL_HOST \"91.82.84.205:7781\"//hostos szerverem IP-je
#define MYSQL_USER \"sajátfelhasználónév\"//felhasználó nevem
OnQueryError az annyit csinált, ha egy hibás query volt, akkor azt beleírta a queryerrors táblába. Lényegébe nem olyan fontos.Oda gondoltam az IP-t,csak nem tudtam 100%-osan,de már tudom! :D
Azt kell megadnod, amivel a MySQL Adatabázisra csatlakozol a hosthoz.
Host-hoz az IP-t kell és a többihez meg az adataidat.
#define MYSQL_USER \"root\"
Ide a felhasználót, amivel csatlakozol. A hostos szerón nem root, nemtom mi, amit adtak ;DAdnak MySQl felhasználót? :O
Adnak MySQl felhasználót? :O
Ide a felhasználót, amivel csatlakozol. A hostos szerón nem root, nemtom mi, amit adtak ;D
Vagy csak amivel bereggeltem skyhostingra?
Szerk:
Itt van egy olyan is:
\"Az FTP jelszavad alaphelyzetben megegyezik a webadmin jelszavaddal.\"
Ez kellene?
[/quote]
Skyhosting nem ad SQL-t
Skyhosting nem ad SQL-t[/quote]
És akkor hogy csináljam meg?
Skyhosting nem ad SQL-tÉs akkor hogy csináljam meg?
[/quote]
www.clans.hu -- Itt kapsz :D
www.clans.hu -- Itt kapsz :D[/quote]
Jah,jó köszi xD ;D
OFF:Amúgy a tulaj bunkó volt,kérdezgettem róla a MySQL-ról,próbáltam tõle segítséget kérni,igaz lehet hülyeségeket is kérdeztem,de igazán mondhatta volna hogy nem adnak MySQl-t.Kérdeztem hogy melyik az,de csak azt mondta hogy a MySQL felhasználót kell oda írni,de nem értettem hogy melyiket!:DEgy ip váltás szerintem megér egy normális hostot...
De így már értem!
Aztán egszercsak ezt írta xD:
\"NE MÁR
Te most szórakozol velem?
tudom ám hogy április elseje van
.Igaz,hogy csak hülyeségeket kérdeztem,de azért rámondhatta volna hogy nem adnak,meg elvégre az a dolga hogy segítsen!
Legszívesebben host-t váltanék,de akkor más lenne az IP-je a szerónak!
Egy olyat kérdeznék, hoy azt nem csinálnád meg, hogy az üléseket, halálokat, pontokat(score) is mentse el?nagyon meg köszönném:)
Megcsiálhatom, ha lesz rá idõm :D
[/quote]
Annak biztosan örülni fognak, de akkor inkább az ölések számát mentse és ne az ülésekét. :laugh:
Helló!Ezen nincs mit csodálkozni mivel ez egy regisztrációs filterscript és az Ladmin is tartalmaz egy regisztrációs rendszert így neked kettõ lett.
Beraktam és amikor felmentem a szerverre, akkor eltûnt az admin szintem és nem is tudom berakni magam, mert azt írja, hogy Be kell jelentkezned a parancs használatához. Ladmin4v2-t használok
Ennyi erõvel admin rendszerré is bõvíthetnéd. : )Azt majd megcsinálja az, akinek szüksége van rá :)
Táblákat létrehoztad ?õõ azokat nem hoztam létre :S
Amúgy nem tudom, ha nem a fent említett miatt, akkor valahol máshol a probléma.
Húúh, most fellélegeztem. ^^de milyen táblákat kel létrehozni? mert az Adatbázis megvan de akkor is ezt írja az Adatbázisba milyen táblákat hozzak létre?
Akkor még szép, hogy ott a hiba, mivel hiába próbál kiolvasni vagy írni valamit, nemtud hova/honna.
Erre megpróbálok majd valami védelmet csinálni, csak nincs rá sok tippem, hogy hogyan.
skyline\" post=\"192753\" timestamp=\"1321084542\"]
Meg most nézem nekem ezt írja:
[pawn]x:\\xxxxxxx\\xxxxx\\xxxxx\\mysql reg rendszer\\mysql.pwn(647) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"
x:\\xxxxxxxx\\xxxxxx\\xxxxx\\mysql reg rendszer\\mysql.pwn(703) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"[/pawn]
és nem jövök rá miért
[/quote]
kurta 0.3d-re írta,ahol már támogatva van az elrejtett jelszó
írd át:
[pawn]DIALOG_STYLE_INPUT [/pawn]-ra
@skyline:ezt használom de nem jó :S
Töltsd le innen a plugin \"threadsafe\" verziójú módját, mivel az amit te használsz a szerveren tárolt külsõ adatkönyvtárakat próbál elérni, ami valószínûleg a biztonság miatt le van tiltva a szervergépen.
F:\\Server\\filterscripts\\reg.pwn(92) : error 001: expected token: \"-string end-\", but found \"-identifier-\"
F:\\Server\\filterscripts\\reg.pwn(92) : error 017: undefined symbol \"felhaszn\"
F:\\Server\\filterscripts\\reg.pwn(92) : error 029: invalid expression, assumed zero
F:\\Server\\filterscripts\\reg.pwn(92) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
4 Errors.
Mutasd a 92. sort :)ez ugy van ahogy kurta feltöltötte
print(\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevu\" felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
Hát ebbõl nagyon sok mindenre tudok következtetni..ezen kívül mást nem ír
Plugin be van töltve ?
libmySQL.dll a szervermappában van ? ( Ez csak windows esetén )
Másold be, amit a server_log.txt-be ír, aztán esetleg tudok valamit segíteni.
17:05:37]
[17:05:37] Server Plugins
[17:05:37] --------------
[17:05:37] Loading plugin: mysql.so
[17:05:37] SA:MP MySQL Plugin v2.1.1 Loaded.
[17:05:37] Loaded.
[17:05:37] Loading plugin: streamer.so
[17:05:37]
*** Streamer Plugin v2.5.2 by Incognito loaded ***
[17:05:37] Loaded.
[17:05:37] Loading plugin: sscanf.so
[17:05:37]
[17:05:37] ===============================
[17:05:37] sscanf plugin loaded.
[17:05:37] (c) 2009 Alex \"Y_Less\" Cole
[17:05:37] ===============================
[17:05:37] Loaded.
[17:05:37] Loaded 3 plugins.
[17:05:37] [MySQL] Thread running. Threadsafe: Yes.
[17:05:37]
[17:05:37] Filter Scripts
[17:05:37] ---------------
[17:05:37] Loading filter script \'reg.amx\'...
[17:05:37] Loaded 1 filter scripts.
Haha, megvan a hiba :Dnah ez megvan.
Azt a MySQL Plugint rakd be, ami ottvan az elsõ üzenetben a fõoldalon. Mivel te Ethan ( StrickenKid ) MySQL pluginját raktad be, ez pedig nem arra van megírva.
F:\\Server\\filterscripts\\reg.pwn(649) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"
F:\\Server\\filterscripts\\reg.pwn(705) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"
F:\\Server\\filterscripts\\reg.pwn(716) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
3 Errors.
skyline link=topic=7449.msg192753#msg192753 date=1321084542]kurta 0.3d-re írta,ahol már támogatva van az elrejtett jelszó
Meg most nézem nekem ezt írja:
[pawn]x:\\xxxxxxx\\xxxxx\\xxxxx\\mysql reg rendszer\\mysql.pwn(647) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"
x:\\xxxxxxxx\\xxxxxx\\xxxxx\\mysql reg rendszer\\mysql.pwn(703) : error 017: undefined symbol \"DIALOG_STYLE_PASSWORD\"[/pawn]
és nem jövök rá miért
írd át:
[pawn]DIALOG_STYLE_INPUT [/pawn]-ra
[/quote]
Milyen tipusú táblákat kell létrehozni?? Vagy a táblák infóit pls valaki leírja? Mert phpmyadminba errorozik, ha létre akarom hozni a táblákat.Ott van a SQL a script alján.
Köszi
kurta, engem 1 dolog érdekelne....Küld be ide a scripted, és megcsinálom:D
felpróbáltam használni a /findplayer-es parancsod minden oké beraktam tuti minden
deha beirom hogy pedro akkor már a Pedro -t nem jelzi ki.. szóval az megoldható lenne hogy kis és nagy karaktereket ne külömböztesse meg?
kurta, engem 1 dolog érdekelne....Meg.
felpróbáltam használni a /findplayer-es parancsod minden oké beraktam tuti minden
deha beirom hogy pedro akkor már a Pedro -t nem jelzi ki.. szóval az megoldható lenne hogy kis és nagy karaktereket ne külömböztesse meg?
files.g-stylezzz.com/mysql/R7/mysql.dll ;)Na végre.
R7 server plugin
// MySQL Regisztrációs rendszer By kurta999
// Verzió: 1.0 R4
// Last Update: 2012.02.24
#include <a_samp>
#include <a_mysql> // http://forum.sa-mp.com/showthread.php?t=56564
#include <sscanf2> // http://forum.sa-mp.com/showthread.php?t=120356
#include <zcmd> // http://forum.sa-mp.com/showthread.php?t=91354
#define NINCS_REG_CSILLAG // Rakd a kommenttárba, ha a jelszót a játékosnak a regisztráció dialógusban csillagozni akarod.
// Szerintem ezt ajánlott így hagyni, mivel a regisztrációban könnyen félrhetírhatsz és nemjössz rá a hibára, mivel nem látod, hogy mit írtál..
// A hibára pedig csak akkor jössz rá, miután beregisztráltál.
#define ChangeNameDialog(%1) \\
ShowPlayerDialog(%1, DIALOG_CHANGENAME, DIALOG_STYLE_INPUT, !\"{\" #XCOLOR_RED \"}Névváltás\", !\"{\" #XCOLOR_GREEN \"}Lentre írd be az új neved! \\nHa régóta játszol már, akkor a névváltás több másodpercig is eltarthat!\\n\\n{\" #XCOLOR_RED \"}Ahogy megváltoztattad, rögtön változtasd meg a neved a SAMP-ba!\", !\"Változtatás\", !\"Mégse\")
// gpci beágyazása
native gpci(playerid, const serial[], maxlen);
new
year,
month,
day,
hour,
minute,
second;
new // Direkt adok hozzá + 1 karaktert, mivel valahol a \\0 kraktert is tárolni kell. (Ez 4 karakter, de kell az 5. is, mivel ott tárolja a \\0-t! [\'a\', \'n\', \'y\', \'á\', \'d\', \'\\0\'])
g_szQuery[512 +1],
g_szLine[128 +1],
i_str[128 +1],
tmp[128 +1],
g_szName[24 +1],
g_szIP[16 +1];
// MySQL regisztrációs rendszer By kurta999
/* Forrás: Wiki
mysql_query Egy megadott \'parancs\' elküldése
mysql_store_result Ez akkor kell, ha tárolni szertnénk azokat az adatokat, amiket a lekérdedés visszadott. (SELECT, stb.. )
mysql_free_result() Ez a store_result után kell, felszabadítja a memóriát, amit a store_result() lefoglalt.
mysql_num_rows Az SQL sorok számával tér vissza (SELECT & SHOW)
mysql_affected_rows Az SQL sorok számával tér vissza (INSERT, UPDATE, REPLACE & DELETE)
mysql_fetch_row A kiválasztott sort beleírjuk egy megadott karakterláncba, egy megadott elválasztóval, alapból ez: |
mysql_insert_id INSTER INTO után visszatér a sor azonosítójával (Csak akkor, ha az auto_increment)
*/
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\"
#define MYSQL_USER \"root\"
#define MYSQL_PASS \"\"
#define MYSQL_DB \"samp\"
#define COLOR_GREY 0x375FFFFF
#define COLOR_GREEN 0x33FF33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFF9900AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_BLUE 0x33CCFFAA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_BASIC 0x0066FFAA
#define COLOR_SYSTEM 0xEFEFF7AA
#define COLOR_LIGHTBLUE 0x33CCFFAA
#define COLOR_PINK 0xFF66FFAA
#define XCOLOR_GREEN 33FF33
#define XCOLOR_RED FF0000
#define XCOLOR_BLUE 33CCFF
#define XCOLOR_YELLOW FF9900
#define XCOLOR_WHITE FFFFFF
// Dialóg ID-k
#define DIALOG_LOGIN 16770
#define DIALOG_REGISTER 16771
#define DIALOG_CHANGENAME 16772
#define DIALOG_CHANGEPASS 16773
#define DIALOG_FINDPLAYER 16774
// isnull by Y_Less
#define isnull(%1) \\
((!(%1[0])) || (((%1[0]) == \'\\1\') && (!(%1[1]))))
public OnFilterScriptInit()
{
// MySQL
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevû felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
mysql_debug(1); // Ha élesbe futtatod, akkor ezt SEMMIKÉPP se hagy bekapcsolva! Ez az egész rendszer sebességét kb. ötszörösére csökkenti, ha nem tízszeresére..
mysql_connect(!MYSQL_HOST, !MYSQL_USER, !MYSQL_DB, !MYSQL_PASS);
if(mysql_ping() != 1)
{
print(!\"MySQL: Kapcsolódás sikertelen! (\" MYSQL_HOST \")\");
print(!\"MySQL: A mód kikapcsol! (\" MYSQL_HOST \")\");
SendRconCommand(!\"exit\");
return 1;
}
print(!\"MySQL: Kapcsolódás elfogadva!\" MYSQL_HOST \"\");
print(!\"MySQL: Adatbázis \" MYSQL_DB \" kiválasztva!\");
mysql_reconnect(); // Újrakapcsolódás engedélyezése
return 1;
}
public OnFilterScriptExit()
{
mysql_close();
return 1;
}
public OnPlayerConnect(playerid)
{
// Automatikus bejelentkezés
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
SetPVarInt(playerid, \"FristSpawn\", 1);
new
iRegID;
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, i_str, sizeof(i_str));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, i_str, year, month, day, hour, minute, second);
mysql_query(g_szQuery);
// Autologin
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 0) // Ha a sor nem üres
{
mysql_fetch_row(g_szLine);
mysql_free_result();
sscanf(g_szLine, \"p<|>d{s[24]s[16]s[30]s[24]s[24]ddddd}\", iRegID);
SetPVarInt(playerid, \"RegID\", iRegID);
// printf(\"%d\", iRegID);
LoginPlayer(playerid, g_szLine);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
else // Ha üres, akkor itt lesz free_result, mer az elõzõ részünk akkor nem fut le és nem lesz neki ott free_result..
{
mysql_free_result();
}
SetPlayerColor(playerid, (random(0xFFFFFF) << 8) | 0xFF); // GetPlayerColor() javítása
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
return (GetPVarType(playerid, \"LoggedIn\")) ? (SavePlayer(playerid)) : (1);
}
public OnPlayerRequestClass(playerid, classid)
{
if(!GetPVarType(playerid, \"LoggedIn\")) // Ha nincs bejelentkezve, ez a lekérés ide nagyon fontos mert minden gobnyomásnál felmutatná a skiválasztóban.
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", pName(playerid)); // Kiválasztjuk, a játékos nevét
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 0) // Ha a sorok száma nem 0 ( nem üres )
{
LoginDialog(playerid); // Akkor login
}
else // Ellentétben
{
RegisterDialog(playerid); // Register
}
mysql_free_result();
}
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
if(!IsPlayerNPC(playerid))
{
if(!GetPVarType(playerid, \"LoggedIn\"))
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 0)
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
mysql_free_result();
return 0;
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
// Ha elõször spawnol, akkor odaadjuk neki a pénzt. Mivel skinválasztásnál nem lehet pénzt adni a játékosnak!
if(GetPVarType(playerid, \"FristSpawn\"))
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, \"Cash\"));
DeletePVar(playerid, \"FristSpawn\");
DeletePVar(playerid, \"Cash\");
}
// Ütésstílus beállítása
SetPlayerFightingStyle(playerid, GetPVarInt(playerid, \"Style\"));
return 1;
}
// Y_Less
NameCheck(const aname[])
{
new
i,
ch;
while ((ch = aname[i++]) && ((ch == \']\') || (ch == \'[\') || (ch == \'(\') || (ch == \')\') || (ch == \'_\') || (ch == \'$\') || (ch == \'@\') || (ch == \'.\') || (ch == \'=\') || (\'0\' <= ch <= \'9\') || ((ch |= 0x20) && (\'a\' <= ch <= \'z\')))) {}
return !ch;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return LoginDialog(playerid);
if(GetPVarType(playerid, \"LoggedIn\"))
{
SendClientMessage(playerid, COLOR_RED, \"Már be vagy jelentkezve.\");
return 1;
}
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
LoginDialog(playerid);
return 1;
}
mysql_real_escape_string(inputtext, tmp); // \"Átvisszzük a karaktereket MySQL formába, hogy nemhogy hiba lesz\"... ( lol, ez aztán kurva értelmes :P )
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `pass` COLLATE `utf8_bin` LIKE \'%s\'\", pName(playerid), tmp);
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 1)
{
mysql_free_result();
SendClientMessage(playerid, COLOR_RED, \"HIBA: Rossz jelszó.\");
LoginDialog(playerid);
return 1;
}
else
{
new
iRegID;
mysql_fetch_row(g_szLine);
mysql_free_result();
sscanf(g_szLine, \"p<|>d{s[24]s[16]s[30]s[24]s[24]ddddd}\", iRegID);
SetPVarInt(playerid, \"RegID\", iRegID);
LoginPlayer(playerid, g_szLine);
}
// Az IP-t beállítjuk a jelenlegi IP-re, hogy az autologin menjen. A GetPlayerIp OnPlayerDisconnect-nél nem mûködik! (255.255.255.255-el tér mindig vissza..)
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `ip` = \'%s\' WHERE `reg_id` = %d\", g_szIP, GetPVarInt(playerid, \"RegID\"));
mysql_query(g_szQuery);
SendClientMessage(playerid, COLOR_GREEN, \"Sikeresen bejelentkeztél!\");
}
case DIALOG_REGISTER:
{
if(!response)
return RegisterDialog(playerid);
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
RegisterDialog(playerid);
return 1;
}
new
len = strlen(inputtext);
if(!(3 <= len <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
RegisterDialog(playerid);
return 1;
}
for(new i; i < len; i++)
{
if(inputtext == \'|\') return SendClientMessage(playerid, COLOR_RED, \"Ezt a jelet {\" #XCOLOR_BLUE \"}| {\" #XCOLOR_RED \"}nem használhatod, mert ez a MySQL elválasztó!\");
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 0)
{
mysql_free_result();
SendClientMessage(playerid, COLOR_RED, \"MySQL sorok száma nem 0, valami hiba történt a kiválasztás közben!\");
SendClientMessage(playerid, COLOR_RED, \"Ezt a hibát jelezd a tulajdonosnak! Kickelve lettél, mert ebbõl hiba keletkezhet!\");
Kick(playerid);
return 1;
}
mysql_free_result();
getdate(year, month, day);
gettime(hour, minute, second);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
mysql_real_escape_string(inputtext, tmp); // Ez arra van, hogy ha speciális karatereket tartalmaz, akk azt átcsinálja az SQL-nek érthetõre
// A jeszavak nincsenek titkosítva...
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `players`(reg_id, name, ip, pass, reg_date, laston) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, tmp, year, month, day, hour, minute, second, year, month, day, hour, minute, second);
mysql_query(g_szQuery);
SetPVarInt(playerid, \"RegID\", mysql_insert_id()); // Játékos Regisztrációs ID-jét beállítuk arra, ameik sorba írtunk elõbb ( INSERT INTO )
SetPVarInt(playerid, \"LoggedIn\", 1);
format(i_str, sizeof(i_str), \"Sikeresen regisztráltál! A jelszavad: {\" #XCOLOR_RED \"}%s. {\" #XCOLOR_GREEN \"}Felhasználó ID: {\" #XCOLOR_BLUE \"}%d\", tmp, GetPVarInt(playerid, \"RegID\"));
SendClientMessage(playerid, COLOR_GREEN, i_str);
SendClientMessage(playerid, COLOR_PINK, \"Ennyi lenne a MySQL regisztáció {\" #XCOLOR_BLUE \"}:)\");
}
case DIALOG_CHANGENAME:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a neved! 3 és 20 karakter között legyen!\");
ChangeNameDialog(playerid);
return 1;
}
if(!NameCheck(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Csak ezek a karakterek lehetnek benne: {\" #XCOLOR_GREEN \"}A-Z, 0-9, [], (), $, @. {\" #XCOLOR_RED \"}Ezenkívül helyet nem tartamlazhat!\");
ChangeNameDialog(playerid);
return 1;
}
if(!strcmp(inputtext, pName(playerid), true))
{
SendClientMessage(playerid, COLOR_RED, \"Jelenleg is ez a neved! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_query(g_szQuery);
mysql_store_result();
if(mysql_num_rows() != 0)
{
mysql_free_result();
SendClientMessage(playerid, COLOR_RED, \"HIBA: Ez a név már használatban van!\");
SendClientMessage(playerid, COLOR_GREEN, \"Írj be egy más nevet, vagy menj a \'Mégse\' gombra!\");
ChangeNameDialog(playerid);
return 1;
}
else
{
mysql_free_result();
}
new
pname[MAX_PLAYER_NAME + 1],
pRegID = GetPVarInt(playerid, \"RegID\");
GetPlayerName(playerid, pname, sizeof(pname));
if(SetPlayerName(playerid, inputtext) != 1)
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges`(id, reg_id, oldname, newname, time) VALUES(0, %d, \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pname, inputtext, year, month, day, hour, minute, second);
mysql_query(g_szQuery);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `name` = \'%s\' WHERE `reg_id` = %d\", inputtext, pRegID);
mysql_query(g_szQuery);
format(i_str, sizeof(i_str), \"Sikeresen átváltottad a neved! Új neved: {\" #XCOLOR_WHITE \"}%s.\", inputtext);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
}
case DIALOG_CHANGEPASS:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a jelszavad! 3 és 20 karakter között legyen!\");
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_INPUT, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
new
pRegID = GetPVarInt(playerid, \"RegID\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `pass` FROM `players` WHERE `reg_id` = %d\", pRegID);
mysql_query(g_szQuery);
mysql_store_result();
mysql_fetch_row(i_str);
mysql_free_result();
mysql_real_escape_string(inputtext, tmp);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `pass` = \'%s\' WHERE `reg_id` = %d\", tmp, pRegID);
mysql_query(g_szQuery);
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges_p`(id, reg_id, name, oldpass, newpass, time) VALUES(0, %d, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pName(playerid), i_str, tmp, year, month, day, hour, minute, second);
mysql_query(g_szQuery);
format(i_str, sizeof(i_str), \"Sikeresen átállítotad a jelszavad! Új jelszavad: {\" #XCOLOR_GREEN \"}%s\", tmp);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
}
case DIALOG_FINDPLAYER:
{
if(!response)
return 0;
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_query(g_szQuery);
mysql_store_result();
mysql_fetch_row(g_szLine);
mysql_free_result();
new
pRegID,
RegDate[24],
Laston[24],
Cash,
Score,
Kills,
Deaths,
Style,
Float:Ratio,
Changes[2];
sscanf(g_szLine, \"p<|>d{s[24]s[16]s[30]}s[24]s[24]ddddd\", pRegID, RegDate, Laston, Cash, Score, Kills, Deaths, Style);
// Arány kiszámítása
if(Deaths && Kills) // Ha az ölések és a halálok száma nem nulla, mivel a 0-val való osztásnak nincs értelme és bebugol a format()
{
Ratio = floatdiv(Kills, Deaths);
}
else
{
Ratio = 0.0;
}
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: tmp = \"Normál\";
case FIGHT_STYLE_BOXING: tmp = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: tmp = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: tmp = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: tmp = \"Grabkick\";
case FIGHT_STYLE_ELBOW: tmp = \"Elbow\";
}
// Megszámlálás
format(g_szQuery, sizeof(g_szQuery), \"SELECT COUNT( reg_id ) FROM `namechanges` WHERE `reg_id` = %d\", pRegID);
mysql_query(g_szQuery);
mysql_store_result();
Changes[0] = mysql_fetch_int();
mysql_free_result();
format(g_szQuery, sizeof(g_szQuery), \"SELECT COUNT( reg_id ) FROM `namechanges_p` WHERE `reg_id` = %d\", pRegID);
mysql_query(g_szQuery);
mysql_store_result();
Changes[1] = mysql_fetch_int();
mysql_free_result();
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", inputtext, playerid, pRegID, Cash, Score);
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, Ratio, tmp);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Névváltások: %d, Jelszóváltások: %d\", Changes[0], Changes[1]);
SendClientMessage(playerid, COLOR_PINK, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
}
}
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsPlayerConnected(killerid) && killerid != INVALID_PLAYER_ID)
{
SetPVarInt(killerid, \"Kills\", GetPVarInt(killerid, \"Kills\") + 1);
}
SetPVarInt(playerid, \"Deaths\", GetPVarInt(playerid, \"Deaths\") + 1);
return 1;
}
public OnQueryError(errorid, error[], resultid, extraid, callback[], sql_query[], connectionHandle)
{
print(sql_query);
}
// Statisztika felmutató
CMD:stats(playerid, params[])
{
new
RegDate[24],
Laston[24],
Kills = GetPVarInt(playerid, \"Kills\"),
Deaths = GetPVarInt(playerid, \"Deaths\"),
Float:Ratio,
Changes[2],
pRegID = GetPVarInt(playerid, \"RegID\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_date`, `laston` FROM `players` WHERE `reg_id` = %d\", pRegID); // Kiválasztjuk a reg_date és a laston mezõt
mysql_query(g_szQuery);
mysql_store_result();
mysql_fetch_row(g_szLine); // Beleírjuk a \"g_szLine\" karakterláncba
mysql_free_result();
sscanf(g_szLine, \"p<|>s[24]s[24]\", RegDate, Laston);
// Arány kiszámítása
if(Deaths && Kills) // Ha az ölések és a halálok száma nem nulla, mivel a 0-val való osztásnak nincs értelme és bebugol a format()
{
Ratio = floatdiv(Kills, Deaths);
}
else
{
Ratio = 0.0;
}
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: tmp = \"Normál\";
case FIGHT_STYLE_BOXING: tmp = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: tmp = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: tmp = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: tmp = \"Grabkick\";
case FIGHT_STYLE_ELBOW: tmp = \"Elbow\";
}
// Megszámlálás
format(g_szQuery, sizeof(g_szQuery), \"SELECT COUNT( reg_id ) FROM `namechanges` WHERE `reg_id` = %d\", pRegID);
mysql_query(g_szQuery);
mysql_store_result();
Changes[0] = mysql_fetch_int();
mysql_free_result();
format(g_szQuery, sizeof(g_szQuery), \"SELECT COUNT( reg_id ) FROM `namechanges_p` WHERE `reg_id` = %d\", pRegID);
mysql_query(g_szQuery);
mysql_store_result();
Changes[1] = mysql_fetch_int();
mysql_free_result();
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", pName(playerid), playerid, GetPVarInt(playerid, \"RegID\"), GetPlayerMoney(playerid), GetPlayerScore(playerid));
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, Ratio, tmp);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Névváltások: %d, Jelszóváltások: %d\", Changes[0], Changes[1]);
SendClientMessage(playerid, COLOR_PINK, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
/*
CMD:kill(playerid, params[])
{
SetPlayerHealth(playerid, 0.0);
return 1;
}
*/
CMD:changename(playerid, params[])
{
ChangeNameDialog(playerid);
return 1;
}
CMD:changepass(playerid, params[])
{
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_PASSWORD, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
CMD:findplayer(playerid, params[])
{
new
count;
if(sscanf(params, \"s[128]\", i_str)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /findplayer <Játékos Névrészlet>\");
// format() trükk, bele kell írni valahogy a százalékot ( % ) is
format(g_szQuery, sizeof(g_szQuery), \"SELECT `name` FROM `players` WHERE `name` LIKE \'%s%s%s\'\", \"%%\", i_str, \"%%\");
mysql_query(g_szQuery);
mysql_store_result();
count = mysql_num_rows();
if(!count)
{
mysql_free_result();
format(i_str, sizeof(i_str), \"Nincs találat a \'%s\' részletre!\", i_str);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
else if(count > 130)
{
mysql_free_result();
format(i_str, sizeof(i_str), \"A \'%s\' részletre több, mint 130 találad van! < %d >!\", i_str, count);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
g_szQuery[0] = EOS; // Kiûrítjük a karakterláncot
while(mysql_fetch_row(g_szName))
{
strcat(g_szQuery, g_szName); // Hozzáadjuk a \"g_szQuery\" karakterlánchoz a \"g_szName\" karakterláncot.
strcat(g_szQuery, \"\\n\"); // Hozzáadjuk a \"g_szQuery\" karakterlánchoz az \"\\n\" karaktert. Ez eredményezi az új sort.
}
mysql_free_result();
format(tmp, 128, \"Találatok a(z) \'%s\' részletre..\", i_str);
ShowPlayerDialog(playerid, DIALOG_FINDPLAYER, DIALOG_STYLE_LIST, tmp, g_szQuery, \"Megtekint\", \"Mégse\");
return 1;
}
/////////////////////////////////////////
stock LoginDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Bejelentkezés: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nTe már regisztálva vagy. Lentre írd be a jelszavad\", !\"Bejelentkezés\", !\"Mégse\");
return 1;
}
stock RegisterDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Regisztráció: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
#if defined NINCS_REG_CSILLAG
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#else
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#endif
return 1;
}
/* Bejelentkezés */
stock LoginPlayer(playerid, sor[])
{
new
PVarSet[5];
sscanf(sor, \"p<|>{ds[24]s[16]s[30]s[24]s[24]}ddddd\", PVarSet[0], PVarSet[1], PVarSet[2], PVarSet[3], PVarSet[4]);
// printf(\"Cash: %d\", PVarSet[0]);
SetPVarInt(playerid, \"Cash\", PVarSet[0]); // A pénzét egy PVar-ban tároljuk, mert a skinválasztásnál nemlehet a játékos pénzét állítani.
SetPlayerScore(playerid, PVarSet[1]);
SetPVarInt(playerid, \"Kills\", PVarSet[2]);
SetPVarInt(playerid, \"Deaths\", PVarSet[3]);
SetPVarInt(playerid, \"Style\", PVarSet[4]);
SetPVarInt(playerid, \"LoggedIn\", 1);
return 1;
}
SavePlayer(playerid)
{
if(!IsPlayerNPC(playerid))
{
if(!GetPVarType(playerid, \"LoggedIn\")) return 0; // Ha nincs bejelentkezve, akkor nem mentjük. Ezt ajánlatos itthagyni, mivel ezmiatt nekem sok bug keletkezett!
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `laston` = \'%02d.%02d.%02d/%02d.%02d.%02d\', `money` = %d, `score` = %d, `kills` = %d, `deaths` = %d, `fightingstyle` = %d WHERE `reg_id` = %d\",
year, month, day, hour, minute, second, GetPlayerMoney(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, \"Kills\"), GetPVarInt(playerid, \"Deaths\"), GetPlayerFightingStyle(playerid),
GetPVarInt(playerid, \"RegID\"));
mysql_query(g_szQuery);
// %02d azt jelenti, hogyha a szám egyjegyû (1, 5, 7, stb... ), akkor tegyen elé egy 0-t. Pl: 05, 07...
// Ezt általában idõre használják, mivel így \'érthetõbb\'...
// Ez ugyanúgy mûködik %03d-vel %04d-vel, és így továb... ^
}
return 1;
}
stock pName(playerid)
{
GetPlayerName(playerid, g_szName, sizeof(g_szName));
return g_szName;
}
/* SQL Tábla */
/*
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`oldname` varchar(21) NOT NULL,
`newname` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges_p` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`name` varchar(24) NOT NULL,
`oldpass` varchar(21) NOT NULL,
`newpass` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(11) NOT NULL DEFAULT \'0\',
`score` int(11) NOT NULL DEFAULT \'0\',
`kills` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`deaths` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`fightingstyle` enum(\'4\',\'5\',\'6\',\'7\',\'15\',\'16\') NOT NULL DEFAULT \'4\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL AUTO_INCREMENT,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
így lelehet kérdezni a sorban lévõ dolgokat, és akkor azt kell használni, hogy mysql_function_query(1, query, false, \"OnQueryFinish\", \"\");
mysql_num_rows()
while(mysql_fetch_row(Line))
muszáj ezt használni, amit írtál elõzõ topicba...:
cache_get_data(rows, fields); // Lekérjük a lekérdezés után kapott értékeket. Sorok és a mezõk számát.
for(new i; i < rows; i++) // Minden sorra vonatkozik.
{
cache_get_row(i, 0, szMusicName); // Lekérjük azt a sort, ami az \"i\" változó értéke, ebben a sorban pedig a nulladik mezõt. Ezt bele a \"szMusicName\" tömbbe.
SendClientMessage(playerid, 0x33FF33AA, szMusicName);
}
Nem lehetne bele admin rendszert rakni?Ez engem is érdekelne.
Akik az alapokat nem értik, azok NE kezdjenek MySQL-be.[/quote]
Szerintem ez nem igaz, mert ha próbálgatják, akkor megérthetik, de ha nem is törõdnek vele, csak kimásolnak egy kész scriptet, akkor nem fejlõdik a \"tanuló\"!
Ha valaki magának akar összerakni egyet, akkor nyugodtan tegye meg, 1 legalább tudja mi van a scriptben, 2 tudja mibõl, mi segítségével épül fel!
Amúgy szerintem jó lett ment a rep!
U.i: Szerintem egy kicsit átláthatatlan...
CMD:stats(playerid, params[])
{
format(Query, sizeof(Query), \"SELECT `RegDate`, `LastOn`, `RegIP`, `LastIP` FROM `users` WHERE `Name` = %s\", PName(playerid));
mysql_function_query(1, Query, true, \"CheckStats\", \"d\", playerid);
return 1;
}
.
.
.
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 3, LastIP); //LastIP
.
.
.
cache_get_row(0, 4, RegDate);
cache_get_row(0, 5, Laston);
cache_get_row(0, 1, RegDate); //RegDate
cache_get_row(0, 2, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 2, LastIP); //LastIP
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
format(Query, sizeof(Query), \"SELECT `RegDate`, `LastOn`, `RegIP`, `LastIP` FROM `users` WHERE `Name` = %s\", PName(playerid));
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 3, LastIP); //LastIP
RegID Name Password Level RegDate LastOn RegIP LastIP Kills Deaths Money Score
mysql_debug(1);
Akik az alapokat nem értik, azok NE kezdjenek MySQL-be.[/quote]
Szerintem ez nem igaz, mert ha próbálgatják, akkor megérthetik, de ha nem is törõdnek vele, csak kimásolnak egy kész scriptet, akkor nem fejlõdik a \"tanuló\"!
Ha valaki magának akar összerakni egyet, akkor nyugodtan tegye meg, 1 legalább tudja mi van a scriptben, 2 tudja mibõl, mi segítségével épül fel!
Amúgy szerintem jó lett ment a rep!
U.i: Szerintem egy kicsit átláthatatlan...
CMD:stats(playerid, params[])
{
format(Query, sizeof(Query), \"SELECT `RegDate`, `LastOn`, `RegIP`, `LastIP` FROM `users` WHERE `Name` = %s\", PName(playerid));
mysql_function_query(1, Query, true, \"CheckStats\", \"d\", playerid);
return 1;
}
.
.
.
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 3, LastIP); //LastIP
.
.
.
cache_get_row(0, 4, RegDate);
cache_get_row(0, 5, Laston);
cache_get_row(0, 1, RegDate); //RegDate
cache_get_row(0, 2, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 2, LastIP); //LastIP
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
format(Query, sizeof(Query), \"SELECT `RegDate`, `LastOn`, `RegIP`, `LastIP` FROM `users` WHERE `Name` = %s\", PName(playerid));
cache_get_row(0, 0, RegDate); //RegDate
cache_get_row(0, 1, LastOn); //LastOn
cache_get_row(0, 2, RegIP); //RegIP
cache_get_row(0, 3, LastIP); //LastIP
RegID Name Password Level RegDate LastOn RegIP LastIP Kills Deaths Money Score
mysql_debug(1);
csak 1 kérdés a táblákat magunknak kell létrehozni?Igen.
Nekem a 95. sorba hibát jelez:print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevu\" felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
És ezek a hibák:D:\\Rendes szerver\\gamemodes\\mysql_szero.pwn(95) : error 001: expected token: \"-string end-\", but found \"-identifier-\"
D:\\Rendes szerver\\gamemodes\\mysql_szero.pwn(95) : error 017: undefined symbol \"felhaszn\"
D:\\Rendes szerver\\gamemodes\\mysql_szero.pwn(95) : error 029: invalid expression, assumed zero
D:\\Rendes szerver\\gamemodes\\mysql_szero.pwn(95) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase
4 Errors.
Aki tud segíteni az segítsen :D
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevu felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
:Sbõvebben kifejtenéd, kérlek?
Most kezdtem el a mysql-t de nem nagyon jövök rá mit hova kel szal, mûvészkedek :D esetleg ha akarod elmondhatod MYSQL hosthoz meg ezekhez mit kell írni vagy valami, ma kezdtema mysql-t szall :question:így sokkal érthetõbb, nem egy :S -et tenni hszbe
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\" // ez a host neve, ha nem küldõ mysql akkor localhost ( ott van ahol a server )
#define MYSQL_USER \"root\" // MySQL felhasználó neve - webadminban tudsz csínálni mysql tárhelyet, annak a felhasználója kerül ide
#define MYSQL_PASS \"\" // Felhasználó jelszava
#define MYSQL_DB \"samp\" // táblák neve.
Fel tudnád rakni a legfrissebb includet? Csak mert én sehol sem találom, ha berakom a hivatalos mysql oldalról a plugint akkor is azt írja a scripted hogy rakjam be az újat.http://files.g-stylezzz.com/mysql/rel/R7/a_mysql.inc
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
Amúgy is a bejelentkezés után miért akarod kickelni? (Közvetlen utána)Nem akarom kickelni, csak mondom, hogy nem mûködik , mert még a kick elõtt ki kellene írni a szöveget!
Rakd be a crashdetect-et és az kiírja, hogy hol crashel pontosan (sorral együtt).
[/quote]
Megpróbálom, de neked mûködik, ha abba a bizonyos sorba beírsz egy Kick(playerid) -t???
SetTimerEx(\"KickPlayer\", 4500, false, \"d\", playerid); // <- Kick() helyett ezt
forward KickPlayer(playerid);
public KickPlayer(playerid)
{
return Kick(playerid);
}
// MySQL Regisztráció rendszer by kurta999
// Verzió: 2.0
// Last Update: 2012.06.04
#include <a_samp>
#tryinclude a_mysql_r7
#if !defined _a_mysql_r7_included
#include <a_mysql>
#endif
#if defined mysql_fetch_int
#error \"Frissítsd a MySQL (a_mysql.inc) függvénykönyvtárad az R7-re!\"
#endif
#include <zcmd> // http://forum.sa-mp.com/showthread.php?t=91354
#define NINCS_REG_CSILLAG // Rakd a kommenttárba, ha a jelszót a játékosnak a regisztráció dialógusban csillagozni akarod.
// Szerintem ezt ajánlott így hagyni, mivel a regisztrációban könnyen félrhetírhatsz és nemjössz rá a hibára, mivel nem látod, hogy mit írtál..
// A hibára pedig csak akkor jössz rá, miután beregisztráltál.
#define ChangeNameDialog(%1) \\
ShowPlayerDialog(%1, DIALOG_CHANGENAME, DIALOG_STYLE_INPUT, !\"{\" #XCOLOR_RED \"}Névváltás\", !\"{\" #XCOLOR_GREEN \"}Lentre írd be az új neved! \\nHa régóta játszol már, akkor a névváltás több másodpercig is eltarthat!\\n\\n{\" #XCOLOR_RED \"}Ahogy megváltoztattad, rögtön változtasd meg a neved a SAMP-ba!\", !\"Változtatás\", !\"Mégse\")
// gpci beágyazása
native gpci(playerid, const serial[], maxlen);
new
year,
month,
day,
hour,
minute,
second;
new // Direkt adok hozzá + 1 karaktert, mivel valahol a \\0 kraktert is tárolni kell. (Ez 4 karakter, de kell az 5. is, mivel ott tárolja a \\0-t! [\'a\', \'n\', \'y\', \'á\', \'d\', \'\\0\'])
g_szQuery[512 +1],
g_szDialogFormat[4096],
i_str[128 +1],
g_szIP[16 +1];
// Bit flagok
enum e_PLAYER_FLAGS (<<= 1)
{
e_LOGGED_IN = 1,
e_FIRST_SPAWN
}
new
e_PLAYER_FLAGS:g_PlayerFlags[MAX_PLAYERS char];
new
g_pQueryQueue[MAX_PLAYERS];
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\"
#define MYSQL_USER \"root\"
#define MYSQL_PASS \"\"
#define MYSQL_DB \"samp\"
// Üzenet, amit akkor ír ki, ha a lekérdezés befejezése elõtt lelép a játékos
#define QUERY_COLLISION(%0) \\
printf(\"Query collision \\\" #%0 \\\"! PlayerID: %d, queue: %d, g_pQueryQueue: %d\", playerid, queue, g_pQueryQueue[playerid])
// RRGGBBAA
#define COLOR_GREEN 0x33FF33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFF9900AA
#define COLOR_PINK 0xFF66FFAA
// RRGGBB
#define XCOLOR_GREEN 33FF33
#define XCOLOR_RED FF0000
#define XCOLOR_BLUE 33CCFF
#define XCOLOR_YELLOW FF9900
#define XCOLOR_WHITE FFFFFF
// Dialóg ID
enum
{
DIALOG_LOGIN = 20000,
DIALOG_REGISTER,
DIALOG_CHANGENAME,
DIALOG_CHANGEPASS,
DIALOG_FINDPLAYER
}
// isnull by Y_Less
#define isnull(%1) \\
((!(%1[0])) || (((%1[0]) == \'\\1\') && (!(%1[1]))))
public OnFilterScriptInit()
{
// MySQL
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevû felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
mysql_debug(1); // Hosztos szerveren ajánlott kikapcsolni. (Ha bekapcsovla hagyod sem nagyon lesz semmi, mivel R7-ben nem ír annyi információt ki, mind a régebbiekben)
mysql_connect(!MYSQL_HOST, !MYSQL_USER, !MYSQL_DB, !MYSQL_PASS);
if(mysql_ping() != 1)
{
print(!\"MySQL: Kapcsolódás sikertelen! (\" MYSQL_HOST \")\");
print(!\"MySQL: A mód kikapcsol! (\" MYSQL_HOST \")\");
SendRconCommand(!\"exit\");
return 1;
}
print(!\"MySQL: Kapcsolódás elfogadva!\" MYSQL_HOST \"\");
print(!\"MySQL: Adatbázis \" MYSQL_DB \" kiválasztva!\");
return 1;
}
public OnFilterScriptExit()
{
mysql_close(); // Kapcsolat bezárása
return 1;
}
public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid, (random(0xFFFFFF) << 8) | 0xFF); // GetPlayerColor() javítása
g_pQueryQueue[playerid]++;
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_OnPlayerConnect\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
g_pQueryQueue[playerid]++;
return SavePlayer(playerid, GetPVarInt(playerid, \"RegID\"));
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
// Ha a játékos csatlakozik vagy lelép, akkor a \"g_pQueryQueue[playerid]\" értéke mindig növekedik.
// Lekérdezésnél átvisszük ennek az értékét a \"queue\" nevû paraméterben, amit majd a lekérdezés lefutásánál ellenõrzünk.
// Ha a játékos lelépett, akkor \"g_pQueryQueue[playerid]\" egyel több lett, tehát nem egyenlõ a \"queue\" paraméter értékével.
// Ez esetben a lekérdezés nem fog lefutni, hanem egy figyelmezetõ üzenetet fog kiírni a konzolva, hogy \"query collision\".
// Nagyon fontos ez, mivel ha van egy lekérdezés, ami lekérdez valami \"titkos\" adatot az adatbázisból,
// közben belaggol a a mysql szerver, a lekérdezés eltart 5 másodpercig, feljön egy másik játékos és annak fogja kiírni az adatokat,
// mivel a lekérdezés lefutása közben lelépett a játékos és egy másik jött a helyére. Erre van ez a védelem, így ettõl egyáltalán nem kell tartani.
// Sima lekérdezéseknél (ház betöltés, egyéb betöltés, frissítés, stb.. szarságok) ilyen helyen nem szükséges ez a védelem.
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new
szFetch[12];
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
// Ez itt egy \"átmeneti változó\", ami tárolja, hogy mi a reg id-je a játékosnak.
// Ha nulla, akkor nincs regisztrálva (mivel az SQL 0-t ad vissza, ha nemlétezõ a sor), ellentétben pedig igen.
g_PlayerFlags{playerid} = e_PLAYER_FLAGS:0; // Nullázuk az értékét, nem elég a nulla, kell elé a változó tagja is, különben figyelmeztet a fordító.
// Automatikus bejelentkezés
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, i_str, sizeof(i_str));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, i_str, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// Autologin
// Leftuttatunk egy lekérdezést, ami ha befejezõdött, akkor meghívódik a \"THREAD_Autologin\" callback.
// A régebbi pluginnal ez egy funkcióban ment, szóval ha a mysql szerver belaggolt és a lekérdezés eltartott 5 másodpercig,
// akkor 5 másodpercig megfagyott a szerver.
// Itt nem fog megfagyni semeddig a szerver, mivel létrehoz neki egy új szálat, és az a szál fagy meg míg nem fut le a lekérdezés.
// Lefutás után pedig meghívja a \"THREAD_Autologin\" callbackot. Ez már logikus, hogy az alap szálon (main thread)-on fut.
//
// Fenti lekérdezéssel is szintén ez a helyzet, viszont ott nem vagyunk kiváncsi a kapott értékekre.
// Az a lefutása során az \"OnQueryFinish\" callbackot hívja meg, viszont itt nem történik semmi.
// Ugyanaz a helyzet az összes lekérdezéssel, ha kiváncsi lennék az értékére, akkor ugyanúgy a callback alá raknám a dolgokat, mint itt.
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_function_query(1, g_szQuery, true, \"THREAD_Autologin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
return 1;
}
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
// Ha elõször spawnol, akkor odaadjuk neki a pénzt. Mivel skinválasztásnál nem lehet pénzt adni a játékosnak!
if(!(g_PlayerFlags{playerid} & e_FIRST_SPAWN))
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, \"Cash\"));
DeletePVar(playerid, \"Cash\");
g_PlayerFlags{playerid} |= e_FIRST_SPAWN;
}
// Ütésstílus beállítása
SetPlayerFightingStyle(playerid, GetPVarInt(playerid, \"Style\"));
return 1;
}
// Y_Less
NameCheck(const aname[])
{
new
i,
ch;
while ((ch = aname[i++]) && ((ch == \']\') || (ch == \'[\') || (ch == \'(\') || (ch == \')\') || (ch == \'_\') || (ch == \'$\') || (ch == \'@\') || (ch == \'.\') || (ch == \'=\') || (\'0\' <= ch <= \'9\') || ((ch |= 0x20) && (\'a\' <= ch <= \'z\')))) {}
return !ch;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return LoginDialog(playerid);
if(g_PlayerFlags{playerid} & e_LOGGED_IN)
{
SendClientMessage(playerid, COLOR_RED, \"Már be vagy jelentkezve.\");
return 1;
}
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
LoginDialog(playerid);
return 1;
}
new
szEscape[32];
mysql_real_escape_string(inputtext, szEscape); // Kiszûri az adatot, SQL injection elkerülése végett. Bõvebben itt olvashatsz róla: http://sampforum.hu/index.php?topic=9285.0
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `pass` COLLATE `utf8_bin` LIKE \'%s\'\", pName(playerid), szEscape);
mysql_function_query(1, g_szQuery, true, \"THREAD_DialogLogin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
case DIALOG_REGISTER:
{
if(!response)
return RegisterDialog(playerid);
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
RegisterDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
RegisterDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_Register_1\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGENAME:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a neved! 3 és 20 karakter között legyen!\");
ChangeNameDialog(playerid);
return 1;
}
if(!NameCheck(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Csak ezek a karakterek lehetnek benne: {\" #XCOLOR_GREEN \"}A-Z, 0-9, [], (), $, @. {\" #XCOLOR_RED \"}Ezenkívül helyet nem tartamlazhat!\");
ChangeNameDialog(playerid);
return 1;
}
if(!strcmp(inputtext, pName(playerid), true))
{
SendClientMessage(playerid, COLOR_RED, \"Jelenleg is ez a neved! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Changename\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGEPASS:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a jelszavad! 3 és 20 karakter között legyen!\");
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_INPUT, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `pass` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, true, \"THREAD_Changepass\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_FINDPLAYER:
{
if(!response)
return 0;
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Findplayer\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
}
return 1;
}
forward THREAD_DialogLogin(playerid, queue);
public THREAD_DialogLogin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_DialogLogin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows != 1)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Rossz jelszó.\");
LoginDialog(playerid);
return 1;
}
LoginPlayer(playerid);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `ip` = \'%s\' WHERE `reg_id` = %d\", g_szIP, GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
SendClientMessage(playerid, COLOR_GREEN, !\"Sikersen bejelentkeztél!\");
return 1;
}
forward THREAD_Register_1(playerid, password[], queue);
public THREAD_Register_1(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_1);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"MySQL sorok száma nem 0, valami hiba történt a kiválasztás közben!\");
SendClientMessage(playerid, COLOR_RED, \"Ezt a hibát jelezd a tulajdonosnak! Kickelve lettél, mert ebbõl hiba keletkezhet!\");
printf(\"MySQL rosw > 1 (%d, %s)\", playerid, password);
Kick(playerid);
return 1;
}
new
szEscape[21];
getdate(year, month, day);
gettime(hour, minute, second);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
mysql_real_escape_string(password, szEscape);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `players`(reg_id, name, ip, pass, reg_date, laston) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, szEscape, year, month, day, hour, minute, second, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"THREAD_Register_2\", \"dsd\", playerid, password, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Register_2(playerid, password[], queue);
public THREAD_Register_2(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_2);
new
iRegID = mysql_insert_id();
SetPVarInt(playerid, \"RegID\", iRegID); // Játékos Regisztrációs ID-jét beállítuk arra, amelyik sorba írtunk elõbb ( INSERT INTO )
SetPVarInt(playerid, \"Style\", 4);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
format(i_str, sizeof(i_str), \"Sikeresen regisztráltál! A jelszavad: {\" #XCOLOR_RED \"}%s. {\" #XCOLOR_GREEN \"}Felhasználó ID: {\" #XCOLOR_BLUE \"}%d\", password, iRegID);
SendClientMessage(playerid, COLOR_GREEN, i_str);
SendClientMessage(playerid, COLOR_PINK, \"Ennyi lenne a MySQL regisztáció {\" #XCOLOR_BLUE \"}:)\");
return 1;
}
forward THREAD_Changename(playerid, inputtext[], queue);
public THREAD_Changename(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changename);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Ez a név már használatban van!\");
SendClientMessage(playerid, COLOR_GREEN, \"Írj be egy más nevet, vagy menj a \'Mégse\' gombra!\");
ChangeNameDialog(playerid);
return 1;
}
new
szOldName[MAX_PLAYER_NAME + 1],
pRegID = GetPVarInt(playerid, \"RegID\");
GetPlayerName(playerid, szOldName, sizeof(szOldName));
if(SetPlayerName(playerid, inputtext) != 1)
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges`(id, reg_id, oldname, newname, time) VALUES(0, %d, \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, szOldName, inputtext, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `name` = \'%s\' WHERE `reg_id` = %d\", inputtext, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átváltottad a neved! Új neved: {\" #XCOLOR_WHITE \"}%s.\", inputtext);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Changepass(playerid, password[], queue);
public THREAD_Changepass(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changepass);
new
szOldPass[21],
szEscaped[21],
pRegID = GetPVarInt(playerid, \"RegID\");
cache_get_row(0, 0, szOldPass);
mysql_real_escape_string(password, szEscaped);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `pass` = \'%s\' WHERE `reg_id` = %d\", szEscaped, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges_p`(id, reg_id, name, oldpass, newpass, time) VALUES(0, %d, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pName(playerid), szOldPass, szEscaped, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átállítotad a jelszavad! Új jelszavad: {\" #XCOLOR_GREEN \"}%s\", password);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Findplayer(playerid, inputtext[], queue);
public THREAD_Findplayer(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Findplayer);
new
szFetch[12],
szRegDate[24],
szLaston[24],
iData[6];
cache_get_row(0, 0, szFetch); iData[0] = strval(szFetch); // regid
cache_get_row(0, 4, szRegDate);
cache_get_row(0, 5, szLaston);
cache_get_row(0, 6, szFetch); iData[1] = strval(szFetch); // money
cache_get_row(0, 7, szFetch); iData[2] = strval(szFetch); // score
cache_get_row(0, 8, szFetch); iData[3] = strval(szFetch); // kills
cache_get_row(0, 9, szFetch); iData[4] = strval(szFetch); // deaths
cache_get_row(0, 10, szFetch); iData[5] = strval(szFetch); // style
switch(iData[5])
{
case FIGHT_STYLE_NORMAL: szFetch = \"Normál\";
case FIGHT_STYLE_BOXING: szFetch = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szFetch = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szFetch = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szFetch = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szFetch = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", inputtext, playerid, iData[0], iData[1], iData[2]);
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", iData[3], iData[4], (iData[3] && iData[4]) ? (floatdiv(iData[3], iData[4])) : (0.0), szFetch);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", szRegDate, szLaston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsPlayerConnected(killerid) && killerid != INVALID_PLAYER_ID)
{
SetPVarInt(killerid, \"Kills\", GetPVarInt(killerid, \"Kills\") + 1);
}
SetPVarInt(playerid, \"Deaths\", GetPVarInt(playerid, \"Deaths\") + 1);
return 1;
}
// Statisztika felmutató
CMD:stats(playerid, params[])
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_date`, `laston` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\")); // Kiválasztjuk a reg_date és a laston mezõt
mysql_function_query(1, g_szQuery, true, \"THREAD_Stats\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Stats(playerid, queue);
public THREAD_Stats(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Stats);
new
RegDate[24],
Laston[24],
szStyle[24],
Kills = GetPVarInt(playerid, \"Kills\"),
Deaths = GetPVarInt(playerid, \"Deaths\");
cache_get_row(0, 0, RegDate);
cache_get_row(0, 1, Laston);
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: szStyle = \"Normál\";
case FIGHT_STYLE_BOXING: szStyle = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szStyle = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szStyle = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szStyle = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szStyle = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", pName(playerid), playerid, GetPVarInt(playerid, \"RegID\"), GetPlayerMoney(playerid), GetPlayerScore(playerid));
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, (Kills && Deaths) ? (floatdiv(Kills, Deaths)) : (0.0), szStyle);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
/*
CMD:kill(playerid, params[])
{
SetPlayerHealth(playerid, 0.0);
return 1;
}
CMD:flag(playerid, params[])
{
format(i_str, 128, \"Logged: %d, FirstSpawn: %d\", g_PlayerFlags{playerid} & e_LOGGED_IN, g_PlayerFlags{playerid} & e_FIRST_SPAWN);
SendClientMessage(playerid, -1, i_str);
return 1;
}
*/
CMD:changename(playerid, params[])
{
ChangeNameDialog(playerid);
return 1;
}
CMD:changepass(playerid, params[])
{
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_PASSWORD, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
CMD:findplayer(playerid, params[])
{
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /findplayer <Játékos Névrészlet>\");
if(strlen(params) > MAX_PLAYER_NAME) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Túl hosszú a részlet, maximum 24 karakter lehet!\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `name` FROM `players` WHERE `name` LIKE \'%s%s%s\'\", \"%%\", params, \"%%\");
mysql_function_query(1, g_szQuery, true, \"THREAD_FindplayerDialog\", \"dsd\", playerid, params, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_FindplayerDialog(playerid, reszlet[], queue);
public THREAD_FindplayerDialog(playerid, reszlet[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_FindplayerDialog);
new
rows,
fields;
cache_get_data(rows, fields);
if(!rows)
{
format(i_str, sizeof(i_str), \"Nincs találat a \'%s\' részletre!\", reszlet);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
else if(rows > 180)
{
format(i_str, sizeof(i_str), \"A \'%s\' részletre több, mint 180 találad van! < %d >!\", reszlet, rows);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
new
x,
szName[MAX_PLAYER_NAME];
g_szDialogFormat[0] = EOS;
for( ; x < rows; x++)
{
cache_get_row(x, 0, szName);
strcat(g_szDialogFormat, szName);
strcat(g_szDialogFormat, \"\\n\");
}
format(i_str, 128, \"Találatok a(z) \'%s\' részletre..\", reszlet);
ShowPlayerDialog(playerid, DIALOG_FINDPLAYER, DIALOG_STYLE_LIST, i_str, g_szDialogFormat, \"Megtekint\", \"Mégse\");
return 1;
}
/////////////////////////////////////////
stock LoginDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Bejelentkezés: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nTe már regisztálva vagy. Lentre írd be a jelszavad\", !\"Bejelentkezés\", !\"Mégse\");
return 1;
}
stock RegisterDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Regisztráció: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
#if defined NINCS_REG_CSILLAG
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#else
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#endif
return 1;
}
/* Bejelentkezés */
stock LoginPlayer(playerid)
{
new
iPVarSet[6],
szFetch[12],
iRegID = GetPVarInt(playerid, \"LineID\");
// Ha a line ID 0, tehát a MySQL nem adott vissza sorokat, akkor semmiképp sem jelentkezhez be!
// Ennek nem szabadna elõfordulnia, de biztonság kedvéért teszek rá védelmet.
if(!iRegID) return printf(\"HIBA: Rossz reg ID! Játékos: %s(%d) (regid: %d)\", pName(playerid), playerid, iRegID);
SetPVarInt(playerid, \"RegID\", iRegID); // RegID-t beállítjuk
cache_get_row(0, 0, szFetch); iPVarSet[0] = strval(szFetch); // RegID
cache_get_row(0, 6, szFetch); iPVarSet[1] = strval(szFetch); // Money
cache_get_row(0, 7, szFetch); iPVarSet[2] = strval(szFetch); // Score
cache_get_row(0, 8, szFetch); iPVarSet[3] = strval(szFetch); // Kills
cache_get_row(0, 9, szFetch); iPVarSet[4] = strval(szFetch); // Deaths
cache_get_row(0, 10, szFetch); iPVarSet[5] = strval(szFetch); // Fightingstyle
SetPVarInt(playerid, \"Cash\", iPVarSet[1]); // A pénzét egy PVar-ban tároljuk, mert a skinválasztásnál nemlehet a játékos pénzét állítani.
SetPlayerScore(playerid, iPVarSet[2]);
SetPVarInt(playerid, \"Kills\", iPVarSet[3]);
SetPVarInt(playerid, \"Deaths\", iPVarSet[4]);
SetPVarInt(playerid, \"Style\", iPVarSet[5]);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
return 1;
}
stock SavePlayer(playerid, regid)
{
if(IsPlayerNPC(playerid)) return 1;
// Ha nincs bejelentkezve és még nem spawnolt le, akkor nem mentjük. Ezt ajánlatos itthagyni, mivel ezmiatt nekem sok bug keletkezett!
if(g_PlayerFlags{playerid} & (e_LOGGED_IN | e_FIRST_SPAWN) == (e_LOGGED_IN | e_FIRST_SPAWN))
{
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `laston` = \'%02d.%02d.%02d/%02d.%02d.%02d\', `money` = %d, `score` = %d, `kills` = %d, `deaths` = %d, `fightingstyle` = \'%d\' WHERE `reg_id` = %d\",
year, month, day, hour, minute, second, GetPlayerMoney(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, \"Kills\"), GetPVarInt(playerid, \"Deaths\"), GetPlayerFightingStyle(playerid),
regid);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// %02d azt jelenti, hogyha a szám egyjegyû (1, 5, 7, stb... ), akkor tegyen elé egy 0-t. Pl: 05, 07.
// Ezt általában idõre használják, mivel így \'érthetõbb\'.
// Ez ugyanúgy mûködik %03d-vel %04d-vel, és így továb... ^
}
return 1;
}
stock pName(playerid)
{
static // \"Helyi\" globális változó
s_szName[MAX_PLAYER_NAME];
GetPlayerName(playerid, s_szName, sizeof(s_szName));
return s_szName;
}
forward OnQueryFinish();
public OnQueryFinish()
{
return 1;
}
/* SQL Tábla */
/*
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`oldname` varchar(21) NOT NULL,
`newname` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges_p` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`name` varchar(24) NOT NULL,
`oldpass` varchar(21) NOT NULL,
`newpass` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(11) NOT NULL DEFAULT \'0\',
`score` int(11) NOT NULL DEFAULT \'0\',
`kills` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`deaths` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`fightingstyle` enum(\'4\',\'5\',\'6\',\'7\',\'15\',\'16\') NOT NULL DEFAULT \'4\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL AUTO_INCREMENT,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
\" post=\"380972\" timestamp=\"1357229112\"]
mert már megszünt a honlapja!! majd felteszem!! :)
Dupla hozzászólás automatikusan összefûzve. ( 2013. január 03. - 17:12:26 )
Itt van :D
// MySQL Regisztráció rendszer by kurta999
// Verzió: 2.0
// Last Update: 2012.06.04
#include <a_samp>
#tryinclude a_mysql_r7
#if !defined _a_mysql_r7_included
#include <a_mysql>
#endif
#if defined mysql_fetch_int
#error \"Frissítsd a MySQL (a_mysql.inc) függvénykönyvtárad az R7-re!\"
#endif
#include <zcmd> // http://forum.sa-mp.com/showthread.php?t=91354
#define NINCS_REG_CSILLAG // Rakd a kommenttárba, ha a jelszót a játékosnak a regisztráció dialógusban csillagozni akarod.
// Szerintem ezt ajánlott így hagyni, mivel a regisztrációban könnyen félrhetírhatsz és nemjössz rá a hibára, mivel nem látod, hogy mit írtál..
// A hibára pedig csak akkor jössz rá, miután beregisztráltál.
#define ChangeNameDialog(%1) \\
ShowPlayerDialog(%1, DIALOG_CHANGENAME, DIALOG_STYLE_INPUT, !\"{\" #XCOLOR_RED \"}Névváltás\", !\"{\" #XCOLOR_GREEN \"}Lentre írd be az új neved! \\nHa régóta játszol már, akkor a névváltás több másodpercig is eltarthat!\\n\\n{\" #XCOLOR_RED \"}Ahogy megváltoztattad, rögtön változtasd meg a neved a SAMP-ba!\", !\"Változtatás\", !\"Mégse\")
// gpci beágyazása
native gpci(playerid, const serial[], maxlen);
new
year,
month,
day,
hour,
minute,
second;
new // Direkt adok hozzá + 1 karaktert, mivel valahol a \\0 kraktert is tárolni kell. (Ez 4 karakter, de kell az 5. is, mivel ott tárolja a \\0-t! [\'a\', \'n\', \'y\', \'á\', \'d\', \'\\0\'])
g_szQuery[512 +1],
g_szDialogFormat[4096],
i_str[128 +1],
g_szIP[16 +1];
// Bit flagok
enum e_PLAYER_FLAGS (<<= 1)
{
e_LOGGED_IN = 1,
e_FIRST_SPAWN
}
new
e_PLAYER_FLAGS:g_PlayerFlags[MAX_PLAYERS char];
new
g_pQueryQueue[MAX_PLAYERS];
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\"
#define MYSQL_USER \"root\"
#define MYSQL_PASS \"\"
#define MYSQL_DB \"samp\"
// Üzenet, amit akkor ír ki, ha a lekérdezés befejezése elõtt lelép a játékos
#define QUERY_COLLISION(%0) \\
printf(\"Query collision \\\" #%0 \\\"! PlayerID: %d, queue: %d, g_pQueryQueue: %d\", playerid, queue, g_pQueryQueue[playerid])
// RRGGBBAA
#define COLOR_GREEN 0x33FF33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFF9900AA
#define COLOR_PINK 0xFF66FFAA
// RRGGBB
#define XCOLOR_GREEN 33FF33
#define XCOLOR_RED FF0000
#define XCOLOR_BLUE 33CCFF
#define XCOLOR_YELLOW FF9900
#define XCOLOR_WHITE FFFFFF
// Dialóg ID
enum
{
DIALOG_LOGIN = 20000,
DIALOG_REGISTER,
DIALOG_CHANGENAME,
DIALOG_CHANGEPASS,
DIALOG_FINDPLAYER
}
// isnull by Y_Less
#define isnull(%1) \\
((!(%1[0])) || (((%1[0]) == \'\\1\') && (!(%1[1]))))
public OnFilterScriptInit()
{
// MySQL
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevû felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
mysql_debug(1); // Hosztos szerveren ajánlott kikapcsolni. (Ha bekapcsovla hagyod sem nagyon lesz semmi, mivel R7-ben nem ír annyi információt ki, mind a régebbiekben)
mysql_connect(!MYSQL_HOST, !MYSQL_USER, !MYSQL_DB, !MYSQL_PASS);
if(mysql_ping() != 1)
{
print(!\"MySQL: Kapcsolódás sikertelen! (\" MYSQL_HOST \")\");
print(!\"MySQL: A mód kikapcsol! (\" MYSQL_HOST \")\");
SendRconCommand(!\"exit\");
return 1;
}
print(!\"MySQL: Kapcsolódás elfogadva!\" MYSQL_HOST \"\");
print(!\"MySQL: Adatbázis \" MYSQL_DB \" kiválasztva!\");
return 1;
}
public OnFilterScriptExit()
{
mysql_close(); // Kapcsolat bezárása
return 1;
}
public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid, (random(0xFFFFFF) << 8) | 0xFF); // GetPlayerColor() javítása
g_pQueryQueue[playerid]++;
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_OnPlayerConnect\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
g_pQueryQueue[playerid]++;
return SavePlayer(playerid, GetPVarInt(playerid, \"RegID\"));
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
// Ha a játékos csatlakozik vagy lelép, akkor a \"g_pQueryQueue[playerid]\" értéke mindig növekedik.
// Lekérdezésnél átvisszük ennek az értékét a \"queue\" nevû paraméterben, amit majd a lekérdezés lefutásánál ellenõrzünk.
// Ha a játékos lelépett, akkor \"g_pQueryQueue[playerid]\" egyel több lett, tehát nem egyenlõ a \"queue\" paraméter értékével.
// Ez esetben a lekérdezés nem fog lefutni, hanem egy figyelmezetõ üzenetet fog kiírni a konzolva, hogy \"query collision\".
// Nagyon fontos ez, mivel ha van egy lekérdezés, ami lekérdez valami \"titkos\" adatot az adatbázisból,
// közben belaggol a a mysql szerver, a lekérdezés eltart 5 másodpercig, feljön egy másik játékos és annak fogja kiírni az adatokat,
// mivel a lekérdezés lefutása közben lelépett a játékos és egy másik jött a helyére. Erre van ez a védelem, így ettõl egyáltalán nem kell tartani.
// Sima lekérdezéseknél (ház betöltés, egyéb betöltés, frissítés, stb.. sz*rságok) ilyen helyen nem szükséges ez a védelem.
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new
szFetch[12];
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
// Ez itt egy \"átmeneti változó\", ami tárolja, hogy mi a reg id-je a játékosnak.
// Ha nulla, akkor nincs regisztrálva (mivel az SQL 0-t ad vissza, ha nemlétezõ a sor), ellentétben pedig igen.
g_PlayerFlags{playerid} = e_PLAYER_FLAGS:0; // Nullázuk az értékét, nem elég a nulla, kell elé a változó tagja is, különben figyelmeztet a fordító.
// Automatikus bejelentkezés
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, i_str, sizeof(i_str));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, i_str, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// Autologin
// Leftuttatunk egy lekérdezést, ami ha befejezõdött, akkor meghívódik a \"THREAD_Autologin\" callback.
// A régebbi pluginnal ez egy funkcióban ment, szóval ha a mysql szerver belaggolt és a lekérdezés eltartott 5 másodpercig,
// akkor 5 másodpercig megfagyott a szerver.
// Itt nem fog megfagyni semeddig a szerver, mivel létrehoz neki egy új szálat, és az a szál fagy meg míg nem fut le a lekérdezés.
// Lefutás után pedig meghívja a \"THREAD_Autologin\" callbackot. Ez már logikus, hogy az alap szálon (main thread)-on fut.
//
// Fenti lekérdezéssel is szintén ez a helyzet, viszont ott nem vagyunk kiváncsi a kapott értékekre.
// Az a lefutása során az \"OnQueryFinish\" callbackot hívja meg, viszont itt nem történik semmi.
// Ugyanaz a helyzet az összes lekérdezéssel, ha kiváncsi lennék az értékére, akkor ugyanúgy a callback alá raknám a dolgokat, mint itt.
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_function_query(1, g_szQuery, true, \"THREAD_Autologin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
return 1;
}
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
// Ha elõször spawnol, akkor odaadjuk neki a pénzt. Mivel skinválasztásnál nem lehet pénzt adni a játékosnak!
if(!(g_PlayerFlags{playerid} & e_FIRST_SPAWN))
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, \"Cash\"));
DeletePVar(playerid, \"Cash\");
g_PlayerFlags{playerid} |= e_FIRST_SPAWN;
}
// Ütésstílus beállítása
SetPlayerFightingStyle(playerid, GetPVarInt(playerid, \"Style\"));
return 1;
}
// Y_Less
NameCheck(const aname[])
{
new
i,
ch;
while ((ch = aname[i++]) && ((ch == \']\') || (ch == \'[\') || (ch == \'(\') || (ch == \')\') || (ch == \'_\') || (ch == \'$\') || (ch == \'@\') || (ch == \'.\') || (ch == \'=\') || (\'0\' <= ch <= \'9\') || ((ch |= 0x20) && (\'a\' <= ch <= \'z\')))) {}
return !ch;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return LoginDialog(playerid);
if(g_PlayerFlags{playerid} & e_LOGGED_IN)
{
SendClientMessage(playerid, COLOR_RED, \"Már be vagy jelentkezve.\");
return 1;
}
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
LoginDialog(playerid);
return 1;
}
new
szEscape[32];
mysql_real_escape_string(inputtext, szEscape); // Kiszûri az adatot, SQL injection elkerülése végett. Bõvebben itt olvashatsz róla: http://sampforum.hu/index.php?topic=9285.0
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `pass` COLLATE `utf8_bin` LIKE \'%s\'\", pName(playerid), szEscape);
mysql_function_query(1, g_szQuery, true, \"THREAD_DialogLogin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
case DIALOG_REGISTER:
{
if(!response)
return RegisterDialog(playerid);
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
RegisterDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
RegisterDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_Register_1\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGENAME:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a neved! 3 és 20 karakter között legyen!\");
ChangeNameDialog(playerid);
return 1;
}
if(!NameCheck(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Csak ezek a karakterek lehetnek benne: {\" #XCOLOR_GREEN \"}A-Z, 0-9, [], (), $, @. {\" #XCOLOR_RED \"}Ezenkívül helyet nem tartamlazhat!\");
ChangeNameDialog(playerid);
return 1;
}
if(!strcmp(inputtext, pName(playerid), true))
{
SendClientMessage(playerid, COLOR_RED, \"Jelenleg is ez a neved! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Changename\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGEPASS:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a jelszavad! 3 és 20 karakter között legyen!\");
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_INPUT, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `pass` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, true, \"THREAD_Changepass\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_FINDPLAYER:
{
if(!response)
return 0;
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Findplayer\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
}
return 1;
}
forward THREAD_DialogLogin(playerid, queue);
public THREAD_DialogLogin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_DialogLogin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows != 1)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Rossz jelszó.\");
LoginDialog(playerid);
return 1;
}
LoginPlayer(playerid);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `ip` = \'%s\' WHERE `reg_id` = %d\", g_szIP, GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
SendClientMessage(playerid, COLOR_GREEN, !\"Sikersen bejelentkeztél!\");
return 1;
}
forward THREAD_Register_1(playerid, password[], queue);
public THREAD_Register_1(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_1);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"MySQL sorok száma nem 0, valami hiba történt a kiválasztás közben!\");
SendClientMessage(playerid, COLOR_RED, \"Ezt a hibát jelezd a tulajdonosnak! Kickelve lettél, mert ebbõl hiba keletkezhet!\");
printf(\"MySQL rosw > 1 (%d, %s)\", playerid, password);
Kick(playerid);
return 1;
}
new
szEscape[21];
getdate(year, month, day);
gettime(hour, minute, second);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
mysql_real_escape_string(password, szEscape);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `players`(reg_id, name, ip, pass, reg_date, laston) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, szEscape, year, month, day, hour, minute, second, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"THREAD_Register_2\", \"dsd\", playerid, password, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Register_2(playerid, password[], queue);
public THREAD_Register_2(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_2);
new
iRegID = mysql_insert_id();
SetPVarInt(playerid, \"RegID\", iRegID); // Játékos Regisztrációs ID-jét beállítuk arra, amelyik sorba írtunk elõbb ( INSERT INTO )
SetPVarInt(playerid, \"Style\", 4);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
format(i_str, sizeof(i_str), \"Sikeresen regisztráltál! A jelszavad: {\" #XCOLOR_RED \"}%s. {\" #XCOLOR_GREEN \"}Felhasználó ID: {\" #XCOLOR_BLUE \"}%d\", password, iRegID);
SendClientMessage(playerid, COLOR_GREEN, i_str);
SendClientMessage(playerid, COLOR_PINK, \"Ennyi lenne a MySQL regisztáció {\" #XCOLOR_BLUE \"}:)\");
return 1;
}
forward THREAD_Changename(playerid, inputtext[], queue);
public THREAD_Changename(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changename);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Ez a név már használatban van!\");
SendClientMessage(playerid, COLOR_GREEN, \"Írj be egy más nevet, vagy menj a \'Mégse\' gombra!\");
ChangeNameDialog(playerid);
return 1;
}
new
szOldName[MAX_PLAYER_NAME + 1],
pRegID = GetPVarInt(playerid, \"RegID\");
GetPlayerName(playerid, szOldName, sizeof(szOldName));
if(SetPlayerName(playerid, inputtext) != 1)
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges`(id, reg_id, oldname, newname, time) VALUES(0, %d, \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, szOldName, inputtext, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `name` = \'%s\' WHERE `reg_id` = %d\", inputtext, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átváltottad a neved! Új neved: {\" #XCOLOR_WHITE \"}%s.\", inputtext);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Changepass(playerid, password[], queue);
public THREAD_Changepass(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changepass);
new
szOldPass[21],
szEscaped[21],
pRegID = GetPVarInt(playerid, \"RegID\");
cache_get_row(0, 0, szOldPass);
mysql_real_escape_string(password, szEscaped);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `pass` = \'%s\' WHERE `reg_id` = %d\", szEscaped, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges_p`(id, reg_id, name, oldpass, newpass, time) VALUES(0, %d, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pName(playerid), szOldPass, szEscaped, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átállítotad a jelszavad! Új jelszavad: {\" #XCOLOR_GREEN \"}%s\", password);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Findplayer(playerid, inputtext[], queue);
public THREAD_Findplayer(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Findplayer);
new
szFetch[12],
szRegDate[24],
szLaston[24],
iData[6];
cache_get_row(0, 0, szFetch); iData[0] = strval(szFetch); // regid
cache_get_row(0, 4, szRegDate);
cache_get_row(0, 5, szLaston);
cache_get_row(0, 6, szFetch); iData[1] = strval(szFetch); // money
cache_get_row(0, 7, szFetch); iData[2] = strval(szFetch); // score
cache_get_row(0, 8, szFetch); iData[3] = strval(szFetch); // kills
cache_get_row(0, 9, szFetch); iData[4] = strval(szFetch); // deaths
cache_get_row(0, 10, szFetch); iData[5] = strval(szFetch); // style
switch(iData[5])
{
case FIGHT_STYLE_NORMAL: szFetch = \"Normál\";
case FIGHT_STYLE_BOXING: szFetch = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szFetch = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szFetch = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szFetch = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szFetch = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", inputtext, playerid, iData[0], iData[1], iData[2]);
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", iData[3], iData[4], (iData[3] && iData[4]) ? (floatdiv(iData[3], iData[4])) : (0.0), szFetch);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", szRegDate, szLaston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsPlayerConnected(killerid) && killerid != INVALID_PLAYER_ID)
{
SetPVarInt(killerid, \"Kills\", GetPVarInt(killerid, \"Kills\") + 1);
}
SetPVarInt(playerid, \"Deaths\", GetPVarInt(playerid, \"Deaths\") + 1);
return 1;
}
// Statisztika felmutató
CMD:stats(playerid, params[])
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_date`, `laston` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\")); // Kiválasztjuk a reg_date és a laston mezõt
mysql_function_query(1, g_szQuery, true, \"THREAD_Stats\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Stats(playerid, queue);
public THREAD_Stats(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Stats);
new
RegDate[24],
Laston[24],
szStyle[24],
Kills = GetPVarInt(playerid, \"Kills\"),
Deaths = GetPVarInt(playerid, \"Deaths\");
cache_get_row(0, 0, RegDate);
cache_get_row(0, 1, Laston);
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: szStyle = \"Normál\";
case FIGHT_STYLE_BOXING: szStyle = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szStyle = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szStyle = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szStyle = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szStyle = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", pName(playerid), playerid, GetPVarInt(playerid, \"RegID\"), GetPlayerMoney(playerid), GetPlayerScore(playerid));
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, (Kills && Deaths) ? (floatdiv(Kills, Deaths)) : (0.0), szStyle);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
/*
CMD:kill(playerid, params[])
{
SetPlayerHealth(playerid, 0.0);
return 1;
}
CMD:flag(playerid, params[])
{
format(i_str, 128, \"Logged: %d, FirstSpawn: %d\", g_PlayerFlags{playerid} & e_LOGGED_IN, g_PlayerFlags{playerid} & e_FIRST_SPAWN);
SendClientMessage(playerid, -1, i_str);
return 1;
}
*/
CMD:changename(playerid, params[])
{
ChangeNameDialog(playerid);
return 1;
}
CMD:changepass(playerid, params[])
{
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_PASSWORD, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
CMD:findplayer(playerid, params[])
{
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /findplayer <Játékos Névrészlet>\");
if(strlen(params) > MAX_PLAYER_NAME) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Túl hosszú a részlet, maximum 24 karakter lehet!\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `name` FROM `players` WHERE `name` LIKE \'%s%s%s\'\", \"%%\", params, \"%%\");
mysql_function_query(1, g_szQuery, true, \"THREAD_FindplayerDialog\", \"dsd\", playerid, params, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_FindplayerDialog(playerid, reszlet[], queue);
public THREAD_FindplayerDialog(playerid, reszlet[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_FindplayerDialog);
new
rows,
fields;
cache_get_data(rows, fields);
if(!rows)
{
format(i_str, sizeof(i_str), \"Nincs találat a \'%s\' részletre!\", reszlet);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
else if(rows > 180)
{
format(i_str, sizeof(i_str), \"A \'%s\' részletre több, mint 180 találad van! < %d >!\", reszlet, rows);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
new
x,
szName[MAX_PLAYER_NAME];
g_szDialogFormat[0] = EOS;
for( ; x < rows; x++)
{
cache_get_row(x, 0, szName);
strcat(g_szDialogFormat, szName);
strcat(g_szDialogFormat, \"\\n\");
}
format(i_str, 128, \"Találatok a(z) \'%s\' részletre..\", reszlet);
ShowPlayerDialog(playerid, DIALOG_FINDPLAYER, DIALOG_STYLE_LIST, i_str, g_szDialogFormat, \"Megtekint\", \"Mégse\");
return 1;
}
/////////////////////////////////////////
stock LoginDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Bejelentkezés: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nTe már regisztálva vagy. Lentre írd be a jelszavad\", !\"Bejelentkezés\", !\"Mégse\");
return 1;
}
stock RegisterDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Regisztráció: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
#if defined NINCS_REG_CSILLAG
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#else
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#endif
return 1;
}
/* Bejelentkezés */
stock LoginPlayer(playerid)
{
new
iPVarSet[6],
szFetch[12],
iRegID = GetPVarInt(playerid, \"LineID\");
// Ha a line ID 0, tehát a MySQL nem adott vissza sorokat, akkor semmiképp sem jelentkezhez be!
// Ennek nem szabadna elõfordulnia, de biztonság kedvéért teszek rá védelmet.
if(!iRegID) return printf(\"HIBA: Rossz reg ID! Játékos: %s(%d) (regid: %d)\", pName(playerid), playerid, iRegID);
SetPVarInt(playerid, \"RegID\", iRegID); // RegID-t beállítjuk
cache_get_row(0, 0, szFetch); iPVarSet[0] = strval(szFetch); // RegID
cache_get_row(0, 6, szFetch); iPVarSet[1] = strval(szFetch); // Money
cache_get_row(0, 7, szFetch); iPVarSet[2] = strval(szFetch); // Score
cache_get_row(0, 8, szFetch); iPVarSet[3] = strval(szFetch); // Kills
cache_get_row(0, 9, szFetch); iPVarSet[4] = strval(szFetch); // Deaths
cache_get_row(0, 10, szFetch); iPVarSet[5] = strval(szFetch); // Fightingstyle
SetPVarInt(playerid, \"Cash\", iPVarSet[1]); // A pénzét egy PVar-ban tároljuk, mert a skinválasztásnál nemlehet a játékos pénzét állítani.
SetPlayerScore(playerid, iPVarSet[2]);
SetPVarInt(playerid, \"Kills\", iPVarSet[3]);
SetPVarInt(playerid, \"Deaths\", iPVarSet[4]);
SetPVarInt(playerid, \"Style\", iPVarSet[5]);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
return 1;
}
stock SavePlayer(playerid, regid)
{
if(IsPlayerNPC(playerid)) return 1;
// Ha nincs bejelentkezve és még nem spawnolt le, akkor nem mentjük. Ezt ajánlatos itthagyni, mivel ezmiatt nekem sok bug keletkezett!
if(g_PlayerFlags{playerid} & (e_LOGGED_IN | e_FIRST_SPAWN) == (e_LOGGED_IN | e_FIRST_SPAWN))
{
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `laston` = \'%02d.%02d.%02d/%02d.%02d.%02d\', `money` = %d, `score` = %d, `kills` = %d, `deaths` = %d, `fightingstyle` = \'%d\' WHERE `reg_id` = %d\",
year, month, day, hour, minute, second, GetPlayerMoney(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, \"Kills\"), GetPVarInt(playerid, \"Deaths\"), GetPlayerFightingStyle(playerid),
regid);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// %02d azt jelenti, hogyha a szám egyjegyû (1, 5, 7, stb... ), akkor tegyen elé egy 0-t. Pl: 05, 07.
// Ezt általában idõre használják, mivel így \'érthetõbb\'.
// Ez ugyanúgy mûködik %03d-vel %04d-vel, és így továb... ^
}
return 1;
}
stock pName(playerid)
{
static // \"Helyi\" globális változó
s_szName[MAX_PLAYER_NAME];
GetPlayerName(playerid, s_szName, sizeof(s_szName));
return s_szName;
}
forward OnQueryFinish();
public OnQueryFinish()
{
return 1;
}
/* SQL Tábla */
/*
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`oldname` varchar(21) NOT NULL,
`newname` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges_p` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`name` varchar(24) NOT NULL,
`oldpass` varchar(21) NOT NULL,
`newpass` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(11) NOT NULL DEFAULT \'0\',
`score` int(11) NOT NULL DEFAULT \'0\',
`kills` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`deaths` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`fightingstyle` enum(\'4\',\'5\',\'6\',\'7\',\'15\',\'16\') NOT NULL DEFAULT \'4\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL AUTO_INCREMENT,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
Ha valami kimaradt SRY :DD
Dupla hozzászólás automatikusan összefûzve. ( 2013. január 03. - 17:13:20 )
Majd valamelyik admin vagy kurta másolja be a fõ postba!! :D
[/quote]
Milyen honlapról beszélsz, lol? Amúgy már megoldottam, más volt a gebasz.
Miert van az hogy belep megjelenik a regisztracios ablak beirom a jelszot de utana semmi ramegyek spawn megint megjelenik a regisztracios ablak.Vagyis nem fogadja el valamiert de nem ir ki semmitNekem is volt ilyen problémám mikor házi szerveren akartam tesztelni és hostos volt a mysql adatbázis nekem nem csatlakozott rá :S
// MySQL Regisztráció rendszer by kurta999
// Verzió: 2.0
// Last Update: 2012.10.29
#include <a_samp>
#tryinclude a_mysql_r7
#if !defined _a_mysql_r7_included
#include <a_mysql>
#endif
#if defined mysql_fetch_int
#error \"Frissítsd a MySQL (a_mysql.inc) függvénykönyvtárad az R7-re!\"
#endif
#include <zcmd> // http://forum.sa-mp.com/showthread.php?t=91354
#define NINCS_REG_CSILLAG // Rakd a kommenttárba, ha a jelszót a játékosnak a regisztráció dialógusban csillagozni akarod.
// Szerintem ezt ajánlott így hagyni, mivel a regisztrációban könnyen félrhetírhatsz és nemjössz rá a hibára, mivel nem látod, hogy mit írtál..
// A hibára pedig csak akkor jössz rá, miután beregisztráltál.
#define ChangeNameDialog(%1) \\
ShowPlayerDialog(%1, DIALOG_CHANGENAME, DIALOG_STYLE_INPUT, !\"{\" #XCOLOR_RED \"}Névváltás\", !\"{\" #XCOLOR_GREEN \"}Lentre írd be az új neved! \\nHa régóta játszol már, akkor a névváltás több másodpercig is eltarthat!\\n\\n{\" #XCOLOR_RED \"}Ahogy megváltoztattad, rögtön változtasd meg a neved a SAMP-ba!\", !\"Változtatás\", !\"Mégse\")
// gpci beágyazása
native gpci(playerid, const serial[], maxlen);
new
year,
month,
day,
hour,
minute,
second;
new // Direkt adok hozzá + 1 karaktert, mivel valahol a \\0 kraktert is tárolni kell. (Ez 4 karakter, de kell az 5. is, mivel ott tárolja a \\0-t! [\'a\', \'n\', \'y\', \'á\', \'d\', \'\\0\'])
g_szQuery[512 +1],
g_szDialogFormat[4096],
i_str[128 +1],
g_szIP[16 +1];
// Bit flagok
enum e_PLAYER_FLAGS (<<= 1)
{
e_LOGGED_IN = 1,
e_FIRST_SPAWN
}
new
e_PLAYER_FLAGS:g_PlayerFlags[MAX_PLAYERS char];
new
g_pQueryQueue[MAX_PLAYERS];
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\"
#define MYSQL_USER \"root\"
#define MYSQL_PASS \"\"
#define MYSQL_DB \"samp\"
// Üzenet, amit akkor ír ki, ha a lekérdezés befejezése elõtt lelép a játékos
#define QUERY_COLLISION(%0) \\
printf(\"Query collision \\\" #%0 \\\"! PlayerID: %d, queue: %d, g_pQueryQueue: %d\", playerid, queue, g_pQueryQueue[playerid])
// RRGGBBAA
#define COLOR_GREEN 0x33FF33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFF9900AA
#define COLOR_PINK 0xFF66FFAA
// RRGGBB
#define XCOLOR_GREEN 33FF33
#define XCOLOR_RED FF0000
#define XCOLOR_BLUE 33CCFF
#define XCOLOR_YELLOW FF9900
#define XCOLOR_WHITE FFFFFF
// Dialóg ID
enum
{
DIALOG_LOGIN = 20000,
DIALOG_REGISTER,
DIALOG_CHANGENAME,
DIALOG_CHANGEPASS,
DIALOG_FINDPLAYER
}
// isnull by Y_Less
#define isnull(%1) \\
((!(%1[0])) || (((%1[0]) == \'\\1\') && (!(%1[1]))))
public OnFilterScriptInit()
{
// MySQL
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevû felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
mysql_debug(1); // Hosztos szerveren ajánlott kikapcsolni. (Ha bekapcsovla hagyod sem nagyon lesz semmi, mivel R7-ben nem ír annyi információt ki, mind a régebbiekben)
mysql_connect(!MYSQL_HOST, !MYSQL_USER, !MYSQL_DB, !MYSQL_PASS);
if(mysql_ping() != 1)
{
print(!\"MySQL: Kapcsolódás sikertelen! (\" MYSQL_HOST \")\");
print(!\"MySQL: A mód kikapcsol! (\" MYSQL_HOST \")\");
SendRconCommand(!\"exit\");
return 1;
}
print(!\"MySQL: Kapcsolódás elfogadva!\" MYSQL_HOST \"\");
print(!\"MySQL: Adatbázis \" MYSQL_DB \" kiválasztva!\");
return 1;
}
public OnFilterScriptExit()
{
mysql_close(); // Kapcsolat bezárása
return 1;
}
public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid, (random(0xFFFFFF) << 8) | 0xFF); // GetPlayerColor() javítása
g_pQueryQueue[playerid]++;
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_OnPlayerConnect\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
g_pQueryQueue[playerid]++;
return SavePlayer(playerid, GetPVarInt(playerid, \"RegID\"));
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
// Ha a játékos csatlakozik vagy lelép, akkor a \"g_pQueryQueue[playerid]\" értéke mindig növekedik.
// Lekérdezésnél átvisszük ennek az értékét a \"queue\" nevû paraméterben, amit majd a lekérdezés lefutásánál ellenõrzünk.
// Ha a játékos lelépett, akkor \"g_pQueryQueue[playerid]\" egyel több lett, tehát nem egyenlõ a \"queue\" paraméter értékével.
// Ez esetben a lekérdezés nem fog lefutni, hanem egy figyelmezetõ üzenetet fog kiírni a konzolva, hogy \"query collision\".
// Nagyon fontos ez, mivel ha van egy lekérdezés, ami lekérdez valami \"titkos\" adatot az adatbázisból,
// közben belaggol a a mysql szerver, a lekérdezés eltart 5 másodpercig, feljön egy másik játékos és annak fogja kiírni az adatokat,
// mivel a lekérdezés lefutása közben lelépett a játékos és egy másik jött a helyére. Erre van ez a védelem, így ettõl egyáltalán nem kell tartani.
// Sima lekérdezéseknél (ház betöltés, egyéb betöltés, frissítés, stb.. szarságok) ilyen helyen nem szükséges ez a védelem.
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new
szFetch[12];
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
// Ez itt egy \"átmeneti változó\", ami tárolja, hogy mi a reg id-je a játékosnak.
// Ha nulla, akkor nincs regisztrálva (mivel az SQL 0-t ad vissza, ha nemlétezõ a sor), ellentétben pedig igen.
g_PlayerFlags{playerid} = e_PLAYER_FLAGS:0; // Nullázuk az értékét, nem elég a nulla, kell elé a változó tagja is, különben figyelmeztet a fordító.
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, i_str, sizeof(i_str));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, i_str, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// Autologin
// Leftuttatunk egy lekérdezést, ami ha befejezõdött, akkor meghívódik a \"THREAD_Autologin\" callback.
// A régebbi pluginnal ez egy funkcióban ment, szóval ha a mysql szerver belaggolt és a lekérdezés eltartott 5 másodpercig,
// akkor 5 másodpercig megfagyott a szerver.
// Itt nem fog megfagyni semeddig a szerver, mivel létrehoz neki egy új szálat, és az a szál fagy meg míg nem fut le a lekérdezés.
// Lefutás után pedig meghívja a \"THREAD_Autologin\" callbackot. Ez már logikus, hogy az alap szálon (main thread)-on fut.
//
// Fenti lekérdezéssel is szintén ez a helyzet, viszont ott nem vagyunk kiváncsi a kapott értékekre.
// Az a lefutása során az \"OnQueryFinish\" callbackot hívja meg, viszont itt nem történik semmi.
// Ugyanaz a helyzet az összes lekérdezéssel, ha kiváncsi lennék az értékére, akkor ugyanúgy a callback alá raknám a dolgokat, mint itt.
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_function_query(1, g_szQuery, true, \"THREAD_Autologin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
return 1;
}
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
//printf(\"%d\", g_PlayerFlags{playerid} & e_LOGGED_IN);
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
// Ha elõször spawnol, akkor odaadjuk neki a pénzt. Mivel skinválasztásnál nem lehet pénzt adni a játékosnak!
if(!(g_PlayerFlags{playerid} & e_FIRST_SPAWN))
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, \"Cash\"));
DeletePVar(playerid, \"Cash\");
g_PlayerFlags{playerid} |= e_FIRST_SPAWN;
}
// Ütésstílus beállítása
SetPlayerFightingStyle(playerid, GetPVarInt(playerid, \"Style\"));
return 1;
}
// Y_Less
NameCheck(const aname[])
{
new
i,
ch;
while ((ch = aname[i++]) && ((ch == \']\') || (ch == \'[\') || (ch == \'(\') || (ch == \')\') || (ch == \'_\') || (ch == \'$\') || (ch == \'@\') || (ch == \'.\') || (ch == \'=\') || (\'0\' <= ch <= \'9\') || ((ch |= 0x20) && (\'a\' <= ch <= \'z\')))) {}
return !ch;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return LoginDialog(playerid);
if(g_PlayerFlags{playerid} & e_LOGGED_IN)
{
SendClientMessage(playerid, COLOR_RED, \"Már be vagy jelentkezve.\");
return 1;
}
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
LoginDialog(playerid);
return 1;
}
new
szEscape[32];
mysql_real_escape_string(inputtext, szEscape); // Kiszûri az adatot, SQL injection elkerülése végett. Bõvebben itt olvashatsz róla: http://sampforum.hu/index.php?topic=9285.0
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `pass` COLLATE `utf8_bin` LIKE \'%s\'\", pName(playerid), szEscape);
mysql_function_query(1, g_szQuery, true, \"THREAD_DialogLogin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
case DIALOG_REGISTER:
{
if(!response)
return RegisterDialog(playerid);
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
RegisterDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
RegisterDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_Register_1\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGENAME:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a neved! 3 és 20 karakter között legyen!\");
ChangeNameDialog(playerid);
return 1;
}
if(!NameCheck(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Csak ezek a karakterek lehetnek benne: {\" #XCOLOR_GREEN \"}A-Z, 0-9, [], (), $, @. {\" #XCOLOR_RED \"}Ezenkívül helyet nem tartamlazhat!\");
ChangeNameDialog(playerid);
return 1;
}
if(!strcmp(inputtext, pName(playerid), true))
{
SendClientMessage(playerid, COLOR_RED, \"Jelenleg is ez a neved! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
mysql_real_escape_string(inputtext, i_str);
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", i_str);
mysql_function_query(1, g_szQuery, true, \"THREAD_Changename\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGEPASS:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a jelszavad! 3 és 20 karakter között legyen!\");
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_INPUT, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `pass` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, true, \"THREAD_Changepass\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_FINDPLAYER:
{
if(!response)
return 0;
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Findplayer\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
}
return 1;
}
forward THREAD_DialogLogin(playerid, queue);
public THREAD_DialogLogin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_DialogLogin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows != 1)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Rossz jelszó.\");
LoginDialog(playerid);
return 1;
}
LoginPlayer(playerid);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `ip` = \'%s\' WHERE `reg_id` = %d\", g_szIP, GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
SendClientMessage(playerid, COLOR_GREEN, !\"Sikersen bejelentkeztél!\");
return 1;
}
forward THREAD_Register_1(playerid, password[], queue);
public THREAD_Register_1(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_1);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"MySQL sorok száma nem 0, valami hiba történt a kiválasztás közben!\");
SendClientMessage(playerid, COLOR_RED, \"Ezt a hibát jelezd a tulajdonosnak! Kickelve lettél, mert ebbõl hiba keletkezhet!\");
printf(\"MySQL rosw > 1 (%d, %s)\", playerid, password);
Kick(playerid);
return 1;
}
new
szEscape[21];
getdate(year, month, day);
gettime(hour, minute, second);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
mysql_real_escape_string(password, szEscape);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `players`(reg_id, name, ip, pass, reg_date, laston) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, szEscape, year, month, day, hour, minute, second, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"THREAD_Register_2\", \"dsd\", playerid, password, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Register_2(playerid, password[], queue);
public THREAD_Register_2(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_2);
new
iRegID = mysql_insert_id();
SetPVarInt(playerid, \"RegID\", iRegID); // Játékos Regisztrációs ID-jét beállítuk arra, amelyik sorba írtunk elõbb ( INSERT INTO )
SetPVarInt(playerid, \"Style\", 4);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
format(i_str, sizeof(i_str), \"Sikeresen regisztráltál! A jelszavad: {\" #XCOLOR_RED \"}%s. {\" #XCOLOR_GREEN \"}Felhasználó ID: {\" #XCOLOR_BLUE \"}%d\", password, iRegID);
SendClientMessage(playerid, COLOR_GREEN, i_str);
SendClientMessage(playerid, COLOR_PINK, \"Ennyi lenne a MySQL regisztáció {\" #XCOLOR_BLUE \"}:)\");
return 1;
}
forward THREAD_Changename(playerid, inputtext[], queue);
public THREAD_Changename(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changename);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Ez a név már használatban van!\");
SendClientMessage(playerid, COLOR_GREEN, \"Írj be egy más nevet, vagy menj a \'Mégse\' gombra!\");
ChangeNameDialog(playerid);
return 1;
}
new
szOldName[MAX_PLAYER_NAME + 1],
pRegID = GetPVarInt(playerid, \"RegID\");
GetPlayerName(playerid, szOldName, sizeof(szOldName));
if(SetPlayerName(playerid, inputtext) != 1)
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges`(id, reg_id, oldname, newname, time) VALUES(0, %d, \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, szOldName, inputtext, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `name` = \'%s\' WHERE `reg_id` = %d\", inputtext, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átváltottad a neved! Új neved: {\" #XCOLOR_WHITE \"}%s.\", inputtext);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Changepass(playerid, password[], queue);
public THREAD_Changepass(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changepass);
new
szOldPass[21],
szEscaped[21],
pRegID = GetPVarInt(playerid, \"RegID\");
cache_get_row(0, 0, szOldPass);
mysql_real_escape_string(password, szEscaped);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `pass` = \'%s\' WHERE `reg_id` = %d\", szEscaped, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges_p`(id, reg_id, name, oldpass, newpass, time) VALUES(0, %d, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pName(playerid), szOldPass, szEscaped, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átállítotad a jelszavad! Új jelszavad: {\" #XCOLOR_GREEN \"}%s\", password);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Findplayer(playerid, inputtext[], queue);
public THREAD_Findplayer(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Findplayer);
new
szFetch[12],
szRegDate[24],
szLaston[24],
iData[6];
cache_get_row(0, 0, szFetch); iData[0] = strval(szFetch); // regid
cache_get_row(0, 4, szRegDate);
cache_get_row(0, 5, szLaston);
cache_get_row(0, 6, szFetch); iData[1] = strval(szFetch); // money
cache_get_row(0, 7, szFetch); iData[2] = strval(szFetch); // score
cache_get_row(0, 8, szFetch); iData[3] = strval(szFetch); // kills
cache_get_row(0, 9, szFetch); iData[4] = strval(szFetch); // deaths
cache_get_row(0, 10, szFetch); iData[5] = strval(szFetch); // style
switch(iData[5])
{
case FIGHT_STYLE_NORMAL: szFetch = \"Normál\";
case FIGHT_STYLE_BOXING: szFetch = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szFetch = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szFetch = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szFetch = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szFetch = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", inputtext, playerid, iData[0], iData[1], iData[2]);
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", iData[3], iData[4], (iData[3] && iData[4]) ? (floatdiv(iData[3], iData[4])) : (0.0), szFetch);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", szRegDate, szLaston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsPlayerConnected(killerid) && killerid != INVALID_PLAYER_ID)
{
SetPVarInt(killerid, \"Kills\", GetPVarInt(killerid, \"Kills\") + 1);
}
SetPVarInt(playerid, \"Deaths\", GetPVarInt(playerid, \"Deaths\") + 1);
return 1;
}
// Statisztika felmutató
CMD:stats(playerid, params[])
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_date`, `laston` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\")); // Kiválasztjuk a reg_date és a laston mezõt
mysql_function_query(1, g_szQuery, true, \"THREAD_Stats\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Stats(playerid, queue);
public THREAD_Stats(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Stats);
new
RegDate[24],
Laston[24],
szStyle[24],
Kills = GetPVarInt(playerid, \"Kills\"),
Deaths = GetPVarInt(playerid, \"Deaths\");
cache_get_row(0, 0, RegDate);
cache_get_row(0, 1, Laston);
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: szStyle = \"Normál\";
case FIGHT_STYLE_BOXING: szStyle = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szStyle = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szStyle = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szStyle = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szStyle = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", pName(playerid), playerid, GetPVarInt(playerid, \"RegID\"), GetPlayerMoney(playerid), GetPlayerScore(playerid));
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, (Kills && Deaths) ? (floatdiv(Kills, Deaths)) : (0.0), szStyle);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
/*
CMD:kill(playerid, params[])
{
SetPlayerHealth(playerid, 0.0);
return 1;
}
CMD:flag(playerid, params[])
{
format(i_str, 128, \"Logged: %d, FirstSpawn: %d\", g_PlayerFlags{playerid} & e_LOGGED_IN, g_PlayerFlags{playerid} & e_FIRST_SPAWN);
SendClientMessage(playerid, -1, i_str);
return 1;
}
*/
CMD:changename(playerid, params[])
{
ChangeNameDialog(playerid);
return 1;
}
CMD:changepass(playerid, params[])
{
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_PASSWORD, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
CMD:findplayer(playerid, params[])
{
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /findplayer <Játékos Névrészlet>\");
if(strlen(params) > MAX_PLAYER_NAME) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Túl hosszú a részlet, maximum 24 karakter lehet!\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `name` FROM `players` WHERE `name` LIKE \'%s%s%s\'\", \"%%\", params, \"%%\");
mysql_function_query(1, g_szQuery, true, \"THREAD_FindplayerDialog\", \"dsd\", playerid, params, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_FindplayerDialog(playerid, reszlet[], queue);
public THREAD_FindplayerDialog(playerid, reszlet[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_FindplayerDialog);
new
rows,
fields;
cache_get_data(rows, fields);
if(!rows)
{
format(i_str, sizeof(i_str), \"Nincs találat a \'%s\' részletre!\", reszlet);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
else if(rows > 180)
{
format(i_str, sizeof(i_str), \"A \'%s\' részletre több, mint 180 találad van! < %d >!\", reszlet, rows);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
new
x,
szName[MAX_PLAYER_NAME];
g_szDialogFormat[0] = EOS;
for( ; x != rows; x++)
{
cache_get_row(x, 0, szName);
strcat(g_szDialogFormat, szName);
strcat(g_szDialogFormat, \"\\n\");
}
format(i_str, 128, \"Találatok a(z) \'%s\' részletre.. (%d)\", reszlet, x);
ShowPlayerDialog(playerid, DIALOG_FINDPLAYER, DIALOG_STYLE_LIST, i_str, g_szDialogFormat, \"Megtekint\", \"Mégse\");
return 1;
}
/////////////////////////////////////////
stock LoginDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Bejelentkezés: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nTe már regisztálva vagy. Lentre írd be a jelszavad\", !\"Bejelentkezés\", !\"Mégse\");
return 1;
}
stock RegisterDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Regisztráció: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
#if defined NINCS_REG_CSILLAG
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#else
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#endif
return 1;
}
/* Bejelentkezés */
stock LoginPlayer(playerid)
{
new
iPVarSet[6],
szFetch[12],
iRegID = GetPVarInt(playerid, \"LineID\");
// Ha a line ID 0, tehát a MySQL nem adott vissza sorokat, akkor semmiképp sem jelentkezhez be!
// Ennek nem szabadna elõfordulnia, de biztonság kedvéért teszek rá védelmet.
if(!iRegID) return printf(\"HIBA: Rossz reg ID! Játékos: %s(%d) (regid: %d)\", pName(playerid), playerid, iRegID);
SetPVarInt(playerid, \"RegID\", iRegID); // RegID-t beállítjuk
cache_get_row(0, 0, szFetch); iPVarSet[0] = strval(szFetch); // RegID
cache_get_row(0, 6, szFetch); iPVarSet[1] = strval(szFetch); // Money
cache_get_row(0, 7, szFetch); iPVarSet[2] = strval(szFetch); // Score
cache_get_row(0, 8, szFetch); iPVarSet[3] = strval(szFetch); // Kills
cache_get_row(0, 9, szFetch); iPVarSet[4] = strval(szFetch); // Deaths
cache_get_row(0, 10, szFetch); iPVarSet[5] = strval(szFetch); // Fightingstyle
SetPVarInt(playerid, \"Cash\", iPVarSet[1]); // A pénzét egy PVar-ban tároljuk, mert a skinválasztásnál nemlehet a játékos pénzét állítani.
SetPlayerScore(playerid, iPVarSet[2]);
SetPVarInt(playerid, \"Kills\", iPVarSet[3]);
SetPVarInt(playerid, \"Deaths\", iPVarSet[4]);
SetPVarInt(playerid, \"Style\", iPVarSet[5]);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
return 1;
}
stock SavePlayer(playerid, regid)
{
if(IsPlayerNPC(playerid)) return 1;
// Ha nincs bejelentkezve és még nem spawnolt le, akkor nem mentjük. Ezt ajánlatos itthagyni, mivel ezmiatt nekem sok bug keletkezett!
if(g_PlayerFlags{playerid} & (e_LOGGED_IN | e_FIRST_SPAWN) == (e_LOGGED_IN | e_FIRST_SPAWN))
{
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `laston` = \'%02d.%02d.%02d/%02d.%02d.%02d\', `money` = %d, `score` = %d, `kills` = %d, `deaths` = %d, `fightingstyle` = \'%d\' WHERE `reg_id` = %d\",
year, month, day, hour, minute, second, GetPlayerMoney(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, \"Kills\"), GetPVarInt(playerid, \"Deaths\"), GetPlayerFightingStyle(playerid),
regid);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// %02d azt jelenti, hogyha a szám egyjegyû (1, 5, 7, stb... ), akkor tegyen elé egy 0-t. Pl: 05, 07.
// Ezt általában idõre használják, mivel így \'érthetõbb\'.
// Ez ugyanúgy mûködik %03d-vel %04d-vel, és így továb... ^
}
return 1;
}
stock pName(playerid)
{
static // \"Helyi\" globális változó
s_szName[MAX_PLAYER_NAME];
GetPlayerName(playerid, s_szName, sizeof(s_szName));
return s_szName;
}
forward OnQueryFinish();
public OnQueryFinish()
{
return 1;
}
/* SQL Tábla */
/*
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`oldname` varchar(21) NOT NULL,
`newname` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges_p` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`name` varchar(24) NOT NULL,
`oldpass` varchar(21) NOT NULL,
`newpass` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(11) NOT NULL DEFAULT \'0\',
`score` int(11) NOT NULL DEFAULT \'0\',
`kills` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`deaths` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`fightingstyle` enum(\'4\',\'5\',\'6\',\'7\',\'15\',\'16\') NOT NULL DEFAULT \'4\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL AUTO_INCREMENT,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
// MySQL Regisztráció rendszer by kurta999
// Verzió: 2.0
// Last Update: 2012.10.29
#include <a_samp>
#tryinclude a_mysql_r7
#if !defined _a_mysql_r7_included
#include <a_mysql>
#endif
#if defined mysql_fetch_int
#error \"Frissítsd a MySQL (a_mysql.inc) függvénykönyvtárad az R7-re!\"
#endif
#include <zcmd> // http://forum.sa-mp.com/showthread.php?t=91354
#define NINCS_REG_CSILLAG // Rakd a kommenttárba, ha a jelszót a játékosnak a regisztráció dialógusban csillagozni akarod.
// Szerintem ezt ajánlott így hagyni, mivel a regisztrációban könnyen félrhetírhatsz és nemjössz rá a hibára, mivel nem látod, hogy mit írtál..
// A hibára pedig csak akkor jössz rá, miután beregisztráltál.
#define ChangeNameDialog(%1) \\
ShowPlayerDialog(%1, DIALOG_CHANGENAME, DIALOG_STYLE_INPUT, !\"{\" #XCOLOR_RED \"}Névváltás\", !\"{\" #XCOLOR_GREEN \"}Lentre írd be az új neved! \\nHa régóta játszol már, akkor a névváltás több másodpercig is eltarthat!\\n\\n{\" #XCOLOR_RED \"}Ahogy megváltoztattad, rögtön változtasd meg a neved a SAMP-ba!\", !\"Változtatás\", !\"Mégse\")
// gpci beágyazása
native gpci(playerid, const serial[], maxlen);
new
year,
month,
day,
hour,
minute,
second;
new // Direkt adok hozzá + 1 karaktert, mivel valahol a \\0 kraktert is tárolni kell. (Ez 4 karakter, de kell az 5. is, mivel ott tárolja a \\0-t! [\'a\', \'n\', \'y\', \'á\', \'d\', \'\\0\'])
g_szQuery[512 +1],
g_szDialogFormat[4096],
i_str[128 +1],
g_szIP[16 +1];
// Bit flagok
enum e_PLAYER_FLAGS (<<= 1)
{
e_LOGGED_IN = 1,
e_FIRST_SPAWN
}
new
e_PLAYER_FLAGS:g_PlayerFlags[MAX_PLAYERS char];
new
g_pQueryQueue[MAX_PLAYERS];
// MySQL beállítások, alapból ezek azok a wamp-nál, csak a tábla nevét módosítsd arra, amilyen néven létrehoztad, nekem itt a \'samp\'
#define MYSQL_HOST \"localhost\"
#define MYSQL_USER \"root\"
#define MYSQL_PASS \"\"
#define MYSQL_DB \"samp\"
// Üzenet, amit akkor ír ki, ha a lekérdezés befejezése elõtt lelép a játékos
#define QUERY_COLLISION(%0) \\
printf(\"Query collision \\\" #%0 \\\"! PlayerID: %d, queue: %d, g_pQueryQueue: %d\", playerid, queue, g_pQueryQueue[playerid])
// RRGGBBAA
#define COLOR_GREEN 0x33FF33AA
#define COLOR_RED 0xFF0000AA
#define COLOR_YELLOW 0xFF9900AA
#define COLOR_PINK 0xFF66FFAA
// RRGGBB
#define XCOLOR_GREEN 33FF33
#define XCOLOR_RED FF0000
#define XCOLOR_BLUE 33CCFF
#define XCOLOR_YELLOW FF9900
#define XCOLOR_WHITE FFFFFF
// Dialóg ID
enum
{
DIALOG_LOGIN = 20000,
DIALOG_REGISTER,
DIALOG_CHANGENAME,
DIALOG_CHANGEPASS,
DIALOG_FINDPLAYER
}
// isnull by Y_Less
#define isnull(%1) \\
((!(%1[0])) || (((%1[0]) == \'\\1\') && (!(%1[1]))))
public OnFilterScriptInit()
{
// MySQL
print(!\"MySQL: Kapcsolódás erre a címre \" MYSQL_HOST \" \" MYSQL_USER \" nevû felhasználóval. \\nAdatbázis neve: \" MYSQL_DB \".\");
mysql_debug(1); // Hosztos szerveren ajánlott kikapcsolni. (Ha bekapcsovla hagyod sem nagyon lesz semmi, mivel R7-ben nem ír annyi információt ki, mind a régebbiekben)
mysql_connect(!MYSQL_HOST, !MYSQL_USER, !MYSQL_DB, !MYSQL_PASS);
if(mysql_ping() != 1)
{
print(!\"MySQL: Kapcsolódás sikertelen! (\" MYSQL_HOST \")\");
print(!\"MySQL: A mód kikapcsol! (\" MYSQL_HOST \")\");
SendRconCommand(!\"exit\");
return 1;
}
print(!\"MySQL: Kapcsolódás elfogadva!\" MYSQL_HOST \"\");
print(!\"MySQL: Adatbázis \" MYSQL_DB \" kiválasztva!\");
return 1;
}
public OnFilterScriptExit()
{
mysql_close(); // Kapcsolat bezárása
return 1;
}
public OnPlayerConnect(playerid)
{
SetPlayerColor(playerid, (random(0xFFFFFF) << 8) | 0xFF); // GetPlayerColor() javítása
g_pQueryQueue[playerid]++;
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_OnPlayerConnect\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
g_pQueryQueue[playerid]++;
return SavePlayer(playerid, GetPVarInt(playerid, \"RegID\"));
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
// Ha a játékos csatlakozik vagy lelép, akkor a \"g_pQueryQueue[playerid]\" értéke mindig növekedik.
// Lekérdezésnél átvisszük ennek az értékét a \"queue\" nevû paraméterben, amit majd a lekérdezés lefutásánál ellenõrzünk.
// Ha a játékos lelépett, akkor \"g_pQueryQueue[playerid]\" egyel több lett, tehát nem egyenlõ a \"queue\" paraméter értékével.
// Ez esetben a lekérdezés nem fog lefutni, hanem egy figyelmezetõ üzenetet fog kiírni a konzolva, hogy \"query collision\".
// Nagyon fontos ez, mivel ha van egy lekérdezés, ami lekérdez valami \"titkos\" adatot az adatbázisból,
// közben belaggol a a mysql szerver, a lekérdezés eltart 5 másodpercig, feljön egy másik játékos és annak fogja kiírni az adatokat,
// mivel a lekérdezés lefutása közben lelépett a játékos és egy másik jött a helyére. Erre van ez a védelem, így ettõl egyáltalán nem kell tartani.
// Sima lekérdezéseknél (ház betöltés, egyéb betöltés, frissítés, stb.. sz*rságok) ilyen helyen nem szükséges ez a védelem.
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new
szFetch[12];
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
// Ez itt egy \"átmeneti változó\", ami tárolja, hogy mi a reg id-je a játékosnak.
// Ha nulla, akkor nincs regisztrálva (mivel az SQL 0-t ad vissza, ha nemlétezõ a sor), ellentétben pedig igen.
g_PlayerFlags{playerid} = e_PLAYER_FLAGS:0; // Nullázuk az értékét, nem elég a nulla, kell elé a változó tagja is, különben figyelmeztet a fordító.
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, i_str, sizeof(i_str));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, i_str, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// Autologin
// Leftuttatunk egy lekérdezést, ami ha befejezõdött, akkor meghívódik a \"THREAD_Autologin\" callback.
// A régebbi pluginnal ez egy funkcióban ment, szóval ha a mysql szerver belaggolt és a lekérdezés eltartott 5 másodpercig,
// akkor 5 másodpercig megfagyott a szerver.
// Itt nem fog megfagyni semeddig a szerver, mivel létrehoz neki egy új szálat, és az a szál fagy meg míg nem fut le a lekérdezés.
// Lefutás után pedig meghívja a \"THREAD_Autologin\" callbackot. Ez már logikus, hogy az alap szálon (main thread)-on fut.
//
// Fenti lekérdezéssel is szintén ez a helyzet, viszont ott nem vagyunk kiváncsi a kapott értékekre.
// Az a lefutása során az \"OnQueryFinish\" callbackot hívja meg, viszont itt nem történik semmi.
// Ugyanaz a helyzet az összes lekérdezéssel, ha kiváncsi lennék az értékére, akkor ugyanúgy a callback alá raknám a dolgokat, mint itt.
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_function_query(1, g_szQuery, true, \"THREAD_Autologin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
return 1;
}
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
//printf(\"%d\", g_PlayerFlags{playerid} & e_LOGGED_IN);
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\"))
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
// Ha elõször spawnol, akkor odaadjuk neki a pénzt. Mivel skinválasztásnál nem lehet pénzt adni a játékosnak!
if(!(g_PlayerFlags{playerid} & e_FIRST_SPAWN))
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, \"Cash\"));
DeletePVar(playerid, \"Cash\");
g_PlayerFlags{playerid} |= e_FIRST_SPAWN;
}
// Ütésstílus beállítása
SetPlayerFightingStyle(playerid, GetPVarInt(playerid, \"Style\"));
return 1;
}
// Y_Less
NameCheck(const aname[])
{
new
i,
ch;
while ((ch = aname[i++]) && ((ch == \']\') || (ch == \'[\') || (ch == \'(\') || (ch == \')\') || (ch == \'_\') || (ch == \'$\') || (ch == \'@\') || (ch == \'.\') || (ch == \'=\') || (\'0\' <= ch <= \'9\') || ((ch |= 0x20) && (\'a\' <= ch <= \'z\')))) {}
return !ch;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_LOGIN:
{
if(!response)
return LoginDialog(playerid);
if(g_PlayerFlags{playerid} & e_LOGGED_IN)
{
SendClientMessage(playerid, COLOR_RED, \"Már be vagy jelentkezve.\");
return 1;
}
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
LoginDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
LoginDialog(playerid);
return 1;
}
new
szEscape[32];
mysql_real_escape_string(inputtext, szEscape); // Kiszûri az adatot, SQL injection elkerülése végett. Bõvebben itt olvashatsz róla: http://sampforum.hu/index.php?topic=9285.0
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `pass` COLLATE `utf8_bin` LIKE \'%s\'\", pName(playerid), szEscape);
mysql_function_query(1, g_szQuery, true, \"THREAD_DialogLogin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
case DIALOG_REGISTER:
{
if(!response)
return RegisterDialog(playerid);
if(isnull(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem írtál be semilyen jelszót!\");
RegisterDialog(playerid);
return 1;
}
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Rossz jelszó hosszúság! 3 - 20\");
RegisterDialog(playerid);
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", pName(playerid));
mysql_function_query(1, g_szQuery, true, \"THREAD_Register_1\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGENAME:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a neved! 3 és 20 karakter között legyen!\");
ChangeNameDialog(playerid);
return 1;
}
if(!NameCheck(inputtext))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Csak ezek a karakterek lehetnek benne: {\" #XCOLOR_GREEN \"}A-Z, 0-9, [], (), $, @. {\" #XCOLOR_RED \"}Ezenkívül helyet nem tartamlazhat!\");
ChangeNameDialog(playerid);
return 1;
}
if(!strcmp(inputtext, pName(playerid), true))
{
SendClientMessage(playerid, COLOR_RED, \"Jelenleg is ez a neved! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
mysql_real_escape_string(inputtext, i_str);
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_id` FROM `players` WHERE `name` = \'%s\'\", i_str);
mysql_function_query(1, g_szQuery, true, \"THREAD_Changename\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_CHANGEPASS:
{
if(!response)
return 0;
if(!(3 <= strlen(inputtext) <= 20))
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ hosszú a jelszavad! 3 és 20 karakter között legyen!\");
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_INPUT, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
format(g_szQuery, sizeof(g_szQuery), \"SELECT `pass` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, true, \"THREAD_Changepass\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
case DIALOG_FINDPLAYER:
{
if(!response)
return 0;
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\'\", inputtext);
mysql_function_query(1, g_szQuery, true, \"THREAD_Findplayer\", \"dsd\", playerid, inputtext, g_pQueryQueue[playerid]);
}
}
return 1;
}
forward THREAD_DialogLogin(playerid, queue);
public THREAD_DialogLogin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_DialogLogin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows != 1)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Rossz jelszó.\");
LoginDialog(playerid);
return 1;
}
LoginPlayer(playerid);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `ip` = \'%s\' WHERE `reg_id` = %d\", g_szIP, GetPVarInt(playerid, \"RegID\"));
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
SendClientMessage(playerid, COLOR_GREEN, !\"Sikersen bejelentkeztél!\");
return 1;
}
forward THREAD_Register_1(playerid, password[], queue);
public THREAD_Register_1(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_1);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"MySQL sorok száma nem 0, valami hiba történt a kiválasztás közben!\");
SendClientMessage(playerid, COLOR_RED, \"Ezt a hibát jelezd a tulajdonosnak! Kickelve lettél, mert ebbõl hiba keletkezhet!\");
printf(\"MySQL rosw > 1 (%d, %s)\", playerid, password);
Kick(playerid);
return 1;
}
new
szEscape[21];
getdate(year, month, day);
gettime(hour, minute, second);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
mysql_real_escape_string(password, szEscape);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `players`(reg_id, name, ip, pass, reg_date, laston) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, szEscape, year, month, day, hour, minute, second, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"THREAD_Register_2\", \"dsd\", playerid, password, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Register_2(playerid, password[], queue);
public THREAD_Register_2(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Register_2);
new
iRegID = mysql_insert_id();
SetPVarInt(playerid, \"RegID\", iRegID); // Játékos Regisztrációs ID-jét beállítuk arra, amelyik sorba írtunk elõbb ( INSERT INTO )
SetPVarInt(playerid, \"Style\", 4);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
format(i_str, sizeof(i_str), \"Sikeresen regisztráltál! A jelszavad: {\" #XCOLOR_RED \"}%s. {\" #XCOLOR_GREEN \"}Felhasználó ID: {\" #XCOLOR_BLUE \"}%d\", password, iRegID);
SendClientMessage(playerid, COLOR_GREEN, i_str);
SendClientMessage(playerid, COLOR_PINK, \"Ennyi lenne a MySQL regisztáció {\" #XCOLOR_BLUE \"}:)\");
return 1;
}
forward THREAD_Changename(playerid, inputtext[], queue);
public THREAD_Changename(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changename);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
SendClientMessage(playerid, COLOR_RED, \"HIBA: Ez a név már használatban van!\");
SendClientMessage(playerid, COLOR_GREEN, \"Írj be egy más nevet, vagy menj a \'Mégse\' gombra!\");
ChangeNameDialog(playerid);
return 1;
}
new
szOldName[MAX_PLAYER_NAME + 1],
pRegID = GetPVarInt(playerid, \"RegID\");
GetPlayerName(playerid, szOldName, sizeof(szOldName));
if(SetPlayerName(playerid, inputtext) != 1)
{
SendClientMessage(playerid, COLOR_RED, \"Nem megfelelõ név! Írj be egy másikat!\");
ChangeNameDialog(playerid);
return 1;
}
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges`(id, reg_id, oldname, newname, time) VALUES(0, %d, \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, szOldName, inputtext, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `name` = \'%s\' WHERE `reg_id` = %d\", inputtext, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átváltottad a neved! Új neved: {\" #XCOLOR_WHITE \"}%s.\", inputtext);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Changepass(playerid, password[], queue);
public THREAD_Changepass(playerid, password[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Changepass);
new
szOldPass[21],
szEscaped[21],
pRegID = GetPVarInt(playerid, \"RegID\");
cache_get_row(0, 0, szOldPass);
mysql_real_escape_string(password, szEscaped);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `pass` = \'%s\' WHERE `reg_id` = %d\", szEscaped, pRegID);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `namechanges_p`(id, reg_id, name, oldpass, newpass, time) VALUES(0, %d, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pRegID, pName(playerid), szOldPass, szEscaped, year, month, day, hour, minute, second);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
format(i_str, sizeof(i_str), \"Sikeresen átállítotad a jelszavad! Új jelszavad: {\" #XCOLOR_GREEN \"}%s\", password);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
return 1;
}
forward THREAD_Findplayer(playerid, inputtext[], queue);
public THREAD_Findplayer(playerid, inputtext[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Findplayer);
new
szFetch[12],
szRegDate[24],
szLaston[24],
iData[6];
cache_get_row(0, 0, szFetch); iData[0] = strval(szFetch); // regid
cache_get_row(0, 4, szRegDate);
cache_get_row(0, 5, szLaston);
cache_get_row(0, 6, szFetch); iData[1] = strval(szFetch); // money
cache_get_row(0, 7, szFetch); iData[2] = strval(szFetch); // score
cache_get_row(0, 8, szFetch); iData[3] = strval(szFetch); // kills
cache_get_row(0, 9, szFetch); iData[4] = strval(szFetch); // deaths
cache_get_row(0, 10, szFetch); iData[5] = strval(szFetch); // style
switch(iData[5])
{
case FIGHT_STYLE_NORMAL: szFetch = \"Normál\";
case FIGHT_STYLE_BOXING: szFetch = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szFetch = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szFetch = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szFetch = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szFetch = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", inputtext, playerid, iData[0], iData[1], iData[2]);
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", iData[3], iData[4], (iData[3] && iData[4]) ? (floatdiv(iData[3], iData[4])) : (0.0), szFetch);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", szRegDate, szLaston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsPlayerConnected(killerid) && killerid != INVALID_PLAYER_ID)
{
SetPVarInt(killerid, \"Kills\", GetPVarInt(killerid, \"Kills\") + 1);
}
SetPVarInt(playerid, \"Deaths\", GetPVarInt(playerid, \"Deaths\") + 1);
return 1;
}
// Statisztika felmutató
CMD:stats(playerid, params[])
{
format(g_szQuery, sizeof(g_szQuery), \"SELECT `reg_date`, `laston` FROM `players` WHERE `reg_id` = %d\", GetPVarInt(playerid, \"RegID\")); // Kiválasztjuk a reg_date és a laston mezõt
mysql_function_query(1, g_szQuery, true, \"THREAD_Stats\", \"dd\", playerid, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_Stats(playerid, queue);
public THREAD_Stats(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Stats);
new
RegDate[24],
Laston[24],
szStyle[24],
Kills = GetPVarInt(playerid, \"Kills\"),
Deaths = GetPVarInt(playerid, \"Deaths\");
cache_get_row(0, 0, RegDate);
cache_get_row(0, 1, Laston);
switch(GetPlayerFightingStyle(playerid))
{
case FIGHT_STYLE_NORMAL: szStyle = \"Normál\";
case FIGHT_STYLE_BOXING: szStyle = \"Boxoló\";
case FIGHT_STYLE_KUNGFU: szStyle = \"Kungfu\";
case FIGHT_STYLE_KNEEHEAD: szStyle = \"Kneehead\";
case FIGHT_STYLE_GRABKICK: szStyle = \"Grabkick\";
case FIGHT_STYLE_ELBOW: szStyle = \"Elbow\";
}
// Üzenet elküldése
format(i_str, sizeof(i_str), \"Név: %s, ID: %d, RegID: %d, Pénz: %d, Pont: %d\", pName(playerid), playerid, GetPVarInt(playerid, \"RegID\"), GetPlayerMoney(playerid), GetPlayerScore(playerid));
SendClientMessage(playerid, COLOR_RED, i_str);
format(i_str, sizeof(i_str), \"Ölések: %d, Halálok: %d, Arány: %.2f, Ütés Stílus: %s\", Kills, Deaths, (Kills && Deaths) ? (floatdiv(Kills, Deaths)) : (0.0), szStyle);
SendClientMessage(playerid, COLOR_YELLOW, i_str);
format(i_str, sizeof(i_str), \"Regisztáció ideje: {\" #XCOLOR_BLUE \"}%s{\" #XCOLOR_GREEN \"}, Utuljára a szerveren: {\" #XCOLOR_BLUE \"}%s\", RegDate, Laston);
SendClientMessage(playerid, COLOR_GREEN, i_str);
return 1;
}
/*
CMD:kill(playerid, params[])
{
SetPlayerHealth(playerid, 0.0);
return 1;
}
CMD:flag(playerid, params[])
{
format(i_str, 128, \"Logged: %d, FirstSpawn: %d\", g_PlayerFlags{playerid} & e_LOGGED_IN, g_PlayerFlags{playerid} & e_FIRST_SPAWN);
SendClientMessage(playerid, -1, i_str);
return 1;
}
*/
CMD:changename(playerid, params[])
{
ChangeNameDialog(playerid);
return 1;
}
CMD:changepass(playerid, params[])
{
ShowPlayerDialog(playerid, DIALOG_CHANGEPASS, DIALOG_STYLE_PASSWORD, \"Jelszóváltás\", \"Lentre írd be az új jelszavad! \\n\\n\", \"Változtatás\", \"Mégse\");
return 1;
}
CMD:findplayer(playerid, params[])
{
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /findplayer <Játékos Névrészlet>\");
if(strlen(params) > MAX_PLAYER_NAME) return SendClientMessage(playerid, COLOR_RED, \"HIBA: Túl hosszú a részlet, maximum 24 karakter lehet!\");
format(g_szQuery, sizeof(g_szQuery), \"SELECT `name` FROM `players` WHERE `name` LIKE \'%s%s%s\'\", \"%%\", params, \"%%\");
mysql_function_query(1, g_szQuery, true, \"THREAD_FindplayerDialog\", \"dsd\", playerid, params, g_pQueryQueue[playerid]);
return 1;
}
forward THREAD_FindplayerDialog(playerid, reszlet[], queue);
public THREAD_FindplayerDialog(playerid, reszlet[], queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_FindplayerDialog);
new
rows,
fields;
cache_get_data(rows, fields);
if(!rows)
{
format(i_str, sizeof(i_str), \"Nincs találat a \'%s\' részletre!\", reszlet);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
else if(rows > 180)
{
format(i_str, sizeof(i_str), \"A \'%s\' részletre több, mint 180 találad van! < %d >!\", reszlet, rows);
SendClientMessage(playerid, COLOR_RED, i_str);
return 1;
}
new
x,
szName[MAX_PLAYER_NAME];
g_szDialogFormat[0] = EOS;
for( ; x != rows; x++)
{
cache_get_row(x, 0, szName);
strcat(g_szDialogFormat, szName);
strcat(g_szDialogFormat, \"\\n\");
}
format(i_str, 128, \"Találatok a(z) \'%s\' részletre.. (%d)\", reszlet, x);
ShowPlayerDialog(playerid, DIALOG_FINDPLAYER, DIALOG_STYLE_LIST, i_str, g_szDialogFormat, \"Megtekint\", \"Mégse\");
return 1;
}
/////////////////////////////////////////
stock LoginDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Bejelentkezés: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nTe már regisztálva vagy. Lentre írd be a jelszavad\", !\"Bejelentkezés\", !\"Mégse\");
return 1;
}
stock RegisterDialog(playerid)
{
format(i_str, sizeof(i_str), \"{\" #XCOLOR_WHITE \"}Regisztráció: {%06x}%s(%d)\", GetPlayerColor(playerid) >>> 8, pName(playerid), playerid);
#if defined NINCS_REG_CSILLAG
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#else
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, i_str, !\"{\" #XCOLOR_GREEN \"}Üdvözöllek a \\n\\n{\" #XCOLOR_BLUE \"}My{\" #XCOLOR_YELLOW \"}SQL {\" #XCOLOR_GREEN \"}teszt szerveren! \\n\\nItt még nem regisztráltál. Lentre írd be a jelszavad\", !\"Regisztáció\", !\"Mégse\");
#endif
return 1;
}
/* Bejelentkezés */
stock LoginPlayer(playerid)
{
new
iPVarSet[6],
szFetch[12],
iRegID = GetPVarInt(playerid, \"LineID\");
// Ha a line ID 0, tehát a MySQL nem adott vissza sorokat, akkor semmiképp sem jelentkezhez be!
// Ennek nem szabadna elõfordulnia, de biztonság kedvéért teszek rá védelmet.
if(!iRegID) return printf(\"HIBA: Rossz reg ID! Játékos: %s(%d) (regid: %d)\", pName(playerid), playerid, iRegID);
SetPVarInt(playerid, \"RegID\", iRegID); // RegID-t beállítjuk
cache_get_row(0, 0, szFetch); iPVarSet[0] = strval(szFetch); // RegID
cache_get_row(0, 6, szFetch); iPVarSet[1] = strval(szFetch); // Money
cache_get_row(0, 7, szFetch); iPVarSet[2] = strval(szFetch); // Score
cache_get_row(0, 8, szFetch); iPVarSet[3] = strval(szFetch); // Kills
cache_get_row(0, 9, szFetch); iPVarSet[4] = strval(szFetch); // Deaths
cache_get_row(0, 10, szFetch); iPVarSet[5] = strval(szFetch); // Fightingstyle
SetPVarInt(playerid, \"Cash\", iPVarSet[1]); // A pénzét egy PVar-ban tároljuk, mert a skinválasztásnál nemlehet a játékos pénzét állítani.
SetPlayerScore(playerid, iPVarSet[2]);
SetPVarInt(playerid, \"Kills\", iPVarSet[3]);
SetPVarInt(playerid, \"Deaths\", iPVarSet[4]);
SetPVarInt(playerid, \"Style\", iPVarSet[5]);
g_PlayerFlags{playerid} |= e_LOGGED_IN;
return 1;
}
stock SavePlayer(playerid, regid)
{
if(IsPlayerNPC(playerid)) return 1;
// Ha nincs bejelentkezve és még nem spawnolt le, akkor nem mentjük. Ezt ajánlatos itthagyni, mivel ezmiatt nekem sok bug keletkezett!
if(g_PlayerFlags{playerid} & (e_LOGGED_IN | e_FIRST_SPAWN) == (e_LOGGED_IN | e_FIRST_SPAWN))
{
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"UPDATE `players` SET `laston` = \'%02d.%02d.%02d/%02d.%02d.%02d\', `money` = %d, `score` = %d, `kills` = %d, `deaths` = %d, `fightingstyle` = \'%d\' WHERE `reg_id` = %d\",
year, month, day, hour, minute, second, GetPlayerMoney(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, \"Kills\"), GetPVarInt(playerid, \"Deaths\"), GetPlayerFightingStyle(playerid),
regid);
mysql_function_query(1, g_szQuery, false, \"OnQueryFinish\", \"\");
// %02d azt jelenti, hogyha a szám egyjegyû (1, 5, 7, stb... ), akkor tegyen elé egy 0-t. Pl: 05, 07.
// Ezt általában idõre használják, mivel így \'érthetõbb\'.
// Ez ugyanúgy mûködik %03d-vel %04d-vel, és így továb... ^
}
return 1;
}
stock pName(playerid)
{
static // \"Helyi\" globális változó
s_szName[MAX_PLAYER_NAME];
GetPlayerName(playerid, s_szName, sizeof(s_szName));
return s_szName;
}
forward OnQueryFinish();
public OnQueryFinish()
{
return 1;
}
/* SQL Tábla */
/*
CREATE TABLE IF NOT EXISTS `connections` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(21) NOT NULL,
`ip` varchar(16) NOT NULL,
`serial` varchar(128) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`oldname` varchar(21) NOT NULL,
`newname` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `namechanges_p` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
`reg_id` mediumint(8) NOT NULL,
`name` varchar(24) NOT NULL,
`oldpass` varchar(21) NOT NULL,
`newpass` varchar(21) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `reg_id` (`reg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `players` (
`reg_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`ip` varchar(20) NOT NULL,
`pass` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`reg_date` varchar(24) NOT NULL,
`laston` varchar(24) NOT NULL,
`money` int(11) NOT NULL DEFAULT \'0\',
`score` int(11) NOT NULL DEFAULT \'0\',
`kills` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`deaths` mediumint(11) unsigned NOT NULL DEFAULT \'0\',
`fightingstyle` enum(\'4\',\'5\',\'6\',\'7\',\'15\',\'16\') NOT NULL DEFAULT \'4\',
PRIMARY KEY (`reg_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
CREATE TABLE IF NOT EXISTS `queryerrors` (
`id` mediumint(7) NOT NULL AUTO_INCREMENT,
`errorid` int(11) NOT NULL,
`error` text NOT NULL,
`resultid` mediumint(7) NOT NULL,
`extraid` mediumint(7) NOT NULL,
`callback` varchar(512) NOT NULL,
`sql_query` varchar(512) NOT NULL,
`connectionHandle` mediumint(7) NOT NULL,
`time` varchar(24) NOT NULL,
PRIMARY KEY (`id`),
KEY `errorid` (`errorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
Fölösleges arra, r33 majd ha kijön, azis támogatni fogja a sima untrhreaded lekérdezéseket, amihez nem kell \"public\", hanem mint ahogy a régi R6 ment.Ez egy jó hír. :D
forward THREAD_Autologin(playerid, queue);
public THREAD_Autologin(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_Autologin);
new
rows,
fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
LoginPlayer(playerid);
SendClientMessage(playerid, COLOR_GREEN, \"Automatikusan bejelentkeztél!\");
}
return 1;
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
// Ha a játékos csatlakozik vagy lelép, akkor a \"g_pQueryQueue[playerid]\" értéke mindig növekedik.
// Lekérdezésnél átvisszük ennek az értékét a \"queue\" nevû paraméterben, amit majd a lekérdezés lefutásánál ellenõrzünk.
// Ha a játékos lelépett, akkor \"g_pQueryQueue[playerid]\" egyel több lett, tehát nem egyenlõ a \"queue\" paraméter értékével.
// Ez esetben a lekérdezés nem fog lefutni, hanem egy figyelmezetõ üzenetet fog kiírni a konzolva, hogy \"query collision\".
// Nagyon fontos ez, mivel ha van egy lekérdezés, ami lekérdez valami \"titkos\" adatot az adatbázisból,
// közben belaggol a a mysql szerver, a lekérdezés eltart 5 másodpercig, feljön egy másik játékos és annak fogja kiírni az adatokat,
// mivel a lekérdezés lefutása közben lelépett a játékos és egy másik jött a helyére. Erre van ez a védelem, így ettõl egyáltalán nem kell tartani.
// Sima lekérdezéseknél (ház betöltés, egyéb betöltés, frissítés, stb.. sz*rságok) ilyen helyen nem szükséges ez a védelem.
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new
szFetch[12],
serial[64];
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
// Ez itt egy \"átmeneti változó\", ami tárolja, hogy mi a reg id-je a játékosnak.
// Ha nulla, akkor nincs regisztrálva (mivel az SQL 0-t ad vissza, ha nemlétezõ a sor), ellentétben pedig igen.
g_PlayerFlags{playerid} = e_PLAYER_FLAGS:0; // Nullázuk az értékét, nem elég a nulla, kell elé a változó tagja is, különben figyelmeztet a fordító.
if(!IsPlayerNPC(playerid)) // Csak játékosokra vonatkozik
{
SetPVarInt(playerid, \"RegID\", -1);
GetPlayerIp(playerid, g_szIP, sizeof(g_szIP));
gpci(playerid, serial, sizeof(serial));
getdate(year, month, day);
gettime(hour, minute, second);
format(g_szQuery, sizeof(g_szQuery), \"INSERT INTO `connections`(id, name, ip, serial, time) VALUES(0, \'%s\', \'%s\', \'%s\', \'%02d.%02d.%02d/%02d.%02d.%02d\')\", pName(playerid), g_szIP, serial, year, month, day, hour, minute, second);
mysql_pquery(1, g_szQuery);
// Autologin
// Leftuttatunk egy lekérdezést, ami ha befejezõdött, akkor meghívódik a \"THREAD_Autologin\" callback.
// A régebbi pluginnal ez egy funkcióban ment, szóval ha a mysql szerver belaggolt és a lekérdezés eltartott 5 másodpercig,
// akkor 5 másodpercig megfagyott a szerver.
// Itt nem fog megfagyni semeddig a szerver, mivel létrehoz neki egy új szálat, és az a szál fagy meg míg nem fut le a lekérdezés.
// Lefutás után pedig meghívja a \"THREAD_Autologin\" callbackot. Ez már logikus, hogy az alap szálon (main thread)-on fut.
//
// Fenti lekérdezéssel is szintén ez a helyzet, viszont ott nem vagyunk kiváncsi a kapott értékekre.
// Az a lefutása során az \"OnQueryFinish\" callbackot hívja meg, viszont itt nem történik semmi.
// Ugyanaz a helyzet az összes lekérdezéssel, ha kiváncsi lennék az értékére, akkor ugyanúgy a callback alá raknám a dolgokat, mint itt.
format(g_szQuery, sizeof(g_szQuery), \"SELECT * FROM `players` WHERE `name` = \'%s\' AND `ip` = \'%s\'\", pName(playerid), g_szIP);
mysql_pquery(1, g_szQuery, \"THREAD_Autologin\", \"dd\", playerid, g_pQueryQueue[playerid]);
}
return 1;
}
forward THREAD_OnPlayerConnect(playerid, queue);
public THREAD_OnPlayerConnect(playerid, queue)
{
if(g_pQueryQueue[playerid] != queue) return QUERY_COLLISION(THREAD_OnPlayerConnect);
new rows,fields;
cache_get_data(rows, fields);
if(rows) // Ha a sor nem üres
{
new szFetch[12],
cache_get_row(0, 0, szFetch);
SetPVarInt(playerid, \"LineID\", strval(szFetch));
}
else
{
SetPVarInt(playerid, \"LineID\",0);
}
//+többi rész
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerNPC(playerid)) return 1;
//printf(\"%d\", g_PlayerFlags{playerid} & e_LOGGED_IN);
if(!(g_PlayerFlags{playerid} & e_LOGGED_IN)) // Felmutatjuk neki a megfelelõ dialógot
{
if(GetPVarInt(playerid, \"LineID\") != 0)
{
LoginDialog(playerid);
}
else
{
RegisterDialog(playerid);
}
}
return 1;
}
SetPVarInt(playerid, \"LineID\", strval(szFetch));
Lenne egy olyan kérdésem, hogy megéri R7-re építeni? Ezt azért kérdem, mert épp most írtam át a szerverem fájlmentésrõl R6-ra. Ahogy olvastam az R7 10-20x gyorsabb, mint az R6. Szóval megéri arra áttérni? Megmondom õszintén engem nem igazán zavar, ha a mód indításakor fél másodperc helyett várok 3-4-et a betöltésre. Meg nekem bonyolultabbnak tûnik az R7.Megérni persze, hogy megéri átírni mivel a legjobb és legújabb plugin. Én maradok az R6 -nál mivel szerintem egyszerû és sokkal könnyebb mint a többi verzió pedig több dolgot lehetséges megcsinálni a legújabb verziókkal. De ez attól függ mennyire vágja az eszed az egész MySQL -t.. ha jól akkor értelme van átírni.. ha semmit akkor maradj inkább az R6 -nál.. nálam szintén ez a probléma.. nem tudok rájönni a logikájára de az R6 -nál pedig simán megy. :D Good luck. ;)
Megérni persze, hogy megéri átírni mivel a legjobb és legújabb plugin. Én maradok az R6 -nál mivel szerintem egyszerû és sokkal könnyebb mint a többi verzió pedig több dolgot lehetséges megcsinálni a legújabb verziókkal. De ez attól függ mennyire vágja az eszed az egész MySQL -t.. ha jól akkor értelme van átírni.. ha semmit akkor maradj inkább az R6 -nál.. nálam szintén ez a probléma.. nem tudok rájönni a logikájára de az R6 -nál pedig simán megy. :D Good luck. ;)
Lenne egy olyan kérdésem, hogy megéri R7-re építeni? Ezt azért kérdem, mert épp most írtam át a szerverem fájlmentésrõl R6-ra. Ahogy olvastam az R7 10-20x gyorsabb, mint az R6. Szóval megéri arra áttérni? Megmondom õszintén engem nem igazán zavar, ha a mód indításakor fél másodperc helyett várok 3-4-et a betöltésre. Meg nekem bonyolultabbnak tûnik az R7.
[/quote]
Nem az a legjobb és legújabb plugin. Az az R38-as plugin. Az R6 és az R7 szépen szólva nagyon régi.
Lenne egy olyan kérdésem, hogy megéri R7-re építeni? Ezt azért kérdem, mert épp most írtam át a szerverem fájlmentésrõl R6-ra. Ahogy olvastam az R7 10-20x gyorsabb, mint az R6. Szóval megéri arra áttérni? Megmondom õszintén engem nem igazán zavar, ha a mód indításakor fél másodperc helyett várok 3-4-et a betöltésre. Meg nekem bonyolultabbnak tûnik az R7.Megérni persze, hogy megéri átírni mivel a legjobb és legújabb plugin. Én maradok az R6 -nál mivel szerintem egyszerû és sokkal könnyebb mint a többi verzió pedig több dolgot lehetséges megcsinálni a legújabb verziókkal. De ez attól függ mennyire vágja az eszed az egész MySQL -t.. ha jól akkor értelme van átírni.. ha semmit akkor maradj inkább az R6 -nál.. nálam szintén ez a probléma.. nem tudok rájönni a logikájára de az R6 -nál pedig simán megy. :D Good luck. ;)
Megérni persze, hogy megéri átírni mivel a legjobb és legújabb plugin. Én maradok az R6 -nál mivel szerintem egyszerû és sokkal könnyebb mint a többi verzió pedig több dolgot lehetséges megcsinálni a legújabb verziókkal. De ez attól függ mennyire vágja az eszed az egész MySQL -t.. ha jól akkor értelme van átírni.. ha semmit akkor maradj inkább az R6 -nál.. nálam szintén ez a probléma.. nem tudok rájönni a logikájára de az R6 -nál pedig simán megy. :D Good luck. ;)
Lenne egy olyan kérdésem, hogy megéri R7-re építeni? Ezt azért kérdem, mert épp most írtam át a szerverem fájlmentésrõl R6-ra. Ahogy olvastam az R7 10-20x gyorsabb, mint az R6. Szóval megéri arra áttérni? Megmondom õszintén engem nem igazán zavar, ha a mód indításakor fél másodperc helyett várok 3-4-et a betöltésre. Meg nekem bonyolultabbnak tûnik az R7.
[/quote]
Nem az a legjobb és legújabb plugin. Az az R38-as plugin. Az R6 és az R7 szépen szólva nagyon régi.
Nem az a legjobb és legújabb plugin. Az az R38-as plugin. Az R6 és az R7 szépen szólva nagyon régi.https://github.com/pBlueG/SA-MP-MySQL/releases
https://github.com/kurta999/MySQL-Register-Login-SaveStatsUgyan olyan hibas mint ez a kod .. :)
Ez a verzió hiba nélkül működik.
nekem is hibátlanul működikszerintem le sem tesztelted a kódot rendesen vagy egyáltalán
https://github.com/kurta999/MySQL-Register-Login-SaveStats
Ez a verzió hiba nélkül működik.
[/quote]
Ugyan olyan hibás a kód. Kövesd az utasításomat és meglátod ugyan azt a hibát fogod te is kapni. Töltsd fel a táblákat az adatbázisra üresen természetesen, töltsd ki az adatokat a csatlakozáshoz és indítsd el a szervert a regisztrációs rendszerrel. Lépj fel és regisztrálj be, regisztráció sikeres lesz majd lépj ki amikor lespawnoltál. Menj a phpMyAdmin -ba és meglátod, hogy a neved sikeresen regisztrálva lesz, módosítsd az IP címet. Nekem házi szerveren 127.0.0.1 lesz és átírod mondjuk. 86.312.2.3.2112 -re mindegy milyen csak írd át és lépj fel megint. Mit fogsz látni? A regisztrációt megint. :D Ha beregisztrálsz akkor kickel a szerver mivel már létezik olyan regisztráció az adatbázisban. Valáhá, ezt fogod megint látni beregisztrálva xd
Már hibakódot is kapok vissza. [01:25:30] [WARNING] CMySQLResult::GetRowData - invalid row (\'0\') or field index (\'0\')- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: .::David::. - 2016. június 26. - 08:15:58- Ha nagyon szeretnéd még videóra is felvehetem hogy hiba nélkül működik.
Kódban nincs hiba.- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: Pedró - 2016. június 26. - 08:17:31- Nekem is tökéletesen működik.
ZyZu csak szeretné lejáratni kurta999-et, régóta szúrja már a szemét, nagyobb puccsokat is tervez ellene. Biztos forrásból értesültem ezekről.- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: ZyZu. - 2016. június 26. - 08:46:29 Idézetet írta: .::David::. date=1466921758\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"3791\" data-ipsquote-contentclass=\"forums_TopicHa nagyon szeretnéd még videóra is felvehetem hogy hiba nélkül működik.
Kódban nincs hiba.
megcsináltad azt amit én leírtam neked? itt nem a kód hibáról van szó.. kód hiba nincsen de ha megváltoztatod az IP címedet akkor bejelentkezik automatikusan és regisztrálni is kell megint
Nekem is tökéletesen működik.
ZyZu csak szeretné lejáratni kurta999-et, régóta szúrja már a szemét, nagyobb puccsokat is tervez ellene. Biztos forrásból értesültem ezekről.
[/quote]
Pedró, húzz el a pics*ba xd- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: .::David::. - 2016. június 26. - 08:54:42- Igen megcsináltam azt amit leírtál. localhoston és vps-en sem írt semmi hibát és nem is kérte hogy regisztráljak megint
- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: ZyZu. - 2016. június 26. - 08:58:18
Jó, akkor nem hibás.. csak nekem csinálja ezt ezzel a kóddal, ok. Nem módosítottam pedig rajta semmit, sima szkriptként használom.- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: ᗩωєѕσмє - 2016. június 26. - 08:59:35- van még 1000 fajta reg.system, be ne szarjatok már ezen az egyen
- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: ZyZu. - 2016. június 26. - 20:29:17- Furcsa, tudod mit csináltam én másképp? Te filterscriptként indítod el, grandlarc móddal.. akkor nekem is tökéletesen működik, de ha átírod az OnFilterScriptInit -et, OnGameModeInit -re/ra akkor nem működik a bejelentkezés. :) Elfelejtettem neked ezt leírni, hogy én ennyit módosítottam rajta csak, hogy gamemodeként indítom el.
- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: lackos888 - 2016. június 26. - 20:43:46 Idézetet írta: ƒeheristi97 date=1466895225\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"3791\" data-ipsquote-contentclass=\"forums_Topicszerintem le sem tesztelted a kódot rendesen vagy egyáltalán
nekem is hibátlanul működik
https://github.com/kurta999/MySQL-Register-Login-SaveStats
Ez a verzió hiba nélkül működik.
[/quote]
Ugyan olyan hibás a kód. Kövesd az utasításomat és meglátod ugyan azt a hibát fogod te is kapni. Töltsd fel a táblákat az adatbázisra üresen természetesen, töltsd ki az adatokat a csatlakozáshoz és indítsd el a szervert a regisztrációs rendszerrel. Lépj fel és regisztrálj be, regisztráció sikeres lesz majd lépj ki amikor lespawnoltál. Menj a phpMyAdmin -ba és meglátod, hogy a neved sikeresen regisztrálva lesz, módosítsd az IP címet. Nekem házi szerveren 127.0.0.1 lesz és átírod mondjuk. 86.312.2.3.2112 -re mindegy milyen csak írd át és lépj fel megint. Mit fogsz látni? A regisztrációt megint. :D Ha beregisztrálsz akkor kickel a szerver mivel már létezik olyan regisztráció az adatbázisban. Valáhá, ezt fogod megint látni beregisztrálva xd
Már hibakódot is kapok vissza. [01:25:30] [WARNING] CMySQLResult::GetRowData - invalid row (\'0\') or field index (\'0\')
[/quote]
Te hülye ez az autologin Hülyeséget beszéltem. Nem tudom, hogy ez neked hogy jön össze. Úgyérzem túlságosan új plugint használsz.- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: ZyZu. - 2017. március 11. - 22:45:08- https://github.com/ZyZu/MySQL-Register-Login-SaveStats
Nem tudom ha valakit érdekelne -e, de átírtam a szkriptet r41-2 verzióra mivel használom a kódot én is. :)- Cím: MySQL Regisztráció rendszer v3.0 (R38-R39 plugin támogatás)
Írta: robdan00 - 2017. március 28. - 21:56:37- Nagyon tetszik :)