implemented filter for block breaking robots, for #1922
This commit is contained in:
parent
99d93d46e4
commit
43e1e6d8c0
5 changed files with 120 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
48
common/buildcraft/silicon/statements/ActionRobotFilter.java
Executable file
48
common/buildcraft/silicon/statements/ActionRobotFilter.java
Executable 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();
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue