Sveiki, esu naujas ant pawno, naudoju mysql R5, žinau, kad yra geresnių, greitesnių, bet kol kas išmoksiu po biški ant R5, niekur neskubu, o problema yra tame, kad neišsaugo vartotojo ar aš prisijungiu/atsijungiu ar padarau restartą, iš naujo prisijungiant vėl meta registraciją.
Ir dar viena problema: Įmeta mane į registraciją, jeigu neparašau daugiau nei 6 raidžių išmeta tekstą, kad tipo reikia 6 raidžių slaptažodyje ir išmeta tekstą Jūs neprisijungęs, todėl tęsti negalite, kaip sutvarkyti šitą, kad galėčiau iš naujo vesti slaptažodį?
public OnPlayerRequestClass(playerid, classid)
public OnPlayerRequestClass(playerid, classid)
{
SetPlayerCameraPos(playerid, 1742.91,-1860.29,13.58);
SetPlayerCameraLookAt(playerid, 1742.91,-1860.29,13.58);
if ( !Logged[ playerid ] ) // jeigu žaidėjas NE prisijungęs su savo duomenimis neleidžame jo į serverį, right ?
{
SendClientMessage(playerid,SPALVA_ORANDZINE,"Jūs neprisijungęs, todėl tęsti negalite."); // parašome klientui kas ne taip.
return 0; // neduodam nieko toliau daryti, laukiam kol prisijungs.
}
return 1;
}
public OnPlayerConnect(playerid)
public OnPlayerConnect(playerid)
{
Logged[playerid] = false; // Nustatome neigiamą reikšmę Logged kintamajam, nes kai žaidėjas prisijungia į serverį, jis nebūna prisijungęs prie savo sąskaitos, right ?
new string[128],pName[MAX_PLAYER_NAME+1],query[256]; // sukuriame kintamuosius, vardo atpažinimui, duomenims į mysql paduoti bei žinutei išreikšti.
GetPlayerName(playerid,pName,sizeof pName); // įdedame į kintamajį dabartinį žaidėjo vardą, jį naudosime teisingai MYSQL eilutei surasti.
MySQLCheck();// Atnaujiname MYSQL jungtį jeigu kartais serveris ją pamiršo.
format(query,sizeof(query),"SELECT * FROM `"TABLENAME"` WHERE Vardas = '%s'",pName); // Sudedame apklausą kurią siūsime užklausai gauti visai informacijai apie žaidėją.
mysql_query(query); // siunčiame užklausą kurią sūdėjome į query
if(IsPlayerConnected(playerid)) // patikriname jeigu žaidėjas prisijunęs
{
GetPlayerName(playerid,pName,sizeof pName); // paimame dar kartą jo vardą.
mysql_store_result(); // atsikeliame iš MYSQL gautą rezultatą
if(mysql_num_rows() > 0) // Jeigu rado duomenis apie vartotoją reiškiasi jis užregistruotas. Duodame jam šansą prisijungti :D
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Prisijungimas","Įveskite savo sąskaitos prisijungimo slaptažodį:","Tęsti","Išeiti"); // parodome DIALOG langą, kad būtų kur suvesti sąskaitos slaptažodį, o gal naudojame komanda ? :D
format(string,sizeof(string),"Sąskaita su vardu - (%s) yra užregistruota. Prašome įvesti sąskaitos slaptažodį norėdami prisijungti.",pName); // formatuojame textą
SendClientMessage(playerid,SPALVA_ORANDZINE,string); // parašome suformatuotą textą.
}
else // jeigu nerado nieko apie vartotoją reiškiasi jis neregistruotas, so we dump
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Registracija","Registracijai įveskite slaptažodį kurį naudosite kas kartą prisijungiant prie sąskaitos","Tęsti","Išeiti"); // parodome DIALOGĄ kuriame užregistruos savo slaptažodį.
format(string,sizeof(string),"Sveikas atvykęs %s, tu šiame serveryje neturi sąskaitos, įvesk slaptažodį norėdamas užregistruoti.",pName); // formatuojame žinutę, kad pasakyti žaidėjui apie neturimą sąskaitą ir reikalingą registraciją.
SendClientMessage(playerid,SPALVA_ORANDZINE,string); // Siunčiame suformatuotą žinutę klientui kuris to prašo.
}
mysql_free_result(); // paleidžiame visus paimtus duomenis, kai reiks vėl pasiimsime.
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
public OnPlayerDisconnect(playerid, reason)
{
new query[300],pName[MAX_PLAYER_NAME]; // kintamieji užklausoms bei vardui.
GetPlayerName(playerid,pName,sizeof(pName)); // paimame žaidėjo vardą kuriam viską darysime.
if ( Logged[ playerid ] ) // jeigu žaidėjas prisijungęs, tai yra jeigu jis suvędęs savo duomenis teisingai arba ką tik užsiregistravęs ir automatiškai prijungtas.
{
MySQLCheck(); // atnaujiname jungtį
format(query,sizeof(query),"UPDATE `"TABLENAME"` SET `Pinigai`='%d' WHERE (`Vardas` = '%s')",GetPlayerMoney(playerid),pName); // išsaugome žaidėjo turimus pinigus į MYSQL duomenų bazę, kad kitą kartą atėjus jis gautu juos.
mysql_query(query); // siunčiame užklausą duomenų bazei.
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1) // Jeigu dialogo id 1 tai yra jeigu jis nori registruotis.
{
if(response) // Jeigu įvedė slaptažodį ir spaudžia tęsti.
{
if(strlen(inputtext) < 6) // jeigu slaptažodis sudaro nemažiau 6 simbolių. Vykdome toliau
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Registracija","Registracijai įveskite slaptažodį kurį naudosite kas kartą prisijungiant prie sąskaitos","Tęsti","Išeiti"); // rodome vėl DIALOGĄ, kad galėtų pasitaisyti neteisingai įvestą slaptažodį.
return SendClientMessage(playerid,SPALVA_ORANDZINE,"Slaptažodis tūrėtų sūdaryti nemažiau 6 simbolių, tai jūsų sąskaitos saugumui."); // pranešame žaidėjui kuris suvedė neteisingai
}
new query[256], vardas[128]; // Stringai :D , užklausai bei vardui.
GetPlayerName(playerid,vardas,128); // įdedame į kintamajį žaidėjo vardą kurį naudosime atpažinimui.
MySQLCheck(); // Prieš užklausą visada atnaujinome jungtį, kodėl neatnaujinti ir dabar? Gal užmiršo?
format(query,sizeof(query),"INSERT INTO `"TABLENAME"` (Vardas,Slaptazodis) VALUES ('%s',md5('%s'))",vardas,inputtext); // vykdome užklausą kurioje suvesime norimus duomenis į MYSQL duom. Taip, pat naudojamės plugino funkcijomis ir užkoduojame slaptažodį - MD5
mysql_query(query); // padarome užklausą.
Logged[playerid] = true; // Nustatome, kad žaidėjas prisijungė automatiškai. // Žaidėjui sąskaitą sukurtą, padarome kintamajį true, kad serveris jį atpažintų kaip prisijungusį.
SendClientMessage(playerid,SPALVA_ORANDZINE,"Užsiregistravote sėkmingai, jūs automatiškai prijungtas. Tęskite norint žaisti."); // Visą ką aš dabar pasakiau pranešame žaidėjui paprastaja kalba (neskriptinimo) :D :D
}
else if(!response) // Jei žaidėjas paspaudė buttoną išeiti, tai metam jį iš serverio, right ?
{
Kick(playerid); // Išspiriame žaidėja, todėl kad nenorėjo registruotis.
}
return 1;
}
if(dialogid == 2) // Jeigu žaidėjas užregistruotas ir norėtų prisijungti prie savo sąskaitos rodome jam dialogą id-2
{
if(response) // jai paspaus tęsti.
{
new vardas[MAX_PLAYER_NAME], query[256]; // Kintamieji vardui bei užklausai.
GetPlayerName(playerid, vardas, 128); // gaunam zaidejo pavadinimą ir įdedame į kintamajį vardas :)
if(IsPlayerConnected(playerid)) // jeigu žaidėjas prisijungęs
{
MySQLCheck(); // Atnaujiname jungtį, nes gali būti užmigusi.
format(query,sizeof(query),"SELECT Pinigai FROM `"TABLENAME"` WHERE Vardas = '%s' AND Slaptazodis = md5('%s') LIMIT 1",vardas,inputtext); // Paimame žaidėjo pinigus, kad būtų ką jam atiduoti.
mysql_query(query); // duodame užklausą, kad gražintų pinigus :D
mysql_store_result(); // Pasidedame gautą rezultatą, nes greit jį .
if(mysql_num_rows() == 1)// jeigu yra atitikmenų iš užklausos
{
PlayerMoney[playerid] = mysql_fetch_int(); // įrašome, kiek jis tūrėjo pinigų į kintamajį.
GivePlayerMoney(playerid,PlayerMoney[playerid]); // ir lygiai tiek pat atiduodame.
SendClientMessage(playerid,SPALVA_ORANDZINE,"Tu sėkmingai prijungtas prie sąskaitos. Sėkmės žaidime!"); // Pranešame ataskaitą apie atiduotus pinigus.
Logged[playerid] = true; // žaidėjo duomenis teisingi, duodame jam žaisti.
mysql_free_result(); // nebereikia paimtų duomenų, todėl juos paleidžiame.
}
else // jeigu nerado nieko tokio iš duotosios užklausos, reišiasi jis nežino sąskaitos duomenų, arba netesingai įrašė.
{
mysql_free_result(); // paleidžiame duomenis, nes neteisingai parašė.
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Prisijungimas","Įveskite savo sąskaitos prisijungimo slaptažodį:","Tęsti","Išeiti"); // DUODAME dar šansą prisijungti, kad nereiktų jungtis į serverį iš naujo.
return SendClientMessage(playerid,SPALVA_ORANDZINE,"Sąskaitos vartotojas neatpažintas, greičiausiai slaptažodis neatitiko."); // pranašame klientui kas blogai, kodėl neprijungia jo prie sąskaitos.
}
}
else // kad išvengti "commands out of sync" klaidų naudojame šitą
{
mysql_store_result(); // kad išvengti "commands out of sync" klaidų naudojame šitą
mysql_free_result(); // kad išvengti "commands out of sync" klaidų naudojame šitą
}
}
else if(!response) // Jai paspaude išeiti, nenorėjo prisijungti.
{
Kick(playerid); // Spiriame lauk iš serverio, nenori prisijungti.
return 1;
}
return 1;
}
return 1;
}
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
return 1;
}
public OnFilterScriptInit()
public OnFilterScriptInit()
{
mysql_connect(SQL_HOST, SQL_USER,SQL_DB, SQL_PASS); // Jungiame į MYSQL
mysql_debug(1); // įjungiame debug, jis rašys visas įvykdytas bei neįvykdytas jungtis į txt failą kurį rasite serverio direktorijoje
return 1;
}
public OnFilterScriptExit()
public OnFilterScriptExit()
{
if(mysql_ping()) mysql_close(); // išjungiame jungtį kartu kai išsijungia naudojamas skriptas filterscript šiuo atviejiu.
return 1;
}
MySQLCheck()// funkcija su kuria prikelsime jungtį.
{
mysql_reconnect(); // perjungiame jungtį su MYSQL
return 1;
}
forward ConnectMySQL(); //
public ConnectMySQL()
{
if(mysql_connect(SQL_HOST,SQL_USER,SQL_DB,SQL_PASS)) // Jeigu nusiusti duomenys sugražino teigiamą rezultatą, reiškiamės prisijungėme.
{
mysql_debug(1); // // įjungiame debug, jis rašys visas įvykdytas bei neįvykdytas jungtis į txt failą kurį rasite serverio direktorijoje
printf("[MYSQL]: Connection to `%s` succesful!",SQL_DB); // parašome konsolėje, kad jungtis pavyko.
}
else // įmanoma prisijungti tik vienu atvieju, todėl visi kiti neteisingi.
{
printf("[MYSQL]: [ERROR]: Connection to `%s` failed!",SQL_DB); // serverio konsolėje parašome, kad neprisijungėme.
}
return 1;
}
Bebras prieš 8 metus
Parodyk klaidas iš mysql log'o, R5 versijoje jis vadinasi debug.txt
.
Įvedus trumpesnį tekstą nei 6 simboliai, turėtų vėl būt rodomas registracijos GUI. Kas vyksta iš tikrųjų?
Braskaz prieš 8 metus
Dėl GUI susitvarkė, nežinau kaip, bet viskas dabar čiki piki, o kaip dabar man padaryt, kad išsaugotų slaptažodį ir kitą? Nes prisijungiu/atsijungiu ir vėl reikia registruotis.
LOG:
[14:34:02] >> mysql_reconnect( Connection handle: 1 )
[14:34:02] >> mysql_reconnect() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:02] >> mysql_query( Connection handle: 1 )
[14:34:02] >> mysql_query() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:02] >> mysql_store_result( Connection handle: 1 )
[14:34:02] >> mysql_store_result() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:02] >> mysql_num_rows( Connection handle: 1 )
[14:34:02] >> mysql_num_rows() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:02] >> mysql_free_result( Connection handle: 1 )
[14:34:02] >> mysql_free_result() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:18] >> mysql_reconnect( Connection handle: 1 )
[14:34:18] >> mysql_reconnect() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
[14:34:18] >> mysql_query( Connection handle: 1 )
[14:34:18] >> mysql_query() - Invalid connection handle. (You set: 1, Highest connection handle ID is 0).
Bebras prieš 8 metus
Panašu kad nepavyksta prisijungt prie duomenų bazės. Kur visas log'as? T.y. kur mysql_connect
?
Braskaz prieš 8 metus
Čia logai kai įeinu į serverį, suvedu 6 simbolių slaptažodį, paspaudžiu spawn, iš naujo prisijungiu į serverį ir vėl užsiregistruoju, daugiau nieko nemeta: http://pastebin.com/rHiXfZUP
Bebras prieš 8 metus
O kai tik įjungi serverį ką rašo? Apskritai, tavo kode yra mysql_connect
eilutė?
Braskaz prieš 8 metus
public OnFilterScriptInit() manau dėl šito visa bėda ir kai public OnFilterScriptInitExit(), nes mysql logus turėjau pats įsijungti, o vat tarp šito kodo yra įjungimas, bet jis neveikia, gal čia dėl šito?
Braskaz prieš 8 metus Atsakymas
Perkėliau abu į OnGameModeInit() / public OnGameModeExit() ir veikia, ačiū už pagalbą ! :)