-
Posts
127 -
Joined
-
Last visited
-
Days Won
21
Content Type
Profiles
Forums
News
Documentation
Everything posted by shane
-
Salut @NERS, Iti ofer mai jos un exemplu: new Float: X, Float: Y, Float: Z; if( IsPlayerInRangeOfPoint( playerid, raza_zonei, x_zona, y_zona, z_zona ) ) { if( IsPlayerInAnyVehicle( playerid ) && GetPlayerState( playerid ) == PLAYER_STATE_DRIVER ) { DisableRemoteVehicleCollisions( playerid, true ); Collisions_ON[ playerid ] = true; } } Practic, detectezi daca un jucator se afla in zona respectiva, daca se afla intr-un vehicul si daca este soferul unui vehicul, iar mai apoi, ii dezactiveaza coliziunile. Dupa care vei avea de detectat daca jucatorul a iesit din zona respectiva, si daca are coliziunile activate. Deci va trebui sa creezi o noua variabila (ex: Collisions_ON[ playerid ]), si sa i le dezactivezi. new Float: X, Float: Y, Float: Z; if( !IsPlayerInRangeOfPoint( playerid, raza_zonei, x_zona, y_zona, z_zona ) && Collisions_ON[ playerid ] ) { if( IsPlayerInAnyVehicle( playerid ) && GetPlayerState( playerid ) == PLAYER_STATE_DRIVER ) { DisableRemoteVehicleCollisions( playerid, false ); Collisions_ON[ playerid ] = false; } } Cam asta ar fi. Va trebui sa adaugi totul intr-un timer global.
-
De unde pot incepe sa invat scripting pawn? se merita?
shane replied to thestafy's question in Ajutor Scripting
Salut @thestafy, Eu personal iti recomand acest canal. L-am gasit cu o simpla cutare pe youtube: https://www.youtube.com/c/GroWyTuts Vad ca serie inceputa cu gamemode "de la 0" si e inregistrat pe forum @GroWy. Poate raspunde si la mesaje, nu stiu. Cat despre "daca se merita". Daca te gandesti sa faci avere din asta, nu se merita. Daca te limitezi la dorintele tale, daca vrei sa faci asta din distractie, din pasiune si asa mai de parte, cine te opreste. Eu unul nu o mai fac pe bani de foarte mult timp, am ramas la pasiune pentru un joc din copilarie, iar din cand in cand mai raspuns si la probleme, incerc sa raman si eu in trend cu noile cerinte si mai scriptez in timpul liber daca am chef si idei misto. De asemenea, un mare ajutor ti-l ofera site-ul: wiki.open.mp . Aici vei gasi majoritatea daca nu chiar toate detaliile despre sa-mp scriping (functii, resurse, etc). Multa bafta! -
Hint pentru cine intampina probleme cu accesarea forumului sau wiki sa-mp.com pe archive.org . In cazul in care nu il puteti accesa de pe web.archive.org, o puteti face de pe web-old.archive.org . Mie personal nu mi-a mers acum ceva zile pe web.archive.org
-
Salut @[emy], Nu ai nevoie neaparat de o functie pentru asta. Poti calcula premiul urmator adunand pPrays cu 5. Rezultatul va fi urmatorul: SCMf(playerid, -1, "{28A700}PRAY >> {FFFFFF}You have prayed %d times until now. {FF5D00}Next reward at %d times.", praypoints+1, playerVariables[playerid][pPrayers] + 5); Iar ca sa simplifici si mai mult, ai putea face ceva de genul: new Prays_Rewards[ 6 ] = { 5, 10, 15, 20, 25, 30 }; for( new i = 0; i < 6; i ++ ) { if( playerVariables[ playerid ][ pPrayers ] == Prays_Rewards[ i ] ) { SCMf( playerid, -1, "Case %d", playerVariables[ playerid ][ pPrayers ] ); SCMf( playerid, -1, "{28A700}PRAY >> {FFFFFF}You have prayed %d times until now. {FF5D00}Next reward at %d times.", playerVariables[ playerid ][ pPrayers ], playerVariables[ playerid ][ pPrayers ] + 5 ); break; } } Ti-am dat un exemplu, nu stiu ce vrei sa faci sau cum ai tu format sistemul
-
Salut @JoeMirana, Nu pot sa inteleg care este problema, daca vorbesti romana, fii mai explicit. Daca te referi sa apare un mesaj ucigasului si unul calui omorat, arata in felul urmator: public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart) { if(issuerid != INVALID_PLAYER_ID && weaponid == 27 && bodypart == 9) { if(ActivarHS == 1) { SetPlayerHealth(playerid, 0.0); SendClientMessage(playerid, -1, "You have been headshooted!"); SendClientMessage(issuerid, -1, "HeadShot done!"); } } } EN: If you don't speak romanian, tell the problem in english.
-
Salut @seek nephrite, In primul rand, ai gresit sectiunea. Daca dai scroll putin mai jos in categoria 'Ajutor Scripting', ai un buton mare albastru 'Ask a question'. In alta ordine de idei, din cate vad, skinul nu se salveaza deoarece tu probabil ai randul ClanMemberSkin din tabelul clans, din baza de date, in format INT (intiger, sau numar mai exact), iar tu ii faci salvarea in script in format String (text mai exact). Pentru a face salvarea corecta, trebuie sa convertesti textul pe care il introduci in dialog, in numar, folosind functia "strval". Iti las mai jos un exemplu pe baza scriptului tau, iar de acolo te descurci tu. Daca ai facut singur scriptul de mai sus, nu esti chair incepator. case DIALOG_CLAN1: { if(response) { //------------------------------------------------------------------ new MemberSkin = strval( inputtext ); //------------------------------------------------------------------ if(MemberSkin > 300 || MemberSkin < 0) return ShowPlayerDialog(playerid, 123, DIALOG_STYLE_INPUT, "{FF0000}ERROR: {FFFFFF}Setting Clan Members Skin", "{00FF00}Please Insert Member Skin of the Clan {FF0000}(1-300)", "Select", "Exit"); //------------------------------------------------------------------ if(PlayerInfo[playerid][ClanID] == PlayerInfo[playerid][ClanID]) if(PlayerInfo[playerid][ClanRank] < 2) SetPlayerSkin(playerid, MemberSkin), PlayerInfo[playerid][ClanSkinM] = MemberSkin; mysql_format(DB_Connect, eQuery, sizeof(eQuery), "UPDATE `clans` SET `ClanMemberSkin` = '%d' WHERE `ID` = %d", MemberSkin, PlayerInfo[playerid][ClanID]); mysql_tquery(DB_Connect, eQuery, "", "" ); } else if(PlayerInfo[playerid][ClanID] == 0) ShowPlayerDialog(playerid, 123, DIALOG_STYLE_INPUT, "{FF0000}ERROR: {FFFFFF}Setting Clan Members Skin", "{00FF00}Please Insert Member Skin of the Clan. {FF0000}(1-300)", "Select", "Exit"); } Apropo, daca linia asta ("else if(PlayerInfo[playerid][ClanID] == 0) ShowPlayerDialog(playerid, 123, DIALOG_STYLE_INPUT, "{FF0000}ERROR: {FFFFFF}Setting Clan Members Skin", "{00FF00}Please Insert Member Skin of the Clan. {FF0000}(1-300)", "Select", "Exit");"), reprezinta restrictia urmatoare: Daca jucatorul nu este intr-un clan. [..] Atunci, ar trebui sa faci dialogul in felul urmator: case DIALOG_CLAN1: { if( !response ) return true; if(PlayerInfo[playerid][ClanID] == 0) return true; //------------------------------------------------------------------ new MemberSkin = strval( inputtext ); //------------------------------------------------------------------ if(MemberSkin > 300 || MemberSkin < 0) return ShowPlayerDialog(playerid, 123, DIALOG_STYLE_INPUT, "{FF0000}ERROR: {FFFFFF}Setting Clan Members Skin", "{00FF00}Please Insert Member Skin of the Clan {FF0000}(1-300)", "Select", "Exit"); //------------------------------------------------------------------ if(PlayerInfo[playerid][ClanID] == PlayerInfo[playerid][ClanID]) if(PlayerInfo[playerid][ClanRank] < 2) SetPlayerSkin(playerid, MemberSkin), PlayerInfo[playerid][ClanSkinM] = MemberSkin; mysql_format(DB_Connect, eQuery, sizeof(eQuery), "UPDATE `clans` SET `ClanMemberSkin` = '%d' WHERE `ID` = %d", MemberSkin, PlayerInfo[playerid][ClanID]); mysql_tquery(DB_Connect, eQuery, "", "" ); }
-
Salut @Cristian Nemes, Warningul "loose indentation" inseamna ca liniile tale de cod nu sunt aranjate in spatii egale cu cele din alte linii de cod. Un exemplu care genereaza aceast warning este urmatorul: if(Variabila[playerid] == 1) { SendClientMessage(playerid, -1, "Ceva"); Variabila[playerid] = 2; // LINIA CARE GENEREAZA EROARE, NU ESTE IN RAND CU MESAJUL DE MAI SUS SI VARIABILA DE MAI JOS Variabila_altceva[playerid] = 1; } Deci, pentru a scapa de eroare, codul va arata in felul urmator: if(Variabila[playerid] == 1) { SendClientMessage(playerid, -1, "Ceva"); Variabila[playerid] = 2; Variabila_altceva[playerid] = 1; } Aici ai scriptul tau aranjat: https://pastebin.com/iQ4dVP41 Ai grija sa fie in linie cu restul de script din gm-ul tau.
-
Salut @TheSlim2, Poftim un exemplu foarte simplu: 1. definesti un nou dialog cu numele DIALOG_GET_LICENSES (sau cum vrei sa fie dialogu tau): Exemplu la inceput de gm -> #define DIALOG_GET_LICENSES 999 sau daca le ai in enum, il adaugi acolo. 2. Comanda /getlicenses pe dialog, cea mai buna varianta. YCMD:getlicenses( playerid, params[], help ) { ShowPlayerDialog( playerid, DIALOG_GET_LICENSES, DIALOG_STYLE_TABLIST_HEADERS, "Get licenses", "type\tprice\nDriving Licence\t$100,000\nGun Licence\t$300,000", "Buy", "Close" ); return true; } 3. la OnDialogResponse adaugi noul dialog case DIALOG_GET_LICENSES: { if( !response ) return true; switch( listitem ) { case 0: { PlayerInfo[ playerid ][ pCarLicence ] = 100; } case 1: { PlayerInfo[ playerid ][ pGunLicence ] = 100; } case 2: { //etc } } } Ce iti mai ramane de facut e sa iti adaugi mesajele, sa inlocuiesti variabilele pCarLicence, pGunLicence, etc cu variabilele tale pentru licente, sa faci salvarea lor in baza de date cu functia din gamemodeul tau (Exemplu, pe burned era parca functia 'Update') si sa adaugi restul de licente in comanda /getlicenses si in dialog, dupa exemplu pe care ti l-am oferit. In cazul in care gamemodeul tau nu foloseste switch in dialoguri, adica daca ai spre exemplu la OnDialogResponse, dialogurile in felul urmator: if(dialogid == DIALOG_CEVA) { } else if(dialogid == DIALOG_ALTCEVA) { } Atunci, in loc de "case DIALOG_GET_LICENSES:" vei folosi -> if( dialogid == DIALOG_GET_LICENSES ) sau else if( dialogid == DIALOG_GET_LICENSES) In cazul in care gamemodeul tau nu e pe YCMD (adica daca comenzile tale sunt asa-> CMD:ceva(playerid, params[]), in loc de YCMD:ceva(playerid, params[], help), atunci comanda /getlicenses va arata asa -> CMD:getlicenses( playerid, params[] )
-
Salut @cobalt_thekiller, In primul rand, ai putea detecta factiunea in functie de id-ul din baza de date. Spre exemplu, daca seiful are id 1, inseamna ca e seiful factiunii LSPD, daca are id 5, e seiful mafiei Aztecas. Asta e doar un sfat si probabil o medota de rezolvare a problemelor tale. Cat despre restul, ai oferit prea putine informatii sa primesti un raspuns. Pe viitor, adauga scripturile folosite spre exemplu, sau ofere niste detalii din care sa inteleaga membrii. Exemplu de informatii necesare pentru problema ta: comanda /order, functia care incarca datele din baza pentru seifuri, comanda /fdeposit, locul in care se creaza textele si / sau obiectele seifului, etc.
-
@GEORGIKAA Daca folosesti Y_Timers, timerul arata in felul urmator: timer Attach_Trailer[ 1000 ]( playerid, trailerid ) { if( !IsPlayerInVehicle( playerid, JobVehicle[ playerid ] ) ) return true; new Float: pX, Float: pY, Float: pZ, Float: vX, Float: vY, Float: vZ; GetPlayerPos( playerid, pX, pY, pZ ), GetVehiclePos( trailerid, vX, vY, vZ ); if( ( floatabs( pX - vX ) < 100.0 ) && ( floatabs( pY - vY ) < 100.0 ) && ( floatabs( pZ - vZ ) < 100.0 ) && ( trailerid != GetPlayerVehicleID( playerid ) ) ) AttachTrailerToVehicle( trailerid, GetPlayerVehicleID( playerid ) ); return true; } // in dialogul tau, cand selectezi cursa, adaugi -> defer Attach_Trailer( playerid, Trailer[ playerid ] ); Daca ai timerele default, procedezi in felul urmator: function Attach_Trailer( playerid ) { if( !IsPlayerInVehicle( playerid, JobVehicle[ playerid ] ) ) return true; new Float: pX, Float: pY, Float: pZ, Float: vX, Float: vY, Float: vZ; GetPlayerPos( playerid, pX, pY, pZ ), GetVehiclePos( Trailer[ playerid ], vX, vY, vZ ); if( ( floatabs( pX - vX ) < 100.0 ) && ( floatabs( pY - vY ) < 100.0 ) && ( floatabs( pZ - vZ ) < 100.0 ) && ( Trailer[ playerid ] != GetPlayerVehicleID( playerid ) ) ) AttachTrailerToVehicle( Trailer[ playerid ], GetPlayerVehicleID( playerid ) ); return true; } // in dialogul tau, cand selectezi cursa, adaugi -> SetTimerEx( "Attach_Trailer", 1000, false, "i", playerid );
-
Salut @GEORGIKAA, Pai nu e ok, pentru ca in momentul in care tu opresti jobul, acea remorca o sa trebuiasca sa fie distrusa, si in loc sa fie distrus vehiculul cu id-ul remorcii, o sa fie distrus vehiculul cu id 1 de pe server. Iar pentru problema cu remorca, am impresia ca trebuie sa o pui intr-un timer si sa o atasezi acolo. Parca era problema asta pe sa-mp. Mai verifica daca nu cumva resetezi si variabila JobVehicle atunci cand dai iti creaza vehiculul de la job (/work sau ce ai tu). In cazul in care iti seteaza iar id 1, stergi si de acolo.
-
Poftim @Raduq, OnVehiclePaintjob -> https://wiki.open.mp/docs/scripting/callbacks/OnVehiclePaintjob Faza cu Save Component e probabil o functie creata manual, nu o gasesc. Ori nu au adaugat-o baietii. Poti cauta mai multe aici -> https://wiki.open.mp/docs/
-
Salut @Raduq, E posibil sa le ai definite dupa ce folosesti mai sus. Spre exemplu tu sa le ai definite la sfarsitul gmului, iar ele sa fie apelate la inceput. Nu mai stiu sigur daca asta ar fi cauza unei probleme dar poti incerca.
-
Salut @Raduq, Problema nu e de la comanda /spawncar sau atunci cand intri/iesi din masina. Problema e ca la tine dupa ce un vehicul este despawnat (distrus), nu se reseteaza variabilele de la el, cum ar fi cine detine acel vehicul, id-ul vehiculului din variabila, iar de fiecare data cand spawnezi o masina, aceasta va avea acel id de la vechea masina care a fost despawnata si va primi variabilele de la masina respectiva. Ca sa rezolvi problema asta pur si simplu cauti functia sau locurile in care iti despawnezi tu vehiculele personale si resetezi variabilele pe 0 sau -1 (sau cum ai tu sistemul, nu stiu).
-
Salut @seek nephrite, Ori ai in /stats in loc de %d, trecut %s sau alt "format", ori ai probleme cu comanda prin care iti setezi admin si vip, ori nu iti salveaza corect datele in variabila pAdmin (ex), respectiv pVIP (exemplu, tu poate ai altfel). Era de ajutor sa postezi si comenzile prin care setezi admin, respectiv helper si comanda /stats
-
Salut @Raduq, Formatul corect pentru dialogurile create folosind easyDialog este urmatoarea: (EXEMPLU) Dialog:MY_GARAGE(playerid, response, listitem) { //condul tau return true; } Ce e diferit? DIALOG este scris cu litere mici (doar prima fiind mare) -> Rezultat: Dialog
-
Salut @Rivalry, Conform scriptului tau, trebuie sa fii admin duty pentru a te teleporta pe harta. Foloseste comanda /aduty sau /aod pentru a te pune admin-duty. Cat despre faza cu teleportul la casa, folosesti comanda /spawnchange pentru a-ti schimba locul de spawnare.
-
Salut @Flaviu11, Stiu ca exista o posibilitate prin care poti detecta asta folosind sampcac, asta in cazul mafiotilor. In rest nu am idee.
-
Foloseste stock in loc de function.
-
Salut @GEORGIKAA, Acel task resprezinta un timer al librariei YSI, daca ai libraria YSI in gamemode si desigur, ai inclus include-ul Y_Timers la inceputul gamemodeului (#include), iti recomand sa il lasi asa. In primul rand, acel "2000" semnifica numarul de milisecunde in care sa se apeleze taskul respectiv (sau functia daca vrei sa-i spui asa). Idee e ca nu ai trecut bine acel "2000" in task, pentru ca nu se scrie cu paranteze rotunde, ci cu paranteze patrate, iar dupa acela se mai adauga inca odata paranteze rotunde care semnifica locul in care poti adauga anumiti parametri. Exemplu de task corect: task teamStart[ 2000 ]( ) Daca nu ai Y_Timers, si primesti erori cand compilezi, erori cu legatura la linia asta de la task, atunci va trebui sa te folosesti de sistemul clasic, care arata in felul urmator: La OnGameModeInit, la sfarsit, vei adauga urmatoarea linie -> SetTimer( "teamStart", 2000, true ); "teamStart" = numele functiei "2000" = sa se apeleze la 2 secunde (doar ca se scrie in milisecunde in script), eventual poti scrie 1000 * 2 (adica 2 secunde) "true" = daca sa se repete timerul sau nu (mai exista varianta "false", care inseamna ca nu se repeta). Apoi, vei crea functia foarte simplu: function teamStart() { //restul de cod din scriptul tau return true; }
-
Salut @GEORGIKAA, Trebuie sa returnezi stringul in functiile fistTeam si secondTeam: return string; Exemplu: function firstTeam(team) { new string[20]; switch(team) { case 1: string = "FC Gilau West"; case 2: string = "CFR Cluj"; case 3: string = "Barcelona"; case 4: string = "Everton"; case 5: string = "Werder Bremen"; case 6: string = "Hoffenheim"; } return string; } Si apropo, nu ai nevoie de un string de 128 de caractere in functie, ca ce ai tu scris pe acolo nu depaseste nici macar 15, dar pune 20 in caz ca mai adaugi vr-o echipa cu un nume mai lung. Exemplu cum ti-am pus in codul de mai sus.
-
Salut @Narcis-4, Daca ce ti s-a spus mai sus nu te-a ajutat, procedeaza in felul urmator: Inchide XAMPP (de tot) Mergi in folderul in care ai instalat XAMPP, dupa care il folderul mysql -> data Sterge fisierul ibdata1 Deschide XAMPP si verifica daca mai ai problema respectiva. Problema ta ar trebui sa fie rezolvata. Daca tot nu s-a rezolvat, reinstaleaza XAMPP cu o versiunea mai veche. Si apropo, data viitoare, posteaza-ti problema aici -> https://www.sa-mp.ro/forums/forum/355-ajutor-scripting/
-
Salut @TheSlim2, O sa-ti ofer si eu un exemplu. In primul rand, daca serverul tau ruleaza pe procesorul de comenzi al librariei YSI, adica YCMD, atunci comanda ta va arata in felul urmator: YCMD:info( playerid, params[], help ) { SendClientMessage( playerid, -1, "Info:" ); SendClientMessage( playerid, -1, "- primul mesaj" ); SendClientMessage( playerid, -1, "- al doilea mesaj" ); // etc return true; } Cum iti dai seama daca serverul ruleaza pe YCMD? Foarte simplu, cauti cu CTRL+F textul "YCMD", iar daca rezultatele cautarii seamana cu comanda pe care ti-am dat-o mai sus, atunci serverul ruleaza pe YCMD. In cazul in care serverul tau ruleaza pe ZCMD, atunci in loc urmatoarea linie de cod ("YCMD:info( playerid, params[], help ) {"), vei folosi urmatoarea linie: CMD:info( playerid, params[] ) {. Acum, sa iti explic ce este functia SendClientMessage. O traducere in limba romana ar fi urmatoarea: Trimite Mesaj Catre Jucator. SendClientMessage = trimite mesaj catre jucator playerid = id-ul jucatorului care foloseste comanda respectiva, adica /info (acesta va ramane asa, nu va fi schimbat) -1 = culoarea mesajului. Tu poti schimba culoarea oricum doresti. Va trebui sa folosesti doar culori in format HEX. Exemplu: 0xFF0000FF = culoara rosu. Poti cauta pe internet un generator pentru culori in acest format
-
Run time error 19: "File or function is not found"
shane replied to alex_13's question in Ajutor Scripting
Verifica daca versiunea pluginului mysql e lafel cu cea a mysql.inc (din folderul pawno/include/). Poate ai schimbat doar fisierele din plugins cand ai schimbat versiunea mysql, iar de mysql.inc ai uitat. Mai pe scurt, le reinstalezi iar. Si nu uita sa compilezi gamemodeu. In plus, daca nu ai facut o, instaleaza urmatoarele: -
Run time error 19: "File or function is not found"
shane replied to alex_13's question in Ajutor Scripting
Salut @alex1333, Ai adaugat in linia plugins inca odata plugins (plugins plugins mysql.so sscanf.so etc). In plus, muta crashdetect.dll inainte de streamer.dll, ca nu ti-l ia nici pe ala. Dupa, daca nu mai ai alte probleme prin gamemode, ar trebui sa porneasca.
