From 77a740edb7cdcbd0c8a2401fa2755d6dd5ed240e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 18 Oct 2026 17:06:14 +0200 Subject: [PATCH] arena: leaving the box during a fight (e.g. ender pearl glitch) counts as knocked out --- .../spawn/arena/appliances/arena/Fight.java | 15 +++++++++++++-- .../arena/appliances/arena/FightListener.java | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/Fight.java b/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/Fight.java index d160791..87aef79 100644 --- a/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/Fight.java +++ b/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/Fight.java @@ -237,11 +237,22 @@ final class Fight { * The player took lethal damage: out of the fight and back to the tribune. */ void defeated(Player player) { + this.knockOut(player, Component.empty(), "ist ausgeschieden"); + } + + /** + * The player got out of the box, for example by glitching through a wall with an ender pearl. + */ + void leftBox(Player player) { + this.knockOut(player, Component.text("Du hast die Arena verlassen", NamedTextColor.GRAY), "hat die Arena verlassen"); + } + + private void knockOut(Player player, Component subtitle, String what) { if(this.over || !this.eliminate(player.getUniqueId())) return; - player.showTitle(Title.title(Component.text("Ausgeschieden", NamedTextColor.RED), Component.empty())); + player.showTitle(Title.title(Component.text("Ausgeschieden", NamedTextColor.RED), subtitle)); Style.play(player, Sound.BLOCK_BEACON_DEACTIVATE, 1f); this.arena.toTribune(player); - this.announceElimination(player.getUniqueId(), "ist ausgeschieden"); + this.announceElimination(player.getUniqueId(), what); this.checkEnd(); } diff --git a/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/FightListener.java b/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/FightListener.java index 0562df7..fba1bc7 100644 --- a/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/FightListener.java +++ b/arena/src/main/java/eu/mhsl/craftattack/spawn/arena/appliances/arena/FightListener.java @@ -12,6 +12,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; @@ -94,4 +95,17 @@ class FightListener extends ApplianceListener { event.setCancelled(true); } } + + /** + * Whoever ends up outside the box anyway (ender pearl through a wall or corner) loses. + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMove(PlayerMoveEvent event) { + if(!event.hasChangedBlock()) return; + Player player = event.getPlayer(); + if(this.getAppliance().state(player) != Arena.PlayerState.FIGHT || !this.isFighting(player)) return; + Fight fight = this.getAppliance().fightOf(player); + if(event.getTo().getWorld() == this.getAppliance().worlds().play() && fight.region().contains(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ())) return; + fight.leftBox(player); + } }