Помогите Странности в уроне энтити слайма

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Ку!

Сразу к делу: сам слайм не наследуется от EntityMonster, в связи с чем просто поставить ему атрибут на инит нельзя. Потратив аж 5 минут времени нашел метод collide, в нем нашел метод дамага энтити - e(EntityLiving entity).

PHP:
protected void e(EntityLiving entityliving) {
    int i = this.getSize();

    if(this.hasLineOfSight(entityliving) && this.h(entityliving) < 0.6D * (double)i * 0.6D * (double)i && entityliving.damageEntity(DamageSource.mobAttack(this), (float)this.di())) {
        this.a(SoundEffects.gY, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
        this.a(this, entityliving);
    }
}

protected int di() {
    return this.getSize();
}
Такой код представляет а-ля дефолт, что в принципе, совпадает с информацией с википедии.
При столкновении наносится урон, равный размеру слизня, кроме маленьких слизней (нулевой размер)
Но урон, наносимый игроку, не совпадает с указанным. Я перезаписал метод di() на возвращение числа 15, но получил 8.5.

Спустя некоторое время, я выявил, что приближенное значение можно получить по формуле damage + (damage * 0.75f) + 2, но стоит запомнить, что эта формула дает приближенные значения, как сказано выше. По-факту, она в принципе подстроена под именно возврат 15.0 дамага.

При 7.0 получается урон 8.0, при 15.0 получается 15.0, т.д.

Жду идеи по этому поводу 😉
 
Кстати, интересный факт, подтверждающий то, что урон изменяется: наноситься урон, возвращаемый методом di(), который отдает просто размер слизня, а размер, как понятно, является классом int.

Проще говоря: наносимый в теории урон - int.
 
Минут 20 назад заметил еще один интересный факт: сила атаки зависит также от сложности игры. Еще страннее то, что не нашел учета такой мелочи в коде ._. (при сложности hard урон умножился в 3 раза от заданного)
 
Чо, никто в НМСке глубоко не шарился в системе пвп? :/

UPD: только сейчас понял, что даже не назвал версии. Сорян, spigot 1.12, R0.1-SNAPSHOT-b1634
 
Когда писал еще одного энтити заметил, что у него также урон уменьшается, из чего сделал вывод, что проблема не в слайме. Проблема заключалась в том, что урон, получаемый от мобов к EntityHuman, был в зависимости от уровня сложности игры.

PHP:
public boolean damageEntity(DamageSource damagesource, float f) {
    if (this.isInvulnerable(damagesource)) {
        return false;
    } else if (this.abilities.isInvulnerable && !damagesource.ignoresInvulnerability()) {
        return false;
    } else {
        this.ticksFarFromPlayer = 0;

        if (this.getHealth() <= 0.0F) {
            return false;
        } else {
            if (this.isSleeping() && !this.world.isClientSide) {
                this.a(true, true, false);
            }

            if (damagesource.r()) {
                if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL) {
                    return false;
                }

                if (this.world.getDifficulty() == EnumDifficulty.EASY) {
                    f = Math.min(f / 2.0F + 1.0F, f);
                }

                if (this.world.getDifficulty() == EnumDifficulty.HARD) {
                    f = f * 3.0F / 2.0F;
                }
            }

            boolean damaged = super.damageEntity(damagesource, f);

            if (damaged) {
                this.releaseShoulderEntities();
            }

            return damaged;
        }
    }
}

Проблема решена; тему закрываю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх