Jump to content

Problema level UP ++


Gasi244

Recommended Posts

Saluut !

Am nevoie de ajutorul vostru pentru urmatoarea problema. 

Am facut un sys. de level UP foarte simplu dar treaba sta in urmatorul fel.

Nu stiu ce conditie sa scriu ca sa-mi scada doar XP-ul cerut si nu tot ! Dupa cum puteti vedea in codul meu acum imi scade tot XP-ul dar daca folosesc conditia pusa de mine atunci va face level-ul in prostie... Dar  daca folosesc comanda intr-un CMD atunci comanda merge perfect, 0 bugs. 

Personal , chestia asta ma depaseste putin si imi da cu virgula . :)) 

Aveti solutii?

if(PlayerInfo[playerid][LVL] < 6)
    {
    if(PlayerInfo[playerid][Exp] >= 75 * PlayerInfo[playerid][LVL])
    {
    PlayerInfo[playerid][Exp] = 0;
    /*PlayerInfo[playerid][MinusXP] -= 75 * PlayerInfo[playerid][LVL];
    PlayerInfo[playerid][Exp] -= PlayerInfo[playerid][MinusXP];*/
    PlayerInfo[playerid][LVL] += 1, Announce(playerid, "~w~~h~Level UP~n~~r~~h~~h~Felicitari!!", 4000, 3);
    return 0;// only for you
    }
   }

 

Link to comment
Share on other sites

16 hours ago, Gasi244 said:

Saluut !

Am nevoie de ajutorul vostru pentru urmatoarea problema. 

Am facut un sys. de level UP foarte simplu dar treaba sta in urmatorul fel.

Nu stiu ce conditie sa scriu ca sa-mi scada doar XP-ul cerut si nu tot ! Dupa cum puteti vedea in codul meu acum imi scade tot XP-ul dar daca folosesc conditia pusa de mine atunci va face level-ul in prostie... Dar  daca folosesc comanda intr-un CMD atunci comanda merge perfect, 0 bugs. 

Personal , chestia asta ma depaseste putin si imi da cu virgula . :)) 

Aveti solutii?


if(PlayerInfo[playerid][LVL] < 6)
    {
    if(PlayerInfo[playerid][Exp] >= 75 * PlayerInfo[playerid][LVL])
    {
    PlayerInfo[playerid][Exp] = 0;
    /*PlayerInfo[playerid][MinusXP] -= 75 * PlayerInfo[playerid][LVL];
    PlayerInfo[playerid][Exp] -= PlayerInfo[playerid][MinusXP];*/
    PlayerInfo[playerid][LVL] += 1, Announce(playerid, "~w~~h~Level UP~n~~r~~h~~h~Felicitari!!", 4000, 3);
    return 0;// only for you
    }
   }

 

Bun, in primul rand faci o variabila sub variabila new PlayerInfo[MAX_PLAYERS][pInfo] (sau cum ti-ai notat-o tu , eu du pe general) faci o variabila 

new lvlexp = 3 (eu am dat un exemplu tu o denumesti cum vrei) (acum sa iti explic despre ce este vorba cu "3")

De este egal cu 3?

Bun pai aceasta variabila te va ajuta la calcularea nivelului de exp pe fiecare level 
Un exemplu eu mi-am pus in felul urmator:

xpneeded = level*lvlexp ( aceasta variabila imi calculeaza nivelul de exp care il am nevoie pe fiecare nivel, level la mine este egal cu variabila de level, adica: level = PlayerInfo[playerid][pLevel], iar lvl exp este definit este deja definit sub variabila PlayerInfo[MAX_PLAYERS][pInfo])

Intr-un cuvant daca am lvl 1 imi v-a trebuii 3 rp pentru nivelul urmator, daca am nivel 2 imi v-a trebuii 6 puncte rp, si tot asa la fiecare level, deoarece 1*3=3, 2*3=6, etc. Daca vreti mai mult puteti pune 4 si devine 1*4=4 pentru nivel 2, 2*4=8 rp pentru nivel 3 , si tot asa. Voi decideti cate puncte rp doriti.

Foarte bine, acum ca ai definit cat exp iti trebuie pe fiecare nivel sa continuam. (ATENTIE!! daca nu doresti sa faci ca bine poti face si o alta variabila level care sa fie egal cu un numar si sa le calculezi in xpneeded , depinde cum doresti tu)

Acum ca am definit cat exp avem nevoie cum punem in stats(bine inteles daca vrei sa pui) si in comanda levelup:

(ATENTIE!! pasul 1 se aplica si la stats si la comanda levelup este la fel)

1. Facem 2 new-uri sau un new si punem virgula si un spatiu intre ele ex: new variabila1, variabila2;

Deci v-a fi asa :

new level = PlayerInfo[playerid][pLevel],  //(este un exemplu tu poate ai PData[platerid][pNivel] , pui ce ai tu)

         xpneeded = level*lvlexp;     

2. La stats puneti la Respect Point sau cum ati denumit voi experienta:

format(str, sizeof(str), "Respect Points  %d/%d", PlayerInfo[playerid][pExp], xpneeded);   

SCM(playerid, culoarea, str);

Bun dar de ce asa si nu altfel:

Pai explicatia este urmatorea: formatul, formateaza mesajul in felul in care doriti, apoi str si sizeof(str) este variabila de stocare care trebuie definita la inceputul scriptului de status cu new str[144] pentru mesaje va sfatuiesc maxim 144 deoarece acesta este maximul acceptat de samp plus cu cu cat mai mici arrayurile deoarece asa se numesc , cu atat nu o sa fie lag sau risc de design pe serverul dumneavoastra. Daca mesajul este scurt gen Buna ziua %s , ..[pName] puteti pune str[30].

Respect Points %d/%d acest mesaj il v-a arata playerului respectiv cand v-a tasta comanda /stats, %d/%d acestea sunt niste semne ajutatoare la citirea variabilelor, %d- este pentru cifre, %s- pentru litere si %e- pentru ambele plus semne ca [] @ etc. 

, PlayerInfo[playerid][pExp], xpneeded acestea doua sunt de fapt ce ne v-a arata unde am pus %d. ATENTIE!! trebuie puse in ordinea care doriti sa o citeasca pentru a arata cum doriti dumneavoastra. in exemplu prima data v-a citi experienta care o detine playerul , apoi experienta necesara pentru level up).

Bun asa formatam un mesaj, acum trebuie sa il si trimita nu? Trimiterea se face in felul urmator:

SendClientMessage(playerid, culoarea, str);  , bun dar ce inseamna fiecare variabila din SendClientMessage (care este fuctia de a trimite mesaj playerului),

pai playerid este pentru cine tasteaza, exemplu: eu scriu /stats ca vreau sa vad statusu si dau enter atunci eu sunt playerid , apoi culoarea este culoarea care o dotiti puteti pune COLOR_MESAJ ca exemplu daca o aveti definita la inceputu gamemodeului. sau cod html a culorii, ca sa le aflati scrieti pe google color picker pawno si se gaseste imediat, iar ultimul str reprezinta ce mesaj sa afiseze , noi cum l-am formatat mai sus cu un rand in str trebuie pus str.

Bun am facut explicatiile pentru functii si stats, acum sa trecem la comanda level up.

dupa verificarea daca este playerul online incepem 

pasul 1 il punem si aici.

apoi sa vedem daca punctele de exp care le are este mai mare sau daca este macar egal cu cele necesare

if(IsPlayerConnected(playerid)) // aceasta este verificarea daca playerul este conectat, bine inteles daca nu ati facut o variabila de verificare daca este logat

{

if(PlayerInfo[playerid][pExp] >= xpneeded)      // astfel fericam daca exp care il are playerul este sau nu mai mare sau egal cu exp necesar , iar daca este executa

{

PlayerInfo[playerid][pExp] = PlayerInfo[playerid][pExp] - xpneeded;  // aici facem ca exp daca este mai mare ca necesar sa nu il seteze pe 0 sa il scada doar //(atentie daca denumiti si PlayerInfo[playerid][pExp] in exp exemplu , sa nu cumva sa puneti exp = exp - xpneeded, pentru ca nu poate citi intr-o variabila, de 2 ori //aceeasi denumire, sincer nu stiu exact daca asta este explicatia, dar este testata de mine faza, deci veti pune PlayerInfo[playerid][pExp] = exp -xpneeded;)

PlayerInfo[playerid][pLevel] ++;   // aici daca are experienta necesara sau este mai mare decat cea necesara face intai scaderea apoi ii da nivel up

// acum sa ne dea un mesaj ca am dat nivel up

format(str, sizeof(str), "Acum ai nivelul: %d", P_Date[playerid][pLevel]);
SCM(playerid, COLOR_YELLOW, str);
// explicatia pentru format si SCM o aveti mai sus , eu am SCM deoarece la inceput de gm am definit #define SCM SendClientMessage pentru a imi usura munca //la scriere

} // daca este mai mare sau egal am facut dar acum ce facem daca este mai mic 

else //// punem un else , semnificatia: un if poate avea si else , daca nu este indeplinita conditia de mai sus punem else si punem sa faca altceva

{

format(str, sizeof(str), "Nu ai suficiente Puncte de Nivel pentru a trece la urmatorul nivel!");   // ii spunem ca nu are suficienta experienta pentru a avansa
SCM(playerid, COLOR_RED, str);
format(str, sizeof(str), "Detii %d Puncte Nivel din %d", exp, xpneeded);   // si aici ii spunem cata experienta are si cata are nevoie 
SCM(playerid, COLOR_WHITE, str);

}

return 1; (sau return true; daca folositi procesorul YCMD, eu folosesc YCMD)

}

 

 

