From 7a436c5a31cde61ac95a85446f5707f477181e81 Mon Sep 17 00:00:00 2001 From: RufusStark Date: Mon, 8 Sep 2014 21:41:48 -0500 Subject: [PATCH] ActionValve and ActionParameterDirection --- .../assets/buildcraft/lang/en_US.lang | 5 +- ...pipe_close.png => action_valve_closed.png} | Bin .../triggers/action_valve_input_only.png | Bin 0 -> 242 bytes .../items/triggers/action_valve_open.png | Bin 0 -> 229 bytes .../triggers/action_valve_output_only.png | Bin 0 -> 242 bytes common/buildcraft/BuildCraftSilicon.java | 2 + common/buildcraft/BuildCraftTransport.java | 17 ++- .../core/triggers/ActionPipeClose.java | 38 ------- .../core/triggers/StatementIconProvider.java | 15 +++ common/buildcraft/transport/Gate.java | 3 +- common/buildcraft/transport/Pipe.java | 15 +-- .../buildcraft/transport/PipeTransport.java | 53 ++++++++-- .../transport/PipeTransportFluids.java | 9 +- .../transport/PipeTransportItems.java | 6 +- .../transport/PipeTransportPower.java | 19 ++-- .../buildcraft/transport/TileGenericPipe.java | 2 +- .../triggers/ActionParameterDirection.java | 93 ++++++++++++++++ .../transport/triggers/ActionValve.java | 99 ++++++++++++++++++ 18 files changed, 294 insertions(+), 82 deletions(-) rename buildcraft_resources/assets/buildcraft/textures/items/triggers/{action_pipe_close.png => action_valve_closed.png} (100%) mode change 100755 => 100644 create mode 100644 buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_input_only.png create mode 100644 buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_open.png create mode 100644 buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_output_only.png delete mode 100755 common/buildcraft/core/triggers/ActionPipeClose.java create mode 100644 common/buildcraft/transport/triggers/ActionParameterDirection.java create mode 100644 common/buildcraft/transport/triggers/ActionValve.java diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index 8e8f2e5b..600d0e96 100755 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -59,7 +59,10 @@ gate.action.pulsar.constant=Energy Pulsar gate.action.pulsar.single=Single Energy Pulse gate.action.pipe.wire=%s Pipe Signal gate.action.robot.goto_station=Goto Station -gate.action.pipe.close=Close Pipe +gate.action.pipe.valve.open=Open +gate.action.pipe.valve.input_only=Input Only +gate.action.pipe.valve.output_only=Output Only +gate.action.pipe.valve.closed=Closed gate.action.station.provide_items=Provide Items gate.action.station.accept_items=Accept Items gate.action.station.request_items=Request Items diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_pipe_close.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_closed.png old mode 100755 new mode 100644 similarity index 100% rename from buildcraft_resources/assets/buildcraft/textures/items/triggers/action_pipe_close.png rename to buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_closed.png diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_input_only.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_input_only.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb529ad851ba59bf9b11fca7d02d7a272997dca GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9*4Am7~ht@a-ayqL{AsT5R21ygHH>#8gRtusIBMy{lSMlh_&p%O}iZDSqFpf zbsUpSFRIG#*V+A0JSg-_f`j_MiwR<#%Ts2)yK^=naOt#8AE8}Zv5!NpXQX*<+5I?} zi?JbJE>*|##F;5t32CbiMxA^ox9{ior>EwB4&qJ|OaIg*cKl%#Dsg44a?Mas;`~)78&qol`;+0E?Mf{XE z)7O>#9*4AmID?mNwi{5W#nZ(x#Nzbb;Dfve6ga+E^%U=D&vz@}a(i&sc20BZi{)mw zk}e$yuhu^-%hBF6^Dx)84ITDk8ar?JyeaHw+GA{!c=BjP`klua*&-7aJy*BQP&&8y zs7Sku(xD5Cf(u!r)uXO%c~x5cxcaU^Q%8jVy@wx9D<7ynH80Uvc>DIe^V^!=*DqtX Y$qalhdHB#3pnDiRUHx3vIVCg!01_!w;{X5v literal 0 HcmV?d00001 diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_output_only.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_valve_output_only.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e80a534ec4ec12c60d19532f31298b7b6e9901 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9*4Am2v_6Pi?e}36FprVLo80;4L&W{YQPbrqqd&+_Xi*LAl9-2H|=tqXB`Z_ z*KtfTy{Ia`UuXA2@u1Kz2@dN2E;^`nE`JjF?#@|<@TJpE>Iijf#Xb(Xo{{GHWcK2o zR)&P~et%8R6KAGqC8Vu77}c3CxBK_^r>EwB4&qJ|OaIg*cKmdKI;Vst04e%eeE implements IDropControlInventory, IPipe { @@ -62,7 +63,6 @@ public abstract class Pipe implements IDropControlInven private boolean internalUpdateScheduled = false; private boolean initialized = false; - private boolean closed = false; private ArrayList actionStates = new ArrayList(); @@ -212,7 +212,6 @@ public abstract class Pipe implements IDropControlInven internalUpdateScheduled = false; } - closed = false; actionStates.clear(); // Update the gate if we have any @@ -535,7 +534,9 @@ public abstract class Pipe implements IDropControlInven public LinkedList getActions() { LinkedList result = new LinkedList(); - result.add(BuildCraftTransport.actionPipeClose); + for (ValveState state : ValveState.VALUES) { + result.add(BuildCraftTransport.actionValve[state.ordinal()]); + } return result; } @@ -662,14 +663,6 @@ public abstract class Pipe implements IDropControlInven return container.getTile(dir); } - public void close() { - closed = true; - } - - public boolean isClosed() { - return closed; - } - private void pushActionState(ActionState state) { actionStates.add(state); } diff --git a/common/buildcraft/transport/PipeTransport.java b/common/buildcraft/transport/PipeTransport.java index f8c794cc..e165e4b8 100644 --- a/common/buildcraft/transport/PipeTransport.java +++ b/common/buildcraft/transport/PipeTransport.java @@ -18,29 +18,58 @@ import buildcraft.api.transport.IPipeTile.PipeType; public abstract class PipeTransport { + public static final String PIPE_IO_SETTINGS = "iosetting"; + public TileGenericPipe container; + protected boolean[] inputsOpen = new boolean[ForgeDirection.VALID_DIRECTIONS.length]; + protected boolean[] outputsOpen = new boolean[ForgeDirection.VALID_DIRECTIONS.length]; + + public PipeTransport() { + for (int b = 0; b < ForgeDirection.VALID_DIRECTIONS.length; b++) { + inputsOpen[b] = true; + outputsOpen[b] = true; + } + } + public abstract PipeType getPipeType(); public World getWorld() { return container.getWorldObj(); } - public void readFromNBT(NBTTagCompound nbttagcompound) { + public void readFromNBT(NBTTagCompound nbt) { + if (nbt.hasKey(PIPE_IO_SETTINGS)) { + int iosettings = nbt.getInteger(PIPE_IO_SETTINGS); + for (int b = 0; b < ForgeDirection.VALID_DIRECTIONS.length; b++) { + inputsOpen[b] = (iosettings & (1 << b)) == 1; + outputsOpen[b] = (iosettings & (1 << (b + 8))) == 1; + } + } } - public void writeToNBT(NBTTagCompound nbttagcompound) { + public void writeToNBT(NBTTagCompound nbt) { + int iosettings = 0; + for (int b = 0; b < ForgeDirection.VALID_DIRECTIONS.length; b++) { + if (inputsOpen[b]) { + iosettings |= 1 << b; + } + if (outputsOpen[b]) { + iosettings |= 1 << (b + 8); + } + } + nbt.setInteger(PIPE_IO_SETTINGS, iosettings); } public void updateEntity() { } public void setTile(TileGenericPipe tile) { - this.container = tile; + this.container = tile; } public boolean canPipeConnect(TileEntity tile, ForgeDirection side) { - return true; + return true; } public void onNeighborBlockChange(int blockId) { @@ -53,11 +82,23 @@ public abstract class PipeTransport { } public boolean inputOpen(ForgeDirection from) { - return true; + return inputsOpen[from.ordinal()]; } public boolean outputOpen(ForgeDirection to) { - return true; + return outputsOpen[to.ordinal()]; + } + + public void allowInput(ForgeDirection from, boolean allow) { + if (from != ForgeDirection.UNKNOWN) { + inputsOpen[from.ordinal()] = allow; + } + } + + public void allowOutput(ForgeDirection to, boolean allow) { + if (to != ForgeDirection.UNKNOWN) { + outputsOpen[to.ordinal()] = allow; + } } public void dropContents() { diff --git a/common/buildcraft/transport/PipeTransportFluids.java b/common/buildcraft/transport/PipeTransportFluids.java index d8ca0a32..223a4e05 100644 --- a/common/buildcraft/transport/PipeTransportFluids.java +++ b/common/buildcraft/transport/PipeTransportFluids.java @@ -185,7 +185,7 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler if (entity instanceof TileGenericPipe) { Pipe pipe = ((TileGenericPipe) entity).pipe; - if (pipe == null || !pipe.inputOpen(o.getOpposite()) || pipe.isClosed()) { + if (pipe == null || !inputOpen(o.getOpposite())) { return false; } } @@ -487,7 +487,7 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler outputTTL[direction.ordinal()] = OUTPUT_TTL; continue; } - if (canReceiveFluid(direction)) { + if (canReceiveFluid(direction) && outputOpen(direction)) { transferState[direction.ordinal()] = TransferState.Output; outputCount++; } @@ -543,7 +543,8 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler } private int fill(int tankIndex, FluidStack resource, boolean doFill) { - if (container.pipe.isClosed()) { + ForgeDirection d = ForgeDirection.getOrientation(tankIndex); + if (d != ForgeDirection.UNKNOWN && !inputOpen(d)) { return 0; } @@ -575,7 +576,7 @@ public class PipeTransportFluids extends PipeTransport implements IFluidHandler @Override public boolean canFill(ForgeDirection from, Fluid fluid) { - return true; + return inputOpen(from); } @Override diff --git a/common/buildcraft/transport/PipeTransportItems.java b/common/buildcraft/transport/PipeTransportItems.java index 5d280c5d..9bdc2b99 100644 --- a/common/buildcraft/transport/PipeTransportItems.java +++ b/common/buildcraft/transport/PipeTransportItems.java @@ -204,7 +204,8 @@ public class PipeTransportItems extends PipeTransport { sides.remove(ForgeDirection.UNKNOWN); for (ForgeDirection o : sides) { - if (container.pipe.outputOpen(o) && canReceivePipeObjects(o, item)) { + //if (container.pipe.outputOpen(o) && canReceivePipeObjects(o, item)) { + if (outputOpen(o) && canReceivePipeObjects(o, item)) { result.add(o); } } @@ -233,7 +234,8 @@ public class PipeTransportItems extends PipeTransport { if (entity instanceof TileGenericPipe) { TileGenericPipe pipe = (TileGenericPipe) entity; - return !pipe.pipe.isClosed() && pipe.pipe.transport instanceof PipeTransportItems; + //return !pipe.pipe.isClosed() && pipe.pipe.transport instanceof PipeTransportItems; + return pipe.pipe.inputOpen(o.getOpposite()) && pipe.pipe.transport instanceof PipeTransportItems; } else if (entity instanceof IInventory && item.getInsertionHandler().canInsertItem(item, (IInventory) entity)) { if (Transactor.getTransactorFor(entity).add(item.getItemStack(), o.getOpposite(), false).stackSize > 0) { return true; diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index c087298a..c57ffbc8 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -278,6 +278,10 @@ public class PipeTransportPower extends PipeTransport { // Compute the tiles requesting energy that are not power pipes for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if (!outputOpen(dir)) { + continue; + } + TileEntity tile = tiles [dir.ordinal()]; if (tile instanceof IEnergyHandler) { IEnergyHandler handler = (IEnergyHandler) tile; @@ -307,6 +311,10 @@ public class PipeTransportPower extends PipeTransport { for (int i = 0; i < 6; ++i) { transferQuery[i] = 0; + if (!inputOpen(ForgeDirection.getOrientation(i))) { + continue; + } + for (int j = 0; j < 6; ++j) { if (j != i) { transferQuery[i] += powerQuery[j]; @@ -419,13 +427,10 @@ public class PipeTransportPower extends PipeTransport { public void requestEnergy(ForgeDirection from, int amount) { step(); - if (!container.pipe.isClosed()) { - if (this.container.pipe instanceof IPipeTransportPowerHook) { - nextPowerQuery[from.ordinal()] += ((IPipeTransportPowerHook) this.container.pipe).requestEnergy(from, - amount); - } else { - nextPowerQuery[from.ordinal()] += amount; - } + if (this.container.pipe instanceof IPipeTransportPowerHook) { + nextPowerQuery[from.ordinal()] += ((IPipeTransportPowerHook) this.container.pipe).requestEnergy(from, amount); + } else { + nextPowerQuery[from.ordinal()] += amount; } } diff --git a/common/buildcraft/transport/TileGenericPipe.java b/common/buildcraft/transport/TileGenericPipe.java index c3bcf452..742e4cf2 100755 --- a/common/buildcraft/transport/TileGenericPipe.java +++ b/common/buildcraft/transport/TileGenericPipe.java @@ -584,7 +584,7 @@ public class TileGenericPipe extends TileEntity implements IPowerReceptor, IFlui /* IPIPEENTRY */ @Override public int injectItem(ItemStack payload, boolean doAdd, ForgeDirection from, EnumColor color) { - if (pipe.isClosed()) { + if (!pipe.inputOpen(from)) { return 0; } diff --git a/common/buildcraft/transport/triggers/ActionParameterDirection.java b/common/buildcraft/transport/triggers/ActionParameterDirection.java new file mode 100644 index 00000000..285bed3e --- /dev/null +++ b/common/buildcraft/transport/triggers/ActionParameterDirection.java @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * 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.transport.triggers; + + +//import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; + +import net.minecraftforge.common.util.ForgeDirection; + +import buildcraft.api.core.NetworkData; +import buildcraft.api.gates.IActionParameter; +import buildcraft.api.gates.IStatement; +import buildcraft.api.transport.IPipeTile; +import buildcraft.core.triggers.StatementIconProvider; + +public class ActionParameterDirection implements IActionParameter { + + // static IIcon[] icons = new IIcon[ForgeDirection.values().length]; + + @NetworkData + public ForgeDirection direction = ForgeDirection.UNKNOWN; + + public ActionParameterDirection() { + } + + /* + @Override + public void registerIcons(IIconRegister register) { + for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) { + icons[d.ordinal()] = register.registerIcon("buildcraft:triggers/trigger_dir_" + d.name().toLowerCase()); + } + } + + @Override + public IIcon getIconToDraw() { + return icons[direction.ordinal()]; + } + + */ + + @Override + public ItemStack getItemStackToDraw() { + return null; + } + + @Override + public IIcon getIconToDraw() { + if (direction == ForgeDirection.UNKNOWN) { + return null; + } else { + return StatementIconProvider.INSTANCE.getIcon(StatementIconProvider.INSTANCE.Action_Parameter_Direction_Down + direction.ordinal()); + } + } + + @Override + public void clicked(IPipeTile pipe, IStatement stmt, ItemStack stack) { + do { + direction = ForgeDirection.getOrientation((direction.ordinal() + 1) % ForgeDirection.values().length); + } while (direction != ForgeDirection.UNKNOWN && !pipe.isPipeConnected(direction)); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + nbt.setInteger("direction", direction.ordinal()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + if (nbt.hasKey("direction")) { + direction = ForgeDirection.values()[nbt.getInteger("direction")]; + } else { + direction = ForgeDirection.UNKNOWN; + } + } + + @Override + public boolean equals(Object object) { + if (object instanceof ActionParameterDirection) { + ActionParameterDirection param = (ActionParameterDirection) object; + return param.direction == this.direction; + } + return false; + } +} diff --git a/common/buildcraft/transport/triggers/ActionValve.java b/common/buildcraft/transport/triggers/ActionValve.java new file mode 100644 index 00000000..53e320f7 --- /dev/null +++ b/common/buildcraft/transport/triggers/ActionValve.java @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * 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.transport.triggers; + +import java.util.Locale; + +import net.minecraft.client.renderer.texture.IIconRegister; + +import net.minecraftforge.common.util.ForgeDirection; + +import buildcraft.api.gates.IActionParameter; +import buildcraft.api.gates.IGate; +import buildcraft.api.transport.IPipe; +import buildcraft.core.triggers.BCActionActive; +import buildcraft.core.utils.StringUtils; +import buildcraft.transport.Pipe; +import buildcraft.transport.PipeTransport; + + +public class ActionValve extends BCActionActive { + + public enum ValveState { + OPEN(true, true), + INPUT_ONLY(true, false), + OUTPUT_ONLY(false, true), + CLOSED(false, false); + + public static final ValveState[] VALUES = values(); + public final boolean inputOpen; + public final boolean outputOpen; + + private ValveState(boolean in, boolean out) { + inputOpen = in; + outputOpen = out; + } + } + + public final ValveState state; + + + public ActionValve(ValveState valveState) { + super("buildcraft:pipe.valve." + valveState.name().toLowerCase(Locale.ENGLISH)); + state = valveState; + } + + @Override + public String getDescription() { + return StringUtils.localize("gate.action.pipe.valve." + state.name().toLowerCase(Locale.ENGLISH)); + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + icon = iconRegister.registerIcon("buildcraft:triggers/action_valve_" + state.name().toLowerCase(Locale.ENGLISH)); + } + + @Override + public int maxParameters() { + return 1; + } + + @Override + public int minParameters() { + return 1; + } + + @Override + public IActionParameter createParameter(int index) { + IActionParameter param = null; + + if (index == 0) { + param = new ActionParameterDirection(); + } + + return param; + } + + @Override + public void actionActivate(IGate gate, IActionParameter[] parameters) { + if (parameters[0] != null) { + IPipe pipe = gate.getPipe(); + + if (pipe != null && pipe instanceof Pipe) { + PipeTransport transport = ((Pipe) pipe).transport; + ForgeDirection side = ((ActionParameterDirection) parameters[0]).direction; + + if (side != ForgeDirection.UNKNOWN) { + transport.allowInput(side, state.inputOpen); + transport.allowOutput(side, state.outputOpen); + } + } + } + } +}