From da9c02dbbbb1f84a692b3b4eb7644c4cfc15c6b6 Mon Sep 17 00:00:00 2001 From: aro Date: Sat, 4 Mar 2023 16:12:26 +0100 Subject: [PATCH] more bugs fixed --- .../kotlin/xyz/atnrch/dragon/RunnerDragon.kt | 31 ++++++++++++-- .../atnrch/dragon/commands/GameSubCommand.kt | 6 +++ .../dragon/event/DimensionEntranceListener.kt | 19 +++++++-- .../dragon/event/PlayerRespawnListener.kt | 1 - .../dragon/event/end/BedInteractListener.kt | 26 ++++++++++++ .../dragon/event/end/EnderDragonListener.kt | 40 +++++++++++++++++-- .../atnrch/dragon/world/PreviousWorldUtils.kt | 22 ++++++++++ .../xyz/atnrch/dragon/world/WorldManager.kt | 9 +++-- 8 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt create mode 100644 src/main/kotlin/xyz/atnrch/dragon/world/PreviousWorldUtils.kt diff --git a/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt b/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt index 75ac79a..5eb70d1 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/RunnerDragon.kt @@ -6,6 +6,7 @@ import org.bukkit.plugin.java.JavaPlugin 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.EnderDragonListener import xyz.atnrch.dragon.event.waiting.WaitingListener import xyz.atnrch.dragon.player.PlayerManager @@ -14,6 +15,7 @@ import xyz.atnrch.dragon.tasks.GracePeriodTask import xyz.atnrch.dragon.tasks.TimerTask import xyz.atnrch.dragon.teams.Team import xyz.atnrch.dragon.teams.TeamManager +import xyz.atnrch.dragon.world.PreviousWorldUtils import xyz.atnrch.dragon.world.WorldManager import java.io.File @@ -43,6 +45,8 @@ class RunnerDragon : JavaPlugin() { lateinit var SPAWN: Location lateinit var WORLD: World + lateinit var WORLD_END: World + lateinit var WORLD_NETHER: World lateinit var LOBBY_SCHEMATIC: SchematicLoader } @@ -54,24 +58,43 @@ class RunnerDragon : JavaPlugin() { instance = this val previousWorldFolder = File("runnerdragon") + val previousEndFolder = File("world_the_end") + val previousNetherFolder = File("world_nether") if (previousWorldFolder.exists()) { logger.warning("Ancien monde détecté! Suppression...") FileUtils.deleteDirectory(previousWorldFolder) } + if (previousEndFolder.exists()) { + logger.warning("Ancien End détecté! Suppression...") + PreviousWorldUtils.resetEnd() + } + if (previousNetherFolder.exists()) { + logger.warning("Ancien Nether détecté! Suppression...") + PreviousWorldUtils.resetNether() + } val creator = WorldCreator("runnerdragon") creator.environment(World.Environment.NORMAL) creator.generateStructures(true) creator.type(WorldType.NORMAL) - logger.info("Création d'un nouveau monde...") + val creatorTheEnd = WorldCreator("world_the_end") + creatorTheEnd.environment(World.Environment.THE_END) + + val creatorNether = WorldCreator("world_nether") + creatorNether.environment(World.Environment.NETHER) + + logger.info("Création des nouveaux mondes...") WORLD = Bukkit.createWorld(creator)!! - worldManager = WorldManager(WORLD) + WORLD_END = Bukkit.createWorld(creatorTheEnd)!! + WORLD_NETHER = Bukkit.createWorld(creatorNether)!! + worldManager = WorldManager(WORLD, WORLD_END, WORLD_NETHER) playerManager = PlayerManager() teamManager = TeamManager(this) server.pluginManager.registerEvents(DimensionEntranceListener(), this) + server.pluginManager.registerEvents(BedInteractListener(), this) server.pluginManager.registerEvents(EnderDragonListener(), this) server.pluginManager.registerEvents(PlayerJoinListener(), this) server.pluginManager.registerEvents(PlayerQuitListener(), this) @@ -99,13 +122,12 @@ class RunnerDragon : JavaPlugin() { GRACE_PERIOD_TASK?.taskId?.let { Bukkit.getScheduler().cancelTask(it) } TIME = 0 DEAD_COWS = 0 - worldManager.applyWaitingRules() + worldManager.applyRules() logger.info("Génération du spawn...") LOBBY_SCHEMATIC = SchematicLoader(File("./lobby1.schem"), WORLD) val schematicSpawn = LOBBY_SCHEMATIC.spawnSchematicAt(0, SPAWN_HEIGHT, 0) SPAWN = Location(WORLD, 0.0, SPAWN_HEIGHT.plus(2).toDouble(), 0.0, -180f, 0f) - WORLD.spawnLocation = SPAWN Bukkit.unloadWorld("world", true) logger.info("Création des équipes...") @@ -142,6 +164,7 @@ class RunnerDragon : JavaPlugin() { GameState.GAME -> { Bukkit.broadcastMessage("$TITLE_MSG ${ChatColor.GOLD}${ChatColor.ITALIC}PVP activé !") + GRACE_PERIOD_TASK?.taskId?.let { Bukkit.getScheduler().cancelTask(it) } true } diff --git a/src/main/kotlin/xyz/atnrch/dragon/commands/GameSubCommand.kt b/src/main/kotlin/xyz/atnrch/dragon/commands/GameSubCommand.kt index 466dcda..2d7bfdc 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/commands/GameSubCommand.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/commands/GameSubCommand.kt @@ -16,6 +16,12 @@ class GameSubCommand { } when (args[0]) { + "end" -> { + Bukkit.getOnlinePlayers().forEach { + it.teleport(RunnerDragon.WORLD_END.spawnLocation) + } + } + "state" -> { if (args.size == 2) { if (enumContains(args[1])) { diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/DimensionEntranceListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/DimensionEntranceListener.kt index 22a4143..524ab27 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/DimensionEntranceListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/DimensionEntranceListener.kt @@ -1,6 +1,8 @@ package xyz.atnrch.dragon.event +import net.md_5.bungee.api.ChatColor import org.bukkit.Bukkit +import org.bukkit.Sound import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerPortalEvent @@ -15,12 +17,21 @@ class DimensionEntranceListener : Listener { when (event.cause) { PlayerTeleportEvent.TeleportCause.NETHER_PORTAL -> if (RunnerDragon.NETHER_PORTAL_ENTERED.not()) { RunnerDragon.NETHER_PORTAL_ENTERED = true - Bukkit.broadcastMessage("Nether portal 1st time!") + Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.GOLD}Le portail du Nether a été franchi pour la première fois !") + Bukkit.getOnlinePlayers().forEach { + it.playSound(it.location, Sound.ENTITY_VILLAGER_CELEBRATE, 1f, 0.3f) + } } - PlayerTeleportEvent.TeleportCause.END_PORTAL -> if (RunnerDragon.END_PORTAL_ENTERED.not()) { - RunnerDragon.END_PORTAL_ENTERED = true - Bukkit.broadcastMessage("End portal 1st time!") + PlayerTeleportEvent.TeleportCause.END_PORTAL -> { + event.player.teleport(RunnerDragon.WORLD_END.spawnLocation) + if (RunnerDragon.END_PORTAL_ENTERED.not()) { + RunnerDragon.END_PORTAL_ENTERED = true + Bukkit.broadcastMessage("${RunnerDragon.TITLE_MSG} ${ChatColor.GOLD}Le portail de l'End a été franchi pour la première fois !") + Bukkit.getOnlinePlayers().forEach { + it.playSound(it.location, Sound.ENTITY_VILLAGER_CELEBRATE, 1f, 0.3f) + } + } } else -> {} diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/PlayerRespawnListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/PlayerRespawnListener.kt index 42321be..fc419cd 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/PlayerRespawnListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/PlayerRespawnListener.kt @@ -9,6 +9,5 @@ class PlayerRespawnListener : Listener { @EventHandler fun onRespawn(event: PlayerRespawnEvent) { event.respawnLocation = RunnerDragon.SPAWN - println("EVENT TRIGGERED") } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt new file mode 100644 index 0000000..f0ba213 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/BedInteractListener.kt @@ -0,0 +1,26 @@ +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 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 + } + 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/EnderDragonListener.kt b/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt index c73eae9..38906f5 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/event/end/EnderDragonListener.kt @@ -2,21 +2,53 @@ package xyz.atnrch.dragon.event.end import org.bukkit.Bukkit import org.bukkit.ChatColor -import org.bukkit.entity.EnderDragon +import org.bukkit.entity.* import org.bukkit.event.EventHandler import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityDamageEvent import org.bukkit.event.entity.EntityDeathEvent import xyz.atnrch.dragon.RunnerDragon +import java.util.* class EnderDragonListener : Listener { @EventHandler fun onEnderDragonDeath(event: EntityDeathEvent) { - if (event.entity is EnderDragon) { - val dragon: EnderDragon = event.entity as EnderDragon - val player = dragon.killer + if (event.entity.type == EntityType.ENDER_DRAGON || event.entity is EnderDragon) { + val dragon = event.entity as EnderDragon + val entity = event.entity + val damageEvent = entity.lastDamageCause ?: return + + var player: Player? = null + when (damageEvent.cause) { + EntityDamageEvent.DamageCause.BLOCK_EXPLOSION -> { + val first: Optional = BedInteractListener.LAST_BED_INTERACT.asMap().entries.stream() + .sorted { a, b -> b.value.compareTo(a.value) } + .map { it.key } + .findFirst() + if (first.isEmpty) { + return + } + player = Bukkit.getPlayer(first.get()) ?: return + } + + EntityDamageEvent.DamageCause.ENTITY_ATTACK, EntityDamageEvent.DamageCause.PROJECTILE -> { + val damager: Entity = damageEvent.entity + if (damager is Projectile) { + player = damager.shooter as Player + } else if (damager is Player) { + player = damager + } + } + + 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.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}!") } } diff --git a/src/main/kotlin/xyz/atnrch/dragon/world/PreviousWorldUtils.kt b/src/main/kotlin/xyz/atnrch/dragon/world/PreviousWorldUtils.kt new file mode 100644 index 0000000..a307025 --- /dev/null +++ b/src/main/kotlin/xyz/atnrch/dragon/world/PreviousWorldUtils.kt @@ -0,0 +1,22 @@ +package xyz.atnrch.dragon.world + +import org.apache.commons.io.FileUtils +import org.bukkit.Bukkit + +class PreviousWorldUtils { + companion object { + fun resetEnd() { + val end = Bukkit.getWorld("world_the_end")!! + end.loadedChunks.forEach { it.unload(false) } + Bukkit.unloadWorld(end, false) + FileUtils.deleteDirectory(end.worldFolder) + } + + fun resetNether() { + val nether = Bukkit.getWorld("world_nether")!! + nether.loadedChunks.forEach { it.unload(false) } + Bukkit.unloadWorld(nether, false) + FileUtils.deleteDirectory(nether.worldFolder) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/atnrch/dragon/world/WorldManager.kt b/src/main/kotlin/xyz/atnrch/dragon/world/WorldManager.kt index bcb8b0b..2fd6dd7 100644 --- a/src/main/kotlin/xyz/atnrch/dragon/world/WorldManager.kt +++ b/src/main/kotlin/xyz/atnrch/dragon/world/WorldManager.kt @@ -5,9 +5,12 @@ import org.bukkit.World import org.bukkit.entity.Player import xyz.atnrch.dragon.RunnerDragon -class WorldManager(private val world: World) { - fun applyWaitingRules() { - world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false) +class WorldManager(private vararg val worlds: World) { + fun applyRules() { + worlds.forEach { + it.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false) + it.setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, false) + } } fun teleportAtSpawn(player: Player) {