From 43e1e6d8c05f6e7ec50bc15c337e3b109af22602 Mon Sep 17 00:00:00 2001 From: SpaceToad Date: Mon, 30 Jun 2014 09:14:30 +0200 Subject: [PATCH] implemented filter for block breaking robots, for #1922 --- .../assets/buildcraft/lang/en_US.lang | 2 + common/buildcraft/BuildCraftSilicon.java | 2 + .../boards/BoardRobotGenericBreakBlock.java | 68 ++++++++++++++++++- .../silicon/statements/ActionRobotFilter.java | 48 +++++++++++++ .../statements/RobotsActionProvider.java | 1 + 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100755 common/buildcraft/silicon/statements/ActionRobotFilter.java diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index dddcd2fa..574c93a9 100755 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -64,6 +64,7 @@ gate.action.station.drop_items_in_pipe=Drop Items In Pipe 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.expansion.fader=Redstone Fader gate.expansion.pulsar=Autarchic Pulsar @@ -197,6 +198,7 @@ item.PipeItemsVoid.name=Void Transport Pipe item.PipeFluidsVoid.name=Void Fluid Pipe item.PipeItemsSandstone.name=Sandstone Transport Pipe item.PipeFluidsSandstone.name=Sandstone Fluid Pipe +item.PipeRobotStation.name=Docking Station item.Facade.name=Facade item.FacadePhased.name=Phased Facade item.FacadePhased.state=%s: %s diff --git a/common/buildcraft/BuildCraftSilicon.java b/common/buildcraft/BuildCraftSilicon.java index b6b345e6..02821091 100644 --- a/common/buildcraft/BuildCraftSilicon.java +++ b/common/buildcraft/BuildCraftSilicon.java @@ -70,6 +70,7 @@ import buildcraft.silicon.network.PacketHandlerSilicon; import buildcraft.silicon.recipes.AdvancedFacadeRecipe; import buildcraft.silicon.recipes.GateExpansionRecipe; import buildcraft.silicon.recipes.GateLogicSwapRecipe; +import buildcraft.silicon.statements.ActionRobotFilter; import buildcraft.silicon.statements.ActionRobotGotoStation; import buildcraft.silicon.statements.ActionRobotWakeUp; import buildcraft.silicon.statements.ActionRobotWorkInArea; @@ -105,6 +106,7 @@ public class BuildCraftSilicon extends BuildCraftMod { public static IAction actionRobotGotoStation = new ActionRobotGotoStation(); public static IAction actionRobotWakeUp = new ActionRobotWakeUp(); public static IAction actionRobotWorkInArea = new ActionRobotWorkInArea(); + public static IAction actionRobotFilter = new ActionRobotFilter(); public static IAction actionStationRequestItems = new ActionStationRequestItemsInv(); public static IAction actionStationProvideItems = new ActionStationProvideItems(); public static IAction actionStationForbidRobot = new ActionStationForbidRobot(); diff --git a/common/buildcraft/core/robots/boards/BoardRobotGenericBreakBlock.java b/common/buildcraft/core/robots/boards/BoardRobotGenericBreakBlock.java index 91990150..b0e8756a 100755 --- a/common/buildcraft/core/robots/boards/BoardRobotGenericBreakBlock.java +++ b/common/buildcraft/core/robots/boards/BoardRobotGenericBreakBlock.java @@ -8,19 +8,30 @@ */ package buildcraft.core.robots.boards; +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import buildcraft.api.boards.RedstoneBoardRobot; import buildcraft.api.core.BlockIndex; +import buildcraft.api.gates.ActionParameterItemStack; +import buildcraft.api.gates.IActionParameter; import buildcraft.api.robots.AIRobot; import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.TickHandlerCoreClient; import buildcraft.core.inventory.filters.IStackFilter; import buildcraft.core.robots.AIRobotBreak; import buildcraft.core.robots.AIRobotFetchAndEquipItemStack; import buildcraft.core.robots.AIRobotGotoSleep; import buildcraft.core.robots.AIRobotSearchBlock; +import buildcraft.core.robots.DockingStation; import buildcraft.core.utils.IPathFound; +import buildcraft.silicon.statements.ActionRobotFilter; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.ActionSlot; public abstract class BoardRobotGenericBreakBlock extends RedstoneBoardRobot { @@ -32,8 +43,37 @@ public abstract class BoardRobotGenericBreakBlock extends RedstoneBoardRobot { public abstract boolean isExpectedTool(ItemStack stack); + /** + * This function has to be derived in a thread safe manner, as it may be + * called from parallel jobs. In particular, world should not be directly + * used, only through WorldProperty class and subclasses. + */ public abstract boolean isExpectedBlock(World world, int x, int y, int z); + private ArrayList blockFilter = new ArrayList(); + private ArrayList metaFilter = new ArrayList(); + + @Override + public final void start() { + DockingStation station = (DockingStation) robot.getLinkedStation(); + + for (ActionSlot slot : new ActionIterator(station.pipe.pipe)) { + if (slot.action instanceof ActionRobotFilter) { + for (IActionParameter p : slot.parameters) { + if (p != null && p instanceof ActionParameterItemStack) { + ActionParameterItemStack param = (ActionParameterItemStack) p; + ItemStack stack = param.getItemStackToDraw(); + + if (stack != null && stack.getItem() instanceof ItemBlock) { + blockFilter.add(((ItemBlock) stack.getItem()).field_150939_a); + metaFilter.add(stack.getItemDamage()); + } + } + } + } + } + } + public final void preemt(AIRobot ai) { if (ai instanceof AIRobotSearchBlock) { BlockIndex index = ((AIRobotSearchBlock) ai).blockFound; @@ -57,7 +97,7 @@ public abstract class BoardRobotGenericBreakBlock extends RedstoneBoardRobot { startDelegateAI(new AIRobotSearchBlock(robot, new IPathFound() { @Override public boolean endReached(World world, int x, int y, int z) { - if (isExpectedBlock(world, x, y, z)) { + if (isExpectedBlock(world, x, y, z) && matchesGateFilter(world, x, y, z)) { return RedstoneBoardRobot.isFreeBlock(new BlockIndex(x, y, z)); } else { return false; @@ -92,4 +132,30 @@ public abstract class BoardRobotGenericBreakBlock extends RedstoneBoardRobot { } } + private boolean matchesGateFilter(World world, int x, int y, int z) { + if (blockFilter.size() == 0) { + return true; + } + + synchronized (TickHandlerCoreClient.startSynchronousComputation) { + try { + TickHandlerCoreClient.startSynchronousComputation.wait(); + + Block block = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + + for (int i = 0; i < blockFilter.size(); ++i) { + if (blockFilter.get(i) == block && metaFilter.get(i) == meta) { + return true; + } + } + + return false; + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + } + } + } diff --git a/common/buildcraft/silicon/statements/ActionRobotFilter.java b/common/buildcraft/silicon/statements/ActionRobotFilter.java new file mode 100755 index 00000000..e2c8a458 --- /dev/null +++ b/common/buildcraft/silicon/statements/ActionRobotFilter.java @@ -0,0 +1,48 @@ +/** + * 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.silicon.statements; + +import net.minecraft.client.renderer.texture.IIconRegister; + +import buildcraft.api.gates.ActionParameterItemStack; +import buildcraft.api.gates.IActionParameter; +import buildcraft.core.triggers.BCActionPassive; +import buildcraft.core.utils.StringUtils; + +public class ActionRobotFilter extends BCActionPassive { + + public ActionRobotFilter() { + super("buildcraft:robot.work_filter"); + } + + @Override + public String getDescription() { + return StringUtils.localize("gate.action.robot.filter"); + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + icon = iconRegister.registerIcon("buildcraft:triggers/action_robot_filter"); + } + + @Override + public int minParameters() { + return 1; + } + + @Override + public int maxParameters() { + return 3; + } + + @Override + public IActionParameter createParameter(int index) { + return new ActionParameterItemStack(); + } +} diff --git a/common/buildcraft/silicon/statements/RobotsActionProvider.java b/common/buildcraft/silicon/statements/RobotsActionProvider.java index 80b37986..1d6d2e7d 100755 --- a/common/buildcraft/silicon/statements/RobotsActionProvider.java +++ b/common/buildcraft/silicon/statements/RobotsActionProvider.java @@ -46,6 +46,7 @@ public class RobotsActionProvider implements IActionProvider { result.add(BuildCraftSilicon.actionRobotGotoStation); result.add(BuildCraftSilicon.actionRobotWorkInArea); result.add(BuildCraftSilicon.actionRobotWakeUp); + result.add(BuildCraftSilicon.actionRobotFilter); result.add(BuildCraftSilicon.actionStationForbidRobot); for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {