diff --git a/common/buildcraft/core/utils/MathUtils.java b/common/buildcraft/core/utils/MathUtils.java new file mode 100644 index 00000000..4a676d97 --- /dev/null +++ b/common/buildcraft/core/utils/MathUtils.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) SpaceToad, 2011-2012 + * 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.core.utils; + +/** + * + * @author CovertJaguar + */ +public class MathUtils { + + public static double clamp(double value, double min, double max) { + return value < min ? min : (value > max ? max : value); + } +} diff --git a/common/buildcraft/transport/BlockGenericPipe.java b/common/buildcraft/transport/BlockGenericPipe.java index 73a93723..cd056b73 100644 --- a/common/buildcraft/transport/BlockGenericPipe.java +++ b/common/buildcraft/transport/BlockGenericPipe.java @@ -609,6 +609,7 @@ public class BlockGenericPipe extends BlockBuildCraft { if (isValid(pipe)) { pipe.container.scheduleNeighborChange(); + pipe.container.redstonePowered = world.isBlockIndirectlyGettingPowered(x, y, z); } } diff --git a/common/buildcraft/transport/Gate.java b/common/buildcraft/transport/Gate.java index 3e4ffcf1..66cfac71 100644 --- a/common/buildcraft/transport/Gate.java +++ b/common/buildcraft/transport/Gate.java @@ -190,7 +190,7 @@ public abstract class Gate { boolean[] oldBroadcastSignal = broadcastSignal; broadcastRedstone = false; - broadcastSignal = new boolean[]{false, false, false, false}; + broadcastSignal = new boolean[4]; // Tell the gate to prepare for resolving actions. (Disable pulser) startResolution(); diff --git a/common/buildcraft/transport/Pipe.java b/common/buildcraft/transport/Pipe.java index d0693a64..ad45c878 100644 --- a/common/buildcraft/transport/Pipe.java +++ b/common/buildcraft/transport/Pipe.java @@ -67,6 +67,13 @@ public abstract class Pipe implements IPipe, IDropContr transport.setTile((TileGenericPipe) tile); } +// public final void handlePipeEvent(PipeEvent event) { +// try { +// Method method = getClass().getDeclaredMethod("eventHandler", event.getClass()); +// method.invoke(this, event); +// } catch (Exception ex) { +// } +// } private static class EventHandler { public final Method method; @@ -83,15 +90,8 @@ public abstract class Pipe implements IPipe, IDropContr eventHandlers.put(getClass(), handlerMap); } EventHandler handler = handlerMap.get(event.getClass()); - if (handler == null) { - try { - Method method = getClass().getDeclaredMethod("eventHandler", event.getClass()); - handler = new EventHandler(method); - } catch (Exception ex) { - handler = new EventHandler(null); - } - handlerMap.put(event.getClass(), handler); - } + if (handler == null) + handler = makeEventHandler(event, handlerMap); if (handler.method == null) return; try { @@ -100,6 +100,18 @@ public abstract class Pipe implements IPipe, IDropContr } } + private EventHandler makeEventHandler(PipeEvent event, Map, EventHandler> handlerMap) { + EventHandler handler; + try { + Method method = getClass().getDeclaredMethod("eventHandler", event.getClass()); + handler = new EventHandler(method); + } catch (Exception ex) { + handler = new EventHandler(null); + } + handlerMap.put(event.getClass(), handler); + return handler; + } + public boolean blockActivated(EntityPlayer entityplayer) { return false; } diff --git a/common/buildcraft/transport/PipeTransportItems.java b/common/buildcraft/transport/PipeTransportItems.java index ca61cfc2..3fc178a1 100644 --- a/common/buildcraft/transport/PipeTransportItems.java +++ b/common/buildcraft/transport/PipeTransportItems.java @@ -19,6 +19,7 @@ import buildcraft.core.network.PacketIds; import buildcraft.core.proxy.CoreProxy; import buildcraft.core.utils.BCLog; import buildcraft.core.utils.BlockUtil; +import buildcraft.core.utils.MathUtils; import buildcraft.transport.network.PacketPipeTransportContent; import buildcraft.transport.network.PacketPipeTransportNBT; import buildcraft.transport.network.PacketSimpleId; @@ -33,12 +34,12 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.logging.Level; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -47,6 +48,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; import net.minecraftforge.common.ForgeDirection; public class PipeTransportItems extends PipeTransport { @@ -151,17 +153,9 @@ public class PipeTransportItems extends PipeTransport { } private void readjustPosition(TravelingItem item) { - double x = item.xCoord; - double y = item.yCoord; - double z = item.zCoord; - - x = Math.max(x, container.xCoord + 0.01); - y = Math.max(y, container.yCoord + 0.01); - z = Math.max(z, container.zCoord + 0.01); - - x = Math.min(x, container.xCoord + 0.99); - y = Math.min(y, container.yCoord + 0.99); - z = Math.min(z, container.zCoord + 0.99); + double x = MathUtils.clamp(item.xCoord, container.xCoord + 0.01, container.xCoord + 0.99); + double y = MathUtils.clamp(item.yCoord, container.yCoord + 0.01, container.yCoord + 0.99); + double z = MathUtils.clamp(item.zCoord, container.zCoord + 0.01, container.zCoord + 0.99); if (item.input != ForgeDirection.UP && item.input != ForgeDirection.DOWN) { y = container.yCoord + TransportUtils.getPipeFloorOf(item.getItemStack()); @@ -284,9 +278,10 @@ public class PipeTransportItems extends PipeTransport { item.blacklist.add(item.input.getOpposite()); - for (ForgeDirection o : ForgeDirection.VALID_DIRECTIONS) { - if (item.blacklist.contains(o)) - continue; + EnumSet sides = EnumSet.complementOf(item.blacklist); + sides.remove(ForgeDirection.UNKNOWN); + + for (ForgeDirection o : sides) { if (container.pipe.outputOpen(o) && canReceivePipeObjects(o, item)) result.add(o); } diff --git a/common/buildcraft/transport/TileGenericPipe.java b/common/buildcraft/transport/TileGenericPipe.java index 92f61a33..39c73b10 100644 --- a/common/buildcraft/transport/TileGenericPipe.java +++ b/common/buildcraft/transport/TileGenericPipe.java @@ -89,6 +89,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui private boolean blockNeighborChange = false; private boolean refreshRenderState = false; private boolean pipeBound = false; + public boolean redstonePowered = false; private int[] facadeBlocks = new int[ForgeDirection.VALID_DIRECTIONS.length]; private int[] facadeMeta = new int[ForgeDirection.VALID_DIRECTIONS.length]; private boolean[] plugs = new boolean[ForgeDirection.VALID_DIRECTIONS.length]; @@ -99,6 +100,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); + nbt.setBoolean("redstonePowered", redstonePowered); if (pipe != null) { nbt.setInteger("pipeId", pipe.itemID); @@ -117,7 +119,8 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + redstonePowered = nbt.getBoolean("redstonePowered"); + coreState.pipeId = nbt.getInteger("pipeId"); pipe = BlockGenericPipe.createPipe(coreState.pipeId); diff --git a/common/buildcraft/transport/triggers/TriggerRedstoneInput.java b/common/buildcraft/transport/triggers/TriggerRedstoneInput.java index 11c2af88..2aca6efc 100644 --- a/common/buildcraft/transport/triggers/TriggerRedstoneInput.java +++ b/common/buildcraft/transport/triggers/TriggerRedstoneInput.java @@ -44,7 +44,7 @@ public class TriggerRedstoneInput extends BCTrigger implements ITriggerPipe { } private boolean isBeingPowered(Pipe pipe) { - return pipe.container.worldObj.isBlockIndirectlyGettingPowered(pipe.container.xCoord, pipe.container.yCoord, pipe.container.zCoord); + return pipe.container.redstonePowered; } @Override