From 4bdf0f22d5e674eb57d5c1d00b03bf580a1ae75f Mon Sep 17 00:00:00 2001 From: CovertJaguar <CovertJaguar@gmail.com> Date: Thu, 24 Oct 2013 18:31:42 -0700 Subject: [PATCH] Buffer Triggers now apply to all Inventories Also adjusted inventory triggers to account for whether an item can be put in a slot when calculating if there is space in the inventory. --- common/buildcraft/BuildCraftCore.java | 5 + common/buildcraft/BuildCraftTransport.java | 5 - .../api/gates/ITriggerParameter.java | 1 + .../api/gates/TriggerParameter.java | 6 +- common/buildcraft/core/DefaultProps.java | 4 +- .../core/triggers/DefaultTriggerProvider.java | 3 + .../core/triggers/TriggerFluidContainer.java | 4 +- .../core/triggers/TriggerInventory.java | 42 +++---- .../core/triggers/TriggerInventoryLevel.java | 104 +++++++++++++++++ .../transport/TileFilteredBuffer.java | 17 +-- .../transport/gui/GuiGateInterface.java | 2 +- .../TriggerFilteredBufferInventoryLevel.java | 109 ------------------ .../triggers/TriggerPipeContents.java | 10 +- 13 files changed, 139 insertions(+), 173 deletions(-) create mode 100644 common/buildcraft/core/triggers/TriggerInventoryLevel.java delete mode 100644 common/buildcraft/transport/triggers/TriggerFilteredBufferInventoryLevel.java diff --git a/common/buildcraft/BuildCraftCore.java b/common/buildcraft/BuildCraftCore.java index 58dcc0fd..c85ef338 100644 --- a/common/buildcraft/BuildCraftCore.java +++ b/common/buildcraft/BuildCraftCore.java @@ -61,6 +61,7 @@ import buildcraft.core.triggers.DefaultActionProvider; import buildcraft.core.triggers.DefaultTriggerProvider; import buildcraft.core.triggers.TriggerFluidContainer; import buildcraft.core.triggers.TriggerInventory; +import buildcraft.core.triggers.TriggerInventoryLevel; import buildcraft.core.triggers.TriggerMachine; import buildcraft.core.utils.Localization; import buildcraft.transport.triggers.TriggerRedstoneInput; @@ -148,6 +149,10 @@ public class BuildCraftCore { public static BCTrigger triggerFullFluid = new TriggerFluidContainer(DefaultProps.TRIGGER_FULL_LIQUID, TriggerFluidContainer.State.Full); public static BCTrigger triggerRedstoneActive = new TriggerRedstoneInput(DefaultProps.TRIGGER_REDSTONE_ACTIVE, true); public static BCTrigger triggerRedstoneInactive = new TriggerRedstoneInput(DefaultProps.TRIGGER_REDSTONE_INACTIVE, false); + + public static BCTrigger triggerInventoryBelow25 = new TriggerInventoryLevel(TriggerInventoryLevel.TriggerType.BELOW_25); + public static BCTrigger triggerInventoryBelow50 = new TriggerInventoryLevel(TriggerInventoryLevel.TriggerType.BELOW_50); + public static BCTrigger triggerInventoryBelow75 = new TriggerInventoryLevel(TriggerInventoryLevel.TriggerType.BELOW_75); public static BCAction actionRedstone = new ActionRedstoneOutput(DefaultProps.ACTION_REDSTONE); public static BCAction actionOn = new ActionMachineControl(DefaultProps.ACTION_ON, Mode.On); diff --git a/common/buildcraft/BuildCraftTransport.java b/common/buildcraft/BuildCraftTransport.java index b5d9ef8d..71e12747 100644 --- a/common/buildcraft/BuildCraftTransport.java +++ b/common/buildcraft/BuildCraftTransport.java @@ -13,7 +13,6 @@ import buildcraft.api.recipes.AssemblyRecipe; import buildcraft.api.transport.IExtractionHandler; import buildcraft.api.transport.IPipe; import buildcraft.api.transport.PipeManager; -import buildcraft.core.CreativeTabBuildCraft; import buildcraft.core.DefaultProps; import buildcraft.core.InterModComms; import buildcraft.core.ItemBuildCraft; @@ -77,7 +76,6 @@ import buildcraft.transport.triggers.ActionPipeDirection; import buildcraft.transport.triggers.ActionPowerLimiter; import buildcraft.transport.triggers.ActionSignalOutput; import buildcraft.transport.triggers.ActionSingleEnergyPulse; -import buildcraft.transport.triggers.TriggerFilteredBufferInventoryLevel; import buildcraft.transport.triggers.TriggerPipeContents; import buildcraft.transport.triggers.TriggerPipeContents.Kind; import buildcraft.transport.triggers.TriggerPipeSignal; @@ -163,9 +161,6 @@ public class BuildCraftTransport { public static BCTrigger triggerGreenSignalInactive = new TriggerPipeSignal(DefaultProps.TRIGGER_GREEN_SIGNAL_INACTIVE, false, IPipe.WireColor.Green); public static BCTrigger triggerYellowSignalActive = new TriggerPipeSignal(DefaultProps.TRIGGER_YELLOW_SIGNAL_ACTIVE, true, IPipe.WireColor.Yellow); public static BCTrigger triggerYellowSignalInactive = new TriggerPipeSignal(DefaultProps.TRIGGER_YELLOW_SIGNAL_INACTIVE, false, IPipe.WireColor.Yellow); - public static BCTrigger triggerInventoryBelow25 = new TriggerFilteredBufferInventoryLevel(DefaultProps.TRIGGER_INVENTORY_LEVEL_BELOW25, TriggerFilteredBufferInventoryLevel.State.Below25); - public static BCTrigger triggerInventoryBelow50 = new TriggerFilteredBufferInventoryLevel(DefaultProps.TRIGGER_INVENTORY_LEVEL_BELOW50, TriggerFilteredBufferInventoryLevel.State.Below50); - public static BCTrigger triggerInventoryBelow75 = new TriggerFilteredBufferInventoryLevel(DefaultProps.TRIGGER_INVENTORY_LEVEL_BELOW75, TriggerFilteredBufferInventoryLevel.State.Below75); public static BCAction actionRedSignal = new ActionSignalOutput(DefaultProps.ACTION_RED_SIGNAL, IPipe.WireColor.Red); public static BCAction actionBlueSignal = new ActionSignalOutput(DefaultProps.ACTION_BLUE_SIGNAL, IPipe.WireColor.Blue); public static BCAction actionGreenSignal = new ActionSignalOutput(DefaultProps.ACTION_GREEN_SIGNAL, IPipe.WireColor.Green); diff --git a/common/buildcraft/api/gates/ITriggerParameter.java b/common/buildcraft/api/gates/ITriggerParameter.java index cef436a6..b097667a 100644 --- a/common/buildcraft/api/gates/ITriggerParameter.java +++ b/common/buildcraft/api/gates/ITriggerParameter.java @@ -13,6 +13,7 @@ public interface ITriggerParameter { public abstract void readFromNBT(NBTTagCompound compound); + @Deprecated public abstract ItemStack getItem(); } diff --git a/common/buildcraft/api/gates/TriggerParameter.java b/common/buildcraft/api/gates/TriggerParameter.java index c76ce99a..0127bc85 100644 --- a/common/buildcraft/api/gates/TriggerParameter.java +++ b/common/buildcraft/api/gates/TriggerParameter.java @@ -66,12 +66,8 @@ public class TriggerParameter implements ITriggerParameter { } } - /* - * (non-Javadoc) - * - * @see net.minecraft.src.buildcraft.api.gates.ITriggerParameter#getItem() - */ @Override + @Deprecated public ItemStack getItem() { return stack; } diff --git a/common/buildcraft/core/DefaultProps.java b/common/buildcraft/core/DefaultProps.java index 32cfffd8..f55e6d37 100644 --- a/common/buildcraft/core/DefaultProps.java +++ b/common/buildcraft/core/DefaultProps.java @@ -127,6 +127,7 @@ public class DefaultProps { public static final int FILLER_LIFESPAN_TOUGH = 20; public static final int FILLER_LIFESPAN_NORMAL = 6000; + // These are only till here for Legacy support, new Triggers/Action don't need them public static int TRIGGER_REDSTONE_ACTIVE = 1; public static int TRIGGER_REDSTONE_INACTIVE = 2; public static int TRIGGER_MACHINE_ACTIVE = 3; @@ -157,9 +158,6 @@ public class DefaultProps { public static int TRIGGER_RED_ENGINE_HEAT = 28; public static int TRIGGER_PIPE_REQUESTS_ENERGY = 29; public static int TRIGGER_PIPE_TOO_MUCH_ENERGY = 30; - public static int TRIGGER_INVENTORY_LEVEL_BELOW25 = 31; - public static int TRIGGER_INVENTORY_LEVEL_BELOW50 = 32; - public static int TRIGGER_INVENTORY_LEVEL_BELOW75 = 33; public static int ACTION_REDSTONE = 1; public static int ACTION_RED_SIGNAL = 2; diff --git a/common/buildcraft/core/triggers/DefaultTriggerProvider.java b/common/buildcraft/core/triggers/DefaultTriggerProvider.java index 48c5e643..8f2392a1 100644 --- a/common/buildcraft/core/triggers/DefaultTriggerProvider.java +++ b/common/buildcraft/core/triggers/DefaultTriggerProvider.java @@ -29,6 +29,9 @@ public class DefaultTriggerProvider implements ITriggerProvider { res.add(BuildCraftCore.triggerContainsInventory); res.add(BuildCraftCore.triggerSpaceInventory); res.add(BuildCraftCore.triggerFullInventory); + res.add(BuildCraftCore.triggerInventoryBelow25); + res.add(BuildCraftCore.triggerInventoryBelow50); + res.add(BuildCraftCore.triggerInventoryBelow75); } if (tile instanceof IFluidHandler) { diff --git a/common/buildcraft/core/triggers/TriggerFluidContainer.java b/common/buildcraft/core/triggers/TriggerFluidContainer.java index 6754003a..0674876e 100644 --- a/common/buildcraft/core/triggers/TriggerFluidContainer.java +++ b/common/buildcraft/core/triggers/TriggerFluidContainer.java @@ -58,8 +58,8 @@ public class TriggerFluidContainer extends BCTrigger { FluidStack searchedFluid = null; - if (parameter != null && parameter.getItem() != null) { - searchedFluid = FluidContainerRegistry.getFluidForFilledItem(parameter.getItem()); + if (parameter != null && parameter.getItemStack() != null) { + searchedFluid = FluidContainerRegistry.getFluidForFilledItem(parameter.getItemStack()); } if (searchedFluid != null) { diff --git a/common/buildcraft/core/triggers/TriggerInventory.java b/common/buildcraft/core/triggers/TriggerInventory.java index 294f596e..7a74d870 100644 --- a/common/buildcraft/core/triggers/TriggerInventory.java +++ b/common/buildcraft/core/triggers/TriggerInventory.java @@ -9,10 +9,11 @@ package buildcraft.core.triggers; import buildcraft.api.gates.ITriggerParameter; import buildcraft.api.inventory.ISpecialInventory; -import buildcraft.core.inventory.InventoryWrapper; +import buildcraft.core.inventory.InventoryIterator; +import buildcraft.core.inventory.InventoryIterator.IInvSlot; +import buildcraft.core.inventory.StackHelper; import java.util.Locale; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -58,7 +59,7 @@ public class TriggerInventory extends BCTrigger { ItemStack searchedStack = null; if (parameter != null) { - searchedStack = parameter.getItem(); + searchedStack = parameter.getItemStack(); } if (tile instanceof ISpecialInventory) { @@ -82,34 +83,21 @@ public class TriggerInventory extends BCTrigger { } if (tile instanceof IInventory) { - ISidedInventory inv = InventoryWrapper.getWrappedInventory(tile); - int invSize = inv.getSizeInventory(); - - if (invSize <= 0) - return false; - + boolean hasSlots = false; boolean foundItems = false; boolean foundSpace = false; - for (int i : inv.getAccessibleSlotsFromSide(side.ordinal())) { - ItemStack stack = inv.getStackInSlot(i); - - boolean slotEmpty = stack == null || stack.stackSize == 0; - - if (searchedStack == null) { - foundItems |= !slotEmpty; - } else if (!slotEmpty) { - foundItems |= stack.isItemEqual(searchedStack); - } - - if (slotEmpty) { - foundSpace = true; - } else if (searchedStack != null) { - if (stack.stackSize < stack.getMaxStackSize() && stack.isItemEqual(searchedStack)) { - foundSpace = true; - } - } + for (IInvSlot slot : InventoryIterator.getIterable((IInventory) tile, side)) { + hasSlots = true; + ItemStack stack = slot.getStackInSlot(); + + foundItems |= stack != null && (searchedStack == null || StackHelper.instance().canStacksMerge(stack, searchedStack)); + foundSpace |= (stack == null || (StackHelper.instance().canStacksMerge(stack, searchedStack) && stack.stackSize < stack.getMaxStackSize())) + && (searchedStack == null || slot.canPutStackInSlot(searchedStack)); } + + if(!hasSlots) + return false; switch (state) { case Empty: diff --git a/common/buildcraft/core/triggers/TriggerInventoryLevel.java b/common/buildcraft/core/triggers/TriggerInventoryLevel.java new file mode 100644 index 00000000..fa1432fa --- /dev/null +++ b/common/buildcraft/core/triggers/TriggerInventoryLevel.java @@ -0,0 +1,104 @@ +/** + * 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.core.triggers; + +import buildcraft.api.gates.ActionManager; +import buildcraft.api.gates.ITriggerParameter; +import buildcraft.core.inventory.InventoryIterator; +import buildcraft.core.inventory.InventoryIterator.IInvSlot; +import buildcraft.core.inventory.StackHelper; +import java.util.Locale; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; + +public class TriggerInventoryLevel extends BCTrigger { + + public enum TriggerType { + + BELOW_25, BELOW_50, BELOW_75 + }; + public TriggerType type; + + public TriggerInventoryLevel(TriggerType type) { + super(0, "buildcraft.inventorylevel." + type.name().toLowerCase(Locale.ENGLISH)); + this.type = type; + + // Legacy migration code + ActionManager.triggers.put("buildcraft.filteredBuffer." + type.name().toLowerCase(Locale.ENGLISH), this); + } + + @Override + public boolean hasParameter() { + return true; + } + + @Override + public String getDescription() { + switch (type) { + case BELOW_25: + return "Contains < 25%"; + case BELOW_50: + return "Contains < 50%"; + default: + return "Contains < 75%"; + } + } + + @Override + public boolean isTriggerActive(ForgeDirection side, TileEntity tile, ITriggerParameter parameter) { + // A parameter is required + if (parameter == null) + return false; + + if (tile instanceof IInventory) { + ItemStack searchStack = parameter.getItemStack(); + + int stackSpace = 0; + int foundItems = 0; + for (IInvSlot slot : InventoryIterator.getIterable((IInventory) tile, side)) { + if (slot.canPutStackInSlot(searchStack)) { + ItemStack stackInSlot = slot.getStackInSlot(); + if (stackInSlot == null || StackHelper.instance().canStacksMerge(stackInSlot, searchStack)) { + stackSpace++; + foundItems += stackInSlot == null ? 0 : stackInSlot.stackSize; + } + } + } + + if (stackSpace > 0) { + float percentage = (float) foundItems / ((float) stackSpace * (float) searchStack.getMaxStackSize()); + + switch (type) { + case BELOW_25: + return percentage < 0.25f; + case BELOW_50: + return percentage < 0.5f; + default: + return percentage < 0.75f; + } + } + + } + + return false; + } + + @Override + public int getIconIndex() { + switch (type) { + case BELOW_25: + return ActionTriggerIconProvider.Trigger_Inventory_Below25; + case BELOW_50: + return ActionTriggerIconProvider.Trigger_Inventory_Below50; + default: + return ActionTriggerIconProvider.Trigger_Inventory_Below75; + } + } +} diff --git a/common/buildcraft/transport/TileFilteredBuffer.java b/common/buildcraft/transport/TileFilteredBuffer.java index dbb8c0b5..3101a9a4 100644 --- a/common/buildcraft/transport/TileFilteredBuffer.java +++ b/common/buildcraft/transport/TileFilteredBuffer.java @@ -1,18 +1,14 @@ package buildcraft.transport; -import buildcraft.BuildCraftTransport; -import buildcraft.api.gates.IOverrideDefaultTriggers; -import buildcraft.api.gates.ITrigger; import buildcraft.core.TileBuildCraft; import buildcraft.core.inventory.SimpleInventory; -import java.util.LinkedList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -public class TileFilteredBuffer extends TileBuildCraft implements IInventory, IOverrideDefaultTriggers { +public class TileFilteredBuffer extends TileBuildCraft implements IInventory { private final SimpleInventory inventoryFilters = new SimpleInventory(9, "FilteredBufferFilters", 1); private final SimpleInventory inventoryStorage = new SimpleInventory(9, "FilteredBufferStorage", 64); @@ -93,17 +89,6 @@ public class TileFilteredBuffer extends TileBuildCraft implements IInventory, IO return false; } - @Override - public LinkedList<ITrigger> getTriggers() { - LinkedList<ITrigger> result = new LinkedList<ITrigger>(); - - result.add(BuildCraftTransport.triggerInventoryBelow25); - result.add(BuildCraftTransport.triggerInventoryBelow50); - result.add(BuildCraftTransport.triggerInventoryBelow75); - - return result; - } - @Override public void readFromNBT(NBTTagCompound nbtTagCompound) { super.readFromNBT(nbtTagCompound); diff --git a/common/buildcraft/transport/gui/GuiGateInterface.java b/common/buildcraft/transport/gui/GuiGateInterface.java index 82091ef4..5a537b20 100644 --- a/common/buildcraft/transport/gui/GuiGateInterface.java +++ b/common/buildcraft/transport/gui/GuiGateInterface.java @@ -136,7 +136,7 @@ public class GuiGateInterface extends GuiAdvancedInterface { public ItemStack getItemStack() { ITriggerParameter parameter = pipe.gate.getTriggerParameter(slot); if (parameter != null) - return parameter.getItem(); + return parameter.getItemStack(); else return null; } diff --git a/common/buildcraft/transport/triggers/TriggerFilteredBufferInventoryLevel.java b/common/buildcraft/transport/triggers/TriggerFilteredBufferInventoryLevel.java deleted file mode 100644 index 7cb69aa7..00000000 --- a/common/buildcraft/transport/triggers/TriggerFilteredBufferInventoryLevel.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * 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.transport.triggers; - -import buildcraft.api.gates.ITriggerParameter; -import buildcraft.core.triggers.ActionTriggerIconProvider; -import buildcraft.core.triggers.BCTrigger; -import buildcraft.transport.TileFilteredBuffer; -import java.util.Locale; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; - -public class TriggerFilteredBufferInventoryLevel extends BCTrigger { - - public enum State { - - Below25, Below50, Below75 - }; - public State state; - - public TriggerFilteredBufferInventoryLevel(int legacyId, State state) { - super(legacyId, "buildcraft.filteredBuffer." + state.name().toLowerCase(Locale.ENGLISH)); - - this.state = state; - } - - @Override - public boolean hasParameter() { - return true; - } - - @Override - public String getDescription() { - switch (state) { - case Below25: - return "Contains < 25%"; - case Below50: - return "Contains < 50%"; - default: - return "Contains < 75%"; - } - } - - @Override - public boolean isTriggerActive(ForgeDirection side, TileEntity tile, ITriggerParameter parameter) { - if (tile instanceof TileFilteredBuffer) { - - // A parameter is required - if (parameter == null) { - return false; - } - - TileFilteredBuffer filteredBuffer = (TileFilteredBuffer) tile; - ItemStack searchStack = parameter.getItem(); - - int foundStackCount = 0; - int foundItemCount = 0; - - IInventory filters = filteredBuffer.getFilters(); - - for (int i = 0; i < filters.getSizeInventory(); i++) { - ItemStack filterStack = filters.getStackInSlot(i); - - if (filterStack != null && filterStack.isItemEqual(searchStack)) { - ItemStack foundStack = filteredBuffer.getStackInSlot(i); - - if (foundStack != null) - foundItemCount += foundStack.stackSize; - - foundStackCount++; - } - } - - if (foundStackCount > 0) { - float percentage = (float) foundItemCount / ((float) foundStackCount * (float) searchStack.getMaxStackSize()); - - switch (state) { - case Below25: - return percentage < 0.25f; - case Below50: - return percentage < 0.5f; - default: - return percentage < 0.75f; - } - } - } - - return false; - } - - @Override - public int getIconIndex() { - switch (state) { - case Below25: - return ActionTriggerIconProvider.Trigger_Inventory_Below25; - case Below50: - return ActionTriggerIconProvider.Trigger_Inventory_Below50; - default: - return ActionTriggerIconProvider.Trigger_Inventory_Below75; - } - } -} diff --git a/common/buildcraft/transport/triggers/TriggerPipeContents.java b/common/buildcraft/transport/triggers/TriggerPipeContents.java index 1e8fa321..afa4d353 100644 --- a/common/buildcraft/transport/triggers/TriggerPipeContents.java +++ b/common/buildcraft/transport/triggers/TriggerPipeContents.java @@ -90,10 +90,10 @@ public class TriggerPipeContents extends BCTrigger implements ITriggerPipe { if (kind == Kind.Empty) return transportItems.items.isEmpty(); else if (kind == Kind.ContainsItems) - if (parameter != null && parameter.getItem() != null) { + if (parameter != null && parameter.getItemStack()!= null) { for (TravelingItem item : transportItems.items) { - if (item.getItemStack().itemID == parameter.getItem().itemID - && item.getItemStack().getItemDamage() == parameter.getItem().getItemDamage()) + if (item.getItemStack().itemID == parameter.getItemStack().itemID + && item.getItemStack().getItemDamage() == parameter.getItemStack().getItemDamage()) return true; } } else @@ -103,8 +103,8 @@ public class TriggerPipeContents extends BCTrigger implements ITriggerPipe { FluidStack searchedFluid = null; - if (parameter != null && parameter.getItem() != null) { - searchedFluid = FluidContainerRegistry.getFluidForFilledItem(parameter.getItem()); + if (parameter != null && parameter.getItemStack() != null) { + searchedFluid = FluidContainerRegistry.getFluidForFilledItem(parameter.getItemStack()); } if (kind == Kind.Empty) {