Jump to content

Cum sa creezi o noua factiune de la 0[PART 1]


WiDuAlK

Recommended Posts

Salutare, astazi vin cu un nou tutorial in 3 pasi. Mi-am propus in cei 3 pasi sa va arat cum se creaza o factiune de la 0, pentru ca si voi sa va concepeti un GM de la 0 , si sa stiti cum se adauga factiunile. Atentie, inainte tin sa mentionez ca eu ma folosesc de registerul mysql din tutorialul acesta: . Parcurgeti acest tutorial doar daca v-ati creat sistemul de inregistrare dupa tutorial, deoarece eu aduc o contribuire lui.

 

In partea 1 o sa creem variabilele de la factiune pe care le vom folosi si anume pLeader, pMember si pRank in baza de date , dar si in GM. Tot aici vom crea publicul Update, care ne va usura updateul la baza de date. Am vazut la unele GM-uri ca se foloseau de acest public(R33 Ideal pentru RPG by wopss, RedzMax parca asa se chema si alte GM-uri care nu imi mai aduc aminte denumirea lor )  si m-am gandit ca e foarte bine sa il folositi. Vom crea si un nou enum cu datele de update.

Vom crea comenzile /invite , /makeleader(cu rconul) /giverank, /uninvite , /fpk(cu rcon).

 

Acum ca am facut introducerea sa trecem si la treaba practica.

 

Mergem la enum-ul "pInfo" si vom adauga cele 3 variabile in felul urmator:

enum pInfo 
{
	pParola,
	pID,
	pLeader,// variabila playerului cand are lider
	pMember,// variabila playerului cand are membru
	pRank// variabila playerului cand are rank
};

creem un enum cu cele 3 upload-uri

enum 
{
	LeaderUpdate,
	MemberUpdate,
	RankUpdate
};

si callback-ul

forward Update(playerid, type);// creem callback-ul
public Update(playerid, type) // facem publicul
{
    if(IsPlayerConnected(playerid))// verificam daca playerul este conectat
    {
        new query[256];// se creaza o interogare in public pentru baza de date     switch(type)// aplicam la swich pentru a face mai rapida apelarea la callback
        {
            switch(type)
            {
                case LeaderUpdate:// dupa cum am creat enum-ul , verificam cazul de update, adica lider
                {
                    mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `Leader`='%d' WHERE `Nume`='%e'", P_Data[playerid][pLeader], GetName(playerid));// facem update-ul la baza de date
                    mysql_query(handle, query);// trimitem update-ul
                }
                case MemberUpdate:// cazul memnerului
                {
                    mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `Memner`='%d' WHERE `Nume`='%e'", P_Data[playerid][pMember], GetName(playerid));// facem update-ul la baza de date
                    mysql_query(handle, query);// trimitem update-ul
                }
                case RankUpdate:// cazul rank-ului
                {
                    mysql_format(handle, query, sizeof(query), "UPDATE `conturi` SET `Memner`='%d' WHERE `Nume`='%e'", P_Data[playerid][pMember], GetName(playerid));// facem update-ul la baza de date
                    mysql_query(handle, query);// trimitem update-ul
                }
            }
        }
    }
    return 1;
}

Acum facem comenzile , dar mai intai aveti nevoie de urmatparele scripturi:

ZCMD

SSCANF

