diff --git a/src/main/java/appeng/parts/p2p/PartP2PItems.java b/src/main/java/appeng/parts/p2p/PartP2PItems.java index a3a92d72f..b7e8c44d3 100644 --- a/src/main/java/appeng/parts/p2p/PartP2PItems.java +++ b/src/main/java/appeng/parts/p2p/PartP2PItems.java @@ -10,8 +10,10 @@ package appeng.parts.p2p; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -88,6 +90,9 @@ public class PartP2PItems extends PartP2PTunnelNormal } for (final PartP2PItems t : itemTunnels) { + if (t.loopsBackTo(this, new HashSet<>())) { + continue; + } final IInventory inv = t.getOutputInv(); if (inv != null) { if (Platform.getRandomInt() % 2 == 0) { @@ -313,4 +318,29 @@ public class PartP2PItems extends PartP2PTunnelNormal public ConnectOverride overridePipeConnection(final PipeType type, final ForgeDirection with) { return this.getSide() == with && type == PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT; } + + private boolean loopsBackTo(final PartP2PItems tunnel, final Set visited) { + final TileEntity te = this.getTile().getWorldObj().getTileEntity( + this.getTile().xCoord + this.getSide().offsetX, + this.getTile().yCoord + this.getSide().offsetY, + this.getTile().zCoord + this.getSide().offsetZ); + if (Platform.getPartFromTE(te, this.getSide().getOpposite()) instanceof PartP2PItems next) { + if (next == tunnel) { + return true; + } + if (!visited.contains(next)) { + visited.add(next); + try { + for (final PartP2PItems t : next.getOutputs()) { + if (t.loopsBackTo(tunnel, visited)) { + return true; + } + } + } catch (final GridAccessException ignored) { + // :P + } + } + } + return false; + } } diff --git a/src/main/java/appeng/parts/p2p/PartP2PLiquids.java b/src/main/java/appeng/parts/p2p/PartP2PLiquids.java index 5e9e6bfdd..6b0cc2dee 100644 --- a/src/main/java/appeng/parts/p2p/PartP2PLiquids.java +++ b/src/main/java/appeng/parts/p2p/PartP2PLiquids.java @@ -221,7 +221,22 @@ public class PartP2PLiquids extends PartP2PTunnelNormal implemen @Override public boolean canFill(final ForgeDirection from, final Fluid fluid) { - return from == this.getSide() && (!this.getOutputs(fluid).isEmpty() || inputAcceptsFluid(fluid)); + if (from != this.getSide()) { + return false; + } + + final Stack stack = this.getDepth(); + for (final PartP2PLiquids t : stack) { + if (t == this) { + return false; + } + } + stack.push(this); + try { + return !this.getOutputs(fluid).isEmpty() || inputAcceptsFluid(fluid); + } finally { + stack.pop(); + } } @Override