diff --git a/src/main/kotlin/xyz/atnrch/dragon/GameState.kt b/src/main/kotlin/xyz/atnrch/dragon/GameState.kt index 015447e..38d2762 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/GameState.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/GameState.kt @@ -4,5 +4,6 @@ enum class GameState { WAITING, LAUNCH, GRACE_PERIOD, - GAME + GAME, + DRAGON } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt b/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt index 5eb70d1..7cee4dc 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt @@ -1,5 +1,7 @@ package xyz.atnrch.dragon +import com.google.common.cache.Cache +import com.google.common.cache.CacheBuilder import org.apache.commons.io.FileUtils import org.bukkit.* import org.bukkit.plugin.java.JavaPlugin @@ -7,6 +9,7 @@ import org.bukkit.scheduler.BukkitTask import xyz.atnrch.dragon.commands.MainCommand import xyz.atnrch.dragon.event.* import xyz.atnrch.dragon.event.end.BedInteractListener +import xyz.atnrch.dragon.event.end.BlockPlaceListener import xyz.atnrch.dragon.event.end.EnderDragonListener import xyz.atnrch.dragon.event.waiting.WaitingListener import xyz.atnrch.dragon.player.PlayerManager @@ -18,29 +21,35 @@ import xyz.atnrch.dragon.teams.TeamManager import xyz.atnrch.dragon.world.PreviousWorldUtils import xyz.atnrch.dragon.world.WorldManager import java.io.File +import java.time.Duration +import java.time.Instant +import java.util.* class RunnerDragon : JavaPlugin() { companion object { lateinit var instance: RunnerDragon - val TITLE = - "${ChatColor.LIGHT_PURPLE}${ChatColor.BOLD}${ChatColor.ITALIC}Runner${ChatColor.DARK_PURPLE}${ChatColor.BOLD}${ChatColor.ITALIC}Dragon" - - val TITLE_MSG = - "${ChatColor.WHITE}[${ChatColor.LIGHT_PURPLE}${ChatColor.BOLD}RUNNER${ChatColor.DARK_PURPLE}${ChatColor.BOLD}DRAGON${ChatColor.WHITE}]" - - var STATE = GameState.GAME - const val TEAM_MAX_SIZE = 2 const val NUMBER_OF_TEAMS = 6 + + val TITLE = + "${ChatColor.LIGHT_PURPLE}${ChatColor.BOLD}${ChatColor.ITALIC}Runner${ChatColor.DARK_PURPLE}${ChatColor.BOLD}${ChatColor.ITALIC}Dragon" + val TITLE_MSG = + "${ChatColor.WHITE}[${ChatColor.LIGHT_PURPLE}${ChatColor.BOLD}RUNNER${ChatColor.DARK_PURPLE}${ChatColor.BOLD}DRAGON${ChatColor.WHITE}]" + val LAST_BED_INTERACT: Cache = CacheBuilder.newBuilder() + .expireAfterWrite(Duration.ofSeconds(10)) + .build() + + var STATE = GameState.GAME var DEAD_COWS = 0 var TIME = 0 - var SPAWN_HEIGHT = 300 + var SPAWN_HEIGHT = 300 var TEAM_LOCK = false var NETHER_PORTAL_ENTERED = false var END_PORTAL_ENTERED = false var TIMER_TASK: BukkitTask? = null + var GRACE_PERIOD_TASK: BukkitTask? = null lateinit var SPAWN: Location @@ -100,6 +109,7 @@ class RunnerDragon : JavaPlugin() { server.pluginManager.registerEvents(PlayerQuitListener(), this) server.pluginManager.registerEvents(PlayerRespawnListener(), this) server.pluginManager.registerEvents(WaitingListener(), this) + server.pluginManager.registerEvents(BlockPlaceListener(), this) server.pluginManager.registerEvents(EntityDeathListener(), this) server.pluginManager.registerEvents(EntityDamageListener(), this) getCommand("rd")!!.setExecutor(MainCommand()) diff --git a/src/main/kotlin/xyz/atnrch/dragon/commands/TeamsSubCommand.kt b/src/main/kotlin/xyz/atnrch/dragon/commands/TeamsSubCommand.kt index b8f4419..912fbd5 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/commands/TeamsSubCommand.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/commands/TeamsSubCommand.kt @@ -50,7 +50,7 @@ class TeamsSubCommand { val dragonPlayer = instance.playerManager.getPlayer(it.uniqueId) dragonPlayer.setTeam(coloredTeam) dragonPlayer.updateDisplayName() - player.sendMessage("${target.name} est passé dans l'équipe ${coloredTeam.name}") + player.sendMessage("${target.name} est passé dans l'équipe ${coloredTeam.displayName}") } } } else { diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/EntityDamageListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/EntityDamageListener.kt index 60e6d8c..8955559 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/EntityDamageListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/EntityDamageListener.kt @@ -14,7 +14,7 @@ class EntityDamageListener : Listener { if (event.entity is Player) { val player = (event.entity as Player) if (player.gameMode == GameMode.SURVIVAL) { - if (RunnerDragon.STATE == GameState.GRACE_PERIOD && event.cause == EntityDamageEvent.DamageCause.ENTITY_ATTACK) { + if ((RunnerDragon.STATE == GameState.GRACE_PERIOD || RunnerDragon.STATE == GameState.DRAGON) && event.cause == EntityDamageEvent.DamageCause.ENTITY_ATTACK) { event.isCancelled = true } else if (RunnerDragon.STATE == GameState.LAUNCH || RunnerDragon.STATE == GameState.WAITING) { event.isCancelled = true diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt index f0ba213..7950996 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt @@ -1,26 +1,16 @@ package xyz.atnrch.dragon.event.end -import com.google.common.cache.Cache -import com.google.common.cache.CacheBuilder import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerBedEnterEvent -import java.time.Duration +import xyz.atnrch.dragon.RunnerDragon import java.time.Instant -import java.util.* class BedInteractListener : Listener { - companion object { - val LAST_BED_INTERACT: Cache = CacheBuilder.newBuilder() - .expireAfterWrite(Duration.ofSeconds(10)) - .build() - } - @EventHandler fun onBedInteract(event: PlayerBedEnterEvent) { if (event.bedEnterResult == PlayerBedEnterEvent.BedEnterResult.NOT_POSSIBLE_HERE) { - return + RunnerDragon.LAST_BED_INTERACT.put(event.player.uniqueId, Instant.now()) } - LAST_BED_INTERACT.put(event.player.uniqueId, Instant.now()) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/end/BlockPlaceListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/BlockPlaceListener.kt new file mode 100644 index 0000000..0424325 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/BlockPlaceListener.kt @@ -0,0 +1,16 @@ +package xyz.atnrch.dragon.event.end + +import org.bukkit.Material +import org.bukkit.World +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockPlaceEvent + +class BlockPlaceListener : Listener { + @EventHandler + fun onBlockPlace(event: BlockPlaceEvent) { + if (event.block.location.world!!.environment == World.Environment.NORMAL && event.blockPlaced.type == Material.END_PORTAL) { + event.isCancelled = true + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt index 38906f5..809ce09 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt @@ -2,7 +2,12 @@ package xyz.atnrch.dragon.event.end import org.bukkit.Bukkit import org.bukkit.ChatColor -import org.bukkit.entity.* +import org.bukkit.Sound +import org.bukkit.World.Environment +import org.bukkit.entity.EnderDragon +import org.bukkit.entity.Entity +import org.bukkit.entity.Player +import org.bukkit.entity.Projectile import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.entity.EntityDamageEvent @@ -13,15 +18,14 @@ import java.util.* class EnderDragonListener : Listener { @EventHandler fun onEnderDragonDeath(event: EntityDeathEvent) { - if (event.entity.type == EntityType.ENDER_DRAGON || event.entity is EnderDragon) { + if (event.entity is EnderDragon) { val dragon = event.entity as EnderDragon - val entity = event.entity - val damageEvent = entity.lastDamageCause ?: return + val damageEvent = dragon.lastDamageCause ?: return var player: Player? = null when (damageEvent.cause) { EntityDamageEvent.DamageCause.BLOCK_EXPLOSION -> { - val first: Optional = BedInteractListener.LAST_BED_INTERACT.asMap().entries.stream() + val first: Optional = RunnerDragon.LAST_BED_INTERACT.asMap().entries.stream() .sorted { a, b -> b.value.compareTo(a.value) } .map { it.key } .findFirst() @@ -43,14 +47,19 @@ class EnderDragonListener : Listener { else -> {} } - println(player?.name) val dragonPlayer = player?.uniqueId?.let { RunnerDragon.instance.playerManager.getPlayer(it) } val team = dragonPlayer?.getTeam() - println(team?.name) if (dragon.dragonBattle?.hasBeenPreviouslyKilled()?.not() == true) { + Bukkit.getOnlinePlayers().forEach { + if (it.location.world!!.environment.equals(Environment.THE_END).not()) { + it.playSound(it.location, Sound.ENTITY_ENDER_DRAGON_DEATH, 1f, 0.5f) + } + } Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.GOLD}${ChatColor.BOLD}VICTOIRE !") - Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.GOLD}${ChatColor.BOLD}LE DRAGON A ÉTÉ TUÉ PAR L'ÉQUIPE ${team?.name}!") + Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.GOLD}${ChatColor.BOLD}LE DRAGON A ÉTÉ TUÉ PAR L'ÉQUIPE ${team?.displayName}${ChatColor.GOLD}${ChatColor.BOLD}!") } + + SecondFight.start(dragon, dragonPlayer) } } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/end/SecondFight.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/SecondFight.kt new file mode 100644 index 0000000..e981857 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/SecondFight.kt @@ -0,0 +1,32 @@ +package xyz.atnrch.dragon.event.end + +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.Sound +import org.bukkit.World +import org.bukkit.entity.EnderDragon +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType +import xyz.atnrch.dragon.RunnerDragon +import xyz.atnrch.dragon.player.DragonPlayer + +class SecondFight { + companion object { + fun start(dragon: EnderDragon, dragonPlayer: DragonPlayer?) { + for (i in 0..2) { + Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.BOLD}${ChatColor.RED}???") + } + + Bukkit.getOnlinePlayers().forEach { + if (it.location.world!!.environment != World.Environment.THE_END) { + it.teleport(dragonPlayer!!.player.location) + } + it.addPotionEffect(PotionEffect(PotionEffectType.BLINDNESS, 5, 1)) + it.playSound(it.location, Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1f, 0.5f) + } + + dragon.dragonBattle!!.initiateRespawn() + dragon.dragonBattle!!.resetCrystals() + } + } +} diff --git a/src/main/kotlin/xyz/atnrch/dragon/inventory/CandleItem.kt b/src/main/kotlin/xyz/atnrch/dragon/inventory/CandleItem.kt index cdfdb31..2c86126 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/inventory/CandleItem.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/inventory/CandleItem.kt @@ -14,11 +14,11 @@ import xyz.atnrch.dragon.teams.Team class CandleItem(private val team: Team) : BaseItem() { override fun getItemProvider(): ItemProvider { - val material = CandleColor.getFromTeamColor(team.color) + val material = CandleColor.getFromTeamColor(team.teamColor) val itemBuilder = ItemBuilder(material) - itemBuilder.setDisplayName("${team.color.chatColor}Rejoindre l'équipe") + itemBuilder.setDisplayName("${team.teamColor.chatColor}Rejoindre l'équipe") team.players.forEach { player -> - itemBuilder.addLoreLines("${ChatColor.DARK_GRAY}- ${team.color.chatColor}${player.player.name}") + itemBuilder.addLoreLines("${ChatColor.DARK_GRAY}- ${team.teamColor.chatColor}${player.player.name}") } return itemBuilder } @@ -30,7 +30,7 @@ class CandleItem(private val team: Team) : BaseItem() { } else if (it.getTeam()!! == team) { it.sendMessage("${ChatColor.RED}Vous êtes déjà dans cette équipe.") } else { - it.sendMessage("Vous êtes désormais dans l'équipe: ${team.name}") + it.sendMessage("Vous êtes désormais dans l'équipe: ${team.displayName}") it.setTeam(team) it.updateDisplayName() } diff --git a/src/main/kotlin/xyz/atnrch/dragon/player/DragonPlayer.kt b/src/main/kotlin/xyz/atnrch/dragon/player/DragonPlayer.kt index 5565793..d8338c8 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/player/DragonPlayer.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/player/DragonPlayer.kt @@ -74,7 +74,7 @@ class DragonPlayer(uuid: UUID) { } fun updateDisplayName() { - NickAPI.nick(player, "${getTeam()!!.color.chatColor}${player.name}") + NickAPI.nick(player, "${getTeam()!!.teamColor.chatColor}${player.name}") NickAPI.refreshPlayer(player) } diff --git a/src/main/kotlin/xyz/atnrch/dragon/teams/Team.kt b/src/main/kotlin/xyz/atnrch/dragon/teams/Team.kt index 099b1ba..fcbd9a1 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/teams/Team.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/teams/Team.kt @@ -5,13 +5,13 @@ import xyz.atnrch.dragon.player.DragonPlayer import java.util.* class Team( - val color: TeamColor, - var name: String = "undefined", + val teamColor: TeamColor, + var displayName: String = "undefined", val players: ArrayList = arrayListOf(), private val deaths: Int = 0 ) { init { - name = "${color.chatColor}${color.chatColor.name}" + displayName = "${teamColor.chatColor}${teamColor.displayName}" } companion object { diff --git a/src/main/kotlin/xyz/atnrch/dragon/teams/TeamColor.kt b/src/main/kotlin/xyz/atnrch/dragon/teams/TeamColor.kt index 8c46781..703e287 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/teams/TeamColor.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/teams/TeamColor.kt @@ -3,12 +3,12 @@ package xyz.atnrch.dragon.teams import org.bukkit.ChatColor import org.bukkit.Color -enum class TeamColor(val chatColor: ChatColor, val color: Color) { - NONE(ChatColor.GRAY, Color.GRAY), - BLUE(ChatColor.BLUE, Color.BLUE), - YELLOW(ChatColor.YELLOW, Color.YELLOW), - RED(ChatColor.RED, Color.RED), - GREEN(ChatColor.DARK_GREEN, Color.GREEN), - ORANGE(ChatColor.GOLD, Color.ORANGE), - PURPLE(ChatColor.LIGHT_PURPLE, Color.PURPLE) +enum class TeamColor(val chatColor: ChatColor, val color: Color, val displayName: String) { + NONE(ChatColor.GRAY, Color.GRAY, "Grise"), + BLUE(ChatColor.BLUE, Color.BLUE, "Bleue"), + YELLOW(ChatColor.YELLOW, Color.YELLOW, "Jaune"), + RED(ChatColor.RED, Color.RED, "Rouge"), + GREEN(ChatColor.DARK_GREEN, Color.GREEN, "Verte"), + ORANGE(ChatColor.GOLD, Color.ORANGE, "Orange"), + PURPLE(ChatColor.LIGHT_PURPLE, Color.PURPLE, "Violette") } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/teams/TeamManager.kt b/src/main/kotlin/xyz/atnrch/dragon/teams/TeamManager.kt index 2356b0e..507912b 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/teams/TeamManager.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/teams/TeamManager.kt @@ -47,6 +47,6 @@ class TeamManager( } fun getTeamColorsNames(): List { - return getTeams().map { team -> "${team.color.chatColor}${team.color.chatColor.name}" } + return getTeams().map { team -> "${team.teamColor.chatColor}${team.teamColor.chatColor.name}" } } } \ No newline at end of file