CMD:makeleader(playerid,params[])
    {
        if(IsPlayerConnected(playerid))
        {
            new string[100], lider, factiuneid;// se creaza variabilele, lider = persoana pe care aplicam comanda, factiuneid = id factiunii la care va fi acea persoana
            if(!IsPlayerAdmin(playerid))// verificam daca playerul nu este conectat cu rcon-ul
                    return SendClientMessage(playerid, -1, "Trebuie sa fi conectat cu Rcon-ul!");

            if(sscanf(params,"ud",lider,factiuneid))// verificam daca playerul nu scrie comanda completa
                    return SendClientMessage(playerid,-1,"Romania Reality: /makeleader [Nume_Player/ID] [FactiuneID]");

            if(factiuneid > 11 && factiuneid < 1)//punem conditie la cate factiuni avem
                    return SendClientMessage(playerid, -1, "Trebuie sa fie intre 1 si 11!");

            if(!IsPlayerConnected(lider))// verificam daca playerul nu este conectat
                    return SendClientMessage(playerid,-1,"Acest jucator nu este conectat");

            P_Data[lider][pLeader] = factiuneid;// persoana pe care aplicam comanda va fi liderul factiunii pe care am scris-o
            P_Data[lider][pMember] = factiuneid;// persoana pe care aplicam comanda va fi membrul factiunii pe care am scris-o
            P_Data[lider][pRank] = 6; // ii va da rank 6

            Update(lider, LeaderUpdate);// se va face update catre baza de date a liderului
            Update(lider, MemberUpdate);// se va face update catre baza de date a liderului ca este si membru in factiune
            Update(lider, RankUpdate);// se va face update la bazaz de date a liderului care are rank 6

            format(string, sizeof(string), "Ai fost promovat ca lider de catre %s", GetName(playerid));
            SendClientMessage(lider, -1, string);// ii da mesaj liderului de cine a fost promovat

            format(string, sizeof(string), "%s este noul lider al factiunii %d.", GetName(lider), factiuneid);
            SendClientMessage(playerid, -1, string);// ii da mesaj adminului pe cine a promovat

               SpawnPlayer(lider);// il spawneaza pe lider

        }
        return 1;
    }

Facem comanda /fpk

CMD:fpk(playerid,params[])
    {
        if(IsPlayerConnected(playerid))
        {
            new concediat, motiv[200], string[200];// se creaza noile variabile care vor fi folosite la verificarea comenzii in scriere

            if(sscanf(params,"us[199]", concediat, motiv))// verificam ca comanda sa se scrie corect
                    return SendClientMessage(playerid,-1,"SERVER: /fpk [Nume_Player] [MOTIV]");// daca nu e scrisa corect , atunci sa ii dea mesajul cum sa se scrie

            if(!IsPlayerAdmin(playerid))// verificam daca playerul nu este conectat cu rcon-ul
                    return SendClientMessage(playerid, -1, "Trebuie sa fi conectat cu Rcon-ul!");

            if(!IsPlayerConnected(concediat))// verificam daca playerul nu este conectat
                    return SendClientMessage(playerid,-1,"Acest jucator nu este conectat");

            if(sscanf(params,"us[199]", concediat, motiv))// verificam ca comanda sa se scrie corect
                    return SendClientMessage(playerid,-1,"SERVER: /fpk [Nume_Player] [MOTIV]");

            P_Data[concediat][pLeader] = 0;// il facem lider 0
            P_Data[concediat][pMember] = 0;// il facem membru 0
            P_Data[concediat][pRank] = 0; // ii dam rank 0

            Update(concediat, LeaderUpdate);// se va face update la bazaz de date a concediatului
            Update(concediat, MemberUpdate);// se va face update la bazaz de date a concediatului
            Update(concediat, RankUpdate);// se va face update la bazaz de date a concediatului

            format(string, sizeof(string), "Ai fost concediat de catre OWNERUL %s, pe motivul: %s", GetName(playerid), motiv);
            SendClientMessage(concediat, -1, string);// ii da mesaj concediatului de cine a fost concediat

            format(string, sizeof(string), "%s este concediat pe motivul: %s", GetName(concediat), motiv);
            SendClientMessage(playerid, -1, string);// ii da mesaj adminului pe cine a concediat

               SpawnPlayer(concediat);// il spawneaza pe lider

        }
        return 1;
    }

Facem comanda /uninvite

