diff --git a/TODO.md b/TODO.md index 2e0e093..25aa553 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,12 @@ -- [ ] Démarrage en forme de Title - [ ] Système de bounties pour les nazes (objectifs à complèter) - [ ] Système de palier par équipe (qui en est où par rapport au dragon) -- [ ] Classer les équipes qui ont le plus tapé le dragon -- [ ] Calculer le deuxième groupe le plus proche de l'Enderdragon +- [ ] Démarrage en forme de Title +- [ ] spread le spawn dans un rayon de 1000 blocks +- [ x ] Calculer le deuxième groupe le plus proche de l'Enderdragon + +Après que les premiers joueurs aient passé le portail de l'End, +balancer les coordonnées ```kotlin val advancement = Advancement.Builder.advancement().save({}, "runnerdragon:test").toBukkit() diff --git a/src/main/kotlin/xyz/ineanto/dragon/RunnerDragon.kt b/src/main/kotlin/xyz/ineanto/dragon/RunnerDragon.kt index 13ed906..b028544 100644 --- a/src/main/kotlin/xyz/ineanto/dragon/RunnerDragon.kt +++ b/src/main/kotlin/xyz/ineanto/dragon/RunnerDragon.kt @@ -17,7 +17,7 @@ import xyz.ineanto.dragon.commands.GameCommand import xyz.ineanto.dragon.event.* import xyz.ineanto.dragon.event.end.BedInteractListener import xyz.ineanto.dragon.event.end.BlockPlaceListener -import xyz.ineanto.dragon.event.end.EnderDragonListener +import xyz.ineanto.dragon.event.end.FinalBlowListener import xyz.ineanto.dragon.event.waiting.WaitingListener import xyz.ineanto.dragon.player.PlayerManager import xyz.ineanto.dragon.scoreboard.ScoreboardTeams @@ -86,7 +86,7 @@ class RunnerDragon : JavaPlugin() { server.pluginManager.registerEvents(DimensionEntranceListener(), this) server.pluginManager.registerEvents(BedInteractListener(), this) - server.pluginManager.registerEvents(EnderDragonListener(), this) + server.pluginManager.registerEvents(FinalBlowListener(), this) server.pluginManager.registerEvents(PlayerJoinListener(), this) server.pluginManager.registerEvents(PlayerQuitListener(), this) server.pluginManager.registerEvents(PlayerRespawnListener(), this) diff --git a/src/main/kotlin/xyz/ineanto/dragon/assets/Asset.kt b/src/main/kotlin/xyz/ineanto/dragon/assets/Asset.kt deleted file mode 100644 index 6508a5f..0000000 --- a/src/main/kotlin/xyz/ineanto/dragon/assets/Asset.kt +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.ineanto.dragon.assets - -data class Asset( - private val qualifier: String, - val name: String, - var path: String = "assets/${qualifier}/${name}.png" -) { - class Icons { - companion object { - val DENY: Asset = Asset("icon", "deny") - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/xyz/ineanto/dragon/coordinates/CoordsDumper.kt b/src/main/kotlin/xyz/ineanto/dragon/coordinates/CoordsDumper.kt new file mode 100644 index 0000000..99b340d --- /dev/null +++ b/src/main/kotlin/xyz/ineanto/dragon/coordinates/CoordsDumper.kt @@ -0,0 +1,13 @@ +package xyz.ineanto.dragon.coordinates + +import org.bukkit.entity.Player + +class CoordsDumper { + // TODO (Ineanto, 06/09/2025): Coords + // tous les joueurs (x, y, z + dimension + équipe) + // stronghold (x, y, z + dimension) + + fun dumpCoords(player: Player) { + + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/ineanto/dragon/event/EntityDamageListener.kt b/src/main/kotlin/xyz/ineanto/dragon/event/EntityDamageListener.kt index 22cc713..c390cf4 100644 --- a/src/main/kotlin/xyz/ineanto/dragon/event/EntityDamageListener.kt +++ b/src/main/kotlin/xyz/ineanto/dragon/event/EntityDamageListener.kt @@ -11,6 +11,8 @@ import xyz.ineanto.dragon.RunnerDragon class EntityDamageListener : Listener { @EventHandler fun onEntityDamage(event: EntityDamageEvent) { + // TODO (Ineanto, 06/09/2025): annuler les dégâts entre membres d'une même équipe + if (event.entity is Player) { val player = (event.entity as Player) if (RunnerDragon.STATE == GameState.GRACE_PERIOD && event.cause == EntityDamageEvent.DamageCause.ENTITY_ATTACK) { diff --git a/src/main/kotlin/xyz/ineanto/dragon/event/PlayerJoinListener.kt b/src/main/kotlin/xyz/ineanto/dragon/event/PlayerJoinListener.kt index db280c6..c5a06e1 100644 --- a/src/main/kotlin/xyz/ineanto/dragon/event/PlayerJoinListener.kt +++ b/src/main/kotlin/xyz/ineanto/dragon/event/PlayerJoinListener.kt @@ -16,8 +16,6 @@ class PlayerJoinListener : Listener { val player = event.player val dragonPlayer: DragonPlayer = RunnerDragon.instance.playerManager.addPlayer(player.uniqueId) - // TODO (Ineanto, 6/26/23): Set nick - event.joinMessage( Component.text("(", NamedTextColor.WHITE) .append(Component.text("+", NamedTextColor.GREEN)) diff --git a/src/main/kotlin/xyz/ineanto/dragon/event/end/EnderDragonListener.kt b/src/main/kotlin/xyz/ineanto/dragon/event/end/EnderDragonListener.kt deleted file mode 100644 index 619317d..0000000 --- a/src/main/kotlin/xyz/ineanto/dragon/event/end/EnderDragonListener.kt +++ /dev/null @@ -1,95 +0,0 @@ -package xyz.ineanto.dragon.event.end - -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import net.kyori.adventure.text.minimessage.MiniMessage -import org.bukkit.Bukkit -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 -import org.bukkit.event.entity.EntityDeathEvent -import xyz.ineanto.dragon.RunnerDragon -import java.util.* - -class EnderDragonListener : Listener { - @EventHandler - fun onEnderDragonDeath(event: EntityDeathEvent) { - if (event.entity is EnderDragon) { - val dragon = event.entity as EnderDragon - val lastDamageCause = dragon.lastDamageCause ?: return - val entity: Entity = lastDamageCause.entity - - var player: Player? = null - when (lastDamageCause.cause) { - EntityDamageEvent.DamageCause.BLOCK_EXPLOSION -> { - val first: Optional = RunnerDragon.LAST_BED_INTERACT.asMap().entries.stream() - .sorted { a, b -> b.value.compareTo(a.value) } - .map { it.key } - .findFirst() - player = Bukkit.getPlayer(first.get()) ?: return - } - - EntityDamageEvent.DamageCause.ENTITY_ATTACK, EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK, EntityDamageEvent.DamageCause.PROJECTILE -> { - if (entity is Projectile) { - player = entity.shooter as Player - } else if (entity is Player) { - player = entity - } - } - - else -> {} - } - - val dragonPlayer = player?.uniqueId?.let { RunnerDragon.instance.playerManager.getPlayer(it) } - val team = dragonPlayer?.getTeam() - if (dragon.dragonBattle?.hasBeenPreviouslyKilled()?.not() == true) { - Bukkit.getOnlinePlayers().forEach { - if ((it.location.world!!.environment == Environment.THE_END).not()) { - it.playSound(it.location, Sound.ENTITY_ENDER_DRAGON_DEATH, 1f, 0.5f) - } - } - - val victoryComponent: Component = Component.text() - .append(RunnerDragon.PREFIX) - .appendSpace() - .append( - MiniMessage.miniMessage().deserialize("VICTOIRE !") - ) - .build() - - - val teamComponent = Component.text() - .append(RunnerDragon.PREFIX) - .appendSpace() - .append( - Component.text( - "Le dragon a été tué par l'équipe :", - NamedTextColor.WHITE - ) - ) - .appendSpace() - - team?.let { - teamComponent.append(team.displayName) - } ?: { - teamComponent.append(Component.text("???", NamedTextColor.RED, TextDecoration.OBFUSCATED)) - } - - teamComponent.appendSpace() - teamComponent.append(Component.text("!", NamedTextColor.WHITE, TextDecoration.BOLD)) - - Bukkit.broadcast(victoryComponent) - Bukkit.broadcast(teamComponent.build()) - } - - //SecondFight.start(dragon) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/xyz/ineanto/dragon/event/end/FinalBlowListener.kt b/src/main/kotlin/xyz/ineanto/dragon/event/end/FinalBlowListener.kt new file mode 100644 index 0000000..b4e0117 --- /dev/null +++ b/src/main/kotlin/xyz/ineanto/dragon/event/end/FinalBlowListener.kt @@ -0,0 +1,72 @@ +package xyz.ineanto.dragon.event.end + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Bukkit +import org.bukkit.NamespacedKey +import org.bukkit.Sound +import org.bukkit.World.Environment +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerAdvancementDoneEvent +import xyz.ineanto.dragon.RunnerDragon +import xyz.ineanto.dragon.teams.Team + +class FinalBlowListener : Listener { + @EventHandler + fun onEnderDragonDeath(event: PlayerAdvancementDoneEvent) { + if (event.advancement == Bukkit.getAdvancement(NamespacedKey.fromString("minecraft:story/follow_ender_eye")!!)) { + // TODO (Ineanto, 06/09/2025): dumper les coords du stronghold + } + + if (event.advancement == Bukkit.getAdvancement(NamespacedKey.fromString("minecraft:end/kill_dragon")!!)) { + // TODO (Ineanto, 06/09/2025): finir ce bordel + + val player = event.player + val dragonPlayer = player.uniqueId.let { RunnerDragon.instance.playerManager.getPlayer(it) } + val team: Team? = dragonPlayer.getTeam() + Bukkit.getOnlinePlayers().forEach { + if ((it.location.world!!.environment == Environment.THE_END).not()) { + it.playSound(it.location, Sound.ENTITY_ENDER_DRAGON_DEATH, 1f, 0.5f) + } + } + + val victoryComponent: Component = Component.text() + .append(RunnerDragon.PREFIX) + .appendSpace() + .append( + MiniMessage.miniMessage().deserialize("VICTOIRE !") + ) + .build() + + + val teamComponent = Component.text() + .append(RunnerDragon.PREFIX) + .appendSpace() + .append( + Component.text( + "Le dragon a été tué par l'équipe :", + NamedTextColor.WHITE + ) + ) + .appendSpace() + + + teamComponent.appendSpace() + teamComponent.append(Component.text("!", NamedTextColor.WHITE, TextDecoration.BOLD)) + + team?.let { + teamComponent.append(team.displayName) + } ?: { + teamComponent.append(Component.text("???", NamedTextColor.RED, TextDecoration.OBFUSCATED)) + } + + Bukkit.broadcast(victoryComponent) + Bukkit.broadcast(teamComponent.build()) + + //SecondFight.start(dragon) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/ineanto/dragon/inventory/TeamSelectionScreen.kt b/src/main/kotlin/xyz/ineanto/dragon/inventory/TeamSelectionScreen.kt deleted file mode 100644 index dd30739..0000000 --- a/src/main/kotlin/xyz/ineanto/dragon/inventory/TeamSelectionScreen.kt +++ /dev/null @@ -1,70 +0,0 @@ -package xyz.ineanto.dragon.inventory - -import net.kyori.adventure.key.Key -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import ru.brikster.glyphs.compile.GlyphCompiler -import ru.brikster.glyphs.glyph.Glyph -import ru.brikster.glyphs.glyph.GlyphComponentBuilder -import ru.brikster.glyphs.glyph.GlyphComponentBuilder.PositionType -import ru.brikster.glyphs.glyph.image.ImageGlyph -import ru.brikster.glyphs.glyph.image.TextureProperties -import ru.brikster.glyphs.glyph.space.mojang.MojangSpacesGlyph -import ru.brikster.glyphs.resources.GlyphResources -import team.unnamed.creative.texture.Texture - -class TeamSelectionScreen { - fun show() { - // Glyphs objects - var spaces = MojangSpacesGlyph.create() - - var guiBackground = ImageGlyph.of( - Key.key(Glyph.DEFAULT_NAMESPACE, "gui/gui_background"), - Texture.of( - Key.key(Glyph.DEFAULT_NAMESPACE, "gui/gui_background"), - GlyphResources.resourceFromJar("gui_background.png") - ), - TextureProperties(/* height */ 256, /* ascent */ 19) - ) - - var exampleButton = ImageGlyph.of( - Key.key(Glyph.DEFAULT_NAMESPACE, "gui/example_button"), - Texture.of( - Key.key(Glyph.DEFAULT_NAMESPACE, "gui/example_button"), - GlyphResources.resourceFromJar("example_button.png") - ), - TextureProperties(/* height */ 22, /* ascent */ -56 - ) - ) - - var font = GlyphResources.minecraftFontGlyphCollection( - listOf( - TextureProperties(/* height */ 12, /* ascent */ -6), - TextureProperties(/* height */ 8, /* ascent */ -24 - ), - TextureProperties(/* height */ 8, /* ascent */-36) - ) - ); - - val resources = GlyphCompiler.instance() - .compile(spaces, guiBackground, exampleButton, font); - resources.addAll(GlyphResources.blankSlotResources()); - - //createResourcepack(resources) - - val title = GlyphComponentBuilder.gui(spaces) - .append(guiBackground) - .append(/* position */ 131, exampleButton) - .append(/* position */ 16, font.translate(/* height */ 12, /* ascent */ -6, "Example text")) - .append(/* position */ 16, font.translate(/* height */ 8, /* ascent */ -24, "Hello ")) - .append(PositionType.RELATIVE, font.translate(/* height */ 8, /* ascent */ -24, "world...")) - .append( - PositionType.ABSOLUTE, /* position */ - 16, - font.translate(/* height */ 8, /* ascent */ -36, "Hello world...", NamedTextColor.LIGHT_PURPLE) - ) - .build() - .append(Component.text("Test menu with glyphs", NamedTextColor.DARK_GRAY, TextDecoration.UNDERLINED)) - } -} \ No newline at end of file diff --git a/src/main/kotlin/xyz/ineanto/dragon/player/DragonPlayer.kt b/src/main/kotlin/xyz/ineanto/dragon/player/DragonPlayer.kt index b924738..0664ede 100644 --- a/src/main/kotlin/xyz/ineanto/dragon/player/DragonPlayer.kt +++ b/src/main/kotlin/xyz/ineanto/dragon/player/DragonPlayer.kt @@ -122,7 +122,9 @@ class DragonPlayer(uuid: UUID) { } fun updateDisplayName() { + val team = RunnerDragon.instance.teamManager.getPlayerTeam(bukkitPlayer) + // TODO (Ineanto, 06/09/2025): do this via scoreboard teams } private fun formatDuration(totalSeconds: Int): String {