implemented filter for block breaking robots, for #1922

This commit is contained in:
SpaceToad 2014-06-30 09:14:30 +02:00
parent 99d93d46e4
commit 43e1e6d8c0
5 changed files with 120 additions and 1 deletions

View file

@ -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

View file

@ -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();

View file

@ -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<Block> blockFilter = new ArrayList<Block>();
private ArrayList<Integer> metaFilter = new ArrayList<Integer>();
@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;
}
}
}
}

View file

@ -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();
}
}

View file

@ -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) {