progress in interaction of crafting robot and furnace, for #1973
This commit is contained in:
parent
0b6ff77515
commit
0e78b4a308
9 changed files with 391 additions and 85 deletions
|
@ -8,16 +8,11 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.api.boards;
|
package buildcraft.api.boards;
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
|
|
||||||
import buildcraft.api.core.BlockIndex;
|
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
|
|
||||||
public abstract class RedstoneBoardRobot extends AIRobot implements IRedstoneBoard<EntityRobotBase> {
|
public abstract class RedstoneBoardRobot extends AIRobot implements IRedstoneBoard<EntityRobotBase> {
|
||||||
|
|
||||||
public static HashSet<BlockIndex> reservedBlocks = new HashSet<BlockIndex>();
|
|
||||||
|
|
||||||
public RedstoneBoardRobot(EntityRobotBase iRobot) {
|
public RedstoneBoardRobot(EntityRobotBase iRobot) {
|
||||||
super(iRobot);
|
super(iRobot);
|
||||||
}
|
}
|
||||||
|
@ -30,32 +25,4 @@ public abstract class RedstoneBoardRobot extends AIRobot implements IRedstoneBoa
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: we should put the three calls below into one object making sure
|
|
||||||
// that blocks are released before being assigned again, and which has a
|
|
||||||
// finalize () method to free potential block upon garbage collection.
|
|
||||||
public static boolean isFreeBlock(BlockIndex index) {
|
|
||||||
synchronized (reservedBlocks) {
|
|
||||||
return !reservedBlocks.contains(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean reserveBlock(BlockIndex index) {
|
|
||||||
synchronized (reservedBlocks) {
|
|
||||||
if (!reservedBlocks.contains(index)) {
|
|
||||||
reservedBlocks.add(index);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void releaseBlock(BlockIndex index) {
|
|
||||||
synchronized (reservedBlocks) {
|
|
||||||
if (reservedBlocks.contains(index)) {
|
|
||||||
reservedBlocks.remove(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ package buildcraft.api.core;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,7 +24,7 @@ public class BlockIndex implements Comparable<BlockIndex> {
|
||||||
public int z;
|
public int z;
|
||||||
|
|
||||||
public BlockIndex() {
|
public BlockIndex() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,6 +49,10 @@ public class BlockIndex implements Comparable<BlockIndex> {
|
||||||
z = (int) Math.floor(entity.posZ);
|
z = (int) Math.floor(entity.posZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BlockIndex(TileEntity entity) {
|
||||||
|
this(entity.xCoord, entity.yCoord, entity.xCoord);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a deterministic and complete ordering of block positions.
|
* Provides a deterministic and complete ordering of block positions.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,9 +8,20 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.api.robots;
|
package buildcraft.api.robots;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
|
||||||
|
import buildcraft.api.core.BlockIndex;
|
||||||
|
|
||||||
public class AIRobot {
|
public class AIRobot {
|
||||||
|
// TODO: we need a more generic resource handler here, for:
|
||||||
|
// - blocks taken by robots
|
||||||
|
// - stations reserved by robots
|
||||||
|
// - orders taken by robots
|
||||||
|
// and possibly others.
|
||||||
|
public static HashSet<BlockIndex> reservedBlocks = new HashSet<BlockIndex>();
|
||||||
|
|
||||||
public EntityRobotBase robot;
|
public EntityRobotBase robot;
|
||||||
|
|
||||||
private AIRobot delegateAI;
|
private AIRobot delegateAI;
|
||||||
|
@ -179,4 +190,32 @@ public class AIRobot {
|
||||||
|
|
||||||
return ai;
|
return ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: we should put the three calls below into one object making sure
|
||||||
|
// that blocks are released before being assigned again, and which has a
|
||||||
|
// finalize () method to free potential block upon garbage collection.
|
||||||
|
public static boolean isFreeBlock(BlockIndex index) {
|
||||||
|
synchronized (reservedBlocks) {
|
||||||
|
return !reservedBlocks.contains(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean reserveBlock(BlockIndex index) {
|
||||||
|
synchronized (reservedBlocks) {
|
||||||
|
if (!reservedBlocks.contains(index)) {
|
||||||
|
reservedBlocks.add(index);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void releaseBlock(BlockIndex index) {
|
||||||
|
synchronized (reservedBlocks) {
|
||||||
|
if (reservedBlocks.contains(index)) {
|
||||||
|
reservedBlocks.remove(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,21 +10,122 @@ package buildcraft.core.robots;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockFurnace;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.tileentity.TileEntityFurnace;
|
||||||
|
|
||||||
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
|
import buildcraft.api.core.BlockIndex;
|
||||||
|
import buildcraft.api.core.IInvSlot;
|
||||||
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
|
import buildcraft.core.inventory.InventoryIterator;
|
||||||
|
import buildcraft.core.inventory.StackHelper;
|
||||||
import buildcraft.core.inventory.filters.ArrayStackFilter;
|
import buildcraft.core.inventory.filters.ArrayStackFilter;
|
||||||
|
import buildcraft.core.inventory.filters.IStackFilter;
|
||||||
|
|
||||||
public class AIRobotCraftFurnace extends AIRobotCraftGeneric {
|
public class AIRobotCraftFurnace extends AIRobotCraftGeneric {
|
||||||
|
|
||||||
|
private static final int INPUT_SLOT = 0;
|
||||||
|
private static final int FUEL_SLOT = 1;
|
||||||
|
private static final int OUTPUT_SLOT = 2;
|
||||||
|
|
||||||
|
private ItemStack input;
|
||||||
|
private DockingStation stationFound;
|
||||||
|
private TileEntityFurnace furnace;
|
||||||
|
|
||||||
public AIRobotCraftFurnace(EntityRobotBase iRobot) {
|
public AIRobotCraftFurnace(EntityRobotBase iRobot) {
|
||||||
super(iRobot);
|
super(iRobot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AIRobotCraftFurnace(EntityRobotBase iRobot, ItemStack iInput) {
|
||||||
|
super(iRobot);
|
||||||
|
|
||||||
|
input = iInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
startDelegateAI(new AIRobotSearchStation(robot, new StationFurnaceFilter(), robot.getZoneToWork()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
if (furnace != null) {
|
||||||
|
if (furnace.getStackInSlot(FUEL_SLOT) == null && getItem(new FuelFilter()) == null) {
|
||||||
|
startDelegateAI(new AIRobotGotoStationAndLoad(robot, new FuelFilter(), robot.getZoneToWork()));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getItem(new ArrayStackFilter(input)) == null) {
|
||||||
|
startDelegateAI(new AIRobotGotoStationAndLoad(robot, new ArrayStackFilter(input), robot.getZoneToWork()));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (robot.getDockingStation() != stationFound) {
|
||||||
|
startDelegateAI(new AIRobotGotoStation(robot, stationFound));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Does this need a timing thing?
|
||||||
|
|
||||||
|
if (furnace.getStackInSlot(FUEL_SLOT) == null) {
|
||||||
|
IInvSlot s = getItem(new FuelFilter());
|
||||||
|
furnace.setInventorySlotContents(FUEL_SLOT, s.decreaseStackInSlot(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (furnace.getStackInSlot(INPUT_SLOT) == null) {
|
||||||
|
IInvSlot s = getItem(new ArrayStackFilter(input));
|
||||||
|
furnace.setInventorySlotContents(INPUT_SLOT, s.decreaseStackInSlot(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Create a delegate AI, waiting until the thing is done
|
||||||
|
|
||||||
|
terminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
|
if (ai instanceof AIRobotSearchStation) {
|
||||||
|
if (!ai.success()) {
|
||||||
|
crafted = false;
|
||||||
|
terminate();
|
||||||
|
} else {
|
||||||
|
stationFound = ((AIRobotSearchStation) ai).targetStation;
|
||||||
|
furnace = getUsableFurnace(new BlockIndex(stationFound.x(), stationFound.y(), stationFound.z()));
|
||||||
|
|
||||||
|
if (furnace == null) {
|
||||||
|
terminate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockIndex index = new BlockIndex(furnace);
|
||||||
|
|
||||||
|
if (!reserveBlock(index)) {
|
||||||
|
terminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
robot.reserveStation(stationFound);
|
||||||
|
}
|
||||||
|
} else if (ai instanceof AIRobotGotoStationAndLoad) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ArrayList<ArrayStackFilter> tryCraft(boolean doRemove) {
|
protected ArrayList<ArrayStackFilter> tryCraft(boolean doRemove) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// How to operate furnaces
|
// How to operate furnaces
|
||||||
// [1] identify a furnace
|
// [1] identify a furnace
|
||||||
// [2] verify that proper item is in. If empty, and slot out empty or
|
// [2] verify that proper item is in. If empty, and slot out empty or
|
||||||
|
@ -35,4 +136,66 @@ public class AIRobotCraftFurnace extends AIRobotCraftGeneric {
|
||||||
|
|
||||||
// How to operate assembly tables
|
// How to operate assembly tables
|
||||||
|
|
||||||
|
private class StationFurnaceFilter implements IStationFilter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(DockingStation station) {
|
||||||
|
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
|
||||||
|
if (getUsableFurnace(new BlockIndex(station.x(), station.y(), station.z())) != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class FuelFilter implements IStackFilter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(ItemStack stack) {
|
||||||
|
return TileEntityFurnace.getItemBurnTime(stack) > 0 && !StackHelper.isMatchingItem(stack, input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TileEntityFurnace getUsableFurnace(BlockIndex b) {
|
||||||
|
// reserve that furnace if found from the block reserve system
|
||||||
|
|
||||||
|
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
|
||||||
|
BlockIndex index = new BlockIndex (b.x + dir.offsetX, b.y
|
||||||
|
+ dir.offsetY, b.z
|
||||||
|
+ dir.offsetZ);
|
||||||
|
|
||||||
|
if (!isFreeBlock(index)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Block nearbyBlock = robot.worldObj.getBlock(index.x, index.y, index.z);
|
||||||
|
|
||||||
|
if (nearbyBlock instanceof BlockFurnace) {
|
||||||
|
TileEntityFurnace f = (TileEntityFurnace) robot.worldObj.getTileEntity(index.x, index.y, index.z);
|
||||||
|
|
||||||
|
if (f.getStackInSlot(INPUT_SLOT) != null
|
||||||
|
&& !StackHelper.isMatchingItem(input, f.getStackInSlot(INPUT_SLOT))) {
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IInvSlot getItem(IStackFilter filter) {
|
||||||
|
for (IInvSlot s : InventoryIterator.getIterable(robot)) {
|
||||||
|
if (s.getStackInSlot() != null && filter.matches(s.getStackInSlot())) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
54
common/buildcraft/core/robots/AIRobotGotoStationAndLoad.java
Executable file
54
common/buildcraft/core/robots/AIRobotGotoStationAndLoad.java
Executable file
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
* 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.robots;
|
||||||
|
|
||||||
|
import buildcraft.api.core.IZone;
|
||||||
|
import buildcraft.api.robots.AIRobot;
|
||||||
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
|
import buildcraft.core.inventory.filters.IStackFilter;
|
||||||
|
|
||||||
|
public class AIRobotGotoStationAndLoad extends AIRobot {
|
||||||
|
|
||||||
|
private boolean found = false;
|
||||||
|
private IStackFilter filter;
|
||||||
|
private IZone zone;
|
||||||
|
|
||||||
|
public AIRobotGotoStationAndLoad(EntityRobotBase iRobot) {
|
||||||
|
super(iRobot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AIRobotGotoStationAndLoad(EntityRobotBase iRobot, IStackFilter iFilter, IZone iZone) {
|
||||||
|
super(iRobot);
|
||||||
|
|
||||||
|
filter = iFilter;
|
||||||
|
zone = iZone;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
startDelegateAI(new AIRobotGotoStationToLoad(robot, filter, zone));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
|
if (ai instanceof AIRobotGotoStationToLoad) {
|
||||||
|
if (ai.success()) {
|
||||||
|
found = true;
|
||||||
|
startDelegateAI(new AIRobotLoad(robot, filter, 1));
|
||||||
|
} else {
|
||||||
|
terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean success() {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,10 +10,7 @@ package buildcraft.core.robots;
|
||||||
|
|
||||||
import buildcraft.api.core.IZone;
|
import buildcraft.api.core.IZone;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.DockingStationRegistry;
|
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.api.robots.IDockingStation;
|
|
||||||
import buildcraft.silicon.statements.ActionStationForbidRobot;
|
|
||||||
|
|
||||||
public class AIRobotSearchAndGotoStation extends AIRobot {
|
public class AIRobotSearchAndGotoStation extends AIRobot {
|
||||||
|
|
||||||
|
@ -34,54 +31,21 @@ public class AIRobotSearchAndGotoStation extends AIRobot {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
if (robot.getDockingStation() != null
|
startDelegateAI(new AIRobotSearchStation(robot, filter, zone));
|
||||||
&& filter.matches((DockingStation) robot.getDockingStation())) {
|
|
||||||
targetStation = (DockingStation) robot.getDockingStation();
|
|
||||||
terminate();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
double potentialStationDistance = Float.MAX_VALUE;
|
|
||||||
DockingStation potentialStation = null;
|
|
||||||
|
|
||||||
for (IDockingStation d : DockingStationRegistry.getStations()) {
|
|
||||||
DockingStation station = (DockingStation) d;
|
|
||||||
|
|
||||||
if (station.reserved() != null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zone != null && !zone.contains(d.x(), d.y(), d.z())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filter.matches(station)) {
|
|
||||||
if (ActionStationForbidRobot.isForbidden(station, robot)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
double dx = robot.posX - d.x();
|
|
||||||
double dy = robot.posY - d.y();
|
|
||||||
double dz = robot.posZ - d.z();
|
|
||||||
double distance = dx * dx + dy * dy + dz * dz;
|
|
||||||
|
|
||||||
if (potentialStation == null || distance < potentialStationDistance) {
|
|
||||||
potentialStation = station;
|
|
||||||
potentialStationDistance = distance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (potentialStation != null) {
|
|
||||||
targetStation = potentialStation;
|
|
||||||
startDelegateAI(new AIRobotGotoStation(robot, potentialStation));
|
|
||||||
} else {
|
|
||||||
terminate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delegateAIEnded(AIRobot ai) {
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
terminate();
|
if (ai instanceof AIRobotSearchStation) {
|
||||||
|
if (ai.success()) {
|
||||||
|
targetStation = ((AIRobotSearchStation) ai).targetStation;
|
||||||
|
startDelegateAI(new AIRobotGotoStation(robot, targetStation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean success() {
|
||||||
|
return targetStation != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
91
common/buildcraft/core/robots/AIRobotSearchStation.java
Executable file
91
common/buildcraft/core/robots/AIRobotSearchStation.java
Executable file
|
@ -0,0 +1,91 @@
|
||||||
|
/**
|
||||||
|
* 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.robots;
|
||||||
|
|
||||||
|
import buildcraft.api.core.IZone;
|
||||||
|
import buildcraft.api.robots.AIRobot;
|
||||||
|
import buildcraft.api.robots.DockingStationRegistry;
|
||||||
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
|
import buildcraft.api.robots.IDockingStation;
|
||||||
|
import buildcraft.silicon.statements.ActionStationForbidRobot;
|
||||||
|
|
||||||
|
public class AIRobotSearchStation extends AIRobot {
|
||||||
|
|
||||||
|
public DockingStation targetStation;
|
||||||
|
private IStationFilter filter;
|
||||||
|
private IZone zone;
|
||||||
|
|
||||||
|
public AIRobotSearchStation(EntityRobotBase iRobot) {
|
||||||
|
super(iRobot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AIRobotSearchStation(EntityRobotBase iRobot, IStationFilter iFilter, IZone iZone) {
|
||||||
|
super(iRobot);
|
||||||
|
|
||||||
|
filter = iFilter;
|
||||||
|
zone = iZone;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start() {
|
||||||
|
if (robot.getDockingStation() != null
|
||||||
|
&& filter.matches((DockingStation) robot.getDockingStation())) {
|
||||||
|
targetStation = (DockingStation) robot.getDockingStation();
|
||||||
|
terminate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double potentialStationDistance = Float.MAX_VALUE;
|
||||||
|
DockingStation potentialStation = null;
|
||||||
|
|
||||||
|
for (IDockingStation d : DockingStationRegistry.getStations()) {
|
||||||
|
DockingStation station = (DockingStation) d;
|
||||||
|
|
||||||
|
if (station.reserved() != null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone != null && !zone.contains(d.x(), d.y(), d.z())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter.matches(station)) {
|
||||||
|
if (ActionStationForbidRobot.isForbidden(station, robot)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double dx = robot.posX - d.x();
|
||||||
|
double dy = robot.posY - d.y();
|
||||||
|
double dz = robot.posZ - d.z();
|
||||||
|
double distance = dx * dx + dy * dy + dz * dz;
|
||||||
|
|
||||||
|
if (potentialStation == null || distance < potentialStationDistance) {
|
||||||
|
potentialStation = station;
|
||||||
|
potentialStationDistance = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (potentialStation != null) {
|
||||||
|
targetStation = potentialStation;
|
||||||
|
}
|
||||||
|
|
||||||
|
terminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
|
terminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean success () {
|
||||||
|
return targetStation != null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,9 +10,11 @@ package buildcraft.core.robots.boards;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.crafting.CraftingManager;
|
import net.minecraft.item.crafting.CraftingManager;
|
||||||
|
import net.minecraft.item.crafting.FurnaceRecipes;
|
||||||
import net.minecraft.item.crafting.IRecipe;
|
import net.minecraft.item.crafting.IRecipe;
|
||||||
import net.minecraft.item.crafting.ShapedRecipes;
|
import net.minecraft.item.crafting.ShapedRecipes;
|
||||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||||
|
@ -28,6 +30,7 @@ import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.api.robots.IDockingStation;
|
import buildcraft.api.robots.IDockingStation;
|
||||||
import buildcraft.core.inventory.StackHelper;
|
import buildcraft.core.inventory.StackHelper;
|
||||||
|
import buildcraft.core.robots.AIRobotCraftFurnace;
|
||||||
import buildcraft.core.robots.AIRobotCraftGeneric;
|
import buildcraft.core.robots.AIRobotCraftGeneric;
|
||||||
import buildcraft.core.robots.AIRobotCraftWorkbench;
|
import buildcraft.core.robots.AIRobotCraftWorkbench;
|
||||||
import buildcraft.core.robots.AIRobotGotoSleep;
|
import buildcraft.core.robots.AIRobotGotoSleep;
|
||||||
|
@ -81,10 +84,13 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ItemStack furnaceInput = lookForFurnaceRecipe(order);
|
||||||
|
|
||||||
|
if (furnaceInput != null) {
|
||||||
|
startDelegateAI(new AIRobotCraftFurnace(robot, furnaceInput));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if (hasFurnaceRecipe(order)) { startDelegateAI(new
|
|
||||||
* AIRobotCraftFurnace(robot)); }
|
|
||||||
*
|
|
||||||
* recipe = lookForAssemblyTableRecipe(order);
|
* recipe = lookForAssemblyTableRecipe(order);
|
||||||
*
|
*
|
||||||
* if (recipe != null) { startDelegateAI(new
|
* if (recipe != null) { startDelegateAI(new
|
||||||
|
@ -134,6 +140,20 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ItemStack lookForFurnaceRecipe(ItemStack order) {
|
||||||
|
for (Object o : FurnaceRecipes.smelting().getSmeltingList().entrySet()) {
|
||||||
|
Map.Entry e = (Map.Entry) o;
|
||||||
|
ItemStack input = (ItemStack) e.getKey();
|
||||||
|
ItemStack output = (ItemStack) e.getValue();
|
||||||
|
|
||||||
|
if (StackHelper.isMatchingItem(output, order)) {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isBlacklisted(ItemStack stack) {
|
private boolean isBlacklisted(ItemStack stack) {
|
||||||
for (ItemStack black : craftingBlacklist) {
|
for (ItemStack black : craftingBlacklist) {
|
||||||
if (StackHelper.isMatchingItem(stack, black)) {
|
if (StackHelper.isMatchingItem(stack, black)) {
|
||||||
|
|
|
@ -69,6 +69,9 @@ public class PathFinding {
|
||||||
maxDistanceToEnd = iMaxDistanceToEnd;
|
maxDistanceToEnd = iMaxDistanceToEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: It's probably more efficient to start a search first, and then to
|
||||||
|
// compute the path, instead of computing all possible path from the get
|
||||||
|
// go.
|
||||||
public PathFinding(World iWorld, BlockIndex iStart, IBlockFilter iPathFound, float iMaxDistance, IZone iZone) {
|
public PathFinding(World iWorld, BlockIndex iStart, IBlockFilter iPathFound, float iMaxDistance, IZone iZone) {
|
||||||
world = iWorld;
|
world = iWorld;
|
||||||
start = iStart;
|
start = iStart;
|
||||||
|
|
Loading…
Reference in a new issue