Death.kt

Branches > main > bda016e > files / src / main / kotlin / net / bowmap / events / Death.kt

package net.bowmap.events

import net.bowmap.paper.*
import net.bowmap.mc.items.BUG
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor.*
import org.bukkit.Material
import org.bukkit.entity.Entity
import org.bukkit.entity.Player
import org.bukkit.entity.Zombie
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDeathEvent
import org.bukkit.inventory.ItemStack

class Death : Listener {
  // Doesn't use attacker but how the player died does contribute to the death event
  // This should probably be the damage source?
  private fun deathMessage(player: Player, attacker: Entity?): Component {
    return headComponent(player)
    .append(SPACE)
    .append(player.displayName())
    .append(Component.text(" Died.", RED))
  }

  // TODO stats
  private fun onPlayerDeath(e: EntityDeathEvent, player: Player, attacker: Entity?) {
    e.isCancelled = true
    broadcast(deathMessage(player, attacker))
  }

  // There is loot table stuff now :)
  private fun calculateDrops(p: Player, victim: Entity): Set<ItemStack> {
    return if (victim is Zombie) {
      setOf(ItemStack(Material.ROTTEN_FLESH))
    } else {
      setOf(BUG)
    }
  }

  private fun onPlayerKill(e: EntityDeathEvent, player: Player, victim: Entity) {
    debug("player KILLED")
    e.droppedExp = 0
    // TODO Based on loot table?
    player.giveExp(1)
    giveOrDrop(player, calculateDrops(player, victim))
  }

  @EventHandler
  fun onEntityDeath(e: EntityDeathEvent) {
    val victim = e.entity
    val attacker = e.damageSource.causingEntity

    if (victim is Player) {
      onPlayerDeath(e, victim, attacker)
    }

    if (attacker is Player) {
      onPlayerKill(e, attacker, victim)
    }

    e.drops.clear()
  }
}