From 48a85a7e853c378429c37edd08516ef903c4b1e4 Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Tue, 14 Feb 2017 17:26:20 +0100 Subject: [PATCH] Use a copy of the block list in BlockExplodeEvent for the fake EntityExplodeEvent. Fixes #356 The blockList() call returns the actual List object in the explode event, which means it'll be shared between the the fake event and the original event. As a result, the call to blockList().clear() will clear the shared list, and the following call to blockList().addAll(fake.blockList()) results in trying to add the empty list to itself. This commit makes sure to copy the original event's block list before sending it to the fake event. --- .../garbagemule/MobArena/listeners/MAGlobalListener.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/garbagemule/MobArena/listeners/MAGlobalListener.java b/src/main/java/com/garbagemule/MobArena/listeners/MAGlobalListener.java index 4ab22e4..4f0975b 100644 --- a/src/main/java/com/garbagemule/MobArena/listeners/MAGlobalListener.java +++ b/src/main/java/com/garbagemule/MobArena/listeners/MAGlobalListener.java @@ -1,6 +1,7 @@ package com.garbagemule.MobArena.listeners; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -20,6 +21,9 @@ import com.garbagemule.MobArena.leaderboards.Stats; import com.garbagemule.MobArena.util.VersionChecker; import com.garbagemule.MobArena.util.inventory.InventoryManager; +import java.util.ArrayList; +import java.util.List; + /** * The point of this class is to simply redirect all events to each arena's * own listener(s). @@ -165,8 +169,11 @@ public class MAGlobalListener implements Listener @EventHandler(priority = EventPriority.HIGHEST) public void blockExplode(BlockExplodeEvent event) { + // Create a copy of the block list so we can clear and re-add + List blocks = new ArrayList<>(event.blockList()); + // Account for Spigot's messy extra event - EntityExplodeEvent fake = new EntityExplodeEvent(null, event.getBlock().getLocation(), event.blockList(), event.getYield()); + EntityExplodeEvent fake = new EntityExplodeEvent(null, event.getBlock().getLocation(), blocks, event.getYield()); entityExplode(fake); // Copy the values over