[1.6.X] Как уменьшить опыт игрока на число (не на уровень)?

Статус
В этой теме нельзя размещать новые ответы.

Nao

138
3
Всем привет.
Столкнулся с такой проблемой: метод addExperienceLevel() способен добавлять к текущему уровню отрицательное значение, а метод addExperience() нет.

Каким образом можно вычесть из общего количества опыта игрока, например, 38 единиц? Буду крайне благодарен за ответ.
 
60
0
Может быть, вычесть уровень методом addExperienceLevel(), а потом добавить количество единиц методом addExperience(), чтобы в сумме получилось вычитание нужного тебе количества единиц?
 

Nao

138
3
dimka, может. Вот только, как понять сколько опыта на какой уровень приходится? Ведь в первом уровне гораздо меньше единиц опыта, чем в каком-нибудь десятом.
 
60
0
Nao, можно посмотреть в исходниках (долго), поэтому идем на minecraftwiki и берем оттуда готовую формулу
(уровни 0-34) для опыта (здесь приводить не буду, т. к. она довольно длинная)
 
905
5
Ну есть же player.experienceTotal. *Взрыв сзади*
 

Nao

138
3
laz2727 написал(а):
Ну есть же player.experienceTotal. *Взрыв сзади*
Ха, и ещё много раз ха... Это всего лишь одна из переменных отвечающих за рассчет опыта.

Система выглядит следующим образом:
Код:
/**
     * The current amount of experience the player has within their Experience Bar.
     */
    public float experience;

/** The current experience level the player is on. */
    public int experienceLevel;

/**
     * The total amount of experience the player has. This also includes the amount of experience within their
     * Experience Bar.
     */
    public int experienceTotal;

public int xpBarCap()
    {
        return this.experienceLevel >= 30 ? 62 + (this.experienceLevel - 30) * 7 : (this.experienceLevel >= 15 ? 17 + (this.experienceLevel - 15) * 3 : 17);
    }

/**
     * Add to player's score
     */
    public void addScore(int par1)
    {
        int j = this.getScore();
        this.dataWatcher.updateObject(18, Integer.valueOf(j + par1));
    }

public void addExperience(int par1)
    {
        this.addScore(par1);
        int j = Integer.MAX_VALUE - this.experienceTotal;

        if (par1 > j)
        {
            par1 = j;
        }

        this.experience += (float)par1 / (float)this.xpBarCap();

        for (this.experienceTotal += par1; this.experience >= 1.0F; this.experience /= (float)this.xpBarCap())
        {
            this.experience = (this.experience - 1.0F) * (float)this.xpBarCap();
            this.addExperienceLevel(1);
        }
    }

public void addExperience(int par1)
    {
        this.addScore(par1);
        int j = Integer.MAX_VALUE - this.experienceTotal;

        if (par1 > j)
        {
            par1 = j;
        }

        this.experience += (float)par1 / (float)this.xpBarCap();

        for (this.experienceTotal += par1; this.experience >= 1.0F; this.experience /= (float)this.xpBarCap())
        {
            this.experience = (this.experience - 1.0F) * (float)this.xpBarCap();
            this.addExperienceLevel(1);
        }
    }

 /**
     * Add experience levels to this player.
     */
    public void addExperienceLevel(int par1)
    {
        this.experienceLevel += par1;

        if (this.experienceLevel < 0)
        {
            this.experienceLevel = 0;
            this.experience = 0.0F;
            this.experienceTotal = 0;
        }

        if (par1 > 0 && this.experienceLevel % 5 == 0 && (float)this.field_82249_h < (float)this.ticksExisted - 100.0F)
        {
            float f = this.experienceLevel > 30 ? 1.0F : (float)this.experienceLevel / 30.0F;
            this.worldObj.playSoundAtEntity(this, "random.levelup", f * 0.75F, 1.0F);
            this.field_82249_h = this.ticksExisted;
        }
    }
Я потому и обратился. Надеялся, что кто-то уже разобрался в этом дурдоме когда-то. На столь элементарное действие не хотелось тратить кучу времени, так как и без этого много в чём ещё разобраться предстоит.
 
60
0
Если тема ещё актуальна, то вот мой вариант:
Код:
int experienceTotalEnd = player.experienceTotal() - сколькоНужноВычестьОпыта;
do
{
    player.addExperienceLevel(-1);
} while (player.experienceTotal() >= experienceTotalEnd);
player.addExperience(experienceTotalEnd - player.experienceTotal());
    
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху