Jump to content

Cum sa creezi o noua factiune de la 0[PART 3](ultima parte)


WiDuAlK

Recommended Posts

Salutare stimaţi utilizatori, am revenit cu partea a 3-a a tutorialului "Cum să creezi o nouă facţiune de la 0".În tutorialele precedente aţi învăţat cum să adăugaţi facţiunea, cum să faceţi spawn, culoare playerului şi celelalte functi.

În acest tutorial vom face 2 lucruri. Primul lucru este că vom adaugă respectivei facţiuni maşini.Am văzut că se plânge lumea, au adăugat nişte maşini şi că i sau dat peste cap id lor. Ei în tutorialul acesta vom explică de ce se întâmplă această, şi cum să o evităm.
Partea a 2-a a tutorialului va constă în adăugarea GATE-urilor(porţilor) cu restricţie dacă eşti liderul facţiunii x sau membrul facţiunii x.

Ne vom folosi de MAP EDITOR pentru adăugarea mai rapidă a facţiunilor. Dacă nu ştiţi să folosiţi Map Editor, aveţi AICI un tutorial.
Bun , dacă tot am vorbit despre ce o să facem, să îi dăm drumul şi practicii.

Mergem în Map Editor şi plasăm 5 vehicule. Noi în momentul de faţă, nu avem nici un vehicul introdus.Că să vedeţi id vehiculelor mergeţi aici: Vehicule

cAY7J4u.jpg?1

sbF6pRj.jpg?1

Adăugăm vehiculele la publicul OnGameModeInit.

 


    // acestea sunt vehiculele de la PD

    CreateVehicle(596, 1544.9691, -1650.9399, 5.4536, 90.0000, -1, -1, 100);

    CreateVehicle(596, 1544.9491, -1654.9799, 5.4536, 90.0000, -1, -1, 100);

    CreateVehicle(596, 1544.9491, -1658.9999, 5.4536, 90.0000, -1, -1, 100);

    CreateVehicle(596, 1544.9491, -1662.8599, 5.4536, 90.0000, -1, -1, 100);

    CreateVehicle(596, 1544.9491, -1667.7000, 5.4536, 90.0000, -1, -1, 100);


Acum mergem la inceput şi facem un callback de restricţie a id-urilor vehiculelor. Mai întâi vedem în GM id vehiculelor introduse cu "/dl" şi le notăm pe o foaie. Noi am pus 5 vehicule deci id-urile lor sunt 1 , 2 ,3 ,4 , 5.

ATENŢIE!!! Nu este necesar să trecem toate vehiculele pe o foaie. Putem trece doar primul vehicul şi ultimul vehicul, pentru că de ele ne vom folosi.

Mergem în pawn şi facem următoarele:


    forward PoliceCar(carid);// Se creaza callback-ul de restrictie

    public PoliceCar(carid)// se face publicul de restrictie

    {

        if((carid >= 1) && (carid <=5))// daca id la vehicul este intre 1 si 5

        {

            return 1;// ii returnam 1

        }

        return 0;// daca nu se afla intre 1 si 5 nu se returneaza nimic.

    }

Bun , aşa facem şi la celelalte facţiuni, chiar dacă au return 0 la primul callback nu au nici o problema.

Acum că am pus verificarea la id vehiculelor punem şi restricţie. Trebuie să facem următoarele: Mergem la publicul OnPlayerStateChange şi punem aşa:


    public OnPlayerStateChange(playerid, newstate, oldstate)

    {

        new newcar = GetPlayerVehicleID(playerid);// definim newcar ca id masinii in care sa urcat playerul.

        if(PoliceCar(newcar))// daca playerul se afla in masina de politie si

        {

            

            if(P_DATA[playerid][pMember] == 1 || P_DATA[playerid][pLeader] == 1) // daca este membru 1 sau lider 1

            {}// Nu se intampla nimic.

            else//altfel , daca nu este nici lider 1 si nici member 1

            {

                RemovePlayerFromVehicle(playerid); // il scoate din masina

                SendClientMessage(playerid,-1,"Nu faci parte din Police Departament!");// si ii da acest mesaj.

            }

        }

        return 1;

    }

