[CAMPANIE STAFF]Cautam moderatori si designeri activi!
Welcome to WTFCS Community Forums!
Servere gaming la super-preturi! [HOSTING SERVICE]
-->






Cum sa creezi un Payday
Author : mihay111, Category : Tutoriale, 0 Replyes, 324 Views
EVALUATE THIS TOPIC
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
1 Guest(s)
Moderator
     
577
POSTS
452
THREADS
190
REPUTATION
Male
Sex

WtfCs Coins: 0.15[w]

Suit Member
09-22-2021, 12:58 PM
#1
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:



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;
}
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.


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);
[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.
Mihai nu face flotari, el le cumpara gata facute!
Mihai s-a nascut intr-o cabana construita de el.
Mihai a omorat 50 de teroristi din 2 gloante.Primul a fost de avertizare.
Mihai poate sa isi faca poze cu telefonul fix.
Mihai a raspuns la un apel pierdut.
Singura femeie care si-a permis sa faca glume despre Mihai a fost Elodia, de aia nu mai este.
Cand Mihai iti arata degetul nu o face ca sa te injure... doar iti arata cate secunde mai ai de trait!
You are not allowed to view links. Register or Login to view.


Forum Jump: