Jump to content

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


WiDuAlK

Recommended Posts

Salutare, după cum am şi spus, am revenit cu partea a 2 -a a tutorialului "Cum să creezi o nouă facţiune de la 0". În acest tutorial voi arată cum o să va puneţi locul de spawn, comenzile de enter-exit, iar la enter-exit ne vom juca puţin cu VirtualWorld-urile, şi ne vom juca şi cu 3DText-urile şi Pick-urile. Spawn-ul îl vom face la 2 din facţiuni Police Departament şi Police Blue Berry(cred că aşa se numea acel sat), fiecăruia îi vom pune şi o sala de antrenament, iar la spawnare să primească o culoare, când vorbeşte să arate o culoare, şi să primească diferite beneficii de gen arme, bani sau viaţă plină....
Va mai urmă o ultima parte. O să vedeţi la timpul potrivit în ce va constă şi a 3-a parte, dar să rămânem la "oile noastre" şi să începem.

Pentru început avem nevoie de poziţii, aşa că mergem pe server şi salvăm cateva poziţii.
4 poziţii sunt la Police Departament Los Santos, ele fiind:
1)locul de spawn
2)locul de unde intră poliţistul în secţie(în partea de jos, lângă spawn, o să vedeţi voi)
3)Locul de unde intră civili în secţie
4)Locul de unde va intră şi va ieşi poliţistul din sala de antrenament


Celelalte poziţii sunt la fel, dar sunt poziţiile de la Police Blue Berry.

 

nJcqD13.jpg

mzms9el.jpg

 

VSvKtVq.jpg

PcfmkvO.jpg

yWPM4Bm.jpg

 

ACUM, MERGETI DUPA URMATORII PASI:

R8ky6yi.jpg?1

 

didCfr3.jpg?1

GErPUYS.jpg?1

uT3FJzL.jpg?1

kq9C3eI.jpg?2

IAR NOI NE VOM FOLOSI DE COORDONATELE ACESTEA:

 

NojcEEv.jpg?1

 

O să aveţi nevoie de tutorialul:

Ne vom folosi de aceste coordonate, ele reprezintă poziţiile de spawn în San Andreas:

Acum, că am făcut rost de coordonate, vom merge şi vom face în felul următor. Ne vom uită după interioarele dorite de AICI.
Mergem acum la publicul OnPlayerSpawn şi punem aşa:

public OnPlayerSpawn(playerid)
{
    if(IsPlayerConnected(playerid))//verificăm dacă playerul este conectat
    {
        if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)//verificăm dacă playerul are lider sau member = 1
        {
            SetPlayerPos(playerid,1532.0398, -1677.7267, 5.8906);// dacă va avea lider sau member = 1, sau amândouă sau una dintre ele, îl va spawna la locul unde am vrut,
            //SetPlayerPos- funcţia ; playerid- playerul care se spawneaza, iar restu , sunt coordonatele de la care am plecat, cele din poză pe care le-am scos în evitenta.
            SetPlayerInterior(playerid,0);// nu este într-o clădire sau altcv , deci îi vom seta 0 când se spawneaza
            SetPlayerVirtualWorld(playerid, 0);// îi setăm VirtualWorld-ul 0 , deoarece în virtual world 0 sunt maşinile şi obiectele şi altele, despre virtual world vorbim puţin mai încolo
        }
        else if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)//  verificăm dacă playerul are lider sau member = 2
        {
            SetPlayerPos(playerid, 627.3973, -571.4391, 17.9145);// dacă va avea lider sau member = 2, sau amândouă sau una dintre ele îl va spawna în faţă uşii, va fi acolo şi coordonată de /enter
            SetPlayerInterior(playerid,0);// nu este într-o clădire sau altcv , deci îi vom seta 0 când se spawneaza
            SetPlayerVirtualWorld(playerid, 0);
        }
        else// aici vom verifică dacă nu are lider să îl spawneze la locul dorit
        {
            SetPlayerPos(playerid, 1479.6548, -1725.2207, 13.5469);
            SetPlayerInterior(playerid,0);// nu este într-o clădire sau altcv , deci îi vom seta 0 când se spawneaza
            SetPlayerVirtualWorld(playerid, 0);
        }

    }
    return 1;
}

