From a49aad24c272a879cf4b8afd32991df36b01e495 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Nov 2020 18:26:17 +0100 Subject: [PATCH] Filter redundancy - Brass tunnels now distribute across matching filtered outputs exclusively before sending items to unfiltered sides - Less chute logic on render thread pls --- .../belts/tunnel/BrassTunnelTileEntity.java | 46 ++++++++++++++----- .../block/chute/ChuteTileEntity.java | 3 +- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index a33fa9015..c3100d370 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -132,23 +132,30 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { if (allFull || allEmpty) syncSet.forEach(te -> te.syncedOutputActive = notifySyncedOut); } - + if (validOutputs == null) return; if (stackToDistribute.isEmpty()) return; - for (Pair pair : validOutputs) { - BrassTunnelTileEntity tunnel = pair.getKey(); - Direction output = pair.getValue(); - if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) - continue; - distributionTargets.add(Pair.of(tunnel.pos, output)); - int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); - if (distance < 0) - distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); - else - distributionDistanceRight = Math.max(distributionDistanceRight, distance); + for (boolean filterPass : Iterate.trueAndFalse) { + for (Pair pair : validOutputs) { + BrassTunnelTileEntity tunnel = pair.getKey(); + Direction output = pair.getValue(); + if (filterPass && tunnel.flapFilterEmpty(output)) + continue; + if (insertIntoTunnel(tunnel, output, stackToDistribute, true) == null) + continue; + distributionTargets.add(Pair.of(tunnel.pos, output)); + int distance = tunnel.pos.getX() + tunnel.pos.getZ() - pos.getX() - pos.getZ(); + if (distance < 0) + distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); + else + distributionDistanceRight = Math.max(distributionDistanceRight, distance); + } + + if (!distributionTargets.isEmpty() && filterPass) + break; } if (distributionTargets.isEmpty()) @@ -317,6 +324,21 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity { return filtering.test(side, stack); } + public boolean flapFilterEmpty(Direction side) { + if (filtering == null) + return false; + if (filtering.get(side) == null) { + FilteringBehaviour adjacentFilter = + TileEntityBehaviour.get(world, pos.offset(side), FilteringBehaviour.TYPE); + if (adjacentFilter == null) + return true; + return adjacentFilter.getFilter() + .isEmpty(); + } + return filtering.getFilter(side) + .isEmpty(); + } + @Override public void initialize() { if (filtering == null) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index 45b257ae2..8ed7e992b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -134,7 +134,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void tick() { super.tick(); - canPickUpItems = canDirectlyInsert(); + if (!world.isRemote) + canPickUpItems = canDirectlyInsert(); float itemMotion = getItemMotion(); if (itemMotion != 0 && world != null && world.isRemote)