09-22-2021, 12:58 PM
Autor: WiDuAIK
Dupa cum zice si titlul "Cum sa faci un PayDay". Payday inseamna plata zilei. Am sa va arat 2 metode de a face payday.
Prima metoda este cea UNIVERSALA. Aceasta metoda se aplica odata pe ora, la o ora fixa de exemplu: 9:00, 10:00, 11:00, 12.00, 13:00, 14:00 etc.
A 2-a metoda este de a face payday INDIVIDUAL. Individual in sensul ca jucatorul trebuie sa joace timp de o ora pe server ca sa primeasca payday. Va putea primi payday in orice minut al zilei. Aceasta depinde cat sta pe server , si cat va juca pe server.
Am sa definesc pentru ambele metode o variabila care o vom folosi.
Mergem la enumul pInfo si punem:
Apoi mergem la callback-ul OnLogin si punem la verificarea "if(rows)":
METODA I(metoda Universala)
Facem un nou callback numit Payday:
Avem nevoie si de include-ul foreach.
Acum, mergem la OnGameModeInit si punem un timer pentru a se aplica payday:
Explicatie: Conform ceasului, o ora are 60 de minute. al 60-lea minut este 00, adica 12:00- al 60-lea minut. Cand trece 60 de minute, adica este o ora fixa, atunci tuturor playerilor li se atribuie 1+ payday.
Aceasta metoda nu este prea complicata, dar eu nu o folosesc, deoarece un jucator poate intra cu 5 minute inainte de a se da payday si ei vor primi la un + la fel ca jucatori care au jucat o ora intreaga.
Pe partea cealalta, ei pot juca aproape o ora intrega si din cauza unor probleme personale, inchid jocul si pierd payday.
Pentru a crea in baza de date noua variabila faceti in felul urmator:[b]
[Image: olEEIhd.jpg?1][/b]
[Image: TYOUC7X.jpg?1]
[Image: OqOtyhT.jpg?1]
Metoda 2(metoda Individuala)
Aceasta metoda este mai recomandata, deoarece ei primesc pe merit un + la payday , nu odata pe ora, si nu vor pierde nimic.
Facem variabila pLogin, pentru a verifica daca este conectat si logat.
Mergem la OnPlayerConnect si punem:
Mergem tot la enum-ul pInfo si punem:
Mergem la callback-ul OnLogin si adaugam:
Acum vom face un callback separat in care vom face un algoritm(o operatie matematica) in care vom seta timpul de payday.
Adaugam un timer la OnGameModeInit pentru a fi activ:
Si ca atunci cand jucatorul se inregistreaza pentru prima data, sa nu primeasca payday adaugam la dialogul de register:
Iar apoi facem in baza de date tabelele.[b]
[Image: olEEIhd.jpg?1][/b]
[Image: wqysyl9.jpg?1]
[Image: GCF1j5i.jpg?1]
ATENTIE: Daca va folositi de metoda universala, nu completati tabel cu TimePayDay.
EXPLICATIE: Atunci cand jucatorul se in registreaza, el primeste 60 * 60 = 3600 secunde = 60 minute.
In timp ce este conectat i se scade secunda cu secunda jucatorului. Cand ajunge la secunda 0, adica cand a stat pe server 60 minute, primeste PayDay.
Daca vreti sa vedeti cate minute mai sunt pana la urmatorul payday faceti un format de genu:
[b]
Impartim la 60 pentru a ne da un rezultat de 60 de ori mai mic, iar pentru ca avem intenger si nu float ne va da rezultatul rotunjit.
Exemplu, noi mai avem 3[/b]100 secunde pana la urmatorul payday, impartim 3100 / 60 = 51,66666666(6 in perioada), iar pentru ca avem intenger ne va rezulta: 51, deci 51 minute pana la urmatorul payday.
Dupa cum zice si titlul "Cum sa faci un PayDay". Payday inseamna plata zilei. Am sa va arat 2 metode de a face payday.
Prima metoda este cea UNIVERSALA. Aceasta metoda se aplica odata pe ora, la o ora fixa de exemplu: 9:00, 10:00, 11:00, 12.00, 13:00, 14:00 etc.
A 2-a metoda este de a face payday INDIVIDUAL. Individual in sensul ca jucatorul trebuie sa joace timp de o ora pe server ca sa primeasca payday. Va putea primi payday in orice minut al zilei. Aceasta depinde cat sta pe server , si cat va juca pe server.
Am sa definesc pentru ambele metode o variabila care o vom folosi.
Mergem la enumul pInfo si punem:
Code:
enum pInfo
{
// variabilele voastre
pPayday
};
Apoi mergem la callback-ul OnLogin si punem la verificarea "if(rows)":
Code:
public OnLogin(playerid)// facem publicul
{
new rows, fields,temporar[200];
cache_get_data(rows, fields);
if(rows)
{
// extragerile voastre
P_Data[playerid][pPayday] = cache_get_field_content_int(0, "PayDay");
}
...
}
METODA I(metoda Universala)
Facem un nou callback numit Payday:
Avem nevoie si de include-ul foreach.
Code:
forward Payday();// definim callback-ul
public Payday()// facem public-ul
{
foreach(Player,i)
{
new ore, minute, secunde;// facem variabilele de timp
gettime(ore, minute, secunde);// definim variabilele de timp, ore, minute si secunde conform ceasului
if(minute == 0 && secunde == 0)// daca minutele sunt egale cu 0
{
P_Data[i][pPayday] += 1;// dam tuturor jucatorilor un + payday
mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `PayDay`='%d' WHERE `Nume`='%e'", P_Data[i][pPayday], GetName(i));// facem update tuturor jucatorilor
mysql_query(handle, query);//trimitem update-ul in baza de date.
}
}
return 1;
}
Acum, mergem la OnGameModeInit si punem un timer pentru a se aplica payday:
Code:
public OnGameModeInit()
{
SetTimer("Payday", 1000, 1);// se verifica din secunda in secunda daca este timpul de payday sau nu.
// liniile voastre
return 1;
}
Aceasta metoda nu este prea complicata, dar eu nu o folosesc, deoarece un jucator poate intra cu 5 minute inainte de a se da payday si ei vor primi la un + la fel ca jucatori care au jucat o ora intreaga.
Pe partea cealalta, ei pot juca aproape o ora intrega si din cauza unor probleme personale, inchid jocul si pierd payday.
Pentru a crea in baza de date noua variabila faceti in felul urmator:[b]
[Image: olEEIhd.jpg?1][/b]
[Image: TYOUC7X.jpg?1]
[Image: OqOtyhT.jpg?1]
Metoda 2(metoda Individuala)
Aceasta metoda este mai recomandata, deoarece ei primesc pe merit un + la payday , nu odata pe ora, si nu vor pierde nimic.
Facem variabila pLogin, pentru a verifica daca este conectat si logat.
Code:
new pLogin[MAX_PLAYERS]; // aceasta variabila i se poate atribui tuturor playerilor de pe server
Mergem la OnPlayerConnect si punem:
Code:
public OnPlayerConnect(playerid)
{
pLogin[playerid] = 0; // cand se va conecta pLogin va avea valoarea 0
// liniile voastre
return 1;
}
Mergem tot la enum-ul pInfo si punem:
Code:
enum pInfo
{
// variabilele voastre
pPayday,
pTimePayday
};
Mergem la callback-ul OnLogin si adaugam:
Code:
public OnLogin(playerid)// facem publicul
{
new rows, fields,temporar[200];
cache_get_data(rows, fields);
if(rows)
{
// extragerile voastre
P_Data[playerid][pPayday] = cache_get_field_content_int(0, "PayDay");
P_Data[playerid][pTimePayday] = cache_get_field_content_int(0, "TimePayDay");
pLogin[playerid] = 1;// cand se va loga, pLogin va avea valoarea 1
}
...
}
Acum vom face un callback separat in care vom face un algoritm(o operatie matematica) in care vom seta timpul de payday.
Code:
forward PaydayIndividual();
public PaydayIndividual()
{
new query[80]; // Cream query-ul cu care vom trimite mesajul in baza de date
foreach(Player, i)
{
if(pLogin[i] == 1)
{
if(P_Data[i][pTimePayday] > 0)
{
P_Data[i][pTimePayday] --;
mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `TimePayDay`='%d' WHERE `Nume`='%e'", P_Data[i][pTimePayday], GetName(i));// facem update tuturor jucatorilor
mysql_query(handle, query);//trimitem update-ul in baza de date.
}
if(P_Data[i][pTimePayday] <= 0)
{
P_Data[i][pPayday] += 1;
mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `PayDay`='%d' WHERE `Nume`='%e'", P_Data[i][pPayday], GetName(i));// facem update tuturor jucatorilor
mysql_query(handle, query);//trimitem update-ul in baza de date.
P_Data[i][pTimePayday] = 60 * 60;
mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `TimePayDay`='%d' WHERE `Nume`='%e'", P_Data[i][pTimePayday], GetName(i));// facem update tuturor jucatorilor
mysql_query(handle, query);//trimitem update-ul in baza de date.
}
}
}
return 1;
}
Adaugam un timer la OnGameModeInit pentru a fi activ:
Code:
public OnGameModeInit()
{
SetTimer("PaydayIndividual", 1000, 1);// se verifica odata pe secunda daca jucatorul a stat pe server o ora.
// liniile voastre
return 1;
}
Si ca atunci cand jucatorul se inregistreaza pentru prima data, sa nu primeasca payday adaugam la dialogul de register:
Code:
case DIALOG_REGISTER:
{
if(!response)
return Kick(playerid);
if(response)
{
if(!strlen(inputtext)
return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Parola incorecta!", "Introdu-ti o parola pentru a te inregistra pe server! \n", "Inregistreaza", "Exit");
GetPlayerIp(playerid, ip, sizeof(ip));
mysql_format(handle, query, sizeof(query), "INSERT INTO conturi (Nume, Parola, IP) VALUES ('%s', '%e', '%s')", GetName(playerid), inputtext, ip);
mysql_tquery(handle, query);
P_Data[playerid][pTimePayday] = 60 * 60;
mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `TimePayDay`='%d' WHERE `Nume`='%e'", P_Data[playerid][pTimePayday], GetName(playerid));// facem update tuturor jucatorilor
mysql_query(handle, query);//trimitem update-ul in baza de date.
// liniile voastre..
}
return 1;
}
Iar apoi facem in baza de date tabelele.[b]
[Image: olEEIhd.jpg?1][/b]
[Image: wqysyl9.jpg?1]
[Image: GCF1j5i.jpg?1]
ATENTIE: Daca va folositi de metoda universala, nu completati tabel cu TimePayDay.
EXPLICATIE: Atunci cand jucatorul se in registreaza, el primeste 60 * 60 = 3600 secunde = 60 minute.
In timp ce este conectat i se scade secunda cu secunda jucatorului. Cand ajunge la secunda 0, adica cand a stat pe server 60 minute, primeste PayDay.
Daca vreti sa vedeti cate minute mai sunt pana la urmatorul payday faceti un format de genu:
Code:
format(string, sizeof(string), "Mai ai %d minute pana la urmatorul payday.", P_Data[playerid][pTimePayday] / 60);
Impartim la 60 pentru a ne da un rezultat de 60 de ori mai mic, iar pentru ca avem intenger si nu float ne va da rezultatul rotunjit.
Exemplu, noi mai avem 3[/b]100 secunde pana la urmatorul payday, impartim 3100 / 60 = 51,66666666(6 in perioada), iar pentru ca avem intenger ne va rezulta: 51, deci 51 minute pana la urmatorul payday.