Guest Rock Posted February 9, 2013 Posted February 9, 2013 In acest topic vei vedea o documentare completa despre sistem-ul BUD. [ Blazing User Database ]1. Inceputul. Creearea bazei de date si coloanelor2. Adaugarea si extragerea datelor din baza de date2: Extragerea si setarea datelor DIRECT din/in baza de dateFunctiile care le voi explica: BUD::Setting( setting[], value )bool BUD::Initialize( )bool BUD::Exit( ) BUD::VerifyColumn( column[], type[, default value ] )bool BUD::IsNameRegistered( name[] )bool BUD::RegisterName( name[], password[] ) BUD::UnregisterName( name[] )bool BUD::CheckAuth( name[], password[] ) BUD::GetNameUID( name[] )Float BUD::GetFloatEntry( uid, entry[] ) BUD::GetIntEntry( uid, entry[] ) BUD::GetStringEntry( uid, entry[], &value[][, size ] )bool BUD::MultiGet( uid, type definitions, ( entry, &variable )... )bool BUD::MultiSet( uid, type definitions, ( entry, value )... )bool BUD::SetIntEntry( uid, entry[], value )bool BUD::SetFloatEntry( uid, entry[], Float:value )bool BUD::SetStringEntry( uid, entry[], value[][, size ] )Inainte sa includem BUD trebuie sa avem asta.#define BUD_USE_WHIRLPOOL false // false - daca nu folosim pluginul WHIRLPOOL si true daca il folosim#define BUD_MAX_COLUMNS 10 // 10 - numarul maxim al columnelor care vor fi permise in baza de dateDupa ce am definit asta putem include BUD.#include < BUD >Acum ca am inclus BUD si avem cateva setari putem sa ne apucam de treaba.Ne ducem la callback-ul OnGameModeInit(daca este gm) sau OnFilterScriptInit(daca este fs), eu voi face un fs.public OnFilterScriptInit( ){}Intre acolade adaugam setarile:BUD::Setting( opt.Database, "Users.db" ); // Aici adaugam numele bazei de date care vrem sa o creem.BUD::Setting( opt.Asynchronous, true ); // daca este "true" va fi mai rapid dar in caz ca ai o pana de curent baza de date e posibil sa se corupaBUD::Setting( opt.KeepAliveTime, 3000 ); // Baza de date va ramane pornita pentru 3000 ms dupa ce va fii folosita, functia este folosita pentru performantaBUD::Setting( opt.CheckForUpdates, true ); // Numele spune totul, verifica daca sunt disponibile update-uri noi.Dupa setari initializam baza de date.ATENTIE: Asta trebuie facut inainte sa folosim alte functii ale bazei de date.BUD::Initialize( );Asta adaugam sub celelalte setari.Dupa ce am facut setarile putem incepe sa adaugam coloanele.BUD::VerifyColumn( "Money", BUD::TYPE_NUMBER );Money - Numele coloanei.BUD::TYPE:TYPE_NUMBER: Numere (1,2,3, 34343)TYPE_STRING: String(bla, test, rock)TYPE_FLOAT : Float(2.0, 3.2, 34.33)TYPE_BINARY: Inca nu este suportat, va aparea in urmatoare versiuneParametrii optionali la VerifyColumn:BUD::VerifyColumn( "Money", BUD::TYPE_NUMBER, 50 ); // 50 - parametrul optional, acesta va adauga la inceput valoarea 50 coloanei "Money"Dupa ce am terminat cu setarile si creearea coloanelor vom inchide baza de date la OnFilterScriptExit sau OnGameModeExit folosind functia:BUD::Exit( );La sfarsit scriptul ar trebuii sa arate exact asa:#include < a_samp >#define BUD_USE_WHIRLPOOL false#define BUD_MAX_COLUMNS 10#include < BUD >public OnFilterScriptInit( ){ BUD::Setting( opt.Database, "Users.db" ); BUD::Setting( opt.Asynchronous, true ); BUD::Setting( opt.KeepAliveTime, 3000 ); BUD::Setting( opt.CheckForUpdates, true ); BUD::Initialize( ); BUD::VerifyColumn( "Money", BUD::TYPE_NUMBER ); // Cu parametrul optional BUD::VerifyColumn( "Money", BUD::TYPE_NUMBER, 50 ); BUD::VerifyColumn( "Rank", BUD::TYPE_STRING, "Newbie" ); BUD::VerifyColumn( "Health", BUD::TYPE_FLOAT, 100.00 );}public OnFilterScriptExit( ){ BUD::Exit( );}PS:Cu timpul voi adauga mai multe detalii deoarece nu am timp sa scriu totul odata.
Massari Posted February 9, 2013 Posted February 9, 2013 Super tutorialu. Mia fost de folos5/5.PS. Daca toti ar face tutoriale ca si tine... rimmon curv.
[RMS]Yakuza Posted February 9, 2013 Posted February 9, 2013 Tare ..Bravo "prietene" ))5/5 Scriptez for $$, Detalii,add sampofficial.
Guest Rock Posted February 11, 2013 Posted February 11, 2013 Acum trecem la partea a doua a tutorialului.In partea asta vom invatata:- Cum sa verificam daca player-ul are cont pe server si daca nu sa ii creem.- Cum sa salvam scorul, banii, rank-ul, orele si restul.Incepem cu verificarea:Inainte sa incepem avem nevoie de urmatoarea functie in script-ul nostru.stock GetName( playerid ){ new _RocKzSk[ MAX_PLAYER_NAME ]; GetPlayerName( playerid, _RocKzSk, sizeof _RocKzSk ); return ( _RocKzSk );}Daca o ai deja este perfect iar daca nu o poti adauga acum.Mai departe ne ducem la callback-ul OnPlayerConnect si adaugam sub el:if( !BUD::IsNameRegistered( GetName( playerid ) ) ){ // Code pentru register}Aceasta functie verifica daca player-ul care tocmai s-a conectat nu are cont pe server.Sub aceasta functie putem adauga un dialog in care putem cere player-ului sa isi faca un cont.(Vei vedea exemplu la sfarsitul postului)Mergem mai departe, in caz ca player-ul are deja cont pe server vom adauga:else{ // Code pentru login}Chiar sub codul de mai devreme.Asta este un exemplu cum ar trebuii sa arate:new _rK[ 128 ];if( !BUD::IsNameRegistered( GetName( playerid ) ) ){ format( _rK, sizeof( _rK ), "Bine ai venit %s\nAi nevoie de unde cont ca sa poti juca pe server.", GetName( playerid ) ); ShowPlayerDialog( playerid, Register_D1, DIALOG_STYLE_MSGBOX, "Cont nou", _rK, "Register", "Kick" );}else{ format( _rK, sizeof( _rK ), "Welcome %s\nAcest cont este deja inregistrat\nLogheaza-te Acum!", GetName( playerid ) ); ShowPlayerDialog( playerid, Login_D1, DIALOG_STYLE_MSGBOX, "Logheaza-te", _rK, "Login", "Kick" );}IMPORTANT:Cand faceti dialog de register trebuie sa adaugati:if ( BUD::RegisterName( GetName( playerid ), inputtext ) ){ // Code pentru register}Pentru a inregistra numele player-ului in baza de date.Intre acoladele acelei functii adaugamnew iUID = BUD::GetNameUID( GetName( playerid ) );BUD::MultiSet( iUID, "s", "Password", inputtext );Pentru a salva si parola userului in baza de date.Restul dialogului vi-l faceti voi pentru ca eu nu explic cum faceti un register/login.Salvare score, bani, rank..etc:Pentru a incepe salvarea ne ducem la OnPlayerDisconnect si adaugam urmatoarea:new iUID = BUD::GetNameUID( GetName( playerid ) );Aceasta functie va lua lua din data de baze id-ul unic al player-ului. (In baza de date fiecare player este salvat cu un iUID unic, ex: 1, 2, 3, 4..)Sub definitia iUID adaugam:BUD::MultiSet( iUID, "iisi", "Money", ROCK_PDATA[ playerid ][ rK_CASH ], "Score", ROCK_PDATA[ playerid ][ rK_SCORE ], "Rank", ROCK_PDATA[ playerid ][ rK_Rank ], "Level", ROCK_PDATA[ playerid][ rK_Level]);Vedem aici ca in loc de "playerid" am folosit iUID.Acea functie salveaza valoarea variabilelor in baza de date.Daca stii cum functioneaza sscanf iti poti da seama ca "ii" este pentru integrer si sunt 2 deoarece avem doua variabile care stocheaza si salveaza un integrer. In caz ca avem string pune "s" si tot asa. (La MultiSet cand folosim un string nu trebuie sa ii punem marimea, ex: "s[30]")ATENTIE:Numele care il puneti cand salvati trebuie sa fie acelasi cu numele coloanelor care le-ati creeat cu VerifyColumn.Extragerea datelor din baza de date:Asta vom pune la OnDialogResponse si anume la dialog-ul cu login sa verificam daca parola introdusa este corecta.if( BUD::CheckAuth( GetName( playerid ), inputtext ) {}inputtext - textul pe care player-ul la introdus in casuta "login" din dialog. (DIALOG_STYLE_INPUT)In caz ca parola salvata in baza de date este aceeasi cu parola introdusa de player trecem mai departe.Definim urmatoarele in interiorul acoladelor de la CheckAuth:new _Money, _Score, _Rank, _Level, iUID = BUD::GetNameUID( GetName( playerid ) );Dupa adaugam urmatoarea functie pentru extragerea datelor.BUD::MultiGet( iUID, "iis[20]i", "Money", _Money, "Score", _Score, "Rank" , _Rank, "Level", _Level);ATENTIE:La MultiGet daca folosim un string ("s") trebuie sa ii adaugam marimea exact ca in exemplu.Acum sa setam valoarea datelor extrase cu MultiGet variabilelor care le avem in script.Pentru asta imediat sub MultiGet adaugam asta sau depinde de caz:ROCK_PDATA[ playerid ][ rK_SCORE ] = _Score;ROCK_PDATA[ playerid ][ rK_CASH ] = _Money;ROCK_PDATA[ playerid ][ rK_Rank ] = _Rank;ROCK_PDATA[ playerid ][ rK_Level ] = _Level;Acum ca am facut asta totul este gata.Un mic exemplu cum ar trebuii sa arate scriptulPentru a intelege mult mai bine cum functioneaza uitate la topicul ASTA.Urmeaza zilele astea urmatoarea parte.
xxSPEEDYxx Posted February 18, 2013 Posted February 18, 2013 Nu as avea rabdarea sa scriu fiecare "sizeof" sau if, si alte fiecare cu culoarea specifica )Good tutorial ... sincer sa fiu, BUD nu cred (din cate stiu) sa fie mai rapid decat SQLite default, deci daca as alege, as alege SQLite normal :D Fara reclama in semnatura!
Guest Rock Posted February 18, 2013 Posted February 18, 2013 Nu as avea rabdarea sa scriu fiecare "sizeof" sau if, si alte fiecare cu culoarea specifica )Imi place sa arate postul frumos.(Am mostenit asta de la Zh3r0)sincer sa fiu, BUD nu cred (din cate stiu) sa fie mai rapid decat SQLite default, deci daca as alege, as alege SQLite normal Asta chiar nu stiu.Eu folosesc pentru ca mi se pare mult mai comod, arata mult mai bine si are si tot ce trebuie.
Gireada Posted February 26, 2013 Posted February 26, 2013 Foarte folositor tutorialul. Bravo rock continua tot asa
Guest Rock Posted February 26, 2013 Posted February 26, 2013 Partea a treia care este si ultima parte.In partea asta vom invata:- cum sa extragem variabilele de tip string, integrer si float direct din baza de date si cum sa modificam aceste variabile.Incepem cu extragerea string-ului:BUD::GetStringEntry( uid, entry[ ], &value[ ][, size ] )O sa ne ajute sa facem asta.Parametrii:uid - Id-ul unic din baza de date despre care am vorbit in primul tutorialentry[ ] - Numele coloanei din baza de date din care vrem sa extragem string-ulvalue[ ][, size ] - String-ul in care stocam ce am extras din coloana aleasa.Un mic exemplu cum ar trebuii sa faceti:new rTest[ 30 ], iUID = BUD::GetNameUID( GetName( playerid ) );BUD::GetStringEntry( iUID, "Rank", rTest );printf( "%s", rTest );Setare valoare string:BUD::SetStringEntry( uid, entry[ ], value[ ][, size ] )Parametrii sunt aceeasi ca la GetStringEntry si vom folosii functia unde vrem noi exact asa:BUD::SetStringEntry( iUID, "Rank", "Newbie" ); // "Newbie" fiind valoarea setata Extragere valoare integrer:BUD::GetIntEntry( uid, entry[ ] )Aici este mult mai usor ca la string, se face simplu asa:new rTest[ 50 ], iUID = BUD::GetNameUID( GetName( playerid ) );format( rTest, 50, "Val: %i", BUD::GetIntEntry( iUID, "Money" ) );printf( "%i", rTest );Setare valoare integrer:BUD::SetIntEntry( uid, entry[ ], value )Se facel lafel de usor ca la GetIntEntry:BUD::SetIntEntry( iUID, "Money", 50 ); // 50 fiind valoarea care vrem sa o adaugamExtragere valoare float:BUD::GetFloatEntry( uid, entry[ ] )Simplu si folositornew rTest[ 50 ], iUID = BUD::GetNameUID( GetName( playerid ) );format( rTest, 50, "Val: %f", BUD::GetFloatEntry( iUID, "Health" );printf( "%f", rTest );Setare valoare float:BUD::SetFloatEntry( uid, entry[ ], Float:value )Lafel ca la Integrer se foloseste asa:BUD::SetFloatEntry( iUID, "Health", 100.00 ) // 100.00 este valoarea care tocmai am adaugato coloaneiSfarsit de tutorial!- Daca ati ajuns pana aici citind fiecare parte si fiecare cuvant sunteti gata sa va creeati propriul system de register/login.- Precizez! Folosind functiile SetStringEntry, SetIntEntry si SetFloatEntry, orice valoare avea inainte coloana aleasa va fii inlocuita cu valoare adaugata de tine.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now