diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index 50f3848c..693cd8d8 100644 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -101,6 +101,7 @@ gate.action.robot.work_in_area=Work in Area gate.action.robot.wakeup=Wake Up gate.action.station.forbid_robot=Robot Forbidden gate.action.robot.filter=Filter +gate.action.robot.filter_tool=Filter Tool gate.expansion.fader=Redstone Fader gate.expansion.pulsar=Autarchic Pulsar diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_robot_filter_tool.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_robot_filter_tool.png new file mode 100644 index 00000000..3695ebcb Binary files /dev/null and b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_robot_filter_tool.png differ diff --git a/common/buildcraft/BuildCraftSilicon.java b/common/buildcraft/BuildCraftSilicon.java index cea3d6a9..7220402d 100644 --- a/common/buildcraft/BuildCraftSilicon.java +++ b/common/buildcraft/BuildCraftSilicon.java @@ -11,6 +11,7 @@ package buildcraft; import java.util.ArrayList; import java.util.Arrays; import java.util.List; + import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -65,6 +66,7 @@ import buildcraft.robots.boards.BoardRobotPlanterNBT; import buildcraft.robots.boards.BoardRobotPumpNBT; import buildcraft.robots.boards.BoardRobotShovelmanNBT; import buildcraft.robots.statements.ActionRobotFilter; +import buildcraft.robots.statements.ActionRobotFilterTool; import buildcraft.robots.statements.ActionRobotGotoStation; import buildcraft.robots.statements.ActionRobotWakeUp; import buildcraft.robots.statements.ActionRobotWorkInArea; @@ -117,6 +119,7 @@ public class BuildCraftSilicon extends BuildCraftMod { public static IActionInternal actionRobotWakeUp = new ActionRobotWakeUp(); public static IActionInternal actionRobotWorkInArea = new ActionRobotWorkInArea(); public static IActionInternal actionRobotFilter = new ActionRobotFilter(); + public static IActionInternal actionRobotFilterTool = new ActionRobotFilterTool(); public static IActionInternal actionRobotAllowCraft = new ActionStationAllowCraft(); public static IActionInternal actionStationRequestItems = new ActionStationRequestItems(); public static IActionInternal actionStationAcceptItems = new ActionStationAcceptItemsInv(); diff --git a/common/buildcraft/core/inventory/filters/AggregateFilter.java b/common/buildcraft/core/inventory/filters/AggregateFilter.java new file mode 100644 index 00000000..9df118a6 --- /dev/null +++ b/common/buildcraft/core/inventory/filters/AggregateFilter.java @@ -0,0 +1,34 @@ +/** + * 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.core.inventory.filters; + +import net.minecraft.item.ItemStack; + +/** + * Returns true if the stack matches all of the stack filters. + */ +public class AggregateFilter implements IStackFilter { + + private final IStackFilter[] filters; + + public AggregateFilter(IStackFilter... iFilters) { + filters = iFilters; + } + + @Override + public boolean matches(ItemStack stack) { + for (IStackFilter f : filters) { + if (!f.matches(stack)) { + return false; + } + } + + return true; + } +} diff --git a/common/buildcraft/robots/ai/AIRobotFetchAndEquipItemStack.java b/common/buildcraft/robots/ai/AIRobotFetchAndEquipItemStack.java index 2143b302..5104cdb9 100755 --- a/common/buildcraft/robots/ai/AIRobotFetchAndEquipItemStack.java +++ b/common/buildcraft/robots/ai/AIRobotFetchAndEquipItemStack.java @@ -18,8 +18,10 @@ import buildcraft.api.robots.AIRobot; import buildcraft.api.robots.EntityRobotBase; import buildcraft.core.inventory.ITransactor; import buildcraft.core.inventory.Transactor; +import buildcraft.core.inventory.filters.AggregateFilter; import buildcraft.core.inventory.filters.IStackFilter; import buildcraft.robots.DockingStation; +import buildcraft.robots.statements.ActionRobotFilterTool; public class AIRobotFetchAndEquipItemStack extends AIRobot { @@ -32,7 +34,7 @@ public class AIRobotFetchAndEquipItemStack extends AIRobot { public AIRobotFetchAndEquipItemStack(EntityRobotBase iRobot, IStackFilter iFilter) { super(iRobot); - filter = iFilter; + filter = new AggregateFilter(ActionRobotFilterTool.getGateFilter(iRobot.getLinkedStation()), iFilter); } @Override diff --git a/common/buildcraft/robots/statements/ActionRobotFilterTool.java b/common/buildcraft/robots/statements/ActionRobotFilterTool.java new file mode 100644 index 00000000..4567fb89 --- /dev/null +++ b/common/buildcraft/robots/statements/ActionRobotFilterTool.java @@ -0,0 +1,97 @@ +/** + * 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.robots.statements; + +import java.util.ArrayList; +import java.util.Collection; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; + +import buildcraft.api.robots.IDockingStation; +import buildcraft.api.statements.IActionInternal; +import buildcraft.api.statements.IStatementContainer; +import buildcraft.api.statements.IStatementParameter; +import buildcraft.api.statements.StatementParameterItemStack; +import buildcraft.core.inventory.filters.ArrayStackOrListFilter; +import buildcraft.core.inventory.filters.IStackFilter; +import buildcraft.core.inventory.filters.PassThroughStackFilter; +import buildcraft.core.statements.BCStatement; +import buildcraft.core.utils.StringUtils; +import buildcraft.robots.DockingStation; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.StatementSlot; + +public class ActionRobotFilterTool extends BCStatement implements IActionInternal { + + public ActionRobotFilterTool() { + super("buildcraft:robot.work_filter_tool"); + } + + @Override + public String getDescription() { + return StringUtils.localize("gate.action.robot.filter_tool"); + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + icon = iconRegister.registerIcon("buildcraft:triggers/action_robot_filter_tool"); + } + + @Override + public int minParameters() { + return 1; + } + + @Override + public int maxParameters() { + return 1; + } + + @Override + public IStatementParameter createParameter(int index) { + return new StatementParameterItemStack(); + } + + public static Collection getGateFilterStacks(IDockingStation station) { + ArrayList result = new ArrayList(); + + for (StatementSlot slot : new ActionIterator(((DockingStation) station).getPipe().pipe)) { + if (slot.statement instanceof ActionRobotFilterTool) { + for (IStatementParameter p : slot.parameters) { + if (p != null && p instanceof StatementParameterItemStack) { + StatementParameterItemStack param = (StatementParameterItemStack) p; + ItemStack stack = param.getItemStack(); + + if (stack != null) { + result.add(stack); + } + } + } + } + } + + return result; + } + + public static IStackFilter getGateFilter(IDockingStation station) { + Collection stacks = getGateFilterStacks(station); + + if (stacks.size() == 0) { + return new PassThroughStackFilter(); + } else { + return new ArrayStackOrListFilter(stacks.toArray(new ItemStack[stacks.size()])); + } + } + + @Override + public void actionActivate(IStatementContainer source, + IStatementParameter[] parameters) { + } +} diff --git a/common/buildcraft/robots/statements/RobotsActionProvider.java b/common/buildcraft/robots/statements/RobotsActionProvider.java index c3a23ebf..1c66aa3c 100755 --- a/common/buildcraft/robots/statements/RobotsActionProvider.java +++ b/common/buildcraft/robots/statements/RobotsActionProvider.java @@ -61,6 +61,7 @@ public class RobotsActionProvider implements IActionProvider { result.add(BuildCraftSilicon.actionRobotWorkInArea); result.add(BuildCraftSilicon.actionRobotWakeUp); result.add(BuildCraftSilicon.actionRobotFilter); + result.add(BuildCraftSilicon.actionRobotFilterTool); result.add(BuildCraftSilicon.actionStationForbidRobot); if (((TileGenericPipe) tile).pipe.transport instanceof PipeTransportItems) {