Aici dacă vrem mai îi adăugăm o armă şi , dacă vrem, îi scădem 50$ la fiecare spawn, pe unele servere era denumit Medic Bill, adică îi da viaţă plină şi de aceea trebuie să plătească taxa de sănătate... doar dacă credeţi că e necesar, poftim şi un model:

    if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// verificăm dacă playerul are lider sau member = 1
    {
        SetPlayerPos(playerid,1532.0398, -1677.7267, 5.8906);
        SetPlayerInterior(playerid,0);
        SetPlayerVirtualWorld(playerid, 0);
        GivePlayerWeapon(playerid, 31, 250);// îi da armă cu id 31(M4A) cu 250 gloanţe
        GivePlayerMoney(playerid,-50);// îi scade suma de 50$ din cont
        SetPlayerArmour(playerid, 100);// pentru că e poliţai îi da şi 100 armură
        //Voi puteţi şterge ce nu va convine, treaba voastră , eu am arătat că se poate şi treaba asta, o putem lungi foarte mult , dar nu cred că are sens
    }

Voi adăugaţi care cum vreţi de preferinţă. Acuma că am făcut spawn ul mergem şi facem comenzile de enter şi exit. Mergem pe site-ul care l-am propus mai sus, şi alegem interiorul, interiorul fiind cu id 6 şi cu poziţia 246.783996,63.900199,1003.640625 , interiorul de la Police Departamant Los Santos.
Facem prin 2 metode. Prima metodă comenzii , comandă e prin zcmd, totu simplu şi uşor , şi metodă 2 , metodă prin tasta, care e mai elegant să o foloseşti, pentru că jucătorul nu se chinuie să scrie "/enter" ci apasă doar o tasta, de preferat F.

Prima metodă(metodă prin comandă):

Mai întâi mergem şi ne punem o ordine în coordonate, adică care sunt de enter, care sunt de spawn , care sunt de intrare, de ieşire, în fine adică de unde îl luăm şi unde îl ducem.
Eu mi-am pus deja o ordine şi facem în felul următor. 2 comenzi /enter şi /exit, ambele fiind pentru toate comenzile.

Aici vreau să va vorbesc despre VirtualWorld-uri . ele pot fi denumite şi "dimensiuni" deoarece 2 playeri pot fi în aceaşi poziţie , dar în VirtualWorld-uri diferite, deci ei nu se văd, dar sunt în aceaşi poziţie nu se văd, nu se ating, cu VirtualWorld vom crea şi sala de antrenament , adică vom folosi acelaşi interior, dar fiecare facţiune va avea virtual World ul ei , pentru că playerii din 2 facţiuni diferite să nu se întâlnească, adică cumva vom avea 2 construcţii identice , dar în zone diferite(sau cu asta putem păcăli necunoscătorii).

mcmd:enter(playerid,params[])
{
    if(IsPlayerConnected(playerid))// verificãm dacã playerul care foloseºte comandã este conectat
    {
        // facem comandã pentru civili:
        if(IsPlayerInRangeOfPoint(playerid,2, 1554.6113, -1675.6897, 16.1953))// verificãm dacã este în jurul coordonatei pe care am salvat-o , primul "2" de lângã playerid reprezintã distanþã dintre poziþie ºi player, adicã 2 metri
        {// dacã este în jurul poziþiei respective, la 2 metri distanþã
            TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
            SetPlayerPos(playerid, 246.783996,63.900199,1003.640625);// îl teleportãm în poziþia interiorului
            SetPlayerInterior(playerid, 6);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
            SetPlayerVirtualWorld(playerid, 1);// îl punem în Virtual World 1 deoarece este în interior, ºi aºa ar fi frumos dacã folosim interiorul.

        }
        // facem comandã pentru poliþist
        if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// verificãm dacã playerul are lider sau member = 1
        {

            if(IsPlayerInRangeOfPoint(playerid,2, 1524.5369, -1677.8561, 6.2188))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei, deci va intrã din parcare în clãdire , nu din faþã clãdirii în clãdire
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                SetPlayerPos(playerid, 246.783996,63.900199,1003.640625);// îl teleportãm în poziþia interiorului
                SetPlayerInterior(playerid, 6);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 1);
            }
            // facem pentru sala de antrenament
            if(IsPlayerInRangeOfPoint(playerid,2, 1568.4191, -1689.9735, 6.2188))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei , locul care vrem sã fie intrarea în sala de antrenament
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);// îl teleportãm în poziþia interiorului
                SetPlayerInterior(playerid, 1);// îi dãm interior = 1, deoarece în acea poziþie, are nevoie de interiorul setat pe 1 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 1);// aici apare virtual world 1
            }
        }
        //dacã nu are lider/member = 1 , ºi folosesc comandã în preajma poziþiei, nu se vor teleporta.

        // voi trece peste enter-ul ºi exitul la facþiunea 2 referitor la interiorul secþiei ºi voi aratã cum mã folosesc la sala de antrenament
        if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)// verificãm dacã playerul are lider sau member = 2
        {
            if(IsPlayerInRangeOfPoint(playerid,2, 611.1915, -583.4981, 18.2109))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în preajma poliþiei BlueBery, locul care vrem sã fie intrarea în sala de antrenament
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);// îl teleportãm în poziþia interiorului
                SetPlayerInterior(playerid, 1);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 2);// aici apare virtual world 2 pentru a nu se întâmpina cu cei de la Police Departament Los Santos
            }
        }
    }
    return 1;
}

Iar în comandă /exit vom înlocui coordonatele de la IsPlayerInRangeOfPoint cu cele de la SetPlayerPos aşa:

mcmd:exit(playerid,params[])
{
    if(IsPlayerConnected(playerid))// verificãm dacã playerul care foloseºte comandã este conectat
    {
        // facem comandã pentru civili:
        if(IsPlayerInRangeOfPoint(playerid,2, 246.783996,63.900199,1003.640625))// verificãm dacã este în jurul coordonatei de la intrare,în faþã uºii în police departament
        {// dacã este în jurul poziþiei respective, la 2 metri distanþã
            TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
            SetPlayerPos(playerid, 1554.6113, -1675.6897, 16.1953);// îl teleportãm în poziþia din parcare
            SetPlayerInterior(playerid, 0);// îi dãm interior = 0 deoarece nu este într-un interior, ci este afarã
            SetPlayerVirtualWorld(playerid, 0);// îl punem în Virtual World 0 deoarece este în parcare ºi maºinile trebuie sã aparã pe harta, ele fiind în virtualWorld 0

        }
        // facem comandã pentru poliþist
        if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// verificãm dacã playerul are lider sau member = 1
        {

            if(IsPlayerInRangeOfPoint(playerid,2, 246.783996,63.900199,1003.640625))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei, deci va intrã din parcare în clãdire , nu din faþã clãdirii în clãdire
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                SetPlayerPos(playerid, 1524.5369, -1677.8561, 6.2188);// îl teleportãm în poziþia din parcare
                SetPlayerInterior(playerid, 0);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 0);// la fel cã sus
            }
            // facem pentru sala de antrenament
            if(IsPlayerInRangeOfPoint(playerid,2, 1412.639892,-1.787510,1000.924377))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei , locul care vrem sã fie intrarea în sala de antrenament
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                SetPlayerPos(playerid, 1568.4191, -1689.9735, 6.2188);// îl teleportãm în poziþia ieºirii
                SetPlayerInterior(playerid, 1);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 1 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 0);// aici îi dãm virtualWorld 0 pentru a apãrea maºinile, el fiind ºi VirtualWorld-ul în care se joacã playerii
            }
        }
        //dacã nu are lider/member = 1 , ºi folosesc comandã în preajma poziþiei, nu se vor teleporta.

        // voi trece peste enter-ul ºi exitul la facþiunea 2 referitor la interiorul secþiei ºi voi aratã cum mã folosesc la sala de antrenament
        if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)// verificãm dacã playerul are lider sau member = 2
        {
            if(IsPlayerInRangeOfPoint(playerid,2, 1412.639892,-1.787510,1000.924377))// verificãm dacã este în jurul coordonatei din interiorul sãlii de antrenament
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                SetPlayerPos(playerid, 611.1915, -583.4981, 18.2109);// îl teleportãm în poziþia de afarã, în faþã secþiei
                SetPlayerInterior(playerid, 0);// îi dãm interior = 0, deoarece în acea poziþie el nu mai este în interior
                SetPlayerVirtualWorld(playerid, 0);// aici apare virtual world 0 la fel cã ºi cel de sus, al Police-ului departament , pentru cã ambele poziþii vor avea ieºire în virtualWorld 0
            }
        }
    }
    return 1;
}

