Jump to content

Cum sa creezi un PayDay


WiDuAlK

Recommended Posts

Salut SA-MP.RO, am venit cu un alt tutorial, posibil sa fie ultimul de acest tip/gen. Acest tutorial l-am scris acum foarte mult timp, dar pentru ca am vazut ca tutorialele mele sunt copiate fara a fii macar gandite sau intelese, nu l-am mai postat. Pentru acest fapt cred cred ca e ultimul tutorial legat de construirea unui GM. Deci sa incepem.
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.

Ne vom folosi de ACEST TUTORIAL

Am sa definesc pentru ambele metode o variabila care o vom folosi.

Mergem la enumul pInfo si punem:


 

enum pInfo
{
    // variabilele voastre
    pPayday
};


Apoi mergem la callback-ul OnLogin si punem la verificarea "if(rows)":

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.

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:

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 face-ti in felul urmator:

olEEIhd.jpg?1

TYOUC7X.jpg?1

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.


 

new pLogin[MAX_PLAYERS]; // aceasta variabila i se poate atribui tuturor playerilor de pe server

Mergem la OnPlayerConnect si punem:


 

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:


 

enum pInfo
{
    // variabilele voastre
    pPayday,
    pTimePayday
};


Mergem la callback-ul OnLogin si adaugam:

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.

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:


 

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:

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.

olEEIhd.jpg?1

wqysyl9.jpg?1

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:

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 3100 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.

 

Edited by WiDuAlK
Reparare payday metoda 1.
  • Upvote 4
Link to comment
Share on other sites

  • WiDuAlK featured this topic
  • 3 weeks later...
  • 11 months later...
  • WopsS unfeatured this topic
  • 3 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.