CMD:uninvite(playerid,params[])
    {
        if(IsPlayerConnected(playerid))
        {
            new concediat, motiv[200], string[200];// creem variabilele de care ne folosim in comanda
            
            if(P_Data[playerid][pLeader] < 0)// verificam daca playerul este lider(persoana care foloseste comanda)
                    return SendClientMessage(playerid,-1,"SERVER: Nu esti lider");
            
            if(sscanf(params,"us[199]", concediat, motiv))//verificam daca comanda e scrisa bine
                    return SendClientMessage(playerid,-1,"SERVER: /uninvite [Nume_Player/ID] [MOTIV]");

            if(P_Data[playerid][pLeader] != P_Data[concediat][pMember])// verificam daca liderul foloseste comanda pe ai sai prieteni
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda decat pe cei din factiune la tine!");

            if(concediat == P_Data[concediat][pLeader])// verificam daca concediatul nu e lider
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe un lider!"); // daca este ii dam mesaj corespunzator

            P_Data[concediat][pMember] = 0;// il facem membru 0
            P_Data[concediat][pRank] = 0; // ii dam rank 0

            Update(concediat, MemberUpdate);// se va face update la bazaz de date a concediatului
            Update(concediat, RankUpdate);// se va face update la bazaz de date a concediatului

            format(string, sizeof(string), "Ai fost concediat de catre Liderul %s, pe motivul", GetName(playerid), motiv);
            SendClientMessage(concediat, -1, string);// ii da mesaj "victimei" de cine a fost concediat

            format(string, sizeof(string), "%s este concediat pe motivul: %s", GetName(concediat), motiv);
            SendClientMessage(playerid, -1, string);// ii da mesaj liderului pe cine a concediat

               SpawnPlayer(concediat);// il spawneaza pe lider

        }
        return 1;
    }

Facem comanda /invite

CMD:invite(playerid,params[])
    {
        if(IsPlayerConnected(playerid))
        {
            new membru, string[200];// se creaza variabilele folosite in comanda

            if(P_Data[playerid][pLeader] < 0)// verificam daca playerul este lider
                    return SendClientMessage(playerid,-1,"SERVER: Nu esti lider");

            if(sscanf(params,"u", membru))//verificam daca comanda e scrisa bine
                    return SendClientMessage(playerid,-1,"SERVER: /uninvite [Nume_Player/ID]");

            if(P_Data[membru][pLeader] > 1)
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe alti lideri!");

            if(P_Data[membru][pMember] > 1)
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe alti membri!");

            P_Data[membru][pMember] = P_Data[playerid][pLeader];// il facem membru la factiunea in care este si cel care invita
            P_Data[membru][pRank] = 0; // ii dam rank 0

            Update(membru, MemberUpdate);// se va face update la bazaz de date a membrului
            Update(membru, RankUpdate);// se va face update la bazaz de date a membrului

            format(string, sizeof(string), "Ai fost promovat membru de catre Liderul %s, pe motivul", GetName(playerid));
            SendClientMessage(membru, -1, string);// ii da mesaj membrului de cine a fost invitat

            format(string, sizeof(string), "%s este membru la tine in factiune", GetName(membru));
            SendClientMessage(playerid, -1, string);// ii da mesaj liderului pe cine a invitat

               SpawnPlayer(membru);// il spawneaza pe lider

        }
        return 1;
    }

Comanda /giverank

CMD:giverank(playerid,params[])
    {
        if(IsPlayerConnected(playerid))
        {
            new membru, rank, string[200];// creem variabilele cu care vom face conditie in comanda

            if(P_Data[playerid][pLeader] < 1)// verificam daca playerul este lider
                    return SendClientMessage(playerid,-1,"SERVER: Nu esti lider");
                    
            if(sscanf(params,"ud", membru, rank))//verificam daca comanda e scrisa bine(ne folosim de cele de mai sus)
                    return SendClientMessage(playerid,-1,"SERVER: /uninvite [Nume_Player/ID] [NRRank]");

            if(P_Data[membru][pLeader]  == P_Data[playerid][pLeader])
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe tine!");

            if(P_Data[membru][pLeader]  > 0)
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe alti lideri!");

            if(P_Data[membru][pMember] != P_Data[playerid][pLeader])// verificam daca comanda se foloseste pe membri altei factiune
                    return SendClientMessage(playerid,-1,"SERVER: Nu poti folosi comanda pe alti membri!");
                    
            if(P_Data[membru][pMember] != P_Data[playerid][pLeader])

            P_Data[membru][pRank] = rank; // ii dam rank 0

            Update(membru, RankUpdate);// se va face update la bazaz de date a membrului

            format(string, sizeof(string), "Ai fost promobat cu rank %d de catre liderul %s", rank, GetName(playerid));
            SendClientMessage(membru, -1, string);// ii da mesaj membrului de cine a fost promovat in rank

            format(string, sizeof(string), "%s este membru la tine in factiune cu rank: %d", GetName(membru), rank);
            SendClientMessage(playerid, -1, string);// ii da mesaj liderului pe cine a promovat

        }
        return 1;
    }