Aţi observat că v-am vorbit de virtual world-uri. ATENŢIE!!!! aveţi grijă cu ele, dacă nu , playerii vor fi rătăciţi printre ele. Am mai spus şi sus, ele sunt făcute că să nu se întâlnească playerii, şi va dau şi un exemplu pe care sigur l-aţi văzut.
Mergem pe un server RPG. Şi aici mergem la benzinărie , în magazin şi vedem un interior. Merge un prieten de-al vostru în alt 24/7 dar când intră, vede acelaşi interior. Ei au intrat unul de la benzinărie , celălalt din altă parte, dar sunt în aceaşi poziţie , dar nu se văd. Asta pentru că sunt în VirtualWorld-uri diferite, dar după ce ies se pot întâlni, pentru că sunt în Virtual World 0. Sper că am lămurit până aici cu interioarele şi virtualWorild-urile.

Metodă a două(metodă prin tasta):

Mai întâi alegem o tasta de AICI. Eu am ales tasta F/ENTER adică "KEY_SECONDARY_ATTACK ". Avem nevoie de public-ul OnPlayerKeyStateChange, iar în comandă vom înlocui în loc de

    CMD:enter(playerid,params[])

cu

    if (newkeys & KEY_SECONDARY_ATTACK)

Şi va sună cam aşa:

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if (newkeys & KEY_SECONDARY_ATTACK)
    {
        // punem poziþiile de enter
        if(IsPlayerConnected(playerid))// verificãm dacã playerul care foloseºte comandã este conectat
        {
            // facem comandã pentru civili:
            if(IsPlayerInRangeOfPoint(playerid,2, 1554.6113, -1675.6897, 16.1953))// verificãm dacã este în jurul coordonatei pe care am salvat-o , primul "2" de lângã playerid reprezintã distanþã dintre poziþie ºi player, adicã 2 metri
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                SetPlayerPos(playerid, 246.783996,63.900199,1003.640625);// îl teleportãm în poziþia interiorului
                SetPlayerInterior(playerid, 6);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 1);// îl punem în Virtual World 1 deoarece este în interior, ºi aºa ar fi frumos dacã folosim interiorul.

            }
            // facem comandã pentru poliþist
            if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// verificãm dacã playerul are lider sau member = 1
            {

                if(IsPlayerInRangeOfPoint(playerid,2, 1524.5369, -1677.8561, 6.2188))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei, deci va intrã din parcare în clãdire , nu din faþã clãdirii în clãdire
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                    TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                    SetPlayerPos(playerid, 246.783996,63.900199,1003.640625);// îl teleportãm în poziþia interiorului
                    SetPlayerInterior(playerid, 6);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                    SetPlayerVirtualWorld(playerid, 1);
                }
                // facem pentru sala de antrenament
                if(IsPlayerInRangeOfPoint(playerid,2, 1568.4191, -1689.9735, 6.2188))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei , locul care vrem sã fie intrarea în sala de antrenament
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                    TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                    // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                    SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);// îl teleportãm în poziþia interiorului
                    SetPlayerInterior(playerid, 1);// îi dãm interior = 1, deoarece în acea poziþie, are nevoie de interiorul setat pe 1 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                    SetPlayerVirtualWorld(playerid, 1);// aici apare virtual world 1
                }
            }
            //dacã nu are lider/member = 1 , ºi folosesc comandã în preajma poziþiei, nu se vor teleporta.

            // voi trece peste enter-ul ºi exitul la facþiunea 2 referitor la interiorul secþiei ºi voi aratã cum mã folosesc la sala de antrenament
            if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)// verificãm dacã playerul are lider sau member = 2
            {
                if(IsPlayerInRangeOfPoint(playerid,2, 611.1915, -583.4981, 18.2109))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în preajma poliþiei BlueBery, locul care vrem sã fie intrarea în sala de antrenament
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);// îl teleportãm în poziþia interiorului
                SetPlayerInterior(playerid, 1);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                SetPlayerVirtualWorld(playerid, 2);// aici apare virtual world 2 pentru a nu se întâmpina cu cei de la Police Departament Los Santos
                }
            }
        }

        // punem ºi poziþiile de exit

        if(IsPlayerConnected(playerid))// verificãm dacã playerul care foloseºte comandã este conectat
        {
            // facem comandã pentru civili:
            if(IsPlayerInRangeOfPoint(playerid,2, 246.783996,63.900199,1003.640625))// verificãm dacã este în jurul coordonatei de la intrare,în faþã uºii în police departament
            {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                SetPlayerPos(playerid, 1554.6113, -1675.6897, 16.1953);// îl teleportãm în poziþia din parcare
                SetPlayerInterior(playerid, 0);// îi dãm interior = 0 deoarece nu este într-un interior, ci este afarã
                SetPlayerVirtualWorld(playerid, 0);// îl punem în Virtual World 0 deoarece este în parcare ºi maºinile trebuie sã aparã pe harta, ele fiind în virtualWorld 0

            }
            // facem comandã pentru poliþist
            if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// verificãm dacã playerul are lider sau member = 1
            {

                if(IsPlayerInRangeOfPoint(playerid,2, 246.783996,63.900199,1003.640625))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei, deci va intrã din parcare în clãdire , nu din faþã clãdirii în clãdire
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                    TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                    SetPlayerPos(playerid, 1524.5369, -1677.8561, 6.2188);// îl teleportãm în poziþia din parcare
                    SetPlayerInterior(playerid, 0);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 6 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                    SetPlayerVirtualWorld(playerid, 0);// la fel cã sus
                }
                // facem pentru sala de antrenament
                if(IsPlayerInRangeOfPoint(playerid,2, 1412.639892,-1.787510,1000.924377))// verificãm dacã este în jurul coordonatei pe care am salvat-o ea fiind în parcarea poliþiei , locul care vrem sã fie intrarea în sala de antrenament
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                    TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                    // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                    SetPlayerPos(playerid, 1568.4191, -1689.9735, 6.2188);// îl teleportãm în poziþia ieºirii
                    SetPlayerInterior(playerid, 1);// îi dãm interior = 6, deoarece în acea poziþie, are nevoie de interiorul setat pe 1 cã sã vadã playerul obiectele, dacã nu , va cãdea în gol
                    SetPlayerVirtualWorld(playerid, 0);// aici îi dãm virtualWorld 0 pentru a apãrea maºinile, el fiind ºi VirtualWorld-ul în care se joacã playerii
                }
            }
            //dacã nu are lider/member = 1 , ºi folosesc comandã în preajma poziþiei, nu se vor teleporta.

            // voi trece peste enter-ul ºi exitul la facþiunea 2 referitor la interiorul secþiei ºi voi aratã cum mã folosesc la sala de antrenament
            if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)// verificãm dacã playerul are lider sau member = 2
            {
                if(IsPlayerInRangeOfPoint(playerid,2, 1412.639892,-1.787510,1000.924377))// verificãm dacã este în jurul coordonatei din interiorul sãlii de antrenament
                {// dacã este în jurul poziþiei respective, la 2 metri distanþã
                    TogglePlayerControllable(playerid, 1);// îl facem sã se poatã miºcã
                    // cãutãm pe forum ul respectiv interiorul de la sala de antrenament, ea având interior = 1, poziþie:1412.639892,-1.787510,1000.924377
                    SetPlayerPos(playerid, 611.1915, -583.4981, 18.2109);// îl teleportãm în poziþia de afarã, în faþã secþiei
                    SetPlayerInterior(playerid, 0);// îi dãm interior = 0, deoarece în acea poziþie el nu mai este în interior
                    SetPlayerVirtualWorld(playerid, 0);// aici apare virtual world 0 la fel cã ºi cel de sus, al Police-ului departament , pentru cã ambele poziþii vor avea ieºire în virtualWorld 0
                }
            }
        }
    }
    return 1;
}

