From 447b914fb5edc21c81502238a43dc301d164e0f9 Mon Sep 17 00:00:00 2001 From: CovertJaguar Date: Tue, 6 Aug 2013 04:58:35 -0700 Subject: [PATCH] Rework Pipe connection rules (again) --- .../api/transport/IPipeConnection.java | 15 +++--- .../buildcraft/api/transport/IPipeTile.java | 4 +- common/buildcraft/core/utils/Utils.java | 31 ++++------- common/buildcraft/energy/TileEngine.java | 3 +- common/buildcraft/energy/TileEngineWood.java | 3 +- .../transport/BlockGenericPipe.java | 51 +++++++++++-------- common/buildcraft/transport/Pipe.java | 7 ++- .../transport/PipeTransportFluids.java | 4 +- .../transport/PipeTransportItems.java | 2 +- .../transport/PipeTransportPower.java | 16 +++--- .../buildcraft/transport/TileGenericPipe.java | 25 ++++----- 11 files changed, 80 insertions(+), 81 deletions(-) diff --git a/common/buildcraft/api/transport/IPipeConnection.java b/common/buildcraft/api/transport/IPipeConnection.java index 1e78ea26..b0af9966 100644 --- a/common/buildcraft/api/transport/IPipeConnection.java +++ b/common/buildcraft/api/transport/IPipeConnection.java @@ -1,17 +1,16 @@ -/** - * Copyright (c) SpaceToad, 2011 - * http://www.mod-buildcraft.com - * - * BuildCraft is distributed under the terms of the Minecraft Mod Public - * License 1.0, or MMPL. Please check the contents of the license located in +/** + * Copyright (c) SpaceToad, 2011 http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public License + * 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ - package buildcraft.api.transport; +import buildcraft.api.transport.IPipeTile.PipeType; import net.minecraftforge.common.ForgeDirection; public interface IPipeConnection { - public boolean isPipeConnected(ForgeDirection with); + public boolean overridePipeConnection(PipeType type, ForgeDirection with); } diff --git a/common/buildcraft/api/transport/IPipeTile.java b/common/buildcraft/api/transport/IPipeTile.java index 86eb9551..13aa8d76 100644 --- a/common/buildcraft/api/transport/IPipeTile.java +++ b/common/buildcraft/api/transport/IPipeTile.java @@ -11,7 +11,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.IFluidHandler; -public interface IPipeTile extends ISolidSideTile, IPipeConnection, IFluidHandler { +public interface IPipeTile extends ISolidSideTile, IFluidHandler { public enum PipeType { @@ -34,4 +34,6 @@ public interface IPipeTile extends ISolidSideTile, IPipeConnection, IFluidHandle * @return Amount of items used from the passed stack. */ int injectItem(ItemStack stack, boolean doAdd, ForgeDirection from); + + boolean isPipeConnected(ForgeDirection with); } diff --git a/common/buildcraft/core/utils/Utils.java b/common/buildcraft/core/utils/Utils.java index 0a3fd314..cc6dc224 100644 --- a/common/buildcraft/core/utils/Utils.java +++ b/common/buildcraft/core/utils/Utils.java @@ -374,47 +374,36 @@ public class Utils { } public static boolean checkPipesConnections(TileEntity tile1, TileEntity tile2) { - if (tile1 == null || tile2 == null) { + if (tile1 == null || tile2 == null) return false; - } - if (!(tile1 instanceof IPipeConnection) && !(tile2 instanceof IPipeConnection)) { + if (!(tile1 instanceof IPipeTile) && !(tile2 instanceof IPipeTile)) return false; - } ForgeDirection o = ForgeDirection.UNKNOWN; - if (tile1.xCoord - 1 == tile2.xCoord) { + if (tile1.xCoord - 1 == tile2.xCoord) o = ForgeDirection.WEST; - } else if (tile1.xCoord + 1 == tile2.xCoord) { + else if (tile1.xCoord + 1 == tile2.xCoord) o = ForgeDirection.EAST; - } else if (tile1.yCoord - 1 == tile2.yCoord) { + else if (tile1.yCoord - 1 == tile2.yCoord) o = ForgeDirection.DOWN; - } else if (tile1.yCoord + 1 == tile2.yCoord) { + else if (tile1.yCoord + 1 == tile2.yCoord) o = ForgeDirection.UP; - } else if (tile1.zCoord - 1 == tile2.zCoord) { + else if (tile1.zCoord - 1 == tile2.zCoord) o = ForgeDirection.NORTH; - } else if (tile1.zCoord + 1 == tile2.zCoord) { + else if (tile1.zCoord + 1 == tile2.zCoord) o = ForgeDirection.SOUTH; - } - if (tile1 instanceof IPipeConnection && !((IPipeConnection) tile1).isPipeConnected(o)) { + if (tile1 instanceof IPipeTile && !((IPipeTile) tile1).isPipeConnected(o)) return false; - } - if (tile2 instanceof IPipeConnection && !((IPipeConnection) tile2).isPipeConnected(o.getOpposite())) { + if (tile2 instanceof IPipeTile && !((IPipeTile) tile2).isPipeConnected(o.getOpposite())) return false; - } return true; } - public static boolean checkPipesConnections(IBlockAccess blockAccess, TileEntity tile1, int x2, int y2, int z2) { - TileEntity tile2 = blockAccess.getBlockTileEntity(x2, y2, z2); - - return checkPipesConnections(tile1, tile2); - } - public static boolean checkLegacyPipesConnections(IBlockAccess blockAccess, int x1, int y1, int z1, int x2, int y2, int z2) { Block b1 = Block.blocksList[blockAccess.getBlockId(x1, y1, z1)]; diff --git a/common/buildcraft/energy/TileEngine.java b/common/buildcraft/energy/TileEngine.java index e83c2769..71117dcb 100644 --- a/common/buildcraft/energy/TileEngine.java +++ b/common/buildcraft/energy/TileEngine.java @@ -17,6 +17,7 @@ import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; import buildcraft.api.power.PowerHandler.Type; import buildcraft.api.transport.IPipeConnection; +import buildcraft.api.transport.IPipeTile.PipeType; import buildcraft.core.DefaultProps; import buildcraft.core.TileBuffer; import buildcraft.core.TileBuildCraft; @@ -498,7 +499,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPowerRecepto } @Override - public boolean isPipeConnected(ForgeDirection with) { + public boolean overridePipeConnection(PipeType type, ForgeDirection with) { return with != orientation; } diff --git a/common/buildcraft/energy/TileEngineWood.java b/common/buildcraft/energy/TileEngineWood.java index b13d116d..3438851b 100644 --- a/common/buildcraft/energy/TileEngineWood.java +++ b/common/buildcraft/energy/TileEngineWood.java @@ -7,6 +7,7 @@ */ package buildcraft.energy; +import buildcraft.api.transport.IPipeTile.PipeType; import buildcraft.core.proxy.CoreProxy; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.ForgeDirection; @@ -84,7 +85,7 @@ public class TileEngineWood extends TileEngine { } @Override - public boolean isPipeConnected(ForgeDirection with) { + public boolean overridePipeConnection(PipeType type, ForgeDirection with) { return false; } diff --git a/common/buildcraft/transport/BlockGenericPipe.java b/common/buildcraft/transport/BlockGenericPipe.java index aa16de94..32af5b44 100644 --- a/common/buildcraft/transport/BlockGenericPipe.java +++ b/common/buildcraft/transport/BlockGenericPipe.java @@ -118,32 +118,32 @@ public class BlockGenericPipe extends BlockContainer { TileEntity tile1 = world.getBlockTileEntity(i, j, k); TileGenericPipe tileG = (TileGenericPipe) tile1; - if (Utils.checkPipesConnections(world, tile1, i - 1, j, k)) { + if (tileG.isPipeConnected(ForgeDirection.WEST)) { setBlockBounds(0.0F, Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMaxPos, Utils.pipeMaxPos, Utils.pipeMaxPos); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - if (Utils.checkPipesConnections(world, tile1, i + 1, j, k)) { + if (tileG.isPipeConnected(ForgeDirection.EAST)) { setBlockBounds(Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMinPos, 1.0F, Utils.pipeMaxPos, Utils.pipeMaxPos); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - if (Utils.checkPipesConnections(world, tile1, i, j - 1, k)) { + if (tileG.isPipeConnected(ForgeDirection.DOWN)) { setBlockBounds(Utils.pipeMinPos, 0.0F, Utils.pipeMinPos, Utils.pipeMaxPos, Utils.pipeMaxPos, Utils.pipeMaxPos); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - if (Utils.checkPipesConnections(world, tile1, i, j + 1, k)) { + if (tileG.isPipeConnected(ForgeDirection.UP)) { setBlockBounds(Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMaxPos, 1.0F, Utils.pipeMaxPos); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - if (Utils.checkPipesConnections(world, tile1, i, j, k - 1)) { + if (tileG.isPipeConnected(ForgeDirection.NORTH)) { setBlockBounds(Utils.pipeMinPos, Utils.pipeMinPos, 0.0F, Utils.pipeMaxPos, Utils.pipeMaxPos, Utils.pipeMaxPos); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } - if (Utils.checkPipesConnections(world, tile1, i, j, k + 1)) { + if (tileG.isPipeConnected(ForgeDirection.SOUTH)) { setBlockBounds(Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMinPos, Utils.pipeMaxPos, Utils.pipeMaxPos, 1.0F); super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); } @@ -193,27 +193,27 @@ public class BlockGenericPipe extends BlockContainer { if (tile1 instanceof TileGenericPipe) { TileGenericPipe tileG = (TileGenericPipe) tile1; - if (Utils.checkPipesConnections(world, tile1, i - 1, j, k) || tileG.hasFacade(ForgeDirection.WEST)) { + if (tileG.isPipeConnected(ForgeDirection.WEST) || tileG.hasFacade(ForgeDirection.WEST)) { xMin = 0.0F; } - if (Utils.checkPipesConnections(world, tile1, i + 1, j, k) || tileG.hasFacade(ForgeDirection.EAST)) { + if (tileG.isPipeConnected(ForgeDirection.EAST) || tileG.hasFacade(ForgeDirection.EAST)) { xMax = 1.0F; } - if (Utils.checkPipesConnections(world, tile1, i, j - 1, k) || tileG.hasFacade(ForgeDirection.DOWN)) { + if (tileG.isPipeConnected(ForgeDirection.DOWN) || tileG.hasFacade(ForgeDirection.DOWN)) { yMin = 0.0F; } - if (Utils.checkPipesConnections(world, tile1, i, j + 1, k) || tileG.hasFacade(ForgeDirection.UP)) { + if (tileG.isPipeConnected(ForgeDirection.UP) || tileG.hasFacade(ForgeDirection.UP)) { yMax = 1.0F; } - if (Utils.checkPipesConnections(world, tile1, i, j, k - 1) || tileG.hasFacade(ForgeDirection.NORTH)) { + if (tileG.isPipeConnected(ForgeDirection.NORTH) || tileG.hasFacade(ForgeDirection.NORTH)) { zMin = 0.0F; } - if (Utils.checkPipesConnections(world, tile1, i, j, k + 1) || tileG.hasFacade(ForgeDirection.SOUTH)) { + if (tileG.isPipeConnected(ForgeDirection.SOUTH) || tileG.hasFacade(ForgeDirection.SOUTH)) { zMax = 1.0F; } @@ -277,11 +277,18 @@ public class BlockGenericPipe extends BlockContainer { float xMin = Utils.pipeMinPos, xMax = Utils.pipeMaxPos, yMin = Utils.pipeMinPos, yMax = Utils.pipeMaxPos, zMin = Utils.pipeMinPos, zMax = Utils.pipeMaxPos; TileEntity pipeTileEntity = world.getBlockTileEntity(x, y, z); - Pipe pipe = getPipe(world, x, y, z); - - if (pipeTileEntity == null || !isValid(pipe)) { + + TileGenericPipe tileG = null; + if(pipeTileEntity instanceof TileGenericPipe) + tileG = (TileGenericPipe)pipeTileEntity; + + if(tileG == null) return null; - } + + Pipe pipe = tileG.pipe; + + if (!isValid(pipe)) + return null; /** * pipe hits along x, y, and z axis, gate (all 6 sides) [and @@ -294,12 +301,12 @@ public class BlockGenericPipe extends BlockContainer { // check along the x axis - if (Utils.checkPipesConnections(world, pipeTileEntity, x - 1, y, z)) { + if (tileG.isPipeConnected(ForgeDirection.WEST)) { xMin = 0.0F; needAxisCheck = true; } - if (Utils.checkPipesConnections(world, pipeTileEntity, x + 1, y, z)) { + if (tileG.isPipeConnected(ForgeDirection.WEST)) { xMax = 1.0F; needAxisCheck = true; } @@ -316,12 +323,12 @@ public class BlockGenericPipe extends BlockContainer { // check along the y axis - if (Utils.checkPipesConnections(world, pipeTileEntity, x, y - 1, z)) { + if (tileG.isPipeConnected(ForgeDirection.DOWN)) { yMin = 0.0F; needAxisCheck = true; } - if (Utils.checkPipesConnections(world, pipeTileEntity, x, y + 1, z)) { + if (tileG.isPipeConnected(ForgeDirection.UP)) { yMax = 1.0F; needAxisCheck = true; } @@ -338,12 +345,12 @@ public class BlockGenericPipe extends BlockContainer { // check along the z axis - if (Utils.checkPipesConnections(world, pipeTileEntity, x, y, z - 1)) { + if (tileG.isPipeConnected(ForgeDirection.NORTH)) { zMin = 0.0F; needAxisCheck = true; } - if (Utils.checkPipesConnections(world, pipeTileEntity, x, y, z + 1)) { + if (tileG.isPipeConnected(ForgeDirection.SOUTH)) { zMax = 1.0F; needAxisCheck = true; } diff --git a/common/buildcraft/transport/Pipe.java b/common/buildcraft/transport/Pipe.java index 87941047..f66f70a5 100644 --- a/common/buildcraft/transport/Pipe.java +++ b/common/buildcraft/transport/Pipe.java @@ -325,7 +325,7 @@ public abstract class Pipe implements IPipe, IDropContr ForgeDirection o = ForgeDirection.getOrientation(side).getOpposite(); TileEntity tile = container.getTile(o); - if (tile instanceof TileGenericPipe && Utils.checkPipesConnections(this.container, tile)) + if (tile instanceof TileGenericPipe && container.isPipeConnected(o)) return 0; return 15; @@ -477,13 +477,12 @@ public abstract class Pipe implements IPipe, IDropContr ForgeDirection target_orientation = ForgeDirection.UNKNOWN; for (ForgeDirection o : ForgeDirection.VALID_DIRECTIONS) { - if (Utils.checkPipesConnections(container.getTile(o), container)) { + if (container.isPipeConnected(o)) { Connections_num++; - if (Connections_num == 1) { + if (Connections_num == 1) target_orientation = o; - } } } diff --git a/common/buildcraft/transport/PipeTransportFluids.java b/common/buildcraft/transport/PipeTransportFluids.java index 9cf4a35a..51b523e8 100644 --- a/common/buildcraft/transport/PipeTransportFluids.java +++ b/common/buildcraft/transport/PipeTransportFluids.java @@ -171,7 +171,7 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler public boolean canReceiveFluid(ForgeDirection o) { TileEntity entity = container.getTile(o); - if (!Utils.checkPipesConnections(container, entity)) + if (!container.isPipeConnected(o)) return false; if (entity instanceof TileGenericPipe) { @@ -481,7 +481,7 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler super.onNeighborBlockChange(blockId); for (ForgeDirection direction : directions) { - if (!Utils.checkPipesConnections(container.getTile(orientations[direction.ordinal()]), container)) { + if (!container.isPipeConnected(direction)) { internalTanks[direction.ordinal()].reset(); transferState[direction.ordinal()] = TransferState.None; renderCache[direction.ordinal()] = null; diff --git a/common/buildcraft/transport/PipeTransportItems.java b/common/buildcraft/transport/PipeTransportItems.java index 900332b2..ad6c405f 100644 --- a/common/buildcraft/transport/PipeTransportItems.java +++ b/common/buildcraft/transport/PipeTransportItems.java @@ -295,7 +295,7 @@ public class PipeTransportItems extends PipeTransport { public boolean canReceivePipeObjects(ForgeDirection o, TravelingItem item) { TileEntity entity = container.getTile(o); - if (!Utils.checkPipesConnections(entity, container)) + if (!container.isPipeConnected(o)) return false; if (entity instanceof TileGenericPipe) { diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index 53887fef..5ea91248 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -108,15 +108,15 @@ public class PipeTransportPower extends PipeTransport { } private void updateTiles() { - for (int i = 0; i < 6; ++i) { - TileEntity tile = container.getTile(ForgeDirection.VALID_DIRECTIONS[i]); - if (Utils.checkPipesConnections(tile, container)) { - tiles[i] = tile; + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + TileEntity tile = container.getTile(side); + if (container.isPipeConnected(side)) { + tiles[side.ordinal()] = tile; } else { - tiles[i] = null; - internalPower[i] = 0; - internalNextPower[i] = 0; - displayPower[i] = 0; + tiles[side.ordinal()] = null; + internalPower[side.ordinal()] = 0; + internalNextPower[side.ordinal()] = 0; + displayPower[side.ordinal()] = 0; } } } diff --git a/common/buildcraft/transport/TileGenericPipe.java b/common/buildcraft/transport/TileGenericPipe.java index dc03881b..ece283e6 100644 --- a/common/buildcraft/transport/TileGenericPipe.java +++ b/common/buildcraft/transport/TileGenericPipe.java @@ -18,6 +18,7 @@ import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; import buildcraft.api.transport.IPipe; +import buildcraft.api.transport.IPipeConnection; import buildcraft.api.transport.IPipeTile; import buildcraft.api.transport.ISolidSideTile; import buildcraft.core.DefaultProps; @@ -435,34 +436,35 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui } /** - * Checks if this tile is connected to another tile + * Checks if this tile can connect to another tile * * @param with - The other Tile * @param side - The orientation to get to the other tile ('with') * @return true if pipes are considered connected */ - protected boolean arePipesConnected(TileEntity with, ForgeDirection side) { - Pipe pipe1 = pipe; - + protected boolean canPipeConnect(TileEntity with, ForgeDirection side) { if (hasPlug(side)) return false; - if (!BlockGenericPipe.isValid(pipe1)) + if (!BlockGenericPipe.isValid(pipe)) return false; + + if(with instanceof IPipeConnection) + return ((IPipeConnection)with).overridePipeConnection(pipe.transport.getPipeType(), side.getOpposite()); if (with instanceof TileGenericPipe) { if (((TileGenericPipe) with).hasPlug(side.getOpposite())) return false; - Pipe pipe2 = ((TileGenericPipe) with).pipe; + Pipe otherPipe = ((TileGenericPipe) with).pipe; - if (!BlockGenericPipe.isValid(pipe2)) + if (!BlockGenericPipe.isValid(otherPipe)) return false; - if (!pipe2.canPipeConnect(this, side.getOpposite())) + if (!otherPipe.canPipeConnect(this, side.getOpposite())) return false; } - return pipe1 != null ? pipe1.canPipeConnect(with, side) : false; + return pipe.canPipeConnect(with, side); } private void computeConnections() { @@ -474,9 +476,8 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui TileBuffer t = cache[side.ordinal()]; t.refresh(); - if (t.getTile() != null) { - pipeConnectionsBuffer[side.ordinal()] = arePipesConnected(t.getTile(), side); - } + if (t.getTile() != null) + pipeConnectionsBuffer[side.ordinal()] = canPipeConnect(t.getTile(), side); } } }