Fixed crash when breaking a Grid, Crafting Monitor, Crafter Manager or Portable Grid when another player is still using it. Fixes #2353

This commit is contained in:
raoulvdberge
2019-11-18 21:34:35 +01:00
parent 030482a266
commit d903427e22
7 changed files with 54 additions and 6 deletions

View File

@@ -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.

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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<StorageMonito
}
}
Direction direction = tile.getWorld().getBlockState(tile.getPos()).get(RSBlocks.STORAGE_MONITOR.getDirection().getProperty());
Direction direction = Direction.NORTH;
BlockState state = tile.getWorld().getBlockState(tile.getPos());
if (state.getBlock() instanceof StorageMonitorBlock) {
direction = state.get(RSBlocks.STORAGE_MONITOR.getDirection().getProperty());
}
if (direction == Direction.NORTH) {
disX = 0.5F;

View File

@@ -47,6 +47,7 @@ import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import com.raoulvdberge.refinedstorage.tile.grid.GridTile;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import com.raoulvdberge.refinedstorage.util.WorldUtils;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.CraftResultInventory;
@@ -519,7 +520,13 @@ public class PortableGridTile extends BaseTile implements IGrid, IPortableGrid,
@Override
public boolean isActive() {
if (world.isRemote) {
return world.getBlockState(pos).get(PortableGridBlock.ACTIVE);
BlockState state = world.getBlockState(pos);
if (state.getBlock() instanceof PortableGridBlock) {
return state.get(PortableGridBlock.ACTIVE);
}
return false;
}
if (RS.SERVER_CONFIG.getPortableGrid().getUseEnergy() &&