Perfect, acum mergem şi şi verificăm. Vedem că merge totul perfect. Aşa faceţi şi la celelalte facţiuni.

Dacă observaţi, când băgaţi un filescript pe server, filescriptul respectiv conţinând nişte maşini, o să va dea id vehiculelor peste cap.
De ce? Pentru că serverul ia mai întâi ce e pe filescripturi(în ordinea în care aţi adăugat în server.cfg) şi pe urmă ce e în GM, deci cumva dacă aveţi 5 maşini într-un filescript, ele vor avea id 1 2 3 4 5 iar cele de la Police Departament vor avea id 6 7 8 9 10.
Că să nu se întâmple această aveţi posibilitatea de a face 2 chesti.
1) Introduceţi tot filescriptul în GM, vehiculele din fs punându-le ultimele
ori
2)Copiaţi maşinile din fs(filescript) , le puneţi ultimele, ştergeţi din fs vehiculele, compilaţi fs şi compilaţi GM.
Aşa nu veţi mai întâmpina probleme.

Acum că ştim să restricţionăm maşini , mai trebuie şi porţi(gate). Aceste porţi vom face să se deschidă şi să se închidă. Se va închide într-un număr de timp. Noi vom seta 5 secunde pentru a se închide, adică după 5 secunde ce să coborât se va urcă înapoi.

Mergem în map editor şi vom face următoarea:

 

 

Potitia initiala

msvFPWG.jpg?1

Pozitia de coborare

vhzdt8B.jpg?1

Acum mergem în pawn şi definim poartă aşa.


    // la inceputul GM

    new GatePD1;

    //La OnGameModeInit:

    GatePD1 = CreateObject(980, 1586.81323, -1637.93604, 14.95745,   0.00000, 0.00000, 0.00000);

Acum că am definit poartă şi am adăugat-o, luăm poziţia coborâtă, adică unde se va duce poartă, adică o coboram.

Bine , acum am demonstrat că am coborât-o. Voi trebuie să o coborâti sub pământ deoarece nu trebuie să se vadă.
Salvăm undeva ambele coordonate ale obiectului:
-poziţia iniţială
-poziţia coborâtă
adică acestea:


    CreateObject(980, 1586.81323, -1637.93604, 14.95745,   0.00000, 0.00000, 0.00000);// pozitia initiala

    CreateObject(980, 1586.81323, -1637.93604, 9.52512,   0.00000, 0.00000, 0.00000);// pozitia coborata.

Acum trebuie să facem că poartă să se deschidă. Putem face prin 2 metode:
-metodă comenzii
-metodă apăsării pe tasta

Facem mai întâi metodă apăsării pe tasta, cred şi cea mai la îndemână şi elegantă, deoarece playerul nu mai trebuie să stea să scrie /deschidegate(exemplu), ci doar apasă o tasta.
Tastele le luăm de aici: Tasta

După cum am spus, la ambele metode trebuie să apelăm la un timer de move, adică poartă trebuie să coboare, dar şi să se ridice la loc(bine înţeles). Aşa că facem următoarele:

