From d90e1cd5049113562f51b1aaae96ee32f8e79c5f Mon Sep 17 00:00:00 2001 From: Moritz Ruth Date: Sun, 14 Jun 2020 14:53:03 +0200 Subject: [PATCH] Add Ninja class and remove stamina (it's annoying) --- .../spigot_ttt/game/GameListener.kt | 2 + .../moritzruth/spigot_ttt/game/GameManager.kt | 1 - .../game/classes/TTTClassManager.kt | 7 +- .../spigot_ttt/game/classes/impl/Ninja.kt | 91 +++++++++++++++++++ .../spigot_ttt/game/players/TTTPlayer.kt | 26 +----- 5 files changed, 96 insertions(+), 31 deletions(-) create mode 100644 src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Ninja.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 f5c348c..0018400 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt @@ -106,6 +106,8 @@ object GameListener : Listener { if (tttPlayer.player.health - e.damage <= 0) { tttPlayer.onDeath(reason, null) event.damage = 0.0 + } else { + event.damage = e.damage } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt index 26f4bb1..ebfb357 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt @@ -138,7 +138,6 @@ object GameManager { PlayerManager.tttPlayers.forEach { it.player.teleportToWorldSpawn() - it.activateStamina() it.addDefaultClassItems() } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/TTTClassManager.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/TTTClassManager.kt index c977698..d5d1f55 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/TTTClassManager.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/TTTClassManager.kt @@ -1,14 +1,11 @@ package de.moritzruth.spigot_ttt.game.classes -import de.moritzruth.spigot_ttt.game.classes.impl.Gambler -import de.moritzruth.spigot_ttt.game.classes.impl.Oracle -import de.moritzruth.spigot_ttt.game.classes.impl.Stuntman -import de.moritzruth.spigot_ttt.game.classes.impl.Warrior +import de.moritzruth.spigot_ttt.game.classes.impl.* import java.util.* object TTTClassManager { private val TTT_CLASSES = setOf( - Warrior, Oracle, Gambler, Stuntman + Warrior, Oracle, Gambler, Stuntman, Ninja ) val listeners = TTT_CLASSES.mapNotNull { it.listener } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Ninja.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Ninja.kt new file mode 100644 index 0000000..ca535b8 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/classes/impl/Ninja.kt @@ -0,0 +1,91 @@ +package de.moritzruth.spigot_ttt.game.classes.impl + +import de.moritzruth.spigot_ttt.game.GameEndEvent +import de.moritzruth.spigot_ttt.game.classes.TTTClass +import de.moritzruth.spigot_ttt.game.players.* +import de.moritzruth.spigot_ttt.plugin +import org.bukkit.ChatColor +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerToggleFlightEvent +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType +import org.bukkit.scheduler.BukkitTask +import org.bukkit.util.Vector + +object Ninja: TTTClass( + "Ninja", + ChatColor.LIGHT_PURPLE +) { + private val isc = InversedStateContainer(State::class) + + override fun onInit(tttPlayer: TTTPlayer) { + tttPlayer.player.allowFlight = true + tttPlayer.player.addPotionEffect(PotionEffect( + PotionEffectType.JUMP, + 1000000, + 2, + false, + false + )) + } + + override val listener = object : Listener { + @EventHandler(ignoreCancelled = true) + fun onPlayerToggleFlight(event: PlayerToggleFlightEvent) { + val tttPlayer = TTTPlayer.of(event.player) ?: return + + if (tttPlayer.tttClass == Ninja) { + val state = isc.getOrCreate(tttPlayer) + + val current = tttPlayer.player.velocity + tttPlayer.player.velocity = Vector(current.x * 3, 0.8, current.z * 3) + state.jumpsRemaining -= 1 + + if (state.jumpsRemaining == 0) { + tttPlayer.player.allowFlight = false + + state.checkOnGroundTask = plugin.server.scheduler.runTaskTimer(plugin, fun() { + if (tttPlayer.player.isOnGround) { + state.jumpsRemaining = 2 + tttPlayer.player.allowFlight = true + state.reset() + } + }, 1, 1) + } + + event.isCancelled = true + } + } + + @EventHandler(ignoreCancelled = true) + fun onTTTPlayerDamage(event: TTTPlayerDamageEvent) { + if (event.tttPlayer.tttClass == Ninja) { + if (event.deathReason == DeathReason.FALL) event.damage = 0.0 + } + } + + @EventHandler(ignoreCancelled = true) + fun onTTTPlayerDeath(event: TTTPlayerDeathEvent) { + isc.get(event.tttPlayer)?.reset() + isc.remove(event.tttPlayer) + } + + @EventHandler + fun onGameEnd(event: GameEndEvent) { + isc.forEveryState { state, tttPlayer -> + state.reset() + } + } + } + + class State: IState { + var jumpsRemaining = 2 + var checkOnGroundTask: BukkitTask? = null + + fun reset() { + checkOnGroundTask?.cancel() + checkOnGroundTask = null + } + } +} 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 026b4cb..c2b76d9 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 @@ -13,11 +13,9 @@ import de.moritzruth.spigot_ttt.game.items.Selectable import de.moritzruth.spigot_ttt.game.items.TTTItem import de.moritzruth.spigot_ttt.game.items.impl.CloakingDevice import de.moritzruth.spigot_ttt.game.items.shop.Shop -import de.moritzruth.spigot_ttt.plugin import de.moritzruth.spigot_ttt.utils.* import org.bukkit.* import org.bukkit.entity.Player -import org.bukkit.scheduler.BukkitTask import kotlin.properties.Delegates class TTTPlayer(player: Player, role: Role, val tttClass: TTTClass?) { @@ -47,9 +45,6 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClass?) { var credits by Delegates.observable(Settings.initialCredits) { _, _, _ -> scoreboard.updateCredits() } val boughtItems = mutableListOf() - private var staminaCooldown: Int = 0 - private var staminaTask: BukkitTask? = null - val scoreboard = TTTScoreboard(this) val stateContainer = StateContainer(this) @@ -159,23 +154,6 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClass?) { private fun getOwningTTTItems() = player.inventory.hotbarContents.mapNotNull { it?.run { ItemManager.getItemByItemStack(this) } } - fun activateStamina() { - if (staminaTask != null) return - - staminaTask = plugin.server.scheduler.runTaskTimer(plugin, fun() { - if (!alive) return - - if (player.isSprinting) { - player.foodLevel -= 2 - staminaCooldown = 4 - } else { - if (staminaCooldown == 0) { - if (player.foodLevel < 20) player.foodLevel += 2 - } else staminaCooldown -= 1 - } - }, 0, secondsToTicks(0.5).toLong()) - } - fun changeRole(newRole: Role) { roleHistory.add(role) role = newRole @@ -219,9 +197,7 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClass?) { player.walkSpeed = 0.2F // yes, this is the default value player.level = 0 player.exp = 0F - - staminaTask?.cancel() - staminaTask = null + player.allowFlight = player.gameMode == GameMode.CREATIVE player.foodLevel = 20 player.inventory.clear()