From 202e359e81390b966a582b5d3954d12826fe1686 Mon Sep 17 00:00:00 2001 From: Moritz Ruth Date: Sun, 14 Jun 2020 14:03:22 +0200 Subject: [PATCH] Fix damage reduction for Warrior --- .../spigot_ttt/game/GameListener.kt | 31 ++++++++++--------- .../spigot_ttt/game/classes/impl/Stuntman.kt | 22 ++++--------- .../spigot_ttt/game/classes/impl/Warrior.kt | 11 ++----- .../spigot_ttt/game/players/TTTPlayer.kt | 4 ++- .../game/players/TTTPlayerDamageEvent.kt | 22 +++++++++++++ 5 files changed, 51 insertions(+), 39 deletions(-) create mode 100644 src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDamageEvent.kt diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt index ac25bbb..f5c348c 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt @@ -9,6 +9,7 @@ import com.comphenix.protocol.wrappers.PlayerInfoData import de.moritzruth.spigot_ttt.TTTPlugin import de.moritzruth.spigot_ttt.game.players.* import de.moritzruth.spigot_ttt.plugin +import de.moritzruth.spigot_ttt.utils.call import de.moritzruth.spigot_ttt.utils.nextTick import org.bukkit.ChatColor import org.bukkit.Material @@ -86,22 +87,24 @@ object GameListener : Listener { val tttPlayer = TTTPlayer.of(event.entity as Player) ?: return if (event.cause == EntityDamageEvent.DamageCause.CUSTOM) return - if (tttPlayer.player.health - event.finalDamage <= 0) { - val reason = when (event.cause) { - EntityDamageEvent.DamageCause.FALL -> DeathReason.FALL - EntityDamageEvent.DamageCause.BLOCK_EXPLOSION, - EntityDamageEvent.DamageCause.ENTITY_EXPLOSION -> DeathReason.EXPLOSION - EntityDamageEvent.DamageCause.DROWNING -> DeathReason.DROWNED - EntityDamageEvent.DamageCause.FIRE, - EntityDamageEvent.DamageCause.FIRE_TICK, - EntityDamageEvent.DamageCause.LAVA, - EntityDamageEvent.DamageCause.HOT_FLOOR -> DeathReason.FIRE - EntityDamageEvent.DamageCause.POISON, EntityDamageEvent.DamageCause.WITHER -> DeathReason.POISON - else -> DeathReason.SUICIDE - } + val reason = when (event.cause) { + EntityDamageEvent.DamageCause.FALL -> DeathReason.FALL + EntityDamageEvent.DamageCause.BLOCK_EXPLOSION, + EntityDamageEvent.DamageCause.ENTITY_EXPLOSION -> DeathReason.EXPLOSION + EntityDamageEvent.DamageCause.DROWNING -> DeathReason.DROWNED + EntityDamageEvent.DamageCause.FIRE, + EntityDamageEvent.DamageCause.FIRE_TICK, + EntityDamageEvent.DamageCause.LAVA, + EntityDamageEvent.DamageCause.HOT_FLOOR -> DeathReason.FIRE + EntityDamageEvent.DamageCause.POISON, + EntityDamageEvent.DamageCause.WITHER -> DeathReason.POISON + else -> DeathReason.SUICIDE + } + val e = TTTPlayerDamageEvent(tttPlayer, event.finalDamage, reason).call() + + if (tttPlayer.player.health - e.damage <= 0) { tttPlayer.onDeath(reason, null) - event.damage = 0.0 } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Stuntman.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Stuntman.kt index d17c980..d23dd84 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Stuntman.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Stuntman.kt @@ -1,33 +1,23 @@ package de.moritzruth.spigot_ttt.game.classes.impl import de.moritzruth.spigot_ttt.game.classes.TTTClass -import de.moritzruth.spigot_ttt.game.players.TTTPlayer +import de.moritzruth.spigot_ttt.game.players.DeathReason +import de.moritzruth.spigot_ttt.game.players.TTTPlayerDamageEvent import org.bukkit.ChatColor -import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.Listener -import org.bukkit.event.entity.EntityDamageEvent -import java.util.* object Stuntman: TTTClass( "Stuntman", ChatColor.DARK_RED ) { - val IMMUNE_DAMAGE_CAUSES = EnumSet.of( - EntityDamageEvent.DamageCause.FALL, - EntityDamageEvent.DamageCause.BLOCK_EXPLOSION, - EntityDamageEvent.DamageCause.ENTITY_EXPLOSION - )!! + val IMMUNE_DEATH_REASONS = setOf(DeathReason.FALL, DeathReason.EXPLOSION) override val listener = object : Listener { @EventHandler(ignoreCancelled = true) - fun onEntityDamage(event: EntityDamageEvent) { - val entity = event.entity - if (entity !is Player) return - - val tttPlayer = TTTPlayer.of(entity) ?: return - if (tttPlayer.tttClass == Stuntman) { - if (IMMUNE_DAMAGE_CAUSES.contains(event.cause)) event.damage = 0.0 + fun onEntityDamage(event: TTTPlayerDamageEvent) { + if (event.tttPlayer.tttClass == Stuntman) { + if (IMMUNE_DEATH_REASONS.contains(event.deathReason)) event.damage = 0.0 } } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Warrior.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Warrior.kt index 5b2fb79..497ad32 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Warrior.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Warrior.kt @@ -2,11 +2,10 @@ package de.moritzruth.spigot_ttt.game.classes.impl import de.moritzruth.spigot_ttt.game.classes.TTTClass import de.moritzruth.spigot_ttt.game.players.TTTPlayer +import de.moritzruth.spigot_ttt.game.players.TTTPlayerDamageEvent import org.bukkit.ChatColor -import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.Listener -import org.bukkit.event.entity.EntityDamageEvent object Warrior: TTTClass( "Warrior", @@ -18,12 +17,8 @@ object Warrior: TTTClass( override val listener = object : Listener { @EventHandler(ignoreCancelled = true) - fun onEntityDamage(event: EntityDamageEvent) { - val entity = event.entity - if (entity !is Player) return - - val tttPlayer = TTTPlayer.of(entity) ?: return - if (tttPlayer.tttClass == Warrior) { + fun onEntityDamage(event: TTTPlayerDamageEvent) { + if (event.tttPlayer.tttClass == Warrior) { event.damage *= 0.9 } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayer.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayer.kt index 0c10e5d..026b4cb 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayer.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayer.kt @@ -71,7 +71,9 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClass?) { fun damage(damage: Double, reason: DeathReason, damager: TTTPlayer, scream: Boolean = true) { if (!alive) return - val finalHealth = player.health - damage + + val event = TTTPlayerDamageEvent(this, damage, reason).call() + val finalHealth = player.health - event.damage if (finalHealth <= 0.0) onDeath(reason, damager, scream) else player.damage(damage) diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDamageEvent.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDamageEvent.kt new file mode 100644 index 0000000..0dd3b6b --- /dev/null +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDamageEvent.kt @@ -0,0 +1,22 @@ +package de.moritzruth.spigot_ttt.game.players + +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +class TTTPlayerDamageEvent( + val tttPlayer: TTTPlayer, + var damage: Double, + val deathReason: DeathReason +): Event() { + override fun getHandlers(): HandlerList { + @Suppress("RedundantCompanionReference") // false positive + return Companion.handlers + } + + companion object { + private val handlers = HandlerList() + + @JvmStatic + fun getHandlerList() = handlers + } +}