From bafc17e1dfa3ef66a96dff739f786c0916039c01 Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Sun, 6 Oct 2024 15:47:50 +0200 Subject: [PATCH] Fix `auto-leave-on-end: true` error. The ConcurrentModificationException happens because the player leave procedure alters the `specPlayers` set, and this is the set we iterate during the automatic spectator kicking procedure. By making a copy of the set and iterating the copy, we circumvent this problem. Java 101, really, but when the code is stateful and complex, it's "fair enough" that it slipped through the cracks. It's also impossible to reproduce without at least two players, so go figure... Fixes #802 --- changelog.md | 1 + src/main/java/com/garbagemule/MobArena/ArenaImpl.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 8df5175..a40687a 100644 --- a/changelog.md +++ b/changelog.md @@ -24,6 +24,7 @@ These changes will (most likely) be included in the next version. ### Fixed - MobArena no longer throws errors when handling block explosions on Minecraft 1.21. +- MobArena no longer throws errors during the automatic removal of spectators when using `auto-leave-on-end: true`. - The `shuffle-positions` ability now correctly shuffles the position of the boss as well if `monster-teleport` is set to `false`. - The `obsidian-bomb` ability no longer breaks boss waves. - Text on Arena Signs is no longer explicitly truncated. This fixes an issue where color codes would count towards the character limit, causing the text that would otherwise fit on the sign to be cut off. diff --git a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java index ed8eeb1..abaaa23 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java @@ -665,7 +665,8 @@ public class ArenaImpl implements Arena // Auto-leave if (settings.getBoolean("auto-leave-on-end", false)) { - specPlayers.forEach(this::playerLeave); + List spectators = new ArrayList<>(specPlayers); + spectators.forEach(this::playerLeave); } return true;