arena: leaving the box during a fight (e.g. ender pearl glitch) counts as knocked out

This commit is contained in:
MineTec committed 2026-10-18 17:06:14 +02:00
1 parent 4a87bb3fad
commit 77a740edb7
2 files changed
+27 -2

No files matched your search

@@ -237,11 +237,22 @@ final class Fight {
* The player took lethal damage: out of the fight and back to the tribune. * The player took lethal damage: out of the fight and back to the tribune.
*/ */
void defeated(Player player) { 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; 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); Style.play(player, Sound.BLOCK_BEACON_DEACTIVATE, 1f);
this.arena.toTribune(player); this.arena.toTribune(player);
this.announceElimination(player.getUniqueId(), "ist ausgeschieden"); this.announceElimination(player.getUniqueId(), what);
this.checkEnd(); this.checkEnd();
} }
@@ -12,6 +12,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -94,4 +95,17 @@ class FightListener extends ApplianceListener<Arena> {
event.setCancelled(true); 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);
}
} }