Acum un pas foarte important, mergem la callback-ul OnLogin si punem sub P_Data[playerid][pID] = cache_get_field_content_int(0, "ID"); urmatoarele:

P_Data[playerid][pLeader] = cache_get_field_content_int(0, "Leader");
P_Data[playerid][pMember] = cache_get_field_content_int(0, "Member");
P_Data[playerid][pRank] = cache_get_field_content_int(0, "Rank");

Iar acum mergem la baza de date si parcurgem urmatorii pasi:

 

RCAVHU7.jpg?1

 

XCec4kL.jpg?1

 

vuVPlgz.jpg?1

 

US1evr7.jpg?1

 

Bun, aceasta a fost partea 1. Daca gasiti greseli pe la comenzi , asta e din cauza ca acuma, seara, l-am facut si sunt putin cam obosit(se vede si dupa data de postare a tutorialului). Sper ca ati inteles pana aici, voi reveni cu a 2-a parte maine. Tutorial 100% scris de WIDUALK. Postarea acestui tutorial fara acordul meu va fi reclamata!

 

Pana data viitoare(maine) PACE!

Edited by WiDuAlK.SaMp
  • Upvote 12
Link to comment
Share on other sites

  • 1 month later...

@WiDuAlK.SaMp in noua versiune a gamemode-ului "Ideal pentru RPG" este altfel numita functia Update.

 

De ce?

Pentru ca se incurca, de exemplu cand vrei sa folosesti o intergare pentru jucator sau factiune.

forward UpdatePlayer(playerid, type); // Pentru jucator.
forward UpdateFaction(factionid, type); // Pentru factiune.
Link to comment
Share on other sites

 

@WiDuAlK.SaMp in noua versiune a gamemode-ului "Ideal pentru RPG" este altfel numita functia Update.

 

De ce?

Pentru ca se incurca, de exemplu cand vrei sa folosesti o intergare pentru jucator sau factiune.

forward UpdatePlayer(playerid, type); // Pentru jucator.
forward UpdateFaction(factionid, type); // Pentru factiune.

Ai dreptate, dar e mai bine asa, de ce? Pentru ca poate face update la altceva din factiune cu UpdateFaction, de pilda mats, drugs, money.

 

De ce am prezentat aceasta metoda? Simplu. Findca una e sa folosesti bucata aia de cod pt update la fiecare comanda, callback si una e sa faci Update(playerid, ceva); si daca o faci bine de prima data bucata aia de cod nu vei avea probleme la update in baza de date folosind functia "Update" decat sa folosesti aceeasi bucata de cod, sa o scri de 100 de ori si din acelea 100 de ori de vro 40-50 de ori sa fie scris gresit ceva, la urma intrebandu-te "De ce mama naibii nu merge?".

 

Prima data am vazut-o la tine si dupa la inca 3 gm-uri(cred ca erau edit-uri) si mi sa parut mai speciala prin simplitate.

Link to comment
Share on other sites

Ai dreptate, dar e mai bine asa, de ce? Pentru ca poate face update la altceva din factiune cu UpdateFaction, de pilda mats, drugs, money.

 

De ce am prezentat aceasta metoda? Simplu. Findca una e sa folosesti bucata aia de cod pt update la fiecare comanda, callback si una e sa faci Update(playerid, ceva); si daca o faci bine de prima data bucata aia de cod nu vei avea probleme la update in baza de date folosind functia "Update" decat sa folosesti aceeasi bucata de cod, sa o scri de 100 de ori si din acelea 100 de ori de vro 40-50 de ori sa fie scris gresit ceva, la urma intrebandu-te "De ce mama naibii nu merge?".

 

Prima data am vazut-o la tine si dupa la inca 3 gm-uri(cred ca erau edit-uri) si mi sa parut mai speciala prin simplitate.

Update(playerid, ceva);

Nu inteleg, este acelasi lucru ce zic eu, doar ca mai ordonat.

Link to comment
Share on other sites

  • WopsS featured this topic

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.

×
×
  • 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.