From d903427e224f15df5f2369ef01956e63e57857c7 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 18 Nov 2019 21:34:35 +0100 Subject: [PATCH] Fixed crash when breaking a Grid, Crafting Monitor, Crafter Manager or Portable Grid when another player is still using it. Fixes #2353 --- CHANGELOG.md | 1 + .../network/node/CrafterManagerNetworkNode.java | 10 +++++++++- .../network/node/CraftingMonitorNetworkNode.java | 10 +++++++++- .../apiimpl/network/node/GridNetworkNode.java | 10 +++++++++- .../refinedstorage/container/BaseContainer.java | 11 ++++++++++- .../render/tesr/StorageMonitorTileRenderer.java | 9 ++++++++- .../tile/grid/portable/PortableGridTile.java | 9 ++++++++- 7 files changed, 54 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 989b058c9..85f99f05e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Fixed delay in block update when placing a cable block (raoulvdberge) - Fixed holder of cable blocks sometimes conflicting with a cable connection while rendering (raoulvdberge) - Fixed being able to move wireless items in inventory when using a keybinding to open (raoulvdberge) +- Fixed crash when breaking a Grid, Crafting Monitor, Crafter Manager or Portable Grid when another player is still using it (raoulvdberge) ### 1.7 NOTE: This is an alpha release. Bugs may happen. Remember to take backups. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java index 96ac0b576..488f3dca5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CrafterManagerNetworkNode.java @@ -2,8 +2,10 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; +import com.raoulvdberge.refinedstorage.block.CrafterManagerBlock; import com.raoulvdberge.refinedstorage.block.NetworkNodeBlock; import com.raoulvdberge.refinedstorage.tile.CrafterManagerTile; +import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -72,6 +74,12 @@ public class CrafterManagerNetworkNode extends NetworkNode { } public boolean isActive() { - return world.getBlockState(pos).get(NetworkNodeBlock.CONNECTED); + BlockState state = world.getBlockState(pos); + + if (state.getBlock() instanceof CrafterManagerBlock) { + return state.get(NetworkNodeBlock.CONNECTED); + } + + return false; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java index bdae1bb78..31416e0ba 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/CraftingMonitorNetworkNode.java @@ -3,11 +3,13 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; +import com.raoulvdberge.refinedstorage.block.CraftingMonitorBlock; import com.raoulvdberge.refinedstorage.block.NetworkNodeBlock; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.CraftingMonitorTile; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.nbt.CompoundNBT; @@ -76,7 +78,13 @@ public class CraftingMonitorNetworkNode extends NetworkNode implements ICrafting @Override public boolean isActive() { - return world.getBlockState(pos).get(NetworkNodeBlock.CONNECTED); + BlockState state = world.getBlockState(pos); + + if (state.getBlock() instanceof CraftingMonitorBlock) { + return state.get(NetworkNodeBlock.CONNECTED); + } + + return false; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java index 9a014b3ad..e0e8784d0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java @@ -14,6 +14,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.AllowedTagList; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.listener.FluidGridStorageCacheListener; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.listener.ItemGridStorageCacheListener; +import com.raoulvdberge.refinedstorage.block.GridBlock; import com.raoulvdberge.refinedstorage.block.NetworkNodeBlock; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; import com.raoulvdberge.refinedstorage.inventory.item.BaseItemHandler; @@ -27,6 +28,7 @@ import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import com.raoulvdberge.refinedstorage.tile.grid.GridTile; import com.raoulvdberge.refinedstorage.util.GridUtils; import com.raoulvdberge.refinedstorage.util.StackUtils; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.inventory.CraftResultInventory; @@ -405,7 +407,13 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I @Override public boolean isActive() { - return world.getBlockState(pos).get(NetworkNodeBlock.CONNECTED); + BlockState state = world.getBlockState(pos); + + if (state.getBlock() instanceof GridBlock) { + return state.get(NetworkNodeBlock.CONNECTED); + } + + return false; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/BaseContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/container/BaseContainer.java index 5c7d0eea4..e05bd9f3a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/BaseContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/BaseContainer.java @@ -155,6 +155,15 @@ public abstract class BaseContainer extends Container { @Override public boolean canInteractWith(PlayerEntity player) { + return isTileStillThere(); + } + + private boolean isTileStillThere() { + if (tile != null) { + // @Volatile: Logic from LockableLootTileEntity#isUsableByPlayer + return tile.getWorld().getTileEntity(tile.getPos()) == tile; + } + return true; } @@ -185,7 +194,7 @@ public abstract class BaseContainer extends Container { public void detectAndSendChanges() { super.detectAndSendChanges(); - if (listener != null) { + if (listener != null && isTileStillThere()) { listener.detectAndSendChanges(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/render/tesr/StorageMonitorTileRenderer.java b/src/main/java/com/raoulvdberge/refinedstorage/render/tesr/StorageMonitorTileRenderer.java index f3e67146d..64425f473 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/render/tesr/StorageMonitorTileRenderer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/render/tesr/StorageMonitorTileRenderer.java @@ -3,7 +3,9 @@ package com.raoulvdberge.refinedstorage.render.tesr; import com.mojang.blaze3d.platform.GlStateManager; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.block.StorageMonitorBlock; import com.raoulvdberge.refinedstorage.tile.StorageMonitorTile; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.ItemCameraTransforms; @@ -41,7 +43,12 @@ public class StorageMonitorTileRenderer extends TileEntityRenderer