diff --git a/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java b/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java index ca03ab19..8d416ce0 100644 --- a/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java +++ b/duels-plugin/src/main/java/com/meteordevelopments/duels/duel/DuelManager.java @@ -87,6 +87,14 @@ public DuelManager(final DuelsPlugin plugin) { } public void handleMatchEnd(DuelMatch match, ArenaImpl arena, Player loser, Location deadLocation, Player winner) { + // Safety check: Don't process if match is already finished (prevents race condition where multiple death events trigger concurrent match ending) + if (match.isFinished()) { + return; + } + + // Mark match as finished immediately to prevent re-entry from concurrent death events + match.setFinished(); + DuelsPlugin.getMorePaperLib().scheduling().regionSpecificScheduler(arena.first().getLocation()).runDelayed(() -> { if (arena.size() == 0) { match.getAllPlayers().forEach(matchPlayer -> { @@ -208,6 +216,14 @@ public void handleMatchEnd(DuelMatch match, ArenaImpl arena, Player loser, Locat } public void handleTeamMatchEnd(TeamDuelMatch match, ArenaImpl arena, Location deadLocation, TeamDuelMatch.Team winningTeam) { + // Safety check: Don't process if team match is already finished (prevents race condition where multiple team member deaths trigger concurrent match ending) + if (match.isFinished()) { + return; + } + + // Mark match as finished immediately to prevent re-entry from concurrent team member deaths + match.setFinished(); + DuelsPlugin.getMorePaperLib().scheduling().regionSpecificScheduler(deadLocation).runDelayed(() -> { if (config.isSpawnFirework()) { DuelsPlugin.getMorePaperLib().scheduling().regionSpecificScheduler(deadLocation).run(() -> {