mantasxx2

(Pamoka) Gamemodo surisimas su MySqL

Recommended Posts

Šioje pamokoje galėsite susipažinti su MySQL duomenų baze,bei jos privalumais, taip pat galėsite išmokti surišti gamemod'ą su MySQL.

Visų pirma jeigu nesate naudoją MySQL, turėsite padaryti tai kas nurodyta pirmame punkte, jeigu esate susipažinę su MySQL eikite iš karto prie 2 punkto.

1. Norėdami naudoti MySQL turite turėti visus failus reikalingus, kad MySQL veiktų.

Pirmiausia siūlyčiau parsisiųsti programą WAMP. Ši programa leidžia jums savo kompiuteryje naudoti PHPMyAdmin kuriame ir yra jūsų duomenų bazė. Parsisiuntę programą ir ją įdiegę, paleiskite start WampServer. Tada apačioje meniu juostoje dešiniame kampe atsiras WAMP ženkliukas, paspauskite ant jo kairiuojiu pelės klavišu ir spustelkite Start All Services. Na štai ir paleidote WAMP, išbandyti galite savo naršyklėje suvedę adresą localhost. Dabar mums reikės mysql plugino kurį galite parsisiųsti štai čia

http://www.failai.lt/wj61j3m9fgw1/plugin-R4-win32_vs9.rar.htm - Windows xp

http://www.failai.lt/z8dmrowjk7ns/plugin-R4-win32_vs10.rar.htm - Windows 7, Windows Vista.

Dabar jūsų naudojamoje serverio direktorijoje įkelsime failus:


  • Sukuriame serverio direktorijoje papkę su pavadinimu plugins. IÅ¡ čia skaitomi papildomi pluginai serveriui.
    Keliame libmySQL.dll į plugins direktoriją.
    Keliame mysql.dll į plugins direktoriją. Pagrindinis mysql plugino failas, kurį įrašysime server.cfg nuskaitymui.
    Keliame a_mysql.inc į pawno/includes direktoriją. Iš jo pawno programa nuskaitys funkcijas, jeigu neįkeltumėte nesuprastų mysql funkcijų.

Dabar turime nurodyti serveriui naudoti pluginą, tai padarome atsidarę serverio server.cfg failą ir jo gale įrašome plugins mysql. Išsaugome failą bei jį uždarome, kad įsigaliotų pakeitimai.

Liko vienas darbas iki skripto rašymo. Sukurti mysql lenteles kurias naudosime:


  • Sukurkite lentelę: "vartotojai" ir sukurkite tokias eilutes:


    • ID,Vardas,Slaptazodis,Pinigai.

2. Viskas ką dabar darysime yra labai svarbu, nepraleiskite nei vieno etapo, nes MySQL gali neveikti! Pasileidžiame savo gamemod'ą.

Skripto viršuje įsirašome kokias naudosime includes, kad nuskaitytų funkcijas kurias naudosime.

#include // Pagrindinės pawn skriptinimo funkcijos (default)

#include // MYSQL plugino include

Dabar surašykime bindus, kad nereiktų kas kartą rašinėti prisijungimo duomenų bei spalvų kodų.

#define SQL_HOST "localhost" // Priėjimas iki MYSQL duomenų bazės, jeigu naudojate localhost įrašykite "localhost"

#define SQL_USER "root" // MYSQL duomenų bazės vartotojas, jeigu naudojate localhost įrašykite "root"

#define SQL_PASS "" // slaptažodis, jeigu naudojate localhost, dažniausiai jis būna be slaptažodžio, tada palikite ""

#define SQL_DB "duombaze" // Jūsų duomenų bazės pavadinimas per kurį jungsimės.

#define TABLENAME "vartotojai" // Kad nereiktų rašinėti kas kartą lentelės, pasidarome bindą. Čia įrašykite savo lentelės pavadinimą.

//colors // spalvos

#define SPALVA_ORANDZINE 0xff9b39ff // orandžinė spalva, naudojana visoje registracijoje.

// colors end // spalvų pabaiga

Jeigu naudojate localhost ir nieko nesate jame keitę tereiks pakeisti SQL_DB į jūsų turimą arba savo MYSQL duombazėje sukurti duomenų bazę pavadinimu: "duombaze" ir nieko nekeisti čia.

Sukuriame kintamuosius kurios naudosime skripte:

// Variables // Kintamieji

new bool:Logged[MAX_PLAYERS]; // sukuriame naują kintamajį, jis tikrins ar žaidėjas prisijungęs.

new PlayerMoney[MAX_PLAYERS]; // kintamasis kurį naudosime žaidėjo pinigams sureguliuoti.

// Variables end // Kintamūjų pabaiga

Priklausomai nuo to kaip skriptą rašote įsidėkite šias funkcijas:

public OnFilterScriptInit()

{

print("\n--------------------------------------"); // Kreditai, netriname.

print(" MYSQL registracijos filterscript by Сarlo. @ supergames.lt"); // Kreditai, paliekame.

print("--------------------------------------\n"); // Kreditai, netriname.

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;

}

Aš skriptą rašau, kaip filterscript todėl naudoju OnFilterScriptInit.

Taip, pat nurodome kas bus išjungiant skriptą irgi priklausomai nuo ką rašote ar filterscript ar gamemode . Aš rašau filterscript todėl:

public OnFilterScriptExit()

{

if(mysql_ping()) mysql_close(); // išjungiame jungtį kartu kai išsijungia naudojamas skriptas filterscript šiuo atviejiu.

return 1;

}

Dabar įdėsime vieną funkciją bet kur skripte su kuria atnaujinsime jungtį su mysql.:

MySQLCheck()// funkcija su kuria prikelsime jungtį.

{

mysql_reconnect(); // perjungiame jungtį su MYSQL

return 1;

}

Sekantį skriptą dėkite taip pat bet kur skripte, su juo jungsimės į mysql ir pranešime rezultatą:

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;

}

Nustatysime tikrinimą, kad neprisijungus neleistų jungtis į žaidimą:

public OnPlayerRequestClass(playerid, classid)

{

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;

}

Dabar nustatykime viską kai žaidėjas prisijungs, patikrinkime viską ką jis turi ir ko jam reikia:

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;

}

Kai žaidėjas atsijungs taip pat turime kažką daryti, o gi ką? Išsaugoti visus jo turimus duomenis (kuriuos aš pasirinkau saugoti - pinigus)

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;

}

Ir štai prieš tai nurodytuose DIALOG languose surašome atsakymus:

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[128], 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;

}

Na štai kaip ir viskas, tikiuosi padėjau, aš viską rašiau kaip FS (filterscript'ą), todėl jeigu dedat prie gamemodo tai atsiminkit!

Pamoką ne mano kure Carlo.

Redaguota , nario Admin_Mantass
  • Teigiamai 5
  • Neigiamai 1

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Nematot?

print("\n--------------------------------------"); // Kreditai, netriname.

print(" MYSQL registracijos filterscript by Сarlo. @ supergames.lt"); // Kreditai, paliekame.

print("--------------------------------------\n"); // Kreditai, netriname.

Pamoką ne mano kure Carlo.

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
Svečias
Ši tema yra užrakinta.

  • Å iame puslapyje narÅ¡o:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.


  • SuperGames programele
  • SuperGames programele