Cam asa se face sistemu-l de nivel si experienta , bineinteles daca sunteti pe baza de date mysql trebuie sa ii faceti si update cu mysql_format si mysql_query, sau daca aveti o funtie deja definite aceste lucruri cu swich si ce trebuie puneti numelefunctiei(playerid, type). 

Sper ca te-a ajutat sa intelegi cum se facem un sistem de nivel si experienta cum doresti tu sa faci , daca da nu uita sa dai un + (si eu am fost invatat si eu invat pe altii la randul meu) 

  • Thanks 1
Link to comment
Share on other sites

31 minutes ago, Andrei Catalin said:

Bun, in primul rand faci o variabila sub variabila new PlayerInfo[MAX_PLAYERS][pInfo] (sau cum ti-ai notat-o tu , eu du pe general) faci o variabila 

new lvlexp = 3 (eu am dat un exemplu tu o denumesti cum vrei) (acum sa iti explic despre ce este vorba cu "3")

De este egal cu 3?

Bun pai aceasta variabila te va ajuta la calcularea nivelului de exp pe fiecare level 
Un exemplu eu mi-am pus in felul urmator:

xpneeded = level*lvlexp ( aceasta variabila imi calculeaza nivelul de exp care il am nevoie pe fiecare nivel, level la mine este egal cu variabila de level, adica: level = PlayerInfo[playerid][pLevel], iar lvl exp este definit este deja definit sub variabila PlayerInfo[MAX_PLAYERS][pInfo])

Intr-un cuvant daca am lvl 1 imi v-a trebuii 3 rp pentru nivelul urmator, daca am nivel 2 imi v-a trebuii 6 puncte rp, si tot asa la fiecare level, deoarece 1*3=3, 2*3=6, etc. Daca vreti mai mult puteti pune 4 si devine 1*4=4 pentru nivel 2, 2*4=8 rp pentru nivel 3 , si tot asa. Voi decideti cate puncte rp doriti.

Foarte bine, acum ca ai definit cat exp iti trebuie pe fiecare nivel sa continuam. (ATENTIE!! daca nu doresti sa faci ca bine poti face si o alta variabila level care sa fie egal cu un numar si sa le calculezi in xpneeded , depinde cum doresti tu)

Acum ca am definit cat exp avem nevoie cum punem in stats(bine inteles daca vrei sa pui) si in comanda levelup:

(ATENTIE!! pasul 1 se aplica si la stats si la comanda levelup este la fel)

1. Facem 2 new-uri sau un new si punem virgula si un spatiu intre ele ex: new variabila1, variabila2;

Deci v-a fi asa :

new level = PlayerInfo[playerid][pLevel],  //(este un exemplu tu poate ai PData[platerid][pNivel] , pui ce ai tu)

         xpneeded = level*lvlexp;     

2. La stats puneti la Respect Point sau cum ati denumit voi experienta:

format(str, sizeof(str), "Respect Points  %d/%d", PlayerInfo[playerid][pExp], xpneeded);   

SCM(playerid, culoarea, str);

Bun dar de ce asa si nu altfel:

Pai explicatia este urmatorea: formatul, formateaza mesajul in felul in care doriti, apoi str si sizeof(str) este variabila de stocare care trebuie definita la inceputul scriptului de status cu new str[144] pentru mesaje va sfatuiesc maxim 144 deoarece acesta este maximul acceptat de samp plus cu cu cat mai mici arrayurile deoarece asa se numesc , cu atat nu o sa fie lag sau risc de design pe serverul dumneavoastra. Daca mesajul este scurt gen Buna ziua %s , ..[pName] puteti pune str[30].

Respect Points %d/%d acest mesaj il v-a arata playerului respectiv cand v-a tasta comanda /stats, %d/%d acestea sunt niste semne ajutatoare la citirea variabilelor, %d- este pentru cifre, %s- pentru litere si %e- pentru ambele plus semne ca [] @ etc. 

, PlayerInfo[playerid][pExp], xpneeded acestea doua sunt de fapt ce ne v-a arata unde am pus %d. ATENTIE!! trebuie puse in ordinea care doriti sa o citeasca pentru a arata cum doriti dumneavoastra. in exemplu prima data v-a citi experienta care o detine playerul , apoi experienta necesara pentru level up).

