From 393b4835d9280ba02cde0054e7c8c7a4b83c468f Mon Sep 17 00:00:00 2001 From: David Kirchner Date: Sun, 8 Oct 2017 19:43:45 -0700 Subject: [PATCH] Fix ConcurrentModificationException that occurred when reactor explodes. CraftBukket's HumanEntity.closeInventory() apparently removes the human from the inventory's viewer list, resulting in an exception when we were calling closeInventory while iterating over the list of said viewers. Fixes TheBusyBiscuit/Slimefun4#364. --- .../mrCookieSlime/Slimefun/api/BlockStorage.java | 15 +++++++-------- .../Slimefun/api/inventory/BlockMenu.java | 7 +++---- .../api/inventory/UniversalBlockMenu.java | 4 +++- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 1b2027e79..29ca6b66e 100644 --- a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -1,8 +1,10 @@ package me.mrCookieSlime.Slimefun.api; import java.io.File; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -415,11 +417,7 @@ public class BlockStorage { if (destroy) { if (storage.hasInventory(l)) storage.clearInventory(l); if (storage.hasUniversalInventory(l)) { - UniversalBlockMenu menu = storage.getUniversalInventory(l); - for (HumanEntity n: menu.toInventory().getViewers()) { - n.closeInventory(); - } - + storage.getUniversalInventory(l).close(); storage.getUniversalInventory(l).save(); } if (ticking_chunks.containsKey(l.getChunk().toString())) { @@ -552,10 +550,11 @@ public class BlockStorage { public void clearInventory(Location l) { BlockMenu menu = getInventory(l); - for (HumanEntity n: menu.toInventory().getViewers()) { - n.closeInventory(); + + for(HumanEntity human: new ArrayList<>(menu.toInventory().getViewers())) { + human.closeInventory(); } - + inventories.get(l).delete(l); inventories.remove(l); } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java index 24209730b..1231c9157 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java @@ -1,7 +1,8 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; -import java.util.Iterator; +import java.util.ArrayList; +import java.util.List; import org.bukkit.Location; import org.bukkit.block.Block; @@ -131,9 +132,7 @@ public class BlockMenu extends ChestMenu { } public void close() { - Iterator iterator = toInventory().getViewers().iterator(); - while (iterator.hasNext()) { - HumanEntity human = iterator.next(); + for(HumanEntity human: new ArrayList<>(toInventory().getViewers())) { human.closeInventory(); } } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java index 7b66834b7..555c34f2b 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java @@ -1,6 +1,8 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; +import java.util.ArrayList; +import java.util.List; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; @@ -89,7 +91,7 @@ public class UniversalBlockMenu extends ChestMenu { } public void close() { - for (HumanEntity human: toInventory().getViewers()) { + for(HumanEntity human: new ArrayList<>(toInventory().getViewers())) { human.closeInventory(); } }