WiDuAlK Posted March 21, 2015 Posted March 21, 2015 (edited) 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 antrenamentCelelalte poziţii sunt la fel, dar sunt poziţiile de la Police Blue Berry. ACUM, MERGETI DUPA URMATORII PASI: IAR NOI NE VOM FOLOSI DE COORDONATELE ACESTEA: 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. Mă 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 că am fost de folos cu acest tutorial, am să vin cu ultima parte cât de repede am să pot. Până dată viitoare PACE! Edited March 21, 2015 by WiDuAlK.SaMp 9 @WiDuAlK Tutorial`s: PAWN pentru SA:MP in Notepad++Tutorial Register-Login MYSQL R39 Tutorial etape de register Cum sa creezi un PayDay (2 METODE)Cum sa creezi o factiune de la 0 PART 1 Cum sa creezi o factiune de la 0 PART 2 Cum sa creezi o factiune de la 0 partea a 3-a (ULTIMA)Functii folositoare din NEW.PWN Tutorial Engine Vehicle Optimizare simplitate si stil Foreach inlocuieste loop-ul SSCANF si ZCMD Cum sa creezi o poarta miscatoare Tutorial cum sa creezi un radio pe server si cum sa iti creezi melodi pentru ascultat pe server Cum sa tii un server din PC folosind HAMACHI Documentatie* Despre hack-uri Servicii: Servicii Scripting & Mapping Produse: Farmer Job Realistic Drugs Dealer System [SA-MP] UNIQUE
WiDuAlK Posted March 21, 2015 Author Posted March 21, 2015 #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. 2 @WiDuAlK Tutorial`s: PAWN pentru SA:MP in Notepad++Tutorial Register-Login MYSQL R39 Tutorial etape de register Cum sa creezi un PayDay (2 METODE)Cum sa creezi o factiune de la 0 PART 1 Cum sa creezi o factiune de la 0 PART 2 Cum sa creezi o factiune de la 0 partea a 3-a (ULTIMA)Functii folositoare din NEW.PWN Tutorial Engine Vehicle Optimizare simplitate si stil Foreach inlocuieste loop-ul SSCANF si ZCMD Cum sa creezi o poarta miscatoare Tutorial cum sa creezi un radio pe server si cum sa iti creezi melodi pentru ascultat pe server Cum sa tii un server din PC folosind HAMACHI Documentatie* Despre hack-uri Servicii: Servicii Scripting & Mapping Produse: Farmer Job Realistic Drugs Dealer System [SA-MP] UNIQUE
mrtea Posted March 29, 2015 Posted March 29, 2015 Multumesc +1 Dar poti face tutorial pentru crearea Factiunii TCC stii ca acolo are chestii de tractat era pe vechiul HP un sistem supper :|
goshuas6e Posted March 4, 2016 Posted March 4, 2016 (edited) Frumos Tutorial. Edited March 4, 2016 by goshuas6e
NighTeN Posted August 4, 2019 Posted August 4, 2019 Foarte frumos explicat, eu sincer am citit doar un sfer din el(cred), deoarece nu am nevoie sa stiu astea momentan, oricum succes
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now