7 rezultate gasite pentru define
- la data de 3/1/2021, 00:20
- Cauta in: Scripturi SA:MP
- Subiect: Samp Voice Plugin (Versiunea noua)
- Raspunsuri: 0
- Vizualizari: 238
Samp Voice Plugin (Versiunea noua)
[size=36]Samp Voice Plugin[/size]
SVP
[ltr]Salutare, aceasta este noua versiune de samp voice, varianta cea veche postata de mine fiind inactiva, din nou, este doar un plugin imprumutat de la rusi, si netestat, succes la implementat [/ltr]
[size=18]TUTORIAL DE INSTALARE[/size]
[size=18] Pentru inceput deschideti server.cfg si adaugati pe linia plugins urmatorul lucru:[/size]
[size=18]Mai apoi trebuie sa adaugati include-ul in gamemode:[/size]
Apoi avem urmatoarele definitii
Adaugam urmatoarele variabile
Adaugam acest cod in OnGamemodeInit
[size=15]Adaugam acest cod in OnGamemodeExit
[/size]
[size=15]Adaugam asta la OnPlayerConnect
[/size]
[size=13] Quote
#if defined _sampvoice_included
if (SvGetVersion(playerid) == SV_NULL) {
SendClientMessage(playerid, -1, "Не удалось обнаружить плагин sampvoice");
} else if (SvHasMicro(playerid) == SV_FALSE) {
SendClientMessage(playerid, -1, "Не удалось обнаружить микрофон");
} else {
if (gstream != SV_NULL) {
SvAttachListenerToStream(gstream, playerid);
SvAddKey(playerid, SV_KEY_B);
}
if ((lstream[playerid] = SvCreateDLStreamAtPlayer(40.0, SV_INFINITY, playerid, 0x00FFFFFF, "Local")) != SV_NULL)
{
SvAddKey(playerid, SV_KEY_Z);
}
}
#endif
[/size]Extinde
[size=15]Iar apoi acest cod la finalul gamemode ului[/size]
[size=15][/size]
LINK DOWNLOAD:[download=https://github.com/CyberMor/sampvoice/releases/download/v3.1/sv_server_037.zipd/v3.1/sv_server_037.zip]
- la data de 8/8/2020, 18:48
- Cauta in: Tutoriale
- Subiect: Optimizare, simplitate şi stil
- Raspunsuri: 2
- Vizualizari: 437
Optimizare, simplitate şi stil
OPTIMIZÁRE, optimizări, s. f. 1. Alegerea și aplicarea soluției (economice) optime (dintre mai multe posibile). 2. (Mat.) Raționament sau calcul care permite găsirea valorilor unuia sau mai multor parametri corespunzând maximului unei funcții. – Cf. fr. optimiser, optimisation.In sa-mp optimizarea este procesul prin care faci un cod sa fie mai rapid la executare.
Am facut niste teste:
1) Variabila normala este mai rapida decat array.
Sa zicem ca avem nevoie de 3 variabile de pozitie pentru GetPlayerPos, sunt 2 cazuri:
fie definim un array: new Float:Pos[3]; GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
fie definim 3 variabile: new Float:PosX, Float:PosY, Float:PosZ; GetPlayerPos(playerid, PosX, PosY, PosZ);
La prima vedere, e mai simplu sa ne folosim de array(cel putin asa am crezut eu), un mic test pe care l-am facut foarte recent legat de viteza array si viteza variabilei normale este:
[21:32:49] Speed Test NORMAL VARIABLE 31550
[21:34:07] Speed Test ARRAY TEST 77967
[21:34:31] Speed Test NORMAL VARIABLE 24034
[21:35:11] Speed Test ARRAY TEST 39904
[21:35:35] Speed Test NORMAL VARIABLE 24056
[21:36:15] Speed Test ARRAY TEST 39867
[21:36:39] Speed Test NORMAL VARIABLE 24163
[21:37:14] Speed Test ARRAY TEST 35011
[21:37:36] Speed Test NORMAL VARIABLE 22375
[21:38:13] Speed Test ARRAY TEST 36687
Concluzie: Array este mai lent decat variabila normala.
2) SWITCH este mai rapid decat if(ceva = altceva)
O sa dau cateva exemple:
Sa presupunem ca avem nevoie sa ne folosim de OnDialogResponse:
enum
{
Dialog1,
Dialog2
};
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
return 1;
}
putem accesa cele 2 dialoguri in felul urmator:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == Dialog1)
{
}
if(dialogid == Dialog2)
{
}
return 1;
}
sau
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case Dialog1:
{
}
case Dialog2:
{
}
}
return 1;
}
putem accesa in acest fel si lista dialogurilor de la tipul: DIALOG_STYLE_LIST
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case Dialog1:
{
switch(listitem)
{
}
}
case Dialog2:
{
switch(listitem)
{
}
}
}
return 1;
}
tot in acest fel putem accesa si butonul selectat:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case Dialog1:
{
switch(response)
{
switch(listitem)
{
}
}
}
case Dialog2:
{
switch(response)
{
switch(listitem)
{
}
}
}
}
return 1;
}
Nu doar OnDialogResponse poate fi accesat asa:
varianta 1:
forward Functie(parametru, tip)
public Functie(parametru, tip)
{
if(tip == ceva)
{
}
if(tip == ceva2)
{
}
return 1;
}
varianta 2:
forward Functie(parametru, tip)
public Functie(parametru, tip)
{
switch(tip)
{
}
return 1;
}
Am testat diferenta intre switch si if(ceva == altceva)
Rezultatele testelor mele sunt:
[21:59:24] Speed Test if(i = ceva) 7713
[21:59:27] Speed Test switch 2537
[21:59:34] Speed Test if(i = ceva) 7475
[21:59:37] Speed Test switch 2430
[21:59:44] Speed Test if(i = ceva) 7471
[21:59:47] Speed Test switch 2431
[21:59:54] Speed Test if(i = ceva) 7558
[21:59:57] Speed Test switch 2423
[22:00:05] Speed Test if(i = ceva) 8645
[22:00:09] Speed Test switch 3683
CONCLUZIE: SWITCH ESTE MAI RAPID DECAT IF(CEVA == ALTCEVA)
3)SetPVarInt vs variabila normala
Am vorbit cu stuntman candva si imi spuse ca poti optimiza scriptul cu SetPVarInt/GetPVarInt
Am testat si teoria lui, iar rezultatul testelor mi-a dat:
[22:17:11] SetPVarInt TEST : 4743
[22:17:15] normal variabile TEST : 4119
[22:17:19] SetPVarInt TEST : 4078
[22:17:22] normal variabile TEST : 3282
[22:17:26] SetPVarInt TEST : 3937
[22:17:29] normal variabile TEST : 3065
[22:17:33] SetPVarInt TEST : 3643
[22:17:36] normal variabile TEST : 2869
[22:17:40] SetPVarInt TEST : 4734
[22:17:44] normal variabile TEST : 3464
[22:17:47] SetPVarInt TEST : 3545
[22:17:50] normal variabile TEST : 2708
[22:17:55] SetPVarInt TEST : 4792
[22:17:59] normal variabile TEST : 4543
Am testat si marimea fisierului, iar SetPVarInt stocheaza mai multa memorie decat variabila definita cu new.
4)ENUM VS [Trebuie sa fiti inscris si conectat pentru a vedea acest link]
Am testat si cele 2 functii ale limbajului pawn:
[23:11:19] Timp scurs(enum): 2086
[23:11:21] Timp scurs(define): 1808
[23:11:23] Timp scurs(enum): 2050
[23:11:25] Timp scurs(define): 1937
[23:11:27] Timp scurs(enum): 1953
[23:11:29] Timp scurs(define): 1868
[23:11:31] Timp scurs(enum): 2034
[23:11:33] Timp scurs(define): 1837
[23:11:35] Timp scurs(enum): 2150
[23:11:37] Timp scurs(define): 1937
Desi define este mai rapid putin decat enum, recomandat pentru dialoguri este enum pentru a nu se incurca dialogurile intre ele.
5)Diferenta intre small si large array
Am testat si diferentele intre 2 array-uri, unul de 2000 si unul de 200:
new array[2000]; vs new array[200];
Timpul de executie pentru cele 2 array-uri:
[23:14:50] Timp scurs(array large): 3254
[23:14:51] Timp scurs(array small): 616
[23:14:54] Timp scurs(array large): 3469
[23:14:55] Timp scurs(array small): 876
[23:14:59] Timp scurs(array large): 3856
[23:15:00] Timp scurs(array small): 746
[23:15:12] Timp scurs(array large): 12562
[23:15:15] Timp scurs(array small): 3190
[23:15:38] Timp scurs(array large): 22416
[23:15:43] Timp scurs(array small): 5344
Pe langa timpul scurs, array large(cel de 2000) are marimea mai mare decat array small(array 200).
Am testat si for vs while, si dupa ce le-am comparat dar dupa ce le-am comparat, am vazut ca variaza timpul intre cele 2, si pe rand timpul pentru for devine mai mare si mai mic decat cel al lui while, deci sunt instabile, si cam egale ca viteza.
Am adus dovezi concrete legate de optimizare.
Nu am reusit sa compar iteratia facuta cu foreach si loop-ul normal facut de for, dar din cate am inteles foreach e mai rapid decat for.
Acestea fiind spuse, sper ca am mai lamurit, daca aveti intrebari sau vreti sa compar ceva dati reply iar eu voi face cu mare placere.
- la data de 2/3/2017, 05:43
- Cauta in: GameMode-uri
- Subiect: Gamemode Server SAMP!
- Raspunsuri: 20
- Vizualizari: 9231
Gamemode Server SAMP!
SouNNd a scris:cum gasesc msql_db si astea
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] MySQL_HOST
- la data de 13/1/2017, 06:21
- Cauta in: Tutoriale
- Subiect: Anti SQL Injection
- Raspunsuri: 7
- Vizualizari: 1151
Anti SQL Injection
Marusky a scris:C:\Users\Marius Catalin\Desktop\RSD.pwn(1764) : error 017: undefined symbol "SCM"
C:\Users\Marius Catalin\Desktop\RSD.pwn(1770) : warning 217: loose indentation
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
1 Error.
ce trebuie sa fac?
trebuie sa schimbi cordonatele la gm trebuie sa pui ceva de genul sau alt ceva
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SCM SendClientMessage
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SCMTA SendClientMessageToAll
- la data de 12/1/2017, 03:20
- Cauta in: Tutoriale
- Subiect: [TUTORIAL:SAMP]Evenimente
- Raspunsuri: 0
- Vizualizari: 265
[TUTORIAL:SAMP]Evenimente
Astazi va voi prezenta ceva simplu si frumos din punctul de vedere al jocului.Cand este vreo sarbatoare sau vreun eveniment in viata reala, cu totii vrem in viata virtuala sa se faca anumite event-uri din care vreti sa aveti toti de castigat.
Ok, eu am gasit asa-zisa o solutie. Cum ?
Pai in primul rand m-am gandit la o sarbatoare din an,am ales craciunul, fiind in luna 12.
Asadar aceasta luna ma ajuta mult deoarece timpul trimis pe server este unul real, si prin urmare incepe automat evenimentul de craciun.(cadouri, brazi, etc).
Eu propun sa incepem.
[Pasul 1] Iarasi ne lovim de aceste include-uri dar acum si de definirea bazei de date.
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SQL_HOST "localhost"
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SQL_USER "root"
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SQL_PASS ""
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] SQL_DB "accounts"
[Pasul 2] Definirea enumerotarii in care se vor situa urmatoarele variabile jucatoriale.
enum pInfo
{
pSQLID,
pGift,
pNextGift
}
new PlayerInfo[MAX_PLAYERS][pInfo];
[Pasul 3] Crearea variabilelor globale de care ne vom folosi usor pe viitor in diverse functii.
new dbhandle;
new bool:EvenimentON[MAX_PLAYERS];
new Gift = 19054;
new timer;
new Float:x_gift[MAX_PLAYERS] = 0.0000;
new Float:y_gift[MAX_PLAYERS] = 0.0000;
new Float:z_gift[MAX_PLAYERS] = 0.0000;
new Float:rx_gift[MAX_PLAYERS] = 0.0000;
new Float:ry_gift[MAX_PLAYERS] = 0.0000;
new Float:rz_gift[MAX_PLAYERS] = 0.0000;
[Pasul 4] Stabilirea forward-urilor care vor apela public-uri.
forward SaveData(playerid);
forward VerificaTimpul();
[Pasul 5] Ne ducem la public-ul OnGameModeInit si vom face in felul urmator:
public OnGameModeInit()
{
dbhandle = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
for( new i = 0; i < MAX_PLAYERS; i++ ) {
new year, month, day;
getdate(year, month, day);
if(month == 12 && day >= 24) {
CreateObject(gift, x_gift[i], y_gift[i], z_gift[i], rx_gift[i], ry_gift[i], rz_gift[i]);
Create3DTextLabel("Scrie /getgift pentru a lua\nun cadou.", -1, x_gift[i], y_gift[i], z_gift[i], 10.0, 1);
EvenimentON[i] = true;
timer = SetTimer("VerificaTimpul", 1000, 1);
}
else {
EvenimentON[i] = false;
}
}
return 1;
}
[Pasul 6] Reprezinta comanda getgift imbogatita cu toate cele.
CMD:getgift(playerid, params[]) {
new time = PlayerInfo[playerid][pNextGift],
minutes,
string[128];
minutes = floatround(time / 60);
format(string, sizeof(string), "%02d minute ramase pana la urmatorul cadou.", minutes);
if(IsPlayerConnected(playerid)) {
if(EvenimentON[playerid]) {
if(IsPlayerInRangeOfPoint(playerid, 5.0, x_gift[playerid], y_gift[playerid], z_gift[playerid])) {
if(PlayerInfo[playerid][pGift] == 0) {
GivePlayerMoney(playerid, 100000);
PlayerInfo[playerid][pGift] = 1;
PlayerInfo[playerid][pNextGift] = 3600;
SaveData(playerid);
}
else {
SendClientMessage(playerid, -1, string);
return 1;
}
}
else {
SendClientMessage(playerid, -1, "Nu esti langa cadou.");
return 1;
}
}
else {
SendClientMessage(playerid, -1, "Nu este nici o sarbatoare.");
return 1;
}
}
else {
SendClientMessage(playerid, -1, "Nu esti conectat.");
return 1;
}
return 1;
}
[Pasul 7] Apelul catre public-ul VerificaTimpul.
public VerificaTimpul() {
for( new i = 0; i < MAX_PLAYERS; i++ ) {
if(IsPlayerConnected(i)) {
if(PlayerInfo[i][pGift]) {
if(PlayerInfo[i][pNextGift] != 0) {
PlayerInfo[i][pNextGift]--;
SaveData(i);
}
else {
PlayerInfo[i][pGift] = 0;
PlayerInfo[i][pNextGift] = 0;
SaveData(i);
KillTimer(timer);
return 1;
}
}
}
}
return 1;
}
[Pasul 8] Apelul catre public-ul SaveData.
public SaveData(playerid) {
new query[128];
format(query, sizeof(query), "UPDATE `accounts` SET `Gift` = '%d', `GiftTime` = '%d' WHERE `ID` = '%d'", PlayerInfo[playerid][pGift], PlayerInfo[playerid][pNextGift], PlayerInfo[playerid][pSQLID]);
mysql_tquery(dbhandle, query, "", "");
return 1;
}
[Pasul 9] La OnPlayerDisconnect vom adauga functia creata la pasul 8 + distrugerea timer-ului, astfel:
public OnPlayerDisconnect(playerid, reason)
{
KillTimer(timer);
SaveData(playerid);
return 1;
}
Sper sa va fie de folos acest tutorial.
- la data de 8/1/2017, 17:33
- Cauta in: GameMode-uri
- Subiect: Simple MySQL R39-3 v1.0
- Raspunsuri: 0
- Vizualizari: 300
Simple MySQL R39-3 v1.0
Introduction
hello!
i made this becoz alot of people ask about this so i decided to make a new and simple one where everyone can beign a gamemode with there ideas well this gamemode is very simple with only 3 commands /stats /setlevel /setvip and it also saves kills + deaths
this gamemode have
[size=24]v1.0
auto login
/stats
/setlevel
/setvip
v1.1
/mute
/unmute
/setkils
/setmoney
/setdeaths
/setscore
/blockcommand /blockcmd
/unblockcommand /unblockcmd
i hope you guys like it
gamemode
pastebin: [Trebuie sa fiti inscris si conectat pentru a vedea acest link]
SQL data: [Trebuie sa fiti inscris si conectat pentru a vedea acest link]
change this to yours one
Code:
//Let's define our mysql settings
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] host "localhost" //This will be your mysql host. Default for xampp is localhost
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] user "root" //This will be your mysql username. Default for xampp is root
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] db "sami" //This is your database name. Remember we have created a database called server before.
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] pass "" //This is your mysql password. In xampp, the password didn't set. So leave it empty.
if you found bugs report it here i will fix it and if i get time i will try to update it
credits
newbienoob for tutorial
BlueG for mysql plugin
yless for sscanf and whirlpool
me for creating this gamemode[/size]
[size=11]Attached Files
[/size]
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] (21.8 KB, 429 views) | |
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] (133.3 KB, 51 views) |
- la data de 4/6/2016, 07:56
- Cauta in: Tutoriale
- Subiect: Tutorial Register/Login MYSQL R39
- Raspunsuri: 3
- Vizualizari: 238
Tutorial Register/Login MYSQL R39
Salutare, azi am sa va prezint cum sa faceti un tutorial register/login mysql R39.Mai intai o sa va trebuiasca pluginul si includeul mysql care ip puteti gasi [Trebuie sa fiti inscris si conectat pentru a vedea acest link]
Mai intai o sa punem la inceputul GM-ului include-ul mysql.
[ltr][Trebuie sa fiti inscris si conectat pentru a vedea acest link]
Acum o sa definim datele de conectare
[ltr][Trebuie sa fiti inscris si conectat pentru a vedea acest link] mysql_host "localhost" // aici punem ip hostului. Daca folosim in PC GM lasam localhost
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] mysql_db "bazadate"// aici punem numele bazei de date.
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] mysql_user "root"// aici punem numele userului de la host. Daca folositi PC lasati root.
[Trebuie sa fiti inscris si conectat pentru a vedea acest link] mysql_pass ""//Aici puneti parola de la host(de la phpmyadmin al hostului). In caz de folositi PC lasati asa.[/ltr]
Vom crea 2 Enum-uri. Unul cu dialogurile de register/login si altul cu datele pe care le va avea playerul
[ltr]enum
{
DIALOG_LOGIN, // dialogul de login
DIALOG_REGISTER// dialogul de register
};
enum pInfo //numele enumului este pInfo. in el vom pune datele playerului gen Admin/Level/ Money/Experianta si altele.
{
pParola,//cu pParola vom lua parola din baza de date a playerului
pID// cu pID vom lua ID-ul din baza de date a playerului
};
new P_Data[MAX_PLAYERS][pInfo];// Aceasta variabila este array. cu ea vom verifica 2 lucruri. id playerului si datele lui gen P_Data[playerid][pID] == 1;
[/ltr]
Vom crea acum un new care ne va ajuta sa conectam datele de conectarea cu baza de date
[ltr]new handle; // handle(mâner) este cea de care ne vom folosi sa facem lagatura intre baza de date si server [/ltr]
Acum vom crea legatura intre baza de date si server.
[ltr]forward MySQLConnect();// se creaza un nou callback cu forward
public MySQLConnect()// se face callback-ul
{
handle = mysql_connect(mysql_host, mysql_user, mysql_db, mysql_pass);// definim handle(manerul) ca fiind conectarea mysql la host, baza de date, parola si user-ul
if(mysql_errno() != 0)// in caz ca aceasta va fi diferita de 0(0 inseamna ca e conectat, 1 inseamna ca nu e conectat , fiind un vector)
{
printf("Conexiunea la baza de date %s a esuat ---> Server Inchis ~~~", mysql_db);// va trimite un mesaj in consola
SendRconCommand("exit");// se inchide serverul
}
else// altfel daca este 0(daca se face legatura)
{
printf("Conexiunea la baza de date '%s' cu user-ul '%s' a reusit!!!", mysql_db, mysql_user);// ne va da acest mesaj in consola
}
return 1;
}[/ltr]
Callback-ul MySQLConnect se va pune la OnGameModeInit pentru a fi finalizata conectarea la baza de date.
[ltr]public OnGameModeInit()
{
MySQLConnect();
return 1;
}[/ltr]
Se va crea un stock simplu cu care vom selecta numele playerului
[ltr]stock GetName(playerid)
{
new Name[MAX_PLAYER_NAME];
GetPlayerName(playerid, Name, sizeof(Name));
return Name;
}[/ltr]
Acum vom se va crea un nou callback , la care vom apela cand playerul se conecteaza. El va arata daca are cont sau nu.
[ltr]forward OnPlayerLogin(playerid);// se creaza callbac-ul
public OnPlayerLogin(playerid)//Se creaza publicul
{
new rows, fields;// definim rows(randurile)si fields(domeniile)
cache_get_data(rows, fields);//cache_get_data interogheaza date din baza de date. acele date sunt rows si fields
if(rows)// atunci cand playerul se inregistreaza i se va crea niste randuri. Daca i se gasesc atunci cand se va conecta ii va da:
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Logheaza-te!", "Te rog sa-ti introduci parola contuului mai jos!", "Logare", "Exit");// dialogul register
}
else// daca nu i se gasesc randuri, adica daca contul nu exista, atunci i se va da urmatorul dialog
{
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Inregistrare", "Trebuie sa iti creezi un cont ca sa joci pe server. nTasteaza mai jos o parola, pentru a te inregistra!", "Inregistreaza", "Exit");// dialogul register
}
return 1;
}
[/ltr]
Acum ca am creat dialogul care ne ajuta sa verificam daca playerul are cont sau nu , mergem la OnPlayerConnect si punem urmatoarele:
[ltr]public OnPlayerConnect(playerid)
{
new query[100];// definim query(interogare)
mysql_format(handle, query, sizeof(query), "SELECT * FROM conturi WHERE Nume = '%s'", GetName(playerid));// mysql format face interogarile/setarile/obtiunile/updateurile la baza de date
//handle reprezinta conectarea la mysql, query si sizeof(queri) reprezinta interogarea
//"SELECT * FROM conturi WHERE Nume = '%s'"- Selecteaza de la tabelul cu conturi, unde numele este %s(de exemplu eu am numele Widualk pe sa-mp. Mi se va extrage numele si
mysql_tquery(handle, query, "OnPlayerLogin", "i", playerid);// se va interoga OnPlayerLogin. Adica mai pe scurt , cand se conecteaza se va verifica daca are cont sau nu acel player.
return 1;
}[/ltr]
Acum ca am terminat cu callback-urile de la conectare, vom crea dialogurile.
[ltr]public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new query[128], ip[25];// se creaza interogarea si ip.
switch(dialogid)// se va folosi switch pentru a selecta dialogul
{
case [Trebuie sa fiti inscris si conectat pentru a vedea acest link] daca se va selecta dialogul register
{
if(!response)
return Kick(playerid);// daca se va apasa pe butonul Exit ii va da kick
if(response)// daca se apasa pe Butonul inregistrare se vor face urmatoarele verificari
{
if(!strlen(inputtext))// daca nu e scris nimic la parola
return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Introdu-ti o parola pentru a te inregistra pe server! n", "Inregistreaza", "Exit");// ii va da din nou dialogul register cu mesajul specific
GetPlayerIp(playerid, ip, sizeof(ip));// definim ip-ul de mai sus
mysql_format(handle, query, sizeof(query), "INSERT INTO conturi (Nume, Parola, IP) VALUES ('%s', '%e', '%s')", GetName(playerid), inputtext, ip);// se insereaza in tabelul cu conturi numele playerului, parola pe care a scris-o si ip pe care il are
mysql_query(handle, query);// se va trimite setarile si se va interoga callback-ul OnRegistration
SpawnPlayer(playerid); // ii da spawn
}
return 1;
}
case [Trebuie sa fiti inscris si conectat pentru a vedea acest link] daca se va selecta dialogul de login
{
if(!response) return Kick(playerid);// si se va apasa pe butonul exit ii va da kick
if(response)//daca se apasa pe butonul LOGARE se va face urmatoarele verificari
{
if(!strlen(inputtext))// daca nu a scris nimic la parola
return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu login cu mesajul specific
// daca se va trece peste aceasta verificare se vor face urmatoarele:
mysql_format(handle, query, sizeof(query), "SELECT * FROM `conturi` WHERE `Nume`='%e' AND `Parola` = '%e'", GetName(playerid),inputtext);// va fi selectata parola de la tabelul cu conturi
mysql_tquery(handle, query, "OnLogin", "i", playerid);// se va face apel la baza si se va interoga CallBackUl OnLogin (Tquery = take query sau ia interogare in romana)
}
return 1;
}
}
return 1;
}[/ltr]
Acum , ca am facut dialogurile , vom crea calback-urile care se interogheaza la dialogurile de mai sus.
Vom crea callback-ul pentrul dialogul de register.
Acum , vom crea callback-ul la care apeleaza dialogul de login
[ltr]forward OnLogin(playerid);// definim callback ul
public OnLogin(playerid)// facem publicul
{
new rows, fields,temporar[200];// definim randurile si domeniile, iar temporar se va folosi la extragerea stringurilor
cache_get_data(rows, fields);// facem interogarea lor
if(rows)// daca playerul are randuri(adica daca are cont creat, odata cu contul se creeaza randurile)
{
//deci daca are randuri
cache_get_field_content(0, "Parola",temporar), format(P_Data[playerid][pParola], 25, temporar);// i se vaextrage parola si i se verifica daca coincide cu numele. Se foloseste new-ul temporar pentru extragerea parolei, ea retinandu-se temporar(pana cand se deconecteaza jucatorul)
P_Data[playerid][pID] = cache_get_field_content_int(0, "ID");// i se vaextrage ip-ul
//un exemplu ar fi , daca are Admin , va fi ceva de genu P_Data[playerid][pAdmin] = cache_get_field_content_int(0,"Admin)"; i se va extrage din baza de date levelul de admin si i se va returna pe server, mai precis, cand se conecteaza are levelul de admin , care i-a fost setat de owner
SpawnPlayer(playerid);// si se va da spawn
}
else// altfel , daca parola este gresita
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Te rog sa iti introduci parola corecta, pentru a te loga pe server.", "Logare", "Exit");// ii va da dialogul cu mesajul specific.
}
return 1;
}[/ltr]
Iar la final punem la OnGameModeExit();
[ltr]public OnGameModeExit()
{
mysql_close( handle ) ;// deconectam serverul de la baza de date, daca se inchide
return 1;
}[/ltr]
Acum , o sa recapitulam.
Playerul are nevoie de ID, Nume, Parola si IP, deci 4 coloane in tabel.
Tabelul se numeste "conturi", deoarece interogarea se face acolo "mysql_format(handle, query, sizeof(query), "SELECT * FROM conturi"-conturi este tabelul unde vor aparea ID ,Nume, Parola, IP
Baza de date se numeste "bazadate" din: [Trebuie sa fiti inscris si conectat pentru a vedea acest link] mysql_db "bazadate"
O sa va arat acum cum se creaza tabelul.
Pasul 1. Definim baza de date cu numele "basedate":
Pasul 2: Se selecteaza noua baza:
Pasul 3: Se creaza tabelul cu cele 4 coloane:
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
Pasul 4: Se definesc coloanele , cu fiecare setare
[Trebuie sa fiti inscris si conectat pentru a vedea acest link]
La tip INT = intenger= numar de cifre.
Varchar = string = sir de caractere(litere)
la Lungimea / setare se selecteaza cat spatiu se acorda, adica cate caractere incap maxim in acel tabel
la id va fi maxim 9999999999(sun 10 cifre consecutive de "9", adica acel numar va fi maximul de playeri care pot avea cont)
la nume, se va putea salva doar numele care contine doar 25 de caractere(adica daca numele depaseste 25 litere, doar primele 25 se vor salva)
la interclasare la Varchar , mereu sa puneti latin1_sweadich_ci, de ce, asta nu pot spune nici eu , dar , stiu ca asa trebuie
La ID tot timpul sa bifati casuta "A_I(auto Increment)" care va genera singur id-ul, altfel nu va merge tabelul conturi
Asa ar trebui sa va arata , atunci cand va inregistrati:
[size=24]Atentie tutorial creat 100% de Widualk. Nerespectarea creditelor va duce la sanctiuni![/size]