further work in requesting orders, for #1973
|
@ -37,4 +37,6 @@ public interface IDockingStation {
|
||||||
void readFromNBT(NBTTagCompound nbt);
|
void readFromNBT(NBTTagCompound nbt);
|
||||||
|
|
||||||
BlockIndex index();
|
BlockIndex index();
|
||||||
|
|
||||||
|
boolean take(EntityRobotBase robot);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
import buildcraft.core.robots.DockingStation;
|
|
||||||
import buildcraft.core.robots.ResourceId;
|
import buildcraft.core.robots.ResourceId;
|
||||||
|
|
||||||
public interface IRobotRegistry {
|
public interface IRobotRegistry {
|
||||||
|
@ -41,17 +40,17 @@ public interface IRobotRegistry {
|
||||||
|
|
||||||
void releaseResources(EntityRobotBase robot);
|
void releaseResources(EntityRobotBase robot);
|
||||||
|
|
||||||
DockingStation getStation(int x, int y, int z, ForgeDirection side);
|
IDockingStation getStation(int x, int y, int z, ForgeDirection side);
|
||||||
|
|
||||||
Collection<DockingStation> getStations();
|
Collection<IDockingStation> getStations();
|
||||||
|
|
||||||
void registerStation(DockingStation station);
|
void registerStation(IDockingStation station);
|
||||||
|
|
||||||
void removeStation(DockingStation station);
|
void removeStation(IDockingStation station);
|
||||||
|
|
||||||
void take(DockingStation station, long robotId);
|
void take(IDockingStation station, long robotId);
|
||||||
|
|
||||||
void release(DockingStation station, long robotId);
|
void release(IDockingStation station, long robotId);
|
||||||
|
|
||||||
void writeToNBT(NBTTagCompound nbt);
|
void writeToNBT(NBTTagCompound nbt);
|
||||||
|
|
||||||
|
|
|
@ -15,4 +15,5 @@ public class StackRequest {
|
||||||
public ItemStack stack;
|
public ItemStack stack;
|
||||||
public int index;
|
public int index;
|
||||||
public TileEntity requester;
|
public TileEntity requester;
|
||||||
|
public IDockingStation station;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,7 @@ gate.action.pipe.wire=%s Pipe Signal
|
||||||
gate.action.robot.goto_station=Goto Station
|
gate.action.robot.goto_station=Goto Station
|
||||||
gate.action.pipe.close=Close Pipe
|
gate.action.pipe.close=Close Pipe
|
||||||
gate.action.station.provide_items=Provide Items
|
gate.action.station.provide_items=Provide Items
|
||||||
|
gate.action.station.accept_items=Accept Items
|
||||||
gate.action.station.request_items=Request Items
|
gate.action.station.request_items=Request Items
|
||||||
gate.action.station.drop_items_in_pipe=Drop Items In Pipe
|
gate.action.station.drop_items_in_pipe=Drop Items In Pipe
|
||||||
gate.action.station.craft=Craft
|
gate.action.station.craft=Craft
|
||||||
|
|
BIN
buildcraft_resources/assets/buildcraft/textures/entities/robot_delivery.png
Executable file
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 522 B |
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 455 B |
Before Width: | Height: | Size: 522 B After Width: | Height: | Size: 520 B |
After Width: | Height: | Size: 332 B |
|
@ -88,11 +88,12 @@ import buildcraft.silicon.statements.ActionRobotFilter;
|
||||||
import buildcraft.silicon.statements.ActionRobotGotoStation;
|
import buildcraft.silicon.statements.ActionRobotGotoStation;
|
||||||
import buildcraft.silicon.statements.ActionRobotWakeUp;
|
import buildcraft.silicon.statements.ActionRobotWakeUp;
|
||||||
import buildcraft.silicon.statements.ActionRobotWorkInArea;
|
import buildcraft.silicon.statements.ActionRobotWorkInArea;
|
||||||
|
import buildcraft.silicon.statements.ActionStationAcceptItemsInv;
|
||||||
|
import buildcraft.silicon.statements.ActionStationAcceptItemsPipe;
|
||||||
import buildcraft.silicon.statements.ActionStationForbidRobot;
|
import buildcraft.silicon.statements.ActionStationForbidRobot;
|
||||||
import buildcraft.silicon.statements.ActionStationProvideItems;
|
import buildcraft.silicon.statements.ActionStationProvideItems;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItemsInv;
|
import buildcraft.silicon.statements.ActionStationRequestItems;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
|
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItemsPipe;
|
|
||||||
import buildcraft.silicon.statements.RobotsActionProvider;
|
import buildcraft.silicon.statements.RobotsActionProvider;
|
||||||
import buildcraft.silicon.statements.RobotsTriggerProvider;
|
import buildcraft.silicon.statements.RobotsTriggerProvider;
|
||||||
import buildcraft.silicon.statements.TriggerRobotSleep;
|
import buildcraft.silicon.statements.TriggerRobotSleep;
|
||||||
|
@ -127,10 +128,11 @@ public class BuildCraftSilicon extends BuildCraftMod {
|
||||||
public static IAction actionRobotWorkInArea = new ActionRobotWorkInArea();
|
public static IAction actionRobotWorkInArea = new ActionRobotWorkInArea();
|
||||||
public static IAction actionRobotFilter = new ActionRobotFilter();
|
public static IAction actionRobotFilter = new ActionRobotFilter();
|
||||||
public static IAction actionRobotCraft = new ActionRobotCraft();
|
public static IAction actionRobotCraft = new ActionRobotCraft();
|
||||||
public static IAction actionStationRequestItems = new ActionStationRequestItemsInv();
|
public static IAction actionStationRequestItems = new ActionStationRequestItems();
|
||||||
|
public static IAction actionStationAcceptItems = new ActionStationAcceptItemsInv();
|
||||||
public static IAction actionStationProvideItems = new ActionStationProvideItems();
|
public static IAction actionStationProvideItems = new ActionStationProvideItems();
|
||||||
public static IAction actionStationForbidRobot = new ActionStationForbidRobot();
|
public static IAction actionStationForbidRobot = new ActionStationForbidRobot();
|
||||||
public static IAction actionStationDropInPipe = new ActionStationRequestItemsPipe();
|
public static IAction actionStationDropInPipe = new ActionStationAcceptItemsPipe();
|
||||||
public static IAction actionStationMachineRequestItems = new ActionStationRequestItemsMachine();
|
public static IAction actionStationMachineRequestItems = new ActionStationRequestItemsMachine();
|
||||||
|
|
||||||
public static TechnoSimpleItem technoRedstoneBoard = new TechnoSimpleItem();
|
public static TechnoSimpleItem technoRedstoneBoard = new TechnoSimpleItem();
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class AIRobotDeliverRequested extends AIRobot {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
startDelegateAI(new AIRobotSearchAndGotoStation(robot, new StationProviderFilter(), robot.getZoneToWork()));
|
startDelegateAI(new AIRobotGotoStation(robot, requested.station));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -58,19 +58,28 @@ public class AIRobotDeliverRequested extends AIRobot {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack newStack = ((IRequestProvider)
|
if (requested.requester != null) {
|
||||||
|
ItemStack newStack = ((IRequestProvider)
|
||||||
requested.requester).provideItemsForRequest(requested.index,
|
requested.requester).provideItemsForRequest(requested.index,
|
||||||
slot.getStackInSlot().copy());
|
slot.getStackInSlot().copy());
|
||||||
|
|
||||||
if (newStack == null || newStack.stackSize != slot.getStackInSlot().stackSize) {
|
if (newStack == null || newStack.stackSize != slot.getStackInSlot().stackSize) {
|
||||||
delivered = true;
|
delivered = true;
|
||||||
slot.setStackInSlot(newStack);
|
slot.setStackInSlot(newStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
terminate();
|
||||||
|
} else {
|
||||||
|
startDelegateAI(new AIRobotUnload(robot));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (ai instanceof AIRobotUnload) {
|
||||||
|
delivered = ai.success();
|
||||||
terminate();
|
terminate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean success() {
|
public boolean success() {
|
||||||
return delivered;
|
return delivered;
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class AIRobotGotoStation extends AIRobot {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() {
|
public void start() {
|
||||||
DockingStation station =
|
DockingStation station = (DockingStation)
|
||||||
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
|
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
|
||||||
stationSide);
|
stationSide);
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ public class AIRobotGotoStation extends AIRobot {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delegateAIEnded(AIRobot ai) {
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
DockingStation station =
|
DockingStation station = (DockingStation)
|
||||||
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
|
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
|
||||||
stationSide);
|
stationSide);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import buildcraft.api.core.IZone;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.core.inventory.InventoryIterator;
|
import buildcraft.core.inventory.InventoryIterator;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItems;
|
import buildcraft.silicon.statements.ActionStationInputItems;
|
||||||
import buildcraft.transport.Pipe;
|
import buildcraft.transport.Pipe;
|
||||||
import buildcraft.transport.gates.ActionIterator;
|
import buildcraft.transport.gates.ActionIterator;
|
||||||
import buildcraft.transport.gates.ActionSlot;
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
@ -66,8 +66,8 @@ public class AIRobotGotoStationToUnload extends AIRobot {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ActionSlot s : new ActionIterator(pipe)) {
|
for (ActionSlot s : new ActionIterator(pipe)) {
|
||||||
if (s.action instanceof ActionStationRequestItems) {
|
if (s.action instanceof ActionStationInputItems) {
|
||||||
if (((ActionStationRequestItems) s.action).insert(station, (EntityRobot) robot, s, robotSlot, false)) {
|
if (((ActionStationInputItems) s.action).insert(station, (EntityRobot) robot, s, robotSlot, false)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import buildcraft.api.core.IInvSlot;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.core.inventory.InventoryIterator;
|
import buildcraft.core.inventory.InventoryIterator;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItems;
|
import buildcraft.silicon.statements.ActionStationInputItems;
|
||||||
import buildcraft.transport.Pipe;
|
import buildcraft.transport.Pipe;
|
||||||
import buildcraft.transport.gates.ActionIterator;
|
import buildcraft.transport.gates.ActionIterator;
|
||||||
import buildcraft.transport.gates.ActionSlot;
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
@ -22,6 +22,7 @@ import buildcraft.transport.gates.ActionSlot;
|
||||||
public class AIRobotUnload extends AIRobot {
|
public class AIRobotUnload extends AIRobot {
|
||||||
|
|
||||||
private int waitedCycles = 0;
|
private int waitedCycles = 0;
|
||||||
|
private boolean delivered = false;
|
||||||
|
|
||||||
public AIRobotUnload(EntityRobotBase iRobot) {
|
public AIRobotUnload(EntityRobotBase iRobot) {
|
||||||
super(iRobot);
|
super(iRobot);
|
||||||
|
@ -55,9 +56,12 @@ public class AIRobotUnload extends AIRobot {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ActionSlot s : new ActionIterator(pipe)) {
|
for (ActionSlot s : new ActionIterator(pipe)) {
|
||||||
if (s.action instanceof ActionStationRequestItems) {
|
if (s.action instanceof ActionStationInputItems) {
|
||||||
if (((ActionStationRequestItems) s.action)
|
if (((ActionStationInputItems) s.action)
|
||||||
.insert(station, (EntityRobot) robot, s, robotSlot, true)) {
|
.insert(station, (EntityRobot) robot, s, robotSlot, true)) {
|
||||||
|
|
||||||
|
delivered = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,4 +75,9 @@ public class AIRobotUnload extends AIRobot {
|
||||||
public double getEnergyCost() {
|
public double getEnergyCost() {
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean success() {
|
||||||
|
return delivered;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,6 +115,7 @@ public class DockingStation implements IDockingStation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean take(EntityRobotBase robot) {
|
public boolean take(EntityRobotBase robot) {
|
||||||
if (robotTaking == null) {
|
if (robotTaking == null) {
|
||||||
linkIsMain = false;
|
linkIsMain = false;
|
||||||
|
|
|
@ -269,7 +269,8 @@ public class EntityRobot extends EntityRobotBase implements
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentDockingStationIndex != null) {
|
if (currentDockingStationIndex != null) {
|
||||||
currentDockingStation = RobotRegistry.getRegistry(worldObj).getStation(
|
currentDockingStation = (DockingStation)
|
||||||
|
RobotRegistry.getRegistry(worldObj).getStation(
|
||||||
currentDockingStationIndex.x,
|
currentDockingStationIndex.x,
|
||||||
currentDockingStationIndex.y,
|
currentDockingStationIndex.y,
|
||||||
currentDockingStationIndex.z,
|
currentDockingStationIndex.z,
|
||||||
|
|
|
@ -23,6 +23,7 @@ import net.minecraftforge.common.util.Constants;
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
|
import buildcraft.api.robots.IDockingStation;
|
||||||
import buildcraft.api.robots.IRobotRegistry;
|
import buildcraft.api.robots.IRobotRegistry;
|
||||||
|
|
||||||
public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
|
@ -37,7 +38,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
private HashMap<ResourceId, Long> resourcesTaken = new HashMap<ResourceId, Long>();
|
private HashMap<ResourceId, Long> resourcesTaken = new HashMap<ResourceId, Long>();
|
||||||
private HashMap<Long, HashSet<ResourceId>> resourcesTakenByRobot = new HashMap<Long, HashSet<ResourceId>>();
|
private HashMap<Long, HashSet<ResourceId>> resourcesTakenByRobot = new HashMap<Long, HashSet<ResourceId>>();
|
||||||
|
|
||||||
private HashMap<StationIndex, DockingStation> stations = new HashMap<StationIndex, DockingStation>();
|
private HashMap<StationIndex, IDockingStation> stations = new HashMap<StationIndex, IDockingStation>();
|
||||||
private HashMap<Long, HashSet<StationIndex>> stationsTakenByRobot = new HashMap<Long, HashSet<StationIndex>>();
|
private HashMap<Long, HashSet<StationIndex>> stationsTakenByRobot = new HashMap<Long, HashSet<StationIndex>>();
|
||||||
|
|
||||||
public RobotRegistry(String id) {
|
public RobotRegistry(String id) {
|
||||||
|
@ -190,7 +191,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
.clone();
|
.clone();
|
||||||
|
|
||||||
for (StationIndex s : stationSet) {
|
for (StationIndex s : stationSet) {
|
||||||
DockingStation d = stations.get(s);
|
DockingStation d = (DockingStation) stations.get(s);
|
||||||
|
|
||||||
if (!d.canRelease()) {
|
if (!d.canRelease()) {
|
||||||
if (forceAll) {
|
if (forceAll) {
|
||||||
|
@ -208,7 +209,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DockingStation getStation(int x, int y, int z, ForgeDirection side) {
|
public IDockingStation getStation(int x, int y, int z, ForgeDirection side) {
|
||||||
StationIndex index = new StationIndex(side, x, y, z);
|
StationIndex index = new StationIndex(side, x, y, z);
|
||||||
|
|
||||||
if (stations.containsKey(index)) {
|
if (stations.containsKey(index)) {
|
||||||
|
@ -219,12 +220,12 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<DockingStation> getStations() {
|
public Collection<IDockingStation> getStations() {
|
||||||
return stations.values();
|
return stations.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerStation(DockingStation station) {
|
public void registerStation(IDockingStation station) {
|
||||||
markDirty();
|
markDirty();
|
||||||
|
|
||||||
StationIndex index = new StationIndex(station);
|
StationIndex index = new StationIndex(station);
|
||||||
|
@ -237,7 +238,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeStation(DockingStation station) {
|
public void removeStation(IDockingStation station) {
|
||||||
markDirty();
|
markDirty();
|
||||||
|
|
||||||
StationIndex index = new StationIndex(station);
|
StationIndex index = new StationIndex(station);
|
||||||
|
@ -252,7 +253,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void take(DockingStation station, long robotId) {
|
public void take(IDockingStation station, long robotId) {
|
||||||
if (!stationsTakenByRobot.containsKey(robotId)) {
|
if (!stationsTakenByRobot.containsKey(robotId)) {
|
||||||
stationsTakenByRobot.put(robotId, new HashSet<StationIndex>());
|
stationsTakenByRobot.put(robotId, new HashSet<StationIndex>());
|
||||||
}
|
}
|
||||||
|
@ -261,7 +262,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void release(DockingStation station, long robotId) {
|
public void release(IDockingStation station, long robotId) {
|
||||||
if (stationsTakenByRobot.containsKey(robotId)) {
|
if (stationsTakenByRobot.containsKey(robotId)) {
|
||||||
stationsTakenByRobot.get(robotId).remove(new StationIndex(station));
|
stationsTakenByRobot.get(robotId).remove(new StationIndex(station));
|
||||||
}
|
}
|
||||||
|
@ -280,8 +281,8 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
|
|
||||||
newRegistry.world = world;
|
newRegistry.world = world;
|
||||||
|
|
||||||
for (DockingStation d : newRegistry.stations.values()) {
|
for (IDockingStation d : newRegistry.stations.values()) {
|
||||||
d.world = world;
|
((DockingStation) d).world = world;
|
||||||
}
|
}
|
||||||
|
|
||||||
registries[world.provider.dimensionId] = newRegistry;
|
registries[world.provider.dimensionId] = newRegistry;
|
||||||
|
@ -310,7 +311,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
|
||||||
|
|
||||||
NBTTagList stationList = new NBTTagList();
|
NBTTagList stationList = new NBTTagList();
|
||||||
|
|
||||||
for (Map.Entry<StationIndex, DockingStation> e : stations.entrySet()) {
|
for (Map.Entry<StationIndex, IDockingStation> e : stations.entrySet()) {
|
||||||
NBTTagCompound cpt = new NBTTagCompound();
|
NBTTagCompound cpt = new NBTTagCompound();
|
||||||
e.getValue().writeToNBT(cpt);
|
e.getValue().writeToNBT(cpt);
|
||||||
stationList.appendTag(cpt);
|
stationList.appendTag(cpt);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
import buildcraft.api.core.BlockIndex;
|
import buildcraft.api.core.BlockIndex;
|
||||||
|
import buildcraft.api.robots.IDockingStation;
|
||||||
|
|
||||||
public class StationIndex {
|
public class StationIndex {
|
||||||
|
|
||||||
|
@ -27,8 +28,8 @@ public class StationIndex {
|
||||||
index = new BlockIndex(x, y, z);
|
index = new BlockIndex(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StationIndex(DockingStation station) {
|
public StationIndex(IDockingStation station) {
|
||||||
side = station.side;
|
side = station.side();
|
||||||
index = station.index();
|
index = station.index();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import buildcraft.api.boards.RedstoneBoardRobot;
|
||||||
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
||||||
import buildcraft.api.gates.ActionParameterItemStack;
|
import buildcraft.api.gates.ActionParameterItemStack;
|
||||||
import buildcraft.api.gates.IActionParameter;
|
import buildcraft.api.gates.IActionParameter;
|
||||||
|
import buildcraft.api.gates.IStatementParameter;
|
||||||
import buildcraft.api.recipes.CraftingResult;
|
import buildcraft.api.recipes.CraftingResult;
|
||||||
import buildcraft.api.recipes.IFlexibleRecipe;
|
import buildcraft.api.recipes.IFlexibleRecipe;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
|
@ -49,6 +50,7 @@ import buildcraft.core.robots.AIRobotUnload;
|
||||||
import buildcraft.core.robots.DockingStation;
|
import buildcraft.core.robots.DockingStation;
|
||||||
import buildcraft.core.robots.IStationFilter;
|
import buildcraft.core.robots.IStationFilter;
|
||||||
import buildcraft.silicon.statements.ActionRobotCraft;
|
import buildcraft.silicon.statements.ActionRobotCraft;
|
||||||
|
import buildcraft.silicon.statements.ActionStationRequestItems;
|
||||||
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
|
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
|
||||||
import buildcraft.transport.Pipe;
|
import buildcraft.transport.Pipe;
|
||||||
import buildcraft.transport.gates.ActionIterator;
|
import buildcraft.transport.gates.ActionIterator;
|
||||||
|
@ -144,7 +146,15 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
|
||||||
craftingBlacklist.clear();
|
craftingBlacklist.clear();
|
||||||
startDelegateAI(new AIRobotGotoSleep(robot));
|
startDelegateAI(new AIRobotGotoSleep(robot));
|
||||||
} else {
|
} else {
|
||||||
currentRequest = getOrderFromRequestingStation(((AIRobotSearchStation) ai).targetStation, true);
|
currentRequest = getOrderFromRequestingAction(((AIRobotSearchStation) ai).targetStation);
|
||||||
|
|
||||||
|
if (currentRequest == null) {
|
||||||
|
currentRequest = getOrderFromRequestingStation(((AIRobotSearchStation) ai).targetStation, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!currentRequest.station.take(robot)) {
|
||||||
|
currentRequest = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (ai instanceof AIRobotDeliverRequested) {
|
} else if (ai instanceof AIRobotDeliverRequested) {
|
||||||
currentRequest = null;
|
currentRequest = null;
|
||||||
|
@ -255,6 +265,8 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
|
||||||
StackRequest request = provider.getAvailableRequest(i);
|
StackRequest request = provider.getAvailableRequest(i);
|
||||||
|
|
||||||
if (request != null && !isBlacklisted(request.stack)) {
|
if (request != null && !isBlacklisted(request.stack)) {
|
||||||
|
request.station = station;
|
||||||
|
|
||||||
if (take) {
|
if (take) {
|
||||||
if (provider.takeRequest(i, robot)) {
|
if (provider.takeRequest(i, robot)) {
|
||||||
return request;
|
return request;
|
||||||
|
@ -270,11 +282,36 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private StackRequest getOrderFromRequestingAction(DockingStation station) {
|
||||||
|
boolean actionFound = false;
|
||||||
|
|
||||||
|
Pipe pipe = station.getPipe().pipe;
|
||||||
|
|
||||||
|
for (ActionSlot s : new ActionIterator(pipe)) {
|
||||||
|
if (s.action instanceof ActionStationRequestItems) {
|
||||||
|
for (IStatementParameter p : s.parameters) {
|
||||||
|
ActionParameterItemStack param = (ActionParameterItemStack) p;
|
||||||
|
|
||||||
|
if (param != null && !isBlacklisted(param.getItemStackToDraw())) {
|
||||||
|
StackRequest req = new StackRequest();
|
||||||
|
req.station = station;
|
||||||
|
req.stack = param.getItemStackToDraw();
|
||||||
|
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private class StationProviderFilter implements IStationFilter {
|
private class StationProviderFilter implements IStationFilter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(DockingStation station) {
|
public boolean matches(DockingStation station) {
|
||||||
return getOrderFromRequestingStation(station, false) != null;
|
return getOrderFromRequestingAction(station) != null
|
||||||
|
|| getOrderFromRequestingStation(station, false) != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,8 @@ public class ActionRobotGotoStation extends BCActionActive {
|
||||||
|
|
||||||
if (index != null) {
|
if (index != null) {
|
||||||
ForgeDirection side = ItemMapLocation.getSide(item);
|
ForgeDirection side = ItemMapLocation.getSide(item);
|
||||||
DockingStation paramStation = registry.getStation(index.x,
|
DockingStation paramStation = (DockingStation)
|
||||||
|
registry.getStation(index.x,
|
||||||
index.y, index.z, side);
|
index.y, index.z, side);
|
||||||
|
|
||||||
if (paramStation != null) {
|
if (paramStation != null) {
|
||||||
|
|
|
@ -25,20 +25,20 @@ import buildcraft.core.robots.EntityRobot;
|
||||||
import buildcraft.core.utils.StringUtils;
|
import buildcraft.core.utils.StringUtils;
|
||||||
import buildcraft.transport.gates.ActionSlot;
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
|
||||||
public class ActionStationRequestItemsInv extends ActionStationRequestItems {
|
public class ActionStationAcceptItemsInv extends ActionStationInputItems {
|
||||||
|
|
||||||
public ActionStationRequestItemsInv() {
|
public ActionStationAcceptItemsInv() {
|
||||||
super("buildcraft:station.request_items");
|
super("buildcraft:station.accept_items");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return StringUtils.localize("gate.action.station.request_items");
|
return StringUtils.localize("gate.action.station.accept_items");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerIcons(IIconRegister iconRegister) {
|
public void registerIcons(IIconRegister iconRegister) {
|
||||||
icon = iconRegister.registerIcon("buildcraft:triggers/action_station_request_items");
|
icon = iconRegister.registerIcon("buildcraft:triggers/action_station_accept_items");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
|
@ -20,9 +20,9 @@ import buildcraft.transport.PipeTransportItems;
|
||||||
import buildcraft.transport.TravelingItem;
|
import buildcraft.transport.TravelingItem;
|
||||||
import buildcraft.transport.gates.ActionSlot;
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
|
||||||
public class ActionStationRequestItemsPipe extends ActionStationRequestItems {
|
public class ActionStationAcceptItemsPipe extends ActionStationInputItems {
|
||||||
|
|
||||||
public ActionStationRequestItemsPipe() {
|
public ActionStationAcceptItemsPipe() {
|
||||||
super("buildcraft:station.drop_in_pipe");
|
super("buildcraft:station.drop_in_pipe");
|
||||||
}
|
}
|
||||||
|
|
30
common/buildcraft/silicon/statements/ActionStationInputItems.java
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* 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 buildcraft.api.core.IInvSlot;
|
||||||
|
import buildcraft.core.inventory.filters.StatementParameterStackFilter;
|
||||||
|
import buildcraft.core.robots.DockingStation;
|
||||||
|
import buildcraft.core.robots.EntityRobot;
|
||||||
|
import buildcraft.core.triggers.BCActionPassive;
|
||||||
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
|
||||||
|
public abstract class ActionStationInputItems extends BCActionPassive {
|
||||||
|
|
||||||
|
public ActionStationInputItems(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean insert(DockingStation station, EntityRobot robot, ActionSlot actionSlot, IInvSlot invSlot,
|
||||||
|
boolean doInsert) {
|
||||||
|
StatementParameterStackFilter param = new StatementParameterStackFilter(actionSlot.parameters);
|
||||||
|
|
||||||
|
return !param.hasFilter() || param.matches(invSlot.getStackInSlot());
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,21 +9,26 @@
|
||||||
package buildcraft.silicon.statements;
|
package buildcraft.silicon.statements;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||||
|
import net.minecraft.inventory.IInventory;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
|
||||||
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
import buildcraft.api.core.IInvSlot;
|
import buildcraft.api.core.IInvSlot;
|
||||||
import buildcraft.api.gates.ActionParameterItemStack;
|
import buildcraft.api.gates.ActionParameterItemStack;
|
||||||
import buildcraft.api.gates.IActionParameter;
|
import buildcraft.api.gates.IActionParameter;
|
||||||
import buildcraft.core.inventory.filters.StatementParameterStackFilter;
|
import buildcraft.core.inventory.ITransactor;
|
||||||
|
import buildcraft.core.inventory.Transactor;
|
||||||
import buildcraft.core.robots.DockingStation;
|
import buildcraft.core.robots.DockingStation;
|
||||||
import buildcraft.core.robots.EntityRobot;
|
import buildcraft.core.robots.EntityRobot;
|
||||||
import buildcraft.core.triggers.BCActionPassive;
|
|
||||||
import buildcraft.core.utils.StringUtils;
|
import buildcraft.core.utils.StringUtils;
|
||||||
import buildcraft.transport.gates.ActionSlot;
|
import buildcraft.transport.gates.ActionSlot;
|
||||||
|
|
||||||
public abstract class ActionStationRequestItems extends BCActionPassive {
|
public class ActionStationRequestItems extends ActionStationInputItems {
|
||||||
|
|
||||||
public ActionStationRequestItems(String name) {
|
public ActionStationRequestItems() {
|
||||||
super(name);
|
super("buildcraft:station.request_items");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -46,10 +51,32 @@ public abstract class ActionStationRequestItems extends BCActionPassive {
|
||||||
return new ActionParameterItemStack();
|
return new ActionParameterItemStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean insert(DockingStation station, EntityRobot robot, ActionSlot actionSlot, IInvSlot invSlot,
|
public boolean insert(DockingStation station, EntityRobot robot, ActionSlot actionSlot, IInvSlot invSlot,
|
||||||
boolean doInsert) {
|
boolean doInsert) {
|
||||||
StatementParameterStackFilter param = new StatementParameterStackFilter(actionSlot.parameters);
|
if (!super.insert(station, robot, actionSlot, invSlot, doInsert)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return !param.hasFilter() || param.matches(invSlot.getStackInSlot());
|
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
|
||||||
|
TileEntity nearbyTile = robot.worldObj.getTileEntity(station.x() + dir.offsetX, station.y()
|
||||||
|
+ dir.offsetY, station.z()
|
||||||
|
+ dir.offsetZ);
|
||||||
|
|
||||||
|
if (nearbyTile != null && nearbyTile instanceof IInventory) {
|
||||||
|
ITransactor trans = Transactor.getTransactorFor(nearbyTile);
|
||||||
|
|
||||||
|
ItemStack added = trans.add(invSlot.getStackInSlot(), dir.getOpposite(), doInsert);
|
||||||
|
|
||||||
|
if (doInsert) {
|
||||||
|
invSlot.decreaseStackInSlot(added.stackSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ public class RobotsActionProvider implements IActionProvider {
|
||||||
if (((TileGenericPipe) pipe).getTile(dir) instanceof IInventory) {
|
if (((TileGenericPipe) pipe).getTile(dir) instanceof IInventory) {
|
||||||
result.add(BuildCraftSilicon.actionStationProvideItems);
|
result.add(BuildCraftSilicon.actionStationProvideItems);
|
||||||
result.add(BuildCraftSilicon.actionStationRequestItems);
|
result.add(BuildCraftSilicon.actionStationRequestItems);
|
||||||
|
result.add(BuildCraftSilicon.actionStationAcceptItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((TileGenericPipe) pipe).getTile(dir) instanceof IRequestProvider) {
|
if (((TileGenericPipe) pipe).getTile(dir) instanceof IRequestProvider) {
|
||||||
|
|
|
@ -109,7 +109,8 @@ public class ItemRobotStation extends ItemBuildCraft {
|
||||||
public void validate(IPipeTile pipe, ForgeDirection direction) {
|
public void validate(IPipeTile pipe, ForgeDirection direction) {
|
||||||
TileGenericPipe gPipe = (TileGenericPipe) pipe;
|
TileGenericPipe gPipe = (TileGenericPipe) pipe;
|
||||||
if (!isValid && !gPipe.getWorld().isRemote) {
|
if (!isValid && !gPipe.getWorld().isRemote) {
|
||||||
station = RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
|
station = (DockingStation)
|
||||||
|
RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
|
||||||
gPipe.xCoord,
|
gPipe.xCoord,
|
||||||
gPipe.yCoord,
|
gPipe.yCoord,
|
||||||
gPipe.zCoord,
|
gPipe.zCoord,
|
||||||
|
|