From d9bc5f137ee91b0f39ed3fdf00420f1158589c62 Mon Sep 17 00:00:00 2001 From: Moritz Ruth Date: Tue, 9 Jun 2020 22:27:52 +0200 Subject: [PATCH] Let a random Sidekick become the Jackal after the latter died --- ...lGameEventsListener.kt => GameListener.kt} | 28 +++++++++++++------ .../moritzruth/spigot_ttt/game/GameManager.kt | 7 +++-- .../game/items/impl/SecondChance.kt | 2 +- .../spigot_ttt/game/players/PlayerManager.kt | 12 ++++---- .../spigot_ttt/game/players/TTTPlayer.kt | 21 ++++++-------- .../game/players/TTTPlayerDeathEvent.kt | 5 ++-- .../spigot_ttt/utils/EventExtensions.kt | 6 ++++ 7 files changed, 49 insertions(+), 32 deletions(-) rename src/main/kotlin/de/moritzruth/spigot_ttt/game/{GeneralGameEventsListener.kt => GameListener.kt} (88%) create mode 100644 src/main/kotlin/de/moritzruth/spigot_ttt/utils/EventExtensions.kt diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GeneralGameEventsListener.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt similarity index 88% rename from src/main/kotlin/de/moritzruth/spigot_ttt/game/GeneralGameEventsListener.kt rename to src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt index 9aa5135..326eef8 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GeneralGameEventsListener.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameListener.kt @@ -8,9 +8,7 @@ import com.comphenix.protocol.events.PacketEvent import com.comphenix.protocol.wrappers.EnumWrappers import com.comphenix.protocol.wrappers.PlayerInfoData import de.moritzruth.spigot_ttt.TTTPlugin -import de.moritzruth.spigot_ttt.game.players.DeathReason -import de.moritzruth.spigot_ttt.game.players.PlayerManager -import de.moritzruth.spigot_ttt.game.players.TTTPlayer +import de.moritzruth.spigot_ttt.game.players.* import de.moritzruth.spigot_ttt.plugin import de.moritzruth.spigot_ttt.utils.nextTick import org.bukkit.ChatColor @@ -24,7 +22,7 @@ import org.bukkit.event.entity.EntityDamageEvent import org.bukkit.event.entity.PlayerDeathEvent import org.bukkit.event.player.* -object GeneralGameEventsListener : Listener { +object GameListener : Listener { private val BLOCKED_COMMANDS = setOf("me", "tell") fun register() { @@ -105,10 +103,6 @@ object GeneralGameEventsListener : Listener { tttPlayer.onDeath(reason, null) } -// gameManager.playerManager.tttPlayers.forEach { -// it.player.playSound(tttPlayer.player.location, Sound.ENTITY_PLAYER_DEATH, SoundCategory.PLAYERS, 2f, 1f) -// } - event.damage = 0.0 } } @@ -136,6 +130,24 @@ object GeneralGameEventsListener : Listener { } } + @EventHandler(priority = EventPriority.HIGHEST) + fun onTTTPlayerDeath(event: TTTPlayerDeathEvent) { + if (!setOf(RoleGroup.JACKAL, null).contains(event.winnerRoleGroup) && event.tttPlayer.role == Role.JACKAL) { + val sidekicks = PlayerManager.tttPlayers.filter { it.role == Role.SIDEKICK } + + if (sidekicks.isNotEmpty()) { + val newJackal = sidekicks.random() + newJackal.changeRole(Role.JACKAL) + + sidekicks.forEach { sidekick -> + if (sidekick != newJackal) { + sidekick.player.sendMessage(TTTPlugin.prefix + "${newJackal.player.displayName} ${ChatColor.GREEN}ist der neue Jackal") + } + } + } + } + } + private val packetListener = object : PacketAdapter(plugin, PacketType.Play.Server.PLAYER_INFO) { override fun onPacketSending(event: PacketEvent) { val packet = WrapperPlayServerPlayerInfo(event.packet) 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 e71e160..69ddc8d 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/GameManager.kt @@ -9,6 +9,7 @@ import de.moritzruth.spigot_ttt.game.items.shop.ShopListener import de.moritzruth.spigot_ttt.game.players.PlayerManager import de.moritzruth.spigot_ttt.game.players.Role import de.moritzruth.spigot_ttt.plugin +import de.moritzruth.spigot_ttt.utils.call import org.bukkit.GameRule import kotlin.random.Random @@ -25,7 +26,7 @@ object GameManager { adjustWorld() ItemManager.registerListeners() - GeneralGameEventsListener.register() + GameListener.register() ShopListener.register() CorpseListener.register() } @@ -43,7 +44,7 @@ object GameManager { } Timers.startOverPhaseTimer(plugin.config.getInt("duration.over", 10)) { - plugin.server.pluginManager.callEvent(GameEndEvent(false)) + GameEndEvent(false).call() phase = null resetWorld() @@ -89,7 +90,7 @@ object GameManager { fun abortGame(broadcast: Boolean = false) { if (phase === null) throw IllegalStateException("The game is not running") - plugin.server.pluginManager.callEvent(GameEndEvent(true)) + GameEndEvent(true).call() phase = null Timers.cancelCurrentTask() resetWorld() diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/items/impl/SecondChance.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/items/impl/SecondChance.kt index c7bab46..a0d5f4a 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/items/impl/SecondChance.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/items/impl/SecondChance.kt @@ -79,7 +79,7 @@ object SecondChance: TTTItem, Buyable { val state = isc.get(event.tttPlayer) if (state != null) { if (Random.nextBoolean()) { - event.letRoundEnd = false + event.winnerRoleGroup = null event.tttPlayer.player.openInventory(chooseSpawnInventory) state.timeoutAction = TimeoutAction(event.tttPlayer, event.tttCorpse.corpse.trueLocation) } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/PlayerManager.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/PlayerManager.kt index f76c361..3273659 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/PlayerManager.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/PlayerManager.kt @@ -36,12 +36,14 @@ object PlayerManager { } fun letRemainingRoleGroupWin() { - GameManager.ensurePhase(GamePhase.COMBAT) + val onlyRemainingRoleGroup = getOnlyRemainingRoleGroup() ?: return + GameManager.letRoleWin(onlyRemainingRoleGroup.primaryRole) + } - val stillLivingRoleGroups = stillLivingRoleGroups - if (stillLivingRoleGroups.count() == 1) { - GameManager.letRoleWin(stillLivingRoleGroups.first().primaryRole) - } + fun getOnlyRemainingRoleGroup(): RoleGroup? { + GameManager.ensurePhase(GamePhase.COMBAT) + return if (stillLivingRoleGroups.count() == 1) stillLivingRoleGroups.first() + else null } fun onPlayerJoin(player: Player) { 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 927f792..d432e6c 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 @@ -10,10 +10,7 @@ import de.moritzruth.spigot_ttt.game.items.Selectable import de.moritzruth.spigot_ttt.game.items.TTTItem import de.moritzruth.spigot_ttt.game.items.shop.Shop import de.moritzruth.spigot_ttt.plugin -import de.moritzruth.spigot_ttt.utils.hotbarContents -import de.moritzruth.spigot_ttt.utils.nextTick -import de.moritzruth.spigot_ttt.utils.secondsToTicks -import de.moritzruth.spigot_ttt.utils.teleportPlayerToWorldSpawn +import de.moritzruth.spigot_ttt.utils.* import org.bukkit.* import org.bukkit.entity.Player import org.bukkit.potion.PotionEffect @@ -88,7 +85,7 @@ class TTTPlayer(player: Player, role: Role) { if (killer == null) "${ChatColor.RED}${ChatColor.BOLD}Du bist gestorben" else "${ChatColor.RED}${ChatColor.BOLD}Du wurdest von " + "${ChatColor.RESET}${killer.player.displayName}" + - "${ChatColor.RED}${ChatColor.BOLD} getötet" + " ${ChatColor.RED}${ChatColor.BOLD}getötet" ) player.gameMode = GameMode.SPECTATOR @@ -98,18 +95,18 @@ class TTTPlayer(player: Player, role: Role) { player.inventory.clear() credits = 0 + val onlyRemainingRoleGroup = PlayerManager.getOnlyRemainingRoleGroup() + val event = TTTPlayerDeathEvent( this, player.location, tttCorpse, killer, - scream - ) - plugin.server.pluginManager.callEvent(event) + scream, + onlyRemainingRoleGroup + ).call() - if (event.letRoundEnd) { - PlayerManager.letRemainingRoleGroupWin() - } + event.winnerRoleGroup?.run { GameManager.letRoleWin(primaryRole) } if (event.scream) { GameManager.world.playSound( @@ -133,7 +130,7 @@ class TTTPlayer(player: Player, role: Role) { Shop.setItems(this) - plugin.server.pluginManager.callEvent(TTTPlayerReviveEvent(this)) + TTTPlayerReviveEvent(this).call() player.sendMessage(TTTPlugin.prefix + "${ChatColor.GREEN}${ChatColor.BOLD}Du wurdest wiederbelebt") nextTick { player.gameMode = GameMode.SURVIVAL } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDeathEvent.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDeathEvent.kt index 24b12c7..f0faaff 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDeathEvent.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/game/players/TTTPlayerDeathEvent.kt @@ -10,15 +10,14 @@ data class TTTPlayerDeathEvent( val location: Location, val tttCorpse: TTTCorpse, val killer: TTTPlayer?, - var scream: Boolean = true + var scream: Boolean = true, + var winnerRoleGroup: RoleGroup? = null ): Event() { override fun getHandlers(): HandlerList { @Suppress("RedundantCompanionReference") // false positive return Companion.handlers } - var letRoundEnd = true - companion object { private val handlers = HandlerList() diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/utils/EventExtensions.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/utils/EventExtensions.kt new file mode 100644 index 0000000..f291361 --- /dev/null +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/utils/EventExtensions.kt @@ -0,0 +1,6 @@ +package de.moritzruth.spigot_ttt.utils + +import de.moritzruth.spigot_ttt.plugin +import org.bukkit.event.Event + +fun T.call(): T = this.also { plugin.server.pluginManager.callEvent(this) }