U ovom tutorialu ce se spremati sljedece:
Ime
Lozinka
IP address
Level
Novci
Admin Level
Pocnimo
Definiramo variable i funkcije
#include
#include
/* ** Colours ** */
#define COL_GREEN "{6EF83C}" // Zelebna boja
#define COL_RED "{F81414}" // Crvena boja
#define COL_BLUE "{00C0FF}" // Plava boja
/* ** Player Data ** */
new
Bit1: g_PlayerLogged ,
Bit16: g_AdminLevel ,
DB: Database
; Trebat cemo sve ovo ispod, pa zaljepite nekamo u skriptu
stock DB_Escape(text[])
{
new
ret[80 * 2],
ch,
i,
j;
while ((ch = text[i++]) && j < sizeof (ret))
{
if (ch == '\'')
{
if (j < sizeof (ret) - 2)
{
ret[j++] = '\'';
ret[j++] = '\'';
}
}
else if (j < sizeof (ret))
{
ret[j++] = ch;
}
else
{
j++;
}
}
ret[sizeof (ret) - 1] = '\0';
return ret;
}Trebat cete ove funkcije da mozete pratiti tutorial
Stvaranje i otvaranje database
public OnFilterScriptInit()
{
Database = db_open("ServerDatabase.db"); // Ovo ce otvoriti databasu pod imenom , 'ServerDatabase.db'
//Ako tablica ne postoji, naparvit cemo ju u gamemodu
db_query(Database, "CREATE TABLE IF NOT EXISTS `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`, `CASH`, `ADMINLEVEL`)");
return 1;
}Kada ce se server pokrenuti napravit ce databasu sam, procedura je:
Otvaranje database > pisanej u databasu > zatvaranje database
Evo zasto je SQLite zanimljiv, skoro sve radi umjesto vas!
Zato provjerite dal imate ovo u gamemodu
POZOR
Provjerite dal ste zatovirli databasu, ako niste nesto bi moglo poci krivo, zato napravvite ovako
public OnFilterScriptExit()
{
for(new i; i != MAX_PLAYERS; i++) OnPlayerDisconnect(i, 1);
db_close(Database);
return 1;
}Otvaranje database "rucno"
Da ovo korisitite trebat ce vam SQLite database opener.SQLite Database Browser cu ja koristiti tako da i vama preporucujem, skinete ga tako da u google napisete SQLite Database Browser 2.0 b1 download"
Ako igrac nije ili je registriran
public OnPlayerConnect(playerid)
{
new
Query[ 150 ], // napravi Query
DBResult: Result, // Napravi database Result
name[ MAX_PLAYER_NAME ] //napravi a name string
;
GetPlayerName(playerid, name, sizeof(name)); // Dobivanje igracevog imena.
Bit1_Set(g_PlayerLogged, playerid, false); // mi cemo resetirati varijablu na 0 = false.
// sada cemo odabrati od `USERS` gdje ce naci ime korisnika.
format(Query, sizeof(Query), "SELECT `NAME` FROM `USERS` WHERE `NAME` = '%s'", DB_Escape(name));
// ubacit cemo query u db rezultat. Query ce napraviti sve sta kaze
Result = db_query(Database, Query);
// ako su num rows tamo, to znaci da je registiran
if(db_num_rows(Result))
{
// salje dobrodosli poruku
format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste registrirani\n\nMolimo vas da se logirate s vasom lozinkom.", name, playerid);
// Pokazuje dialog (login)
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Login", "Leave");
}
else // Else ako nije registiran
{
// salje dobrodosli poruku
format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi "COL_RED"niste{FFFFFF} registrirani\n\n napisite vasu lozinku da vas mozemo registrirati.", name, playerid);
// Pokazuje dialog registriranje
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Register", "Leave");
}
db_free_result(Result);
return 1;
}Ovaj dolje kod je povezan s ovim gore, tako da ga morate imati u skripti
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new
Query[ 256 ], // Radi array . No lies :X
DBResult: Result, // Radi database Result
name[ MAX_PLAYER_NAME ], // Radi name string
ip[ 16 ] // Radi IP string
;
GetPlayerName(playerid, name, sizeof(name)); // Dobivamo ime igraca
GetPlayerIp(playerid, ip, sizeof(ip));
if(dialogid == 1) // To je id dialoga koji smo gore dodali
{
if(response) // Pokrece se ako je igrac odabrao Login
{
// ako unutra nađemo NAME ako lozinka pripada igracevom imenu onda
format(Query, sizeof(Query), "SELECT * FROM `USERS` WHERE `NAME` = '%s' AND `PASSWORD` = '%s'", DB_Escape(name), DB_Escape(inputtext));
// sprema ^ sta je u database bazi
Result = db_query(Database, Query);
// ako su podaci nadjeni onda korisnik postoji, uradimo ovo dolje
if(db_num_rows(Result))
{
new Field[ 20 ]; //Izrada polja za preuzimanje podataka
// dobivamo polje "SCORE"'s i stavimo u polje
db_get_field_assoc(Result, "SCORE", Field, 30);
// stavljamo igracev Lvl
SetPlayerScore(playerid, strval(Field));
// strval pretvara string u broj
// Sad cemo raditi sve isto za ostalo
// dobivamo polje "CASH"
db_get_field_assoc(Result, "CASH", Field, 30);
// dajemo igracu onoliko novca kolko je imao
GivePlayerMoney(playerid, strval(Field));
// dobivamo polje "ADMINLEVEL"
db_get_field_assoc(Result, "ADMINLEVEL", Field, 30);
// Stavljamo igracu lvl admina koji je bio
Bit16_Set(g_AdminLevel, playerid, strval(Field));
// logiranje
Bit1_Set(g_PlayerLogged, playerid, true);
// SSalje poruku
SendClientMessage(playerid, -1, "Vi ste "COL_GREEN"uspjesno{FFFFFF} logirani! ");
}
else // Ako je lozinka krivo napisana
{
// salje poruku
format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste registirani\n\nLogirajte se s vasom lozinkom.", name, playerid);
// prikazuje dialog
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Login", "Leave");
// Pokazuje igracu da je kriva lozinka
SendClientMessage(playerid, -1, ""COL_RED"Kriva{FFFFFF} lozinka, pokusaj ponovo!");
}
db_free_result(Result);
}
else return Kick(playerid); // Kicka igraca ako je odabrao leave
}
if(dialogid == 0) // id od dialoga
{
if(response) // radi ako je igrac odabrao register
{
//provjerava dali je lozinka najmanje duga 3 slova/brojeva
if(strlen(inputtext) > 24 || strlen(inputtext) < 3)
{
// salje poruku
format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste "COL_RED"not{FFFFFF} registrirani\n\nNapisite vasu lozinku.", name, playerid);
// Pokazuje opet dialog
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Register", "Leave");
// Pokazuje ako je lozinka najmanje duga 3 slova/brojka
SendClientMessage(playerid, -1, "Vasa lozinka mora imati najmanje 3 slova/brojka");
}
else
{
// Ubacuje sve u databasu pri registriranju
format(Query, sizeof(Query), "INSERT INTO `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`, `CASH`, `ADMINLEVEL`) VALUES('%s','%s','%s', '0', '500', '0')", DB_Escape(name), DB_Escape(inputtext), DB_Escape(ip));
// Querying the formatted Query ^
db_query(Database, Query);
// logiranje
Bit1_Set(g_PlayerLogged, playerid, true);
GivePlayerMoney(playerid, 500); // Give Player the money.
// resetira lvl
SetPlayerScore(playerid, 0);
// salje poruku
SendClientMessage(playerid, -1, "Vi ste "COL_GREEN"uspjesno{FFFFFF} registirani! automatski ste registrirani!");
}
}
else return Kick(playerid); // Kicka ako je igrac odabrao leave
}
return 1;
}Posljednji korak, spremanje podataka!
public OnPlayerDisconnect(playerid, reason)
{
new
Query[ 200 ],
name[ MAX_PLAYER_NAME ] // radi name string
;
GetPlayerName(playerid, name, sizeof(name)); // dobivamo ime igraca
if(Bit1_Get(g_PlayerLogged, playerid) == 1)
{
//ovo ce updatovati vase podatke s najnovijim
format(Query,sizeof(Query),"UPDATE `USERS` SET SCORE = '%d', CASH = '%d', ADMINLEVEL = '%d' WHERE `NAME` = '%s'",
GetPlayerScore(playerid), // Dobivamo LVL igraca
GetPlayerMoney(playerid), // Dobivamo igracev novac
Bit16_Get(g_AdminLevel, playerid), // Dobivamo admin lvl
DB_Escape(name)); // Dobivamo igracevo ime
db_query(Database, Query);
// resetirat cemo ovaj array na 0, = false.
Bit1_Set(g_PlayerLogged, playerid, false);
}
return 1;
}Evo napokon smo gotovi!
Provjerite dal imate sve kao u tutorialu.
Ako ima bugova javite u komentar da popravimo!
Preveo i editirao Don_Sergio
Napravio Lorenc_
Hvala svima na citanju
