From f9a58aad0843c58a73e62ba79f2cd20eb79fbbdd Mon Sep 17 00:00:00 2001 From: Jason Spangler Date: Sat, 11 Aug 2018 20:09:49 -0500 Subject: [PATCH] Fix for ConcurrentModificationException due to ICopyableCap.copyTo() --- src/main/java/com/wumple/util/ModConfig.java | 6 ++- .../util/capability/copier/CapCopier.java | 1 + .../util/capability/copier/ICopyableCap.java | 38 ++++++++++++------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/wumple/util/ModConfig.java b/src/main/java/com/wumple/util/ModConfig.java index 1e7439c..108486c 100755 --- a/src/main/java/com/wumple/util/ModConfig.java +++ b/src/main/java/com/wumple/util/ModConfig.java @@ -39,8 +39,12 @@ public static class MatchingConfig public static class Debugging { @Name("Debug mode") - @Config.Comment("Enable debug features on this menu, display extra debug info.") + @Config.Comment("Enable general debug features, display extra debug info.") public boolean debug = false; + + @Name("Placeholder TileEntity") + @Config.Comment("Use placeholder TileEntity to hold caps if block has none. May crash. May not persist.") + public boolean usePlaceholderTileEntity = false; } @Mod.EventBusSubscriber(modid = Reference.MOD_ID) diff --git a/src/main/java/com/wumple/util/capability/copier/CapCopier.java b/src/main/java/com/wumple/util/capability/copier/CapCopier.java index 797dfa5..dd07c96 100755 --- a/src/main/java/com/wumple/util/capability/copier/CapCopier.java +++ b/src/main/java/com/wumple/util/capability/copier/CapCopier.java @@ -69,6 +69,7 @@ default void onPlaceBlock(BlockEvent.PlaceEvent event) ItemStack stack = event.getPlayer().getHeldItem(event.getHand()); BlockPos pos = event.getPos(); + // this can fail if pos (aka Block at pos) has no TileEntity! copyToFrom(pos, stack, world); } diff --git a/src/main/java/com/wumple/util/capability/copier/ICopyableCap.java b/src/main/java/com/wumple/util/capability/copier/ICopyableCap.java index 8ea6236..2771053 100755 --- a/src/main/java/com/wumple/util/capability/copier/ICopyableCap.java +++ b/src/main/java/com/wumple/util/capability/copier/ICopyableCap.java @@ -2,6 +2,7 @@ import java.util.List; +import com.wumple.util.ModConfig; import com.wumple.util.placeholder.TileEntityPlaceholder; import net.minecraft.item.ItemStack; @@ -93,25 +94,34 @@ default void copyTo(BlockPos pos, World world) { TileEntity tileentity = world.getTileEntity(pos); - if (tileentity == null) + if (ModConfig.zdebugging.usePlaceholderTileEntity) { - tileentity = getNewTE(); - if (tileentity != null) + if (tileentity == null) { - Chunk chunk = world.getChunk(pos); - // Obvious method doesn't work: world.setTileEntity(pos, tileentity); - // Block.hasTileEntity() false would cause Chunk.addTileEntity() to reject - tileentity.setWorld(world); - tileentity.setPos(pos); - tileentity.validate(); - chunk.getTileEntityMap().put(pos, tileentity); - chunk.markDirty(); - world.addTileEntity(tileentity); - // TODO: tileentity will not persist - loading/saving will strip it out since Block.hasTileEntity() false + tileentity = getNewTE(); + if (tileentity != null) + { + Chunk chunk = world.getChunk(pos); + // Obvious method doesn't work: world.setTileEntity(pos, tileentity); + // Block.hasTileEntity() false would cause Chunk.addTileEntity() to reject + tileentity.setWorld(world); + tileentity.setPos(pos); + tileentity.validate(); + // THIS CAUSES ConcurrentModificationException !!! + // However World.processingLoadedTiles that World.setTileEntity uses is private + chunk.getTileEntityMap().put(pos, tileentity); + chunk.markDirty(); + world.addTileEntity(tileentity); + // TODO: tileentity will not persist - loading/saving will strip it out since Block.hasTileEntity() false + } } } - copyTo(tileentity); + if (tileentity != null) + { + copyTo(tileentity); + } + // else failure: no TileEntity to copy cap to } default void copyTo(TileEntity tileentity)