1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем zxcRemkun, 2 сен 2023.

  1. Автор темы
    zxcRemkun

    zxcRemkun Активный участник

    Баллы:
    61
    Привет! При разработки плагина на 1.12.2 столкнулся с проблемой, суть такая:
    При выходе игрока я сохраняю все его эффекты, например после Яблока Нотча у игрока поглощение 4, что даёт ему 8 золотых сердец. Загвоздка в том, что после того как игрок теряет все или несколько из сердец, эффект поглощения 4 всё ещё остаётся, и если он перезайдёт то снова получит все 8 сердец.
    В голове есть только догадки решения проблемы по типу обработчика полученного урона, если кто-то уже сталкивался с таким и знает другой способ решения проблемы, буду рад если вы им поделитесь.
     
    Последнее редактирование: 2 сен 2023
  2. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
  3. Автор темы
    zxcRemkun

    zxcRemkun Активный участник

    Баллы:
    61
  4. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    https://www.spigotmc.org/threads/get-health-absorbtion-hearts.460446/
    https://www.spigotmc.org/threads/me...unt-of-absorption-hearts-a-player-has.460469/

    Ну, или если только через ведроапи, то да, можно отслеживать дамаг, полученный игроком с поглощением, после которого хп оказалось больше, чем должно было быть.
     
  5. Автор темы
    zxcRemkun

    zxcRemkun Активный участник

    Баллы:
    61
    Ладно я костыль сделал. Если кто-то ещё тоже с таким столкнулся то можете взять за основу мой говнокод на котлине:
    Код:
    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
                    }
                }
            }
        }
    }
     

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