diff --git a/api/buildcraft/api/robots/IDockingStation.java b/api/buildcraft/api/robots/IDockingStation.java index da16f9aa..cb635715 100755 --- a/api/buildcraft/api/robots/IDockingStation.java +++ b/api/buildcraft/api/robots/IDockingStation.java @@ -37,4 +37,6 @@ public interface IDockingStation { void readFromNBT(NBTTagCompound nbt); BlockIndex index(); + + boolean take(EntityRobotBase robot); } diff --git a/api/buildcraft/api/robots/IRobotRegistry.java b/api/buildcraft/api/robots/IRobotRegistry.java index bd48a298..9537b3b3 100755 --- a/api/buildcraft/api/robots/IRobotRegistry.java +++ b/api/buildcraft/api/robots/IRobotRegistry.java @@ -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 getStations(); + Collection 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); diff --git a/api/buildcraft/api/robots/StackRequest.java b/api/buildcraft/api/robots/StackRequest.java index 29556cf2..7a6163c8 100755 --- a/api/buildcraft/api/robots/StackRequest.java +++ b/api/buildcraft/api/robots/StackRequest.java @@ -15,4 +15,5 @@ public class StackRequest { public ItemStack stack; public int index; public TileEntity requester; + public IDockingStation station; } diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index b635cb3f..2cd4dbb1 100755 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -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 diff --git a/buildcraft_resources/assets/buildcraft/textures/entities/robot_delivery.png b/buildcraft_resources/assets/buildcraft/textures/entities/robot_delivery.png new file mode 100755 index 00000000..a60cd541 Binary files /dev/null and b/buildcraft_resources/assets/buildcraft/textures/entities/robot_delivery.png differ diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_accept_items.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_accept_items.png new file mode 100755 index 00000000..05bd69ca Binary files /dev/null and b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_accept_items.png differ diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_machine_request.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_machine_request.png index fc56cc72..89711f46 100755 Binary files a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_machine_request.png and b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_machine_request.png differ diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_request_items.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_request_items.png index 05bd69ca..8b885053 100755 Binary files a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_request_items.png and b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_request_items.png differ diff --git a/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_robot_mandatory.png b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_robot_mandatory.png new file mode 100755 index 00000000..e59fb99b Binary files /dev/null and b/buildcraft_resources/assets/buildcraft/textures/items/triggers/action_station_robot_mandatory.png differ diff --git a/common/buildcraft/BuildCraftSilicon.java b/common/buildcraft/BuildCraftSilicon.java index 489ce3a1..f7980b9e 100644 --- a/common/buildcraft/BuildCraftSilicon.java +++ b/common/buildcraft/BuildCraftSilicon.java @@ -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(); diff --git a/common/buildcraft/core/robots/AIRobotDeliverRequested.java b/common/buildcraft/core/robots/AIRobotDeliverRequested.java index d3c09af4..1a79e7a5 100755 --- a/common/buildcraft/core/robots/AIRobotDeliverRequested.java +++ b/common/buildcraft/core/robots/AIRobotDeliverRequested.java @@ -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; diff --git a/common/buildcraft/core/robots/AIRobotGotoStation.java b/common/buildcraft/core/robots/AIRobotGotoStation.java index fef506b7..ad50f0a6 100755 --- a/common/buildcraft/core/robots/AIRobotGotoStation.java +++ b/common/buildcraft/core/robots/AIRobotGotoStation.java @@ -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); diff --git a/common/buildcraft/core/robots/AIRobotGotoStationToUnload.java b/common/buildcraft/core/robots/AIRobotGotoStationToUnload.java index f82b13b1..f8643651 100755 --- a/common/buildcraft/core/robots/AIRobotGotoStationToUnload.java +++ b/common/buildcraft/core/robots/AIRobotGotoStationToUnload.java @@ -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; } } diff --git a/common/buildcraft/core/robots/AIRobotUnload.java b/common/buildcraft/core/robots/AIRobotUnload.java index d27366b1..4f249c88 100755 --- a/common/buildcraft/core/robots/AIRobotUnload.java +++ b/common/buildcraft/core/robots/AIRobotUnload.java @@ -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; + } } diff --git a/common/buildcraft/core/robots/DockingStation.java b/common/buildcraft/core/robots/DockingStation.java index 6626192f..86cf925a 100755 --- a/common/buildcraft/core/robots/DockingStation.java +++ b/common/buildcraft/core/robots/DockingStation.java @@ -115,6 +115,7 @@ public class DockingStation implements IDockingStation { } } + @Override public boolean take(EntityRobotBase robot) { if (robotTaking == null) { linkIsMain = false; diff --git a/common/buildcraft/core/robots/EntityRobot.java b/common/buildcraft/core/robots/EntityRobot.java index b6fe3feb..a3ed8b91 100755 --- a/common/buildcraft/core/robots/EntityRobot.java +++ b/common/buildcraft/core/robots/EntityRobot.java @@ -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, diff --git a/common/buildcraft/core/robots/RobotRegistry.java b/common/buildcraft/core/robots/RobotRegistry.java index b808bec4..f42ede02 100755 --- a/common/buildcraft/core/robots/RobotRegistry.java +++ b/common/buildcraft/core/robots/RobotRegistry.java @@ -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 resourcesTaken = new HashMap(); private HashMap> resourcesTakenByRobot = new HashMap>(); - private HashMap stations = new HashMap(); + private HashMap stations = new HashMap(); private HashMap> stationsTakenByRobot = new HashMap>(); 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 getStations() { + public Collection 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()); } @@ -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 e : stations.entrySet()) { + for (Map.Entry e : stations.entrySet()) { NBTTagCompound cpt = new NBTTagCompound(); e.getValue().writeToNBT(cpt); stationList.appendTag(cpt); diff --git a/common/buildcraft/core/robots/StationIndex.java b/common/buildcraft/core/robots/StationIndex.java index 63ba59bb..b390ab61 100755 --- a/common/buildcraft/core/robots/StationIndex.java +++ b/common/buildcraft/core/robots/StationIndex.java @@ -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(); } diff --git a/common/buildcraft/core/robots/boards/BoardRobotCrafter.java b/common/buildcraft/core/robots/boards/BoardRobotCrafter.java index bf6ad140..2668f999 100755 --- a/common/buildcraft/core/robots/boards/BoardRobotCrafter.java +++ b/common/buildcraft/core/robots/boards/BoardRobotCrafter.java @@ -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; } } } diff --git a/common/buildcraft/silicon/statements/ActionRobotGotoStation.java b/common/buildcraft/silicon/statements/ActionRobotGotoStation.java index d80598f6..a12552a1 100755 --- a/common/buildcraft/silicon/statements/ActionRobotGotoStation.java +++ b/common/buildcraft/silicon/statements/ActionRobotGotoStation.java @@ -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) { diff --git a/common/buildcraft/silicon/statements/ActionStationRequestItemsInv.java b/common/buildcraft/silicon/statements/ActionStationAcceptItemsInv.java similarity index 89% rename from common/buildcraft/silicon/statements/ActionStationRequestItemsInv.java rename to common/buildcraft/silicon/statements/ActionStationAcceptItemsInv.java index 11ef2d53..52b1eb12 100755 --- a/common/buildcraft/silicon/statements/ActionStationRequestItemsInv.java +++ b/common/buildcraft/silicon/statements/ActionStationAcceptItemsInv.java @@ -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 diff --git a/common/buildcraft/silicon/statements/ActionStationRequestItemsPipe.java b/common/buildcraft/silicon/statements/ActionStationAcceptItemsPipe.java similarity index 94% rename from common/buildcraft/silicon/statements/ActionStationRequestItemsPipe.java rename to common/buildcraft/silicon/statements/ActionStationAcceptItemsPipe.java index 59ba4fe1..64cdc5ca 100755 --- a/common/buildcraft/silicon/statements/ActionStationRequestItemsPipe.java +++ b/common/buildcraft/silicon/statements/ActionStationAcceptItemsPipe.java @@ -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"); } diff --git a/common/buildcraft/silicon/statements/ActionStationInputItems.java b/common/buildcraft/silicon/statements/ActionStationInputItems.java new file mode 100755 index 00000000..dc2331c6 --- /dev/null +++ b/common/buildcraft/silicon/statements/ActionStationInputItems.java @@ -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()); + } +} diff --git a/common/buildcraft/silicon/statements/ActionStationRequestItems.java b/common/buildcraft/silicon/statements/ActionStationRequestItems.java index 8f31ca65..179245ed 100755 --- a/common/buildcraft/silicon/statements/ActionStationRequestItems.java +++ b/common/buildcraft/silicon/statements/ActionStationRequestItems.java @@ -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; } } diff --git a/common/buildcraft/silicon/statements/RobotsActionProvider.java b/common/buildcraft/silicon/statements/RobotsActionProvider.java index 52be71ec..182f054c 100755 --- a/common/buildcraft/silicon/statements/RobotsActionProvider.java +++ b/common/buildcraft/silicon/statements/RobotsActionProvider.java @@ -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) { diff --git a/common/buildcraft/transport/ItemRobotStation.java b/common/buildcraft/transport/ItemRobotStation.java index 117ba38f..4cca7e20 100755 --- a/common/buildcraft/transport/ItemRobotStation.java +++ b/common/buildcraft/transport/ItemRobotStation.java @@ -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,