diff --git a/src/main/java/me/desht/pneumaticcraft/common/block/entity/AbstractAirHandlingBlockEntity.java b/src/main/java/me/desht/pneumaticcraft/common/block/entity/AbstractAirHandlingBlockEntity.java index 5c9825721..98cdca170 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/block/entity/AbstractAirHandlingBlockEntity.java +++ b/src/main/java/me/desht/pneumaticcraft/common/block/entity/AbstractAirHandlingBlockEntity.java @@ -120,7 +120,6 @@ private void handleSecurityUpgrade(IAirHandlerMachine handler) { public void onBlockRotated() { super.onBlockRotated(); - // force a recalculation of where any possible leak might be coming from initializeHullAirHandlers(); airHandlerMap.keySet().forEach(h -> h.setSideLeaking(null)); diff --git a/src/main/java/me/desht/pneumaticcraft/common/block/entity/tube/PressureTubeBlockEntity.java b/src/main/java/me/desht/pneumaticcraft/common/block/entity/tube/PressureTubeBlockEntity.java index 6e7202fe7..f21ac1e0c 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/block/entity/tube/PressureTubeBlockEntity.java +++ b/src/main/java/me/desht/pneumaticcraft/common/block/entity/tube/PressureTubeBlockEntity.java @@ -70,6 +70,7 @@ public class PressureTubeBlockEntity extends AbstractAirHandlingBlockEntity impl private final List neighbourDirections = new ArrayList<>(); private VoxelShape cachedTubeShape = null; // important for performance private int pendingCacheShapeClear = 0; + private boolean needDiscover = false; public PressureTubeBlockEntity(BlockPos pos, BlockState state) { this(ModBlockEntityTypes.PRESSURE_TUBE.get(), pos, state, PressureTier.TIER_ONE, PneumaticValues.VOLUME_PRESSURE_TUBE); @@ -199,6 +200,11 @@ public void tickClient() { public void tickServer() { super.tickServer(); + if (needDiscover) { + discoverConnectedNeighbors(); + needDiscover = false; + } + boolean couldLeak = true; for (Direction dir : DirectionUtil.VALUES) { @@ -320,7 +326,10 @@ public void onNeighborBlockUpdate(BlockPos fromPos) { tubeModules().forEach(AbstractTubeModule::onNeighborBlockUpdate); - discoverConnectedNeighbors(); + // connected neighbour discovery needs to be deferred, + // since although the neighbouring block has updated, + // the block entity's air handler data may not yet have updated + needDiscover = true; } private void discoverConnectedNeighbors() { diff --git a/src/main/java/me/desht/pneumaticcraft/common/capabilities/MachineAirHandler.java b/src/main/java/me/desht/pneumaticcraft/common/capabilities/MachineAirHandler.java index 0e264315a..f960eb8b0 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/capabilities/MachineAirHandler.java +++ b/src/main/java/me/desht/pneumaticcraft/common/capabilities/MachineAirHandler.java @@ -119,11 +119,6 @@ public void disableSafetyVenting() { public void setConnectableFaces(Collection sides) { connectableFaces.clear(); sides.forEach(side -> connectableFaces.set(side.get3DDataValue())); - - // invalidate cached neighbour data - for (Direction dir : DirectionUtil.VALUES) { - this.neighbourAirHandlers.put(dir, null); - } } @Override @@ -248,9 +243,7 @@ private Optional getNeighbourAirHandler(BlockEntity ownerTE, neighbourAirHandlers.put(dir, BlockCapabilityCache.create(PNCCapabilities.AIR_HANDLER_MACHINE, level, ownerTE.getBlockPos().relative(dir), - dir.getOpposite(), - () -> !ownerTE.isRemoved(), - () -> neighbourAirHandlers.put(dir, null) + dir.getOpposite() )); } return Optional.ofNullable(neighbourAirHandlers.get(dir).getCapability());