Jump to content

pomoc XP & Level systém


DaNn

Recommended Posts

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

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

  • Globální moderátor
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 by Hip
Link to comment
Share on other sites

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

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 by DuFF
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...