Bun asa formatam un mesaj, acum trebuie sa il si trimita nu? Trimiterea se face in felul urmator:

SendClientMessage(playerid, culoarea, str);  , bun dar ce inseamna fiecare variabila din SendClientMessage (care este fuctia de a trimite mesaj playerului),

pai playerid este pentru cine tasteaza, exemplu: eu scriu /stats ca vreau sa vad statusu si dau enter atunci eu sunt playerid , apoi culoarea este culoarea care o dotiti puteti pune COLOR_MESAJ ca exemplu daca o aveti definita la inceputu gamemodeului. sau cod html a culorii, ca sa le aflati scrieti pe google color picker pawno si se gaseste imediat, iar ultimul str reprezinta ce mesaj sa afiseze , noi cum l-am formatat mai sus cu un rand in str trebuie pus str.

Bun am facut explicatiile pentru functii si stats, acum sa trecem la comanda level up.

dupa verificarea daca este playerul online incepem 

pasul 1 il punem si aici.

apoi sa vedem daca punctele de exp care le are este mai mare sau daca este macar egal cu cele necesare

if(IsPlayerConnected(playerid)) // aceasta este verificarea daca playerul este conectat, bine inteles daca nu ati facut o variabila de verificare daca este logat

{

if(PlayerInfo[playerid][pExp] >= xpneeded)      // astfel fericam daca exp care il are playerul este sau nu mai mare sau egal cu exp necesar , iar daca este executa

{

PlayerInfo[playerid][pExp] = PlayerInfo[playerid][pExp] - xpneeded;  // aici facem ca exp daca este mai mare ca necesar sa nu il seteze pe 0 sa il scada doar //(atentie daca denumiti si PlayerInfo[playerid][pExp] in exp exemplu , sa nu cumva sa puneti exp = exp - xpneeded, pentru ca nu poate citi intr-o variabila, de 2 ori //aceeasi denumire, sincer nu stiu exact daca asta este explicatia, dar este testata de mine faza, deci veti pune PlayerInfo[playerid][pExp] = exp -xpneeded;)

PlayerInfo[playerid][pLevel] ++;   // aici daca are experienta necesara sau este mai mare decat cea necesara face intai scaderea apoi ii da nivel up

// acum sa ne dea un mesaj ca am dat nivel up

format(str, sizeof(str), "Acum ai nivelul: %d", P_Date[playerid][pLevel]);
SCM(playerid, COLOR_YELLOW, str);
// explicatia pentru format si SCM o aveti mai sus , eu am SCM deoarece la inceput de gm am definit #define SCM SendClientMessage pentru a imi usura munca //la scriere

} // daca este mai mare sau egal am facut dar acum ce facem daca este mai mic 

else //// punem un else , semnificatia: un if poate avea si else , daca nu este indeplinita conditia de mai sus punem else si punem sa faca altceva

{

format(str, sizeof(str), "Nu ai suficiente Puncte de Nivel pentru a trece la urmatorul nivel!");   // ii spunem ca nu are suficienta experienta pentru a avansa
SCM(playerid, COLOR_RED, str);
format(str, sizeof(str), "Detii %d Puncte Nivel din %d", exp, xpneeded);   // si aici ii spunem cata experienta are si cata are nevoie 
SCM(playerid, COLOR_WHITE, str);

}

return 1; (sau return true; daca folositi procesorul YCMD, eu folosesc YCMD)

}

 

 

Cam asa se face sistemu-l de nivel si experienta , bineinteles daca sunteti pe baza de date mysql trebuie sa ii faceti si update cu mysql_format si mysql_query, sau daca aveti o funtie deja definite aceste lucruri cu swich si ce trebuie puneti numelefunctiei(playerid, type). 

Sper ca te-a ajutat sa intelegi cum se facem un sistem de nivel si experienta cum doresti tu sa faci , daca da nu uita sa dai un + (si eu am fost invatat si eu invat pe altii la randul meu) 

Multumesc pentru tutorial :) 

Personal am nevoie doar de "PlayerInfo[playerid][pExp] = PlayerInfo[playerid][pExp] - xpneeded" dar apreciez efortul tau ! 

GM-ul meu nu are puncte de respect si nu e full RPG. Experienta la mine se face mult mai usor fata de un server de RPG , joburile, misiunile sau diverse minigame-uri sunt diferit gandite fata de ce e pe un RPG clasic , care e prea greu de jucat pentru mine :)) Necesita prea mult timp 

 

 

Edited by Gasi244
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.