Mergem la publicul OnPlayerKeyStateChange şi punem aşa:


    // alegem o tasta, eu amales tasta KEY_CROUCH deoarece apasa "H" cand e in masina si "C" cand nu este in masina. Voi alegeti orice tasta credeti ca vi s-ar potrivi.

    

    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)

    {

        if (newkeys & KEY_CROUCH )// daca apasa tasta KEY_CROUCH

        {

            if(P_DATA[playerid][pMember] == 1 || P_DATA[playerid][pLeader] == 1)// daca este lider sau member la factiunea cu nr 1(Police Departament)

            {

                if(IsPlayerInRangeOfPoint(playerid, 15, 1586.81323, -1637.93604, 14.95745))// daca este in raza portii

                //1586.81323, -1637.93604, 14.95745 - locatia portii

                //15 - distanta dintre poarta si player, adica daca este la max 15 metri de poarta

                {

                    MoveObject(GatePD1, 1586.81323, -1637.93604, 9.52512, 5.0, 0.00000, 0.00000, 0.00000);// se muta obiectului

                    // GatePD1 - dupa cum am definit obiectul, GatePD1 este poarta noastra

                    // 586.81323, -1637.93604, 9.52512- pozitia lui de coborare

                    // 5.0 viteza de deplasare in jos

                    // 0.00000, 0.00000, 0.00000 - rotatiile acestuia, in cazul nostru nu se roteaza. Rotatiile sunt doar la alegere, dar e mai bine ca sa punem si aceasta pentru a nu intampina probleme

                    SetTimer("MoveGatePd1",5000,0);// apelam la callback-ul MoveGatePd1 pentru a se inchide poarta, adica dupa 5 secunde sa se apeleze la callback

                    SendClientMessage(playerid,-1,"Ai deschis poarta 5 secunde!");// ii da acest mesaj

                }

            }

        }

        return 1;

    }

    // facem si callback-ul la care am apelat:

    forward MoveGatePd1();// cream callback-ul

    public MoveGatePd1()// cream publicul

    {

        MoveObject(GatePD,11586.81323, -1637.93604, 14.95745, 5.0, 0.00000, 0.00000, 0.00000);// mutam poarta

        // la fel ca in pasii de sus

        // GatePD1- obiectul nostru

        // 11586.81323, -1637.93604, 14.95745 - pozitia initiala

        // 5.0 - viteza de deplasare

        // 0.00000, 0.00000, 0.00000 - rotatiile obiectului, in momentul de fata nu se roteste deloc, deoarece a plecat de la aceasi rotatie si a ajuns la aceasi rotatie.

        return 1;// returnam 1.

    }

-Metoda prin comanda

Mergem la OnPlayerCommandText si punem asa:


    if (strcmp("/deschidepoarta", cmdtext, true, 10) == 0)

    {

        if(P_DATA[playerid][pMember] == 1 || P_DATA[playerid][pLeader] == 1)// daca este lider sau member la factiunea cu nr 1(Police Departament)

        {

            if(IsPlayerInRangeOfPoint(playerid, 15, 1586.81323, -1637.93604, 14.95745))// daca este in raza portii

            //1586.81323, -1637.93604, 14.95745 - locatia portii

            //15 - distanta dintre poarta si player, adica daca este la max 15 metri de poarta

            {

                MoveObject(GatePD1, 1586.81323, -1637.93604, 9.52512, 5.0, 0.00000, 0.00000, 0.00000);// se muta obiectului

                // GatePD1 - dupa cum am definit obiectul, GatePD1 este poarta noastra

                // 586.81323, -1637.93604, 9.52512- pozitia lui de coborare

                // 5.0 viteza de deplasare in jos

                // 0.00000, 0.00000, 0.00000 - rotatiile acestuia, in cazul nostru nu se roteaza. Rotatiile sunt doar la alegere, dar e mai bine ca sa punem si aceasta pentru a nu intampina probleme

                SetTimer("MoveGatePd1",5000,0);// apelam la callback-ul MoveGatePd1 pentru a se inchide poarta, adica dupa 5 secunde sa se apeleze la callback

                SendClientMessage(playerid,-1,"Ai deschis poarta 5 secunde!");// ii da acest mesaj

            }

        }

        return 1;

    }

ATENŢIE!!! Noi folosim CreateObject şi MoveObject. Dacă folosiţi STREAMER şi le creaţi cu CreateDynamicObject OBLIGATORIU mutaţi cu MoveDynamicObject, la fel şi invers. Nu va funcţiona nici odată altfel. Eu v-aş recomandă să folosiţi SREAMER-ul şi să creaţi obiectele cu el. De ce? Pentru că limita de obiecte în SĂ-MP este de 1000 de obiecte. De aceea, pentru a va lasă obiectele mai importante să le creaţi cu CreateObject. De ce e pusă această limita? Pentru binele clientului(când intraţi pe un server, voi sunteţi clientul adică jocul, nu serverul) deoarece mănâncă din RAM şi veţi avea lag dacă limita e mai mare sau infinită.

