Jump to content

shane

Membru
  • Posts

    124
  • Joined

  • Last visited

  • Days Won

    19

Everything posted by shane

  1. 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
  2. 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.
  3. 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, "", "" ); }
  4. 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.
  5. 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[] )
  6. 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.
  7. @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 );
  8. 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.
  9. shane

    Wiki

    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/
  10. shane

    Erori

    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.
  11. 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).
  12. 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
  13. 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
  14. 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.
  15. Salut @Flaviu11, Stiu ca exista o posibilitate prin care poti detecta asta folosind sampcac, asta in cazul mafiotilor. In rest nu am idee.
  16. shane

    26 erori

    Foloseste stock in loc de function.
  17. 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; }
  18. shane

    26 erori

    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.
  19. 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/
  20. 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
  21. 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:
  22. 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.
  23. Salut @Rivalry, In primul rand, iti recomand sa muti speedometrul intr-un timer ceva mai mare, deoarece OnPlayerUpdate se apeleaza odata la milisecunda daca imi aduc bine aminte, sau ceva pe acolo. In alta ordine de idei, fuelul nu scade deoarece nu ai adaugat nicaieri un script prin care acesta sa scada. Pentru a face asta, avand in vedere ca nu ai libraria YSI, pe care ti-o recomand sa o cauti pe forum, va trebui sa creezi un nou timer, de preferat sa se apeleze odata la 20-30 de secunde. Acesta ar trebui sa arate in felul urmator: public OnGameModeInit( ) { SetTimer( "Vehicle_Fuel", 1000 * 20, true ); //practic, de aici porneste timerul cand porneste serverul, ai grija sa pui doar functia SetTimer in publicul OnGameModeInit, nu sa introduci iar OnGameModeInit in script. Intelegi ce zic. Se va repeta odata la 20 de secunde return true; } forward Vehicle_Fuel( ); public Vehicle_Fuel( ) { foreach( new i : Player ) { if( IsPlayerLogged[ i ] && IsPlayerInAnyVehicle( i ) && GetPlayerState( i ) == PLAYER_STATE_DRIVER ) { new vehicleid = GetPlayerVehicleID( i ); if( !IsAbicycle( vehicleid ) && vehicle_Engine[ vehicleid ] ) { // aici verifici daca nu e bicicleta si daca motorul este pornit if( carfuel[ vehicleid ] > 0 ) carfuel[ vehicleid ] --; // aici scade benzina in cazul in care este mai mare de 0 else GameTextForPlayer( i, "Ai ramas fara benzina!", 5000, 3 ); // aici, daca nu mai ai benzina si te afli in vehicul, iti va aparea textul respectiv } } } return true; } Cam asta ar fi cea mai simpla metoda dupa parerea mea. Va trebui sa mai adaugi tu niste variabile noi, cum ar fi IsPlayerLogged ca sa verifici daca jucatorul este logat pe server (daca a introdus parola corecta si l a bagat pe server). In cazul in care nu vrei sa folosesti, sau din alte motive, schimbu IsPlayerLogged[ i ] cu IsPlayerConnected( i ). De asemenea, mai ai variabila Vehicle_Engine[ vehicleid ], care verifica daca motorul vehiculului este pornit, va trebui sa o adaugi sau sa o scoti din script daca nu vrei sa o folosesti.
  24. Salut @Miki Romania, Asta s-ar putea sa te ajute:
  25. Salut @Andrei-Madalin Hizan, Rezolvarea e foarte simpla. Cauti scriptul care scade Fuel-ul de la vehicule si adaugi o exceptie, care arata in felul urmator: if(!IsABike(GetPlayerVehicleID(playerid))) { //restul de cod pe care il ai } Daca esti pe un gamemode "de la 0", vei avea nevoie de functia IsABike, pe care o gasesti in aproape orice GM de pe net. Daca ai un gamemode descarcat de pe net, mai mult ca sigur deja ai functia respectiva. Practic, traducerea in romana a exceptiei de mai sus e urmatoarea: Daca nu este o bicicleta vehiculul in care se afla jucatorul, atunci benzina scade. Apropo, deoarece mai mult ca sigur scriptul prin care benzina scade e folosit intr-un timer, probabil va trebui sa detectezi jucatorul cu "i", sau in loc de GetPlayerVehicleID, poti folosi o variabila definita deja de tine in script, cum ar fi "vehicleid". Cat despre modalitatea prin care sa nu-ti mai apara benzina la speedometru, procedezi tot cu acelasi script. if(!IsABike(GetPlayerVehicleID(playerid))) PlayerTextDrawSetString //etc, restu de cod de la fuel
×
×
  • 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.