Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Работа с PotionEffect в слайм мирах

zxcRemkun

Активный участник
Баллы
61
Привет! При разработки плагина на 1.12.2 столкнулся с проблемой, суть такая:
При выходе игрока я сохраняю все его эффекты, например после Яблока Нотча у игрока поглощение 4, что даёт ему 8 золотых сердец. Загвоздка в том, что после того как игрок теряет все или несколько из сердец, эффект поглощения 4 всё ещё остаётся, и если он перезайдёт то снова получит все 8 сердец.
В голове есть только догадки решения проблемы по типу обработчика полученного урона, если кто-то уже сталкивался с таким и знает другой способ решения проблемы, буду рад если вы им поделитесь.
 
Последнее редактирование:
https://www.spigotmc.org/threads/get-health-absorbtion-hearts.460446/
https://www.spigotmc.org/threads/me...unt-of-absorption-hearts-a-player-has.460469/

Ну, или если только через ведроапи, то да, можно отслеживать дамаг, полученный игроком с поглощением, после которого хп оказалось больше, чем должно было быть.
 
Ладно я костыль сделал. Если кто-то ещё тоже с таким столкнулся то можете взять за основу мой говнокод на котлине:
Код:
class PlayerDamageManager : Listener {
    var newAmplifier: Int? = null
    var hasAbsorption: Boolean? = null
    val damageToAbsorption = hashMapOf<String, Int>()

    operator fun get(name: String) = damageToAbsorption[name]

    operator fun get(player: Player) = get(player.name)

    fun invalidate(name: String) = damageToAbsorption.remove(name)

    fun increase(name: String, damage: Double) {
        val currentDmg = get(name)
        if (currentDmg != null) {
            damageToAbsorption[name] = (currentDmg + damage).toInt()
        } else {
            damageToAbsorption[name] = damage.toInt()
        }
    }

    @EventHandler
    fun onEntityDamageEntity(event: EntityDamageByEntityEvent) {
        val player = event.entity
        if (player is Player) {
            handleAbsorptionHP(player, event.damage)
        }
    }

    @EventHandler
    fun onPlayerGetDamage(event: EntityDamageEvent) {
        val player = event.entity
        if (player is Player) {
            handleAbsorptionHP(player, event.damage)
        }
    }
    @EventHandler
    fun onPlayerConsume(event: PlayerItemConsumeEvent) {
        val item = event.item
        if (item.type == Material.GOLDEN_APPLE) {
            damageManager.hasAbsorption = true
            damageManager.invalidate(event.player.name)
        }
    }

    fun handleAbsorptionHP(player: Player, damage: Double) {
        if (player.hasPotionEffect(PotionEffectType.ABSORPTION)) {
            increase(player.name, damage)

            val currentDmg = get(player)!!
            val pet = player.getPotionEffect(PotionEffectType.ABSORPTION)
            val absHP = (pet.amplifier + 1) * 4
            if (currentDmg > absHP) {
                player.removePotionEffect(PotionEffectType.ABSORPTION)
                hasAbsorption = false
                invalidate(player.name)
            } else {
                if (currentDmg >= 1) {
                    if (currentDmg % 4 == 0) {
                        val newAbsLevel = ((absHP - currentDmg) / 4)
                        newAmplifier = newAbsLevel
                    } else if (currentDmg % 4 >= 2) {
                        val newAbsLevel = ((absHP - currentDmg) / 4)
                        newAmplifier = newAbsLevel
                    } else if (currentDmg % 4 == 1) {
                        val newAbsLevel = ((absHP - currentDmg) / 4) + 1
                        newAmplifier = newAbsLevel
                    }
                } else {
                    newAmplifier = pet.amplifier
                }
            }
        }
    }
}
 

Поделиться этой страницей

Назад
Верх