NOTĂ! Ştiu că mulţi dintre voi începători , sau persoane puţin mai avansate citiţi aşa "răsfoind" sau mai deloc de am scris eu după "//" ,dar eu am explicat ce e cu fiecare funcţie şi cum se foloseşte, deoarece dacă nu ştiţi să creaţi aşa ceva , nu veţi putea dezvoltă un server , şi veţi veni la noi şi veţi spune "Nu , că nu ştiu, fă-mi tu.". Eu va explic, şi voi dacă citiţi şi încercaţi o dată, a două oară, a 3-a oară până va iese şi deprindeţi modul de gândire, veţi avansa, altfel nu aveţi cum.

NOTĂ2!! Aveţi măcar bunul simt de a nu copia tutorialul şi a-l poştă în altă parte şi ai modifică creditele. Eu am muncit la aceste tutoriale, am adăugat si diacritice unde sa putut şi am încercat să explic pe cât posibil pe înţelesul tutuor. Această este marea mea rugăminte.

Notă secundară! Dacă va plăcut acest tutorial, dacă va folosit acest tutorial sau dacă măcar îmi respectaţi muncă depusă, daţi + 1 la tutorialele postate de mine. Aşa văd că muncă mea e apreciată , şi voi poştă în continuare tutoriale.

Cam atât a fost cu cele 3 părţi ale tutorialului, am încercat să va prezint cum se face o facţiune de la 0, nu că alte tutoriale pe care le-am văzut, şi care sunt cam pe lângă. Sper că va fost de folos , şi încercaţi să gândiţi când citiţi. Luaţi fiecare funcţie în parte şi o gândiţi, astfel veţi face performanţă.

 

  • Upvote 11
Link to comment
Share on other sites

  • WopsS featured this topic
  • 2 weeks later...
  • 6 months later...
stock PoliceCar( carid )
{
    switch( carid )
    {
        case 1 .. 5: return true;
		default: return false;
    }
    return false;
}

Poate optimizezi si tu putin daca tot le dai un exemplu.

La 7/31/2015la12:21, MrAndrei a spus:

Foarte bun tutorialul !

 

La aceea barier cum se procedeaza? Poti face un tutorial te rog ?

Faci la fel ca si la poarta, iei pozitia de inchis si deschis.

Sinner.png

Link to comment
Share on other sites

Eu nu as merge pe idea de :

 public PoliceCar(carid)// se face publicul de restrictie

    {

        if((carid >= 1) && (carid <=5))// daca id la vehicul este intre 1 si 5

        {

            return 1;// ii returnam 1

        }

        return 0;// daca nu se afla intre 1 si 5 nu se returneaza nimic.

    }

 

deoarece faci verificare pe id masinii si este posibil sa se dea la un moment dat peste cap id-urile lor.

Exemplu, daca introduci un FS cu masini in el o sa faca load mai intai la masinile din FS si apoi din GM, cea ce va duce la modificarea id-urilor masinilor din joc iar masinile de la factiuni vor fi date peste cap.

Exemplu 2: Cand faci dealership-ul o sa se creeze masini personale noi, iar id-ul lor va fi corect, dar dupa restart va fi data peste cap ordinea vehiculelor, si din nou vor exista probleme.

De preferat ar fi metoda:

new CarPD1, CarPD2, CarPD4 ....;

public OnGameModeInit()
{
	CarPD1 = CreateVehicle(...);
	CarPD2 = CreateVehicle(...);
	CarPD3 = CreateVehicle(...);
	CarPD4 = CreateVehicle(...);
	return 1;
}
 public PoliceCar(carid)// se face publicul de restrictie
    {
        if((carid == CarPD1 || carid == CarPD2 || carid == CarPD3 || carid == CarPD4))
        {
            return 1;
        }
        return 0;
    }

Acum, indiferent de id lor nu vor exista probleme.

Link to comment
Share on other sites

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.