Acum putem testa şi vedem că putem intră în clădiri , putem ieşi, fără nici o problema. Acum , se pune problema , că jucătorul să vadă că acolo se intră, şi marcăm cu un pick-up
şi un text 3D.
Mergem AICI şi căutăm un pick-up care ne convine , şi îl vom crea. Eu am ales pickup cu id 1239.

Mergem la public-ul OnGameModeInit şi adăugăm aşa:

    AddStaticPickUp(model, type, Float:X, Float:Y, Float:Z, Virtualworld)
    model- modelul pickup-ului, în cazul nostru 1239
    type- tipul de pick-up, adică dacă va dispărea , dacă nu, căutaţi pe wiki PickupTypes şi gătiţi detalii
    Float x y z sunt poziţiile
    VirtualWorld este virtual-word-ul în care suntem

Eu voi crea 2 Pick-up-uri şi 2 3Dtext-uri , adică cel de la intrarea în Police Departament a civililor şi unul în secţie.

    Create3DTextLabel(text[], color, Float:X, Float:Y, Float:Z, Float:DrawDistance, virtualworld, testLOS)
    text[] este textul, el se pune între ghilimele ""
    color- culoarea textului
    Float:X, Float:Y, Float:Z poziţiile 3Dtext-ului
    Float:DrawDistance - distanţă maximă de care să se vadă 3DText-ul
    virtualworld- virtualWorld-ul în care se află playerul
    testLOS - reprezintă 2 valori aici 0/1 şi corespund văzului, adică dacă să se vadă prin pereţi sau nu

Mergem la OnGameModeInit şi punem aşa:

    Create3DTextLabel("Apasă F sau scrie /entern pentru a intră!", -1,1554.6113, -1675.6897, 16.1953, 10.0, 0, 0);// textul din faţă poliţiei     Create3DTextLabel("Apasă F sau scrie /exitn pentru a intră!", -1,246.783996,63.900199,1003.640625, 10.0, 1, 0);// textul din interiorul poliţiei     AddStaticPickup(1314, 23, 1554.6113, -1675.6897, 16.1953);// pickup-ul din faţă secţiei de poliţie, observăm că faţă de al 2-lea nu are pus 1, deoarece suntem în Virtual World 0, şi nu mai are rost să punem ",0" la urmă     AddStaticPickup(1314, 23, 246.783996,63.900199,1003.640625,1);// pickup-ul din interiorul secţiei, are virtualWorld 0

Observăm aici că nu au condiţie de interior, deci e un avantaj. Acum mergem , testăm, totul ok şi mai avem nevoie de culoare la facţiune. Mergem AICI şi definim culorile în GM Atenţie în text punem culoarea între paranteze, dar nu oricum ci în felul următor:

    0xAFAFAFAA -> {AFAFAF} deci din culoarea definită "0xAFAFAFAA" am scos "0x AFAFAF AA" AA şi 0x de la început , iar înăutru parantezei sunt celelalte 6 caractere.

Avem mai întâi nevoie de ProxDetector, pentru a vedea de la o limita de distanţă în chat, avem nevoie şi de forech, care îl găsiţi aici şi îl definim:

#define COLOR_FADE1 0xE6E6E6E6
#define COLOR_FADE2 0xC8C8C8C8
#define COLOR_FADE3 0xAAAAAAAA
#define COLOR_FADE4 0x8C8C8C8C
#define COLOR_FADE5 0x6E6E6E6E
forward ProxDetector(Float:radi, playerid, string[], col1, col2, col3, col4, col5);
public ProxDetector(Float:radi, playerid, string[], col1, col2, col3, col4, col5)
{
    if(IsPlayerConnected(playerid))
    {
        new Float:posx, Float:posy, Float:posz;
        new Float:oldposx, Float:oldposy, Float:oldposz;
        new Float:tempposx, Float:tempposy, Float:tempposz;
        GetPlayerPos(playerid, oldposx, oldposy, oldposz);
        foreach(Player, i)
        {

            if(GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid))
            {
                    GetPlayerPos(i, posx, posy, posz);
                    tempposx = (oldposx -posx);
                    tempposy = (oldposy -posy);
                    tempposz = (oldposz -posz);
                    if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
                    {
                        SendClientMessage(i, col1, string);
                    }
                    else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
                    {
                        SendClientMessage(i, col2, string);
                    }
                    else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
                    {
                        SendClientMessage(i, col3, string);
                    }
                    else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
                    {
                        SendClientMessage(i, col4, string);
                    }
                    else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
                    {
                        SendClientMessage(i, col5, string);
                    }
            }
            else
            {
                SendClientMessage(i, col1, string);
            }
        }
    }
    return 0;
}

Acesta îl găsiţi şi pe internet, etc, noi îl vom folosi. Mergem mai întâi să modificăm scrisul în chat, adică la public-ul OnPlayerText şi punem aşa:

public OnPlayerText(playerid, text[])
{
    new strîng[1000];// facem strîng-ul şi text-ul de 1000 de caractere, adică să scrie până la 1000 de caractere(SPACE se ia că caracterd)

    if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// dacă e lider/member 1
    {//scrie în chat(cu T)
        format(strîng, sizeof(strîng), "{2641FE}%s {FFFFFF}: %s", GetName(playerid), text);//observaţi că va fi de genu {2641FE}Widualk: mesaj
        // {2641FE} este culoarea albastră, adică va fi scris Widualk cu albastru dacă sunt poliţist
        // {FFFFFF} - este culoarea alb, şi mesajum meu este cu alb, deci mesaj>alb nume>albastru
        SetPlayerChatBubble(playerid, text, -1, 30.0, 10000);// SetPlayerChatBubble face că mesajul să fie scris deasupra capului, -1 reprezintă culoarea albă
        //-1 reprezintă culoarea albă, 30.0 reprezintă distanţă la care vede celălalt jucător mesajul, în cazul nostru se vede deasupra capului până la distanţă de 30 m
        // 10000> reprezintă timpul adică 10 secunde, 1000 însemnând 1 secundă
        ProxDetector(20.0, playerid, strîng, COLOR_FADE1, COLOR_FADE2, COLOR_FADE3, COLOR_FADE4, COLOR_FADE5);
        // Aici ProxDetector face că textul în chat să fie văzut de la distanţă de 20metri
        //Adică trebuie să ai fi la cel mult 30metri să îi vezi textul deasupra capului şi la max 20 metri să vezi textul în chat
    }
    //la facţiunea 2(Police BlueBerry)
    else if(P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)//dacă e în facţiunea nr 2 că membru/lider/amândouă
    {//şi scrie în chat, o să se întâmple că mai sus.
        format(strîng, sizeof(strîng), "{1E519D}%s {FFFFFF}: %s", GetName(playerid), text);
        SetPlayerChatBubble(playerid, text, -1, 30.0, 10000);
        ProxDetector(20.0, playerid, strîng, COLOR_FADE1, COLOR_FADE2, COLOR_FADE3, COLOR_FADE4, COLOR_FADE5);
    }
    //acum, dacă nu are lider/member la cele de mai sus, adică este civil
    else
    { // este civil şi scrie în chat
        format(strîng, sizeof(strîng), "{FFFFFF}%s {FFFFFF}: %s", GetName(playerid), text);
        //la fel că mai sus, dar numele îi apare cu alb("{FFFFFF}")
        SetPlayerChatBubble(playerid, text, -1, 30.0, 10000);
        ProxDetector(20.0, playerid, strîng, COLOR_FADE1, COLOR_FADE2, COLOR_FADE3, COLOR_FADE4, COLOR_FADE5);
    }
    return 1;
}

Acum, mergem , verificăm, şi mai ramande de făcut un singur lucru, când apăsăm TAB să apară numele cu o culoare. Când te apropi de el, are culoarea albă, noi o modificăm tot cu aceast callback Mergem şi definim un nou callback, şi un public al callback-ului

forward FactionColor(playerid);// definim Callback-ul
public FactionColor(playerid)// facem callback-ul
{
    if(IsPlayerConnected(playerid))// verificăm dacă este conectat
    {
        SetPlayerColor(playerid, COLOR_WHITE);// dacă nu are lider/member într-o facţiune să scrie cu alb

        if(P_Data[playerid][pMember] == 1 || P_Data[playerid][pLeader] == 1)// dacă are lider/member 1
        SetPlayerColor(playerid,COLOR_BLUE);// culoarea playerului este albastră

        if (P_Data[playerid][pMember] == 2 || P_Data[playerid][pLeader] == 2)// dacă are lider/member 2
        SetPlayerColor(playerid,COLOR_BLUE);// culoarea playerului este albastră
    }
    return 1;
}

Acum mergem la OnPlayerSpawn şi adăugăm la urmă:

    //liniile care le avem
    else// aici vom verifică dacă nu are lider să îl spawneze la locul dorit
    {
        SetPlayerPos(playerid, 1479.6548, -1725.2207, 13.5469);
        SetPlayerInterior(playerid,0);// nu este într-o clădire sau altcv , deci îi vom seta 0 când se spawneaza
        SetPlayerVirtualWorld(playerid, 0);
    }
    // asta e ultimul else, şi după el adăugăm:
    FactionColor(playerid);// când se spawneaza să îi dea culoare

Atenţie, dacă sunteţi singur pe server, nu puteţi vedea, deoarece numele vostru e selectat, şi va apărea mereu cu alb, folosiţi tutorialul pentru a testa cu prietenii fără HOST.

 

scuzaţi de întârziere, dar am avut mult de scris... am făcut şi poze, am stat sa pun diacritice, am făcut mai mult decât mi-am propus... DIN FERICIRE PENTRU VOI.

 

Sper am fost de folos cu acest tutorial, am vin cu ultima parte cât de repede am pot. Până dată viitoare PACE!

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

#EDITAT---> MODIFICAT SI VERIFICAT!!

Avea  niste probleme cu diacritice introduse in variabile, pe care nu le observasem.Totul merge in parametri normali in momentul de fata.

 

 

Frumos +1

Intr-adevar frumos, dar hai sa iti zic o treaba. Imi place ca iti spui parerea, daca ii poti zice asa, dar macar daca ai citi un sfert din tutorial, macar daca ar fi cu folos reply tau, adica pun pariu ca acest reply e de a-ti mari numarul de posturi, nu de a iti spune o parere sincera, nui nici o problema, dar macar incearca sa inveti ceva din ce am scris, ca pentru voi am scris, eu le stiu deja.

  • Upvote 2
Link to comment
Share on other sites

  • 2 weeks later...
  • WopsS featured this topic
  • 7 months later...
  • 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.

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