DaNn 4 Odesláno: 4. Srpen, 2020 Share Odesláno: 4. Srpen, 2020 Zdravím, hledal jsem všude různé XP / Level systémy ale žadný z ních není který bych potřeboval já. Jen se chci zeptat zdá-li někdo neví o nějakým level / xp systému který má něco takového. XP: 0 / 7500 Po překročení 7500 XP hráči dá LEVEL up + XP: 7500 / 17500 napr. Doufam ze to nekdo chape, diky za rady. Hezky den. Link to comment Share on other sites More sharing options...
DaNn 4 Odesláno: 4. Srpen, 2020 Author Share Odesláno: 4. Srpen, 2020 A nebo takhle, vytvoril jsem tohle: new Level[MAX_PLAYERS]; new XP[MAX_PLAYERS]; new XPpotreba[MAX_PLAYERS]; forward LevelUP(playerid); public LevelUP(playerid) { new Potreba = XP_potreba(playerid); if(Level[playerid] == 0 && XP[playerid] >= 7500) { Level[playerid] = 1; XP[playerid] -= 7500; GivePlayerMoney(playerid, 10000); SendClientMessage(playerid, 0x84E812AA, "Úspěšně jste dosáhl Levelu 1, jako odměnu jste dostali 10,000$"); } if(Level[playerid] == 1 && XP[playerid] >= 17500) { Level[playerid] = 2; XP[playerid] -= 17500; GivePlayerMoney(playerid, 20000); SendClientMessage(playerid, 0x84E812AA, "Úspěšně jste dosáhl Levelu 2, jako odměnu jste dostali 20,000$"); } XPpotreba[playerid] = Potreba; return 1; } stock XP_potreba(playerid) { switch(Level[playerid]) { case 0: return 7500; case 1: return 17500; } return 1; } Ale pri dosazeni XP tak to neda LEVEL UP nevim proc a jede to furt ++++ XP jako napr: 7600/7500 rozumite. Prosim pomoc :(( Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 4. Srpen, 2020 Globální moderátor Share Odesláno: 4. Srpen, 2020 (upraveno) před 1 hodinou, Zahradnik said: new XPpotreba[MAX_PLAYERS]; je uplně k ničemu když se podíváš před 1 hodinou, Zahradnik said: stock XP_potreba(playerid) { switch(Level[playerid]) { case 0: return 7500; case 1: return 17500; } return 1; } je dost overkill na to co potřebuješ zkus toto: new level_xp[] = {0, 7500, 17500}; //na lvl 0 potřebuješ 0, na level 1 potřebuješ 7500 atd... z toho vychází krásná kontrola ve tvé fci jaký má level a zda chce update levelu: if(Level[playerid] == 0 && XP[playerid] >= level_xp[1]) vzhledem k tomu, že toto budeš používat často, doporučuji na toto udělat fci: stock isPlayerLevelUpgradable(playerid){ return level_xp[Level[playerid]+1] < XP[playerid]; } fce ti zjistí, zda má dostat lvl navíc nebo ne. Užití: if(isPlayerLevelUpgradable(playerid)) { //zasloužím si další lvl, udělej co chceš } užití pak v celku nějak takto: forward LevelUP(playerid); public LevelUP(playerid) { new Potreba = XP_potreba(playerid); if(isPlayerLevelUpgradable(playerid)) { Level[playerid]++; //přidám mu level a pokračuju switch(Level[playerid]) { case 1: { //když dostal lvl 1 GivePlayerMoney(playerid, 10000); SendClientMessage(playerid, 0x84E812AA, "Úspěšně jste dosáhl Levelu 1, jako odměnu jste dostali 10,000$"); } case 2: { //když dostal lvl 2 GivePlayerMoney(playerid, 10000); SendClientMessage(playerid, 0x84E812AA, "Úspěšně jste dosáhl Levelu 2, jako odměnu jste dostali 10,000$"); } } LevelUP(playerid); //znovu zkontrolovat, zda nemá dostat další lvl. } return 1; } nezapomeň callback LevelUP volat ve chvílích, kdy mi dáváš XP, aby to hned kontrolovalo, zda má mít novej lvl. Edited 4. Srpen, 2020 by Hip Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 4. Srpen, 2020 Share Odesláno: 4. Srpen, 2020 Nejlepší je na to si zařídit funkci, která ti bude po určité akci, zabití, připojení apod. zjistí, zda má hráč dostatečný počet XP na level up. I když lepší by byl asi timer, ale když je public pomalu na cokoliv co hráč udělá, na odpojení, připojení, střelba, umrtí, respawnutí... No to je na tobě. První co, tak si deklarovat pár proměnných, stačí na to dvě: (Jediné co, tak hráč musí začínat s levelem 1. Může i s 0 ale bude mít insta level up, jestli chceš zakomponovat i level 0, tak pak musíš požadovanou hodnotu XP jen posunout). new PlayerXP[MAX_PLAYERS], // Počet XP, které hráč má LevelXP[MAX_PLAYERS]; // Počet levelů, který hráč má A k tomu ještě i 1 makro, které se pak bude hodit na cyklus, vysvětlení později. Je to makro, který určí maximální level, kterého může hráč dosáhnout: #define MAX_PLAYER_LEVEL (255) Začneme s fukncí: Jednoduchou podmínku, jestliže má více a nebo stejně XP, než kolik potřebuje... CheckPlayerXP(playerid) { if (PlayerXP[playerid] >= (3 * LevelXP[playerid] * 500)) LevelXP[playerid]++; Tady příchází ale problém... Pokud hráč dostane víc XP, třeba na 3 levely, tak funkce ale provede jen jediný level up. Řešení, které mě napadá je znovu opakovat předešlou podmínku (nemá návratovou hodnotu, takže fce bude stále pokračovat) a zjistit, zda stále má více XP než potřebuje: if (PlayerXP[playerid] > (3 * LevelXP[playerid] * 500)) { Pak už jen na to hodit cyklus. Princip je prostý. Cyklus bude stále pokračovat tím, že k proměnné počet bude přičítat 1 dokud nezjistí, že na další level hráč už nemá XP. Jamile na to narazí. cyklus přeruší a hráči nastaví level, který mu zjistil cyklus: new i = 0, pocet = LevelXP[playerid]; while (i < MAX_PLAYER_LEVEL) { if (PlayerXP[playerid] >= (2 * pocet * 500)) pocet++; else { LevelXP[playerid] = pocet; break; } i++; } Link to comment Share on other sites More sharing options...
DuFF 79 Odesláno: 4. Srpen, 2020 Share Odesláno: 4. Srpen, 2020 (upraveno) před 18 hodinami, Scydo said: Nejlepší je na to si zařídit funkci, která ti bude po určité akci, zabití, připojení apod. zjistí, zda má hráč dostatečný počet XP na level up. Ja by som toto zakomponoval skôr do funkcie, ktorou budem zvyšovať XP hráča. Rovno by som mu v nej zvýšil level, ak by to bolo možné a zavolal nejaký callback, napr. OnPlayerLevelIncreased(playerid), ktorý by mal na starosti odmeny za nový level (toľkokrát, na koľko levelov by mal hráč XP). // Edit: prikladám kód pre zmätených (netestoval som) Spoiler #include <a_samp> #define MAX_PLAYER_LEVEL 255 #define XP_FOR_KILL 50 new gPlayerLevel[MAX_PLAYERS]; new gPlayerXP[MAX_PLAYERS]; new const gMinumumXPForLevel[MAX_PLAYER_LEVEL + 1] = { 0, 7500, 17500, ... }; public OnPlayerDeath(playerid, killerid, reason) { if (killerid != INVALID_PLAYER_ID) // teoreticky zbytočná podmienka GivePlayerXP(killerid, XP_FOR_KILL); return 1; } forward OnPlayerLeveledUp(playerid); public OnPlayerLeveledUp(playerid) { new newLevel = GetPlayerLevel(playerid); switch(newLevel) { case 1: { // odmena za lvl 1 } case 2: { // odmena za lvl 2 } // ... } } stock GivePlayerXP(playerid, xp) { if (!SetPlayerXP(playerid, GetPlayerXP(playerid) + xp)) return 0; while (CanPlayerLevelUp(playerid)) IncreasePlayerLevel(playerid); return 1; } stock CanPlayerLevelUp(playerid) { if (!IsPlayerConnected(playerid)) return 0; new currentPlayerLevel = GetPlayerLevel(playerid); if (currentPlayerLevel >= MAX_PLAYER_LEVEL) return 0; new nextPlayerLevel = currentPlayerLevel + 1; return gMinumumXPForLevel[nextPlayerLevel] <= GetPlayerXP(playerid); } stock IncreasePlayerLevel(playerid) { if (!SetPlayerLevel(playerid, GetPlayerLevel(playerid) + 1)) return 0; CallLocalFunction("OnPlayerLeveledUp", "d", playerid); return 1; } stock GetPlayerLevel(playerid) { if (!IsPlayerConnected(playerid)) return 0; return gPlayerLevel[playerid]; } stock GetPlayerXP(playerid) { if (!IsPlayerConnected(playerid)) return 0; return gPlayerXP[playerid]; } // Iba na interné použitie stock SetPlayerXP(playerid, xp) { if (!IsPlayerConnected(playerid)) return 0; gPlayerXP[playerid] = xp; return 1; } stock SetPlayerLevel(playerid, level) { if (!IsPlayerConnected(playerid)) return 0; gPlayerLevel[playerid] = level; return 1; } Edited 5. Srpen, 2020 by DuFF 1 Link to comment Share on other sites More sharing options...
DaNn 4 Odesláno: 4. Srpen, 2020 Author Share Odesláno: 4. Srpen, 2020 Omg, vyzkouším všechno možný. Děkuji všem za pomoc 😄 Link to comment Share on other sites More sharing options...
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