diff --git a/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java b/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java index dac9672978a..9972e817b1c 100644 --- a/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java +++ b/src/main/java/gregtech/api/metatileentity/NeighborCacheTileEntityBase.java @@ -75,11 +75,27 @@ public void onChunkUnload() { private boolean invalidRef(EnumFacing facing) { WeakReference ref = getRef(facing); - if (ref == INVALID) return true; + if (ref == INVALID || crossesUnloadedChunk(facing)) return true; TileEntity te = ref.get(); return te != null && te.isInvalid(); } + private boolean crossesUnloadedChunk(EnumFacing facing) { + if (crossesChunk(facing)) { + int ncx = getPos().offset(facing).getX() >> 4; + int ncz = getPos().offset(facing).getZ() >> 4; + return getWorld().getChunkProvider().getLoadedChunk(ncx, ncz) == null; + } + return false; + } + + private boolean crossesChunk(EnumFacing facing) { + int cx = getPos().getX() >> 4, cz = getPos().getZ() >> 4; + BlockPos offset = getPos().offset(facing); + int ncx = offset.getX() >> 4, ncz = offset.getZ() >> 4; + return cx != ncx || cz != ncz; + } + @NotNull private WeakReference computeNeighbor(EnumFacing facing) { TileEntity te = super.getNeighbor(facing);