Death.kt
Branches > main > a347d46 > files / src / main / kotlin / net / bowmap / events / Death.kt
package net.bowmap.events
import net.bowmap.paper.*
import net.bowmap.server.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()
}
}