further work in requesting orders, for #1973

This commit is contained in:
SpaceToad 2014-08-14 23:24:53 +02:00
parent 221a4416e5
commit 3b9b1af204
26 changed files with 181 additions and 57 deletions

View file

@ -37,4 +37,6 @@ public interface IDockingStation {
void readFromNBT(NBTTagCompound nbt);
BlockIndex index();
boolean take(EntityRobotBase robot);
}

View file

@ -14,7 +14,6 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.core.robots.DockingStation;
import buildcraft.core.robots.ResourceId;
public interface IRobotRegistry {
@ -41,17 +40,17 @@ public interface IRobotRegistry {
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);

View file

@ -15,4 +15,5 @@ public class StackRequest {
public ItemStack stack;
public int index;
public TileEntity requester;
public IDockingStation station;
}

View file

@ -63,6 +63,7 @@ gate.action.pipe.wire=%s Pipe Signal
gate.action.robot.goto_station=Goto Station
gate.action.pipe.close=Close Pipe
gate.action.station.provide_items=Provide Items
gate.action.station.accept_items=Accept Items
gate.action.station.request_items=Request Items
gate.action.station.drop_items_in_pipe=Drop Items In Pipe
gate.action.station.craft=Craft

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 B

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

View file

@ -88,11 +88,12 @@ import buildcraft.silicon.statements.ActionRobotFilter;
import buildcraft.silicon.statements.ActionRobotGotoStation;
import buildcraft.silicon.statements.ActionRobotWakeUp;
import buildcraft.silicon.statements.ActionRobotWorkInArea;
import buildcraft.silicon.statements.ActionStationAcceptItemsInv;
import buildcraft.silicon.statements.ActionStationAcceptItemsPipe;
import buildcraft.silicon.statements.ActionStationForbidRobot;
import buildcraft.silicon.statements.ActionStationProvideItems;
import buildcraft.silicon.statements.ActionStationRequestItemsInv;
import buildcraft.silicon.statements.ActionStationRequestItems;
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
import buildcraft.silicon.statements.ActionStationRequestItemsPipe;
import buildcraft.silicon.statements.RobotsActionProvider;
import buildcraft.silicon.statements.RobotsTriggerProvider;
import buildcraft.silicon.statements.TriggerRobotSleep;
@ -127,10 +128,11 @@ public class BuildCraftSilicon extends BuildCraftMod {
public static IAction actionRobotWorkInArea = new ActionRobotWorkInArea();
public static IAction actionRobotFilter = new ActionRobotFilter();
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 actionStationForbidRobot = new ActionStationForbidRobot();
public static IAction actionStationDropInPipe = new ActionStationRequestItemsPipe();
public static IAction actionStationDropInPipe = new ActionStationAcceptItemsPipe();
public static IAction actionStationMachineRequestItems = new ActionStationRequestItemsMachine();
public static TechnoSimpleItem technoRedstoneBoard = new TechnoSimpleItem();

View file

@ -40,7 +40,7 @@ public class AIRobotDeliverRequested extends AIRobot {
@Override
public void start() {
startDelegateAI(new AIRobotSearchAndGotoStation(robot, new StationProviderFilter(), robot.getZoneToWork()));
startDelegateAI(new AIRobotGotoStation(robot, requested.station));
}
@Override
@ -58,19 +58,28 @@ public class AIRobotDeliverRequested extends AIRobot {
return;
}
ItemStack newStack = ((IRequestProvider)
if (requested.requester != null) {
ItemStack newStack = ((IRequestProvider)
requested.requester).provideItemsForRequest(requested.index,
slot.getStackInSlot().copy());
if (newStack == null || newStack.stackSize != slot.getStackInSlot().stackSize) {
delivered = true;
slot.setStackInSlot(newStack);
}
if (newStack == null || newStack.stackSize != slot.getStackInSlot().stackSize) {
delivered = true;
slot.setStackInSlot(newStack);
}
terminate();
} else {
startDelegateAI(new AIRobotUnload(robot));
return;
}
} else if (ai instanceof AIRobotUnload) {
delivered = ai.success();
terminate();
}
}
@Override
public boolean success() {
return delivered;

View file

@ -36,7 +36,7 @@ public class AIRobotGotoStation extends AIRobot {
@Override
public void start() {
DockingStation station =
DockingStation station = (DockingStation)
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
stationSide);
@ -56,7 +56,7 @@ public class AIRobotGotoStation extends AIRobot {
@Override
public void delegateAIEnded(AIRobot ai) {
DockingStation station =
DockingStation station = (DockingStation)
robot.getRegistry().getStation(stationIndex.x, stationIndex.y, stationIndex.z,
stationSide);

View file

@ -15,7 +15,7 @@ import buildcraft.api.core.IZone;
import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.core.inventory.InventoryIterator;
import buildcraft.silicon.statements.ActionStationRequestItems;
import buildcraft.silicon.statements.ActionStationInputItems;
import buildcraft.transport.Pipe;
import buildcraft.transport.gates.ActionIterator;
import buildcraft.transport.gates.ActionSlot;
@ -66,8 +66,8 @@ public class AIRobotGotoStationToUnload extends AIRobot {
}
for (ActionSlot s : new ActionIterator(pipe)) {
if (s.action instanceof ActionStationRequestItems) {
if (((ActionStationRequestItems) s.action).insert(station, (EntityRobot) robot, s, robotSlot, false)) {
if (s.action instanceof ActionStationInputItems) {
if (((ActionStationInputItems) s.action).insert(station, (EntityRobot) robot, s, robotSlot, false)) {
return true;
}
}

View file

@ -14,7 +14,7 @@ import buildcraft.api.core.IInvSlot;
import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.core.inventory.InventoryIterator;
import buildcraft.silicon.statements.ActionStationRequestItems;
import buildcraft.silicon.statements.ActionStationInputItems;
import buildcraft.transport.Pipe;
import buildcraft.transport.gates.ActionIterator;
import buildcraft.transport.gates.ActionSlot;
@ -22,6 +22,7 @@ import buildcraft.transport.gates.ActionSlot;
public class AIRobotUnload extends AIRobot {
private int waitedCycles = 0;
private boolean delivered = false;
public AIRobotUnload(EntityRobotBase iRobot) {
super(iRobot);
@ -55,9 +56,12 @@ public class AIRobotUnload extends AIRobot {
}
for (ActionSlot s : new ActionIterator(pipe)) {
if (s.action instanceof ActionStationRequestItems) {
if (((ActionStationRequestItems) s.action)
if (s.action instanceof ActionStationInputItems) {
if (((ActionStationInputItems) s.action)
.insert(station, (EntityRobot) robot, s, robotSlot, true)) {
delivered = true;
return true;
}
}
@ -71,4 +75,9 @@ public class AIRobotUnload extends AIRobot {
public double getEnergyCost() {
return 2;
}
@Override
public boolean success() {
return delivered;
}
}

View file

@ -115,6 +115,7 @@ public class DockingStation implements IDockingStation {
}
}
@Override
public boolean take(EntityRobotBase robot) {
if (robotTaking == null) {
linkIsMain = false;

View file

@ -269,7 +269,8 @@ public class EntityRobot extends EntityRobotBase implements
}
if (currentDockingStationIndex != null) {
currentDockingStation = RobotRegistry.getRegistry(worldObj).getStation(
currentDockingStation = (DockingStation)
RobotRegistry.getRegistry(worldObj).getStation(
currentDockingStationIndex.x,
currentDockingStationIndex.y,
currentDockingStationIndex.z,

View file

@ -23,6 +23,7 @@ import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.robots.IDockingStation;
import buildcraft.api.robots.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<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>>();
public RobotRegistry(String id) {
@ -190,7 +191,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
.clone();
for (StationIndex s : stationSet) {
DockingStation d = stations.get(s);
DockingStation d = (DockingStation) stations.get(s);
if (!d.canRelease()) {
if (forceAll) {
@ -208,7 +209,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
}
@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);
if (stations.containsKey(index)) {
@ -219,12 +220,12 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
}
@Override
public Collection<DockingStation> getStations() {
public Collection<IDockingStation> getStations() {
return stations.values();
}
@Override
public void registerStation(DockingStation station) {
public void registerStation(IDockingStation station) {
markDirty();
StationIndex index = new StationIndex(station);
@ -237,7 +238,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
}
@Override
public void removeStation(DockingStation station) {
public void removeStation(IDockingStation station) {
markDirty();
StationIndex index = new StationIndex(station);
@ -252,7 +253,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
}
@Override
public void take(DockingStation station, long robotId) {
public void take(IDockingStation station, long robotId) {
if (!stationsTakenByRobot.containsKey(robotId)) {
stationsTakenByRobot.put(robotId, new HashSet<StationIndex>());
}
@ -261,7 +262,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
}
@Override
public void release(DockingStation station, long robotId) {
public void release(IDockingStation station, long robotId) {
if (stationsTakenByRobot.containsKey(robotId)) {
stationsTakenByRobot.get(robotId).remove(new StationIndex(station));
}
@ -280,8 +281,8 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
newRegistry.world = world;
for (DockingStation d : newRegistry.stations.values()) {
d.world = world;
for (IDockingStation d : newRegistry.stations.values()) {
((DockingStation) d).world = world;
}
registries[world.provider.dimensionId] = newRegistry;
@ -310,7 +311,7 @@ public class RobotRegistry extends WorldSavedData implements IRobotRegistry {
NBTTagList stationList = new NBTTagList();
for (Map.Entry<StationIndex, DockingStation> e : stations.entrySet()) {
for (Map.Entry<StationIndex, IDockingStation> e : stations.entrySet()) {
NBTTagCompound cpt = new NBTTagCompound();
e.getValue().writeToNBT(cpt);
stationList.appendTag(cpt);

View file

@ -13,6 +13,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.BlockIndex;
import buildcraft.api.robots.IDockingStation;
public class StationIndex {
@ -27,8 +28,8 @@ public class StationIndex {
index = new BlockIndex(x, y, z);
}
public StationIndex(DockingStation station) {
side = station.side;
public StationIndex(IDockingStation station) {
side = station.side();
index = station.index();
}

View file

@ -28,6 +28,7 @@ import buildcraft.api.boards.RedstoneBoardRobot;
import buildcraft.api.boards.RedstoneBoardRobotNBT;
import buildcraft.api.gates.ActionParameterItemStack;
import buildcraft.api.gates.IActionParameter;
import buildcraft.api.gates.IStatementParameter;
import buildcraft.api.recipes.CraftingResult;
import buildcraft.api.recipes.IFlexibleRecipe;
import buildcraft.api.robots.AIRobot;
@ -49,6 +50,7 @@ import buildcraft.core.robots.AIRobotUnload;
import buildcraft.core.robots.DockingStation;
import buildcraft.core.robots.IStationFilter;
import buildcraft.silicon.statements.ActionRobotCraft;
import buildcraft.silicon.statements.ActionStationRequestItems;
import buildcraft.silicon.statements.ActionStationRequestItemsMachine;
import buildcraft.transport.Pipe;
import buildcraft.transport.gates.ActionIterator;
@ -144,7 +146,15 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
craftingBlacklist.clear();
startDelegateAI(new AIRobotGotoSleep(robot));
} 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) {
currentRequest = null;
@ -255,6 +265,8 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
StackRequest request = provider.getAvailableRequest(i);
if (request != null && !isBlacklisted(request.stack)) {
request.station = station;
if (take) {
if (provider.takeRequest(i, robot)) {
return request;
@ -270,11 +282,36 @@ public class BoardRobotCrafter extends RedstoneBoardRobot {
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 {
@Override
public boolean matches(DockingStation station) {
return getOrderFromRequestingStation(station, false) != null;
return getOrderFromRequestingAction(station) != null
|| getOrderFromRequestingStation(station, false) != null;
}
}
}

View file

@ -72,7 +72,8 @@ public class ActionRobotGotoStation extends BCActionActive {
if (index != null) {
ForgeDirection side = ItemMapLocation.getSide(item);
DockingStation paramStation = registry.getStation(index.x,
DockingStation paramStation = (DockingStation)
registry.getStation(index.x,
index.y, index.z, side);
if (paramStation != null) {

View file

@ -25,20 +25,20 @@ import buildcraft.core.robots.EntityRobot;
import buildcraft.core.utils.StringUtils;
import buildcraft.transport.gates.ActionSlot;
public class ActionStationRequestItemsInv extends ActionStationRequestItems {
public class ActionStationAcceptItemsInv extends ActionStationInputItems {
public ActionStationRequestItemsInv() {
super("buildcraft:station.request_items");
public ActionStationAcceptItemsInv() {
super("buildcraft:station.accept_items");
}
@Override
public String getDescription() {
return StringUtils.localize("gate.action.station.request_items");
return StringUtils.localize("gate.action.station.accept_items");
}
@Override
public void registerIcons(IIconRegister iconRegister) {
icon = iconRegister.registerIcon("buildcraft:triggers/action_station_request_items");
icon = iconRegister.registerIcon("buildcraft:triggers/action_station_accept_items");
}
@Override

View file

@ -20,9 +20,9 @@ import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TravelingItem;
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");
}

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

View file

@ -9,21 +9,26 @@
package buildcraft.silicon.statements;
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.gates.ActionParameterItemStack;
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.EntityRobot;
import buildcraft.core.triggers.BCActionPassive;
import buildcraft.core.utils.StringUtils;
import buildcraft.transport.gates.ActionSlot;
public abstract class ActionStationRequestItems extends BCActionPassive {
public class ActionStationRequestItems extends ActionStationInputItems {
public ActionStationRequestItems(String name) {
super(name);
public ActionStationRequestItems() {
super("buildcraft:station.request_items");
}
@Override
@ -46,10 +51,32 @@ public abstract class ActionStationRequestItems extends BCActionPassive {
return new ActionParameterItemStack();
}
@Override
public boolean insert(DockingStation station, EntityRobot robot, ActionSlot actionSlot, IInvSlot invSlot,
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;
}
}

View file

@ -66,6 +66,7 @@ public class RobotsActionProvider implements IActionProvider {
if (((TileGenericPipe) pipe).getTile(dir) instanceof IInventory) {
result.add(BuildCraftSilicon.actionStationProvideItems);
result.add(BuildCraftSilicon.actionStationRequestItems);
result.add(BuildCraftSilicon.actionStationAcceptItems);
}
if (((TileGenericPipe) pipe).getTile(dir) instanceof IRequestProvider) {

View file

@ -109,7 +109,8 @@ public class ItemRobotStation extends ItemBuildCraft {
public void validate(IPipeTile pipe, ForgeDirection direction) {
TileGenericPipe gPipe = (TileGenericPipe) pipe;
if (!isValid && !gPipe.getWorld().isRemote) {
station = RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
station = (DockingStation)
RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
gPipe.xCoord,
gPipe.yCoord,
gPipe.zCoord,