From 470a7e82bca11eaf5d226679f0d9b44789d32e11 Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Tue, 17 Dec 2019 17:12:31 +0000 Subject: [PATCH] Iterate over copy of loaded TE list, fixes #298 and #304 --- .../wizardry/client/WizardryClientEventHandler.java | 8 +++++++- .../electroblob/wizardry/data/DispenserCastingData.java | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java b/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java index 159e7c5e..7b25b636 100644 --- a/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java +++ b/src/main/java/electroblob/wizardry/client/WizardryClientEventHandler.java @@ -41,6 +41,9 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.relauncher.Side; import org.lwjgl.opengl.GL11; +import java.util.ArrayList; +import java.util.List; + /** * Event handler responsible for client-side only events, mostly rendering. * @@ -138,7 +141,10 @@ public final class WizardryClientEventHandler { if(world == null) return; - for(TileEntity tileentity : world.loadedTileEntityList){ + // Somehow this was throwing a CME, I have no idea why so I'm just going to cheat and copy the list + List tileEntities = new ArrayList<>(world.loadedTileEntityList); + + for(TileEntity tileentity : tileEntities){ if(tileentity instanceof TileEntityDispenser){ if(DispenserCastingData.get((TileEntityDispenser)tileentity) != null){ DispenserCastingData.get((TileEntityDispenser)tileentity).update(); diff --git a/src/main/java/electroblob/wizardry/data/DispenserCastingData.java b/src/main/java/electroblob/wizardry/data/DispenserCastingData.java index 28d0fe56..226c4abc 100644 --- a/src/main/java/electroblob/wizardry/data/DispenserCastingData.java +++ b/src/main/java/electroblob/wizardry/data/DispenserCastingData.java @@ -166,7 +166,10 @@ public class DispenserCastingData extends BlockCastingData // This will fire once for each dimension, but since we want dispenser-casting to work in all dimensions, // this is correct (the loaded tile entity list will of course be different in each case. - for(TileEntity tileentity : event.world.loadedTileEntityList){ + // Somehow this was throwing a CME, I have no idea why so I'm just going to cheat and copy the list + List tileEntities = new ArrayList<>(event.world.loadedTileEntityList); + + for(TileEntity tileentity : tileEntities){ if(tileentity instanceof TileEntityDispenser){ if(DispenserCastingData.get((TileEntityDispenser)tileentity) != null){ DispenserCastingData.get((TileEntityDispenser)tileentity).update();