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); void readFromNBT(NBTTagCompound nbt);
BlockIndex index(); BlockIndex index();
boolean take(EntityRobotBase robot);
} }

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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; 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;
} }
} }

View file

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

View file

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