fix robots not using the correct sides when accessing inventories/tanks

This commit is contained in:
Hea3veN 2015-07-22 21:42:23 -03:00
parent a0a81e2503
commit ac47040919
8 changed files with 74 additions and 14 deletions

View file

@ -8,9 +8,10 @@
*/
package buildcraft.api.robots;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidHandler;
@ -184,18 +185,34 @@ public abstract class DockingStation {
return null;
}
public IInventory getItemInput() {
public ForgeDirection getItemOutputSide() {
return ForgeDirection.UNKNOWN;
}
public ISidedInventory getItemInput() {
return null;
}
public ForgeDirection getItemInputSide() {
return ForgeDirection.UNKNOWN;
}
public IFluidHandler getFluidOutput() {
return null;
}
public ForgeDirection getFluidOutputSide() {
return ForgeDirection.UNKNOWN;
}
public IFluidHandler getFluidInput() {
return null;
}
public ForgeDirection getFluidInputSide() {
return ForgeDirection.UNKNOWN;
}
public boolean providesPower() {
return false;
}

View file

@ -31,6 +31,7 @@ Improvements:
* Zone Planners now have a dynamic texture (asie)
* Requesters now support the Comparator (asie)
* Add events for robot interaction and removal (asie)
* fix robots not using the correct sides when accessing inventories/tanks (hea3ven)
* Transport:
* Filtered Buffers now support the Comparator (asie)
* Lenses do not require Iron Ingots anymore (asie)

View file

@ -3,6 +3,7 @@ package buildcraft.robotics;
import java.util.List;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
@ -21,6 +22,7 @@ import buildcraft.api.statements.IStatement;
import buildcraft.api.statements.StatementSlot;
import buildcraft.api.transport.IInjectable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.core.lib.inventory.InventoryWrapper;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TravelingItem;
@ -98,7 +100,12 @@ public class DockingStationPipe extends DockingStation implements IRequestProvid
}
@Override
public IInventory getItemInput() {
public ForgeDirection getItemOutputSide() {
return side().getOpposite();
}
@Override
public ISidedInventory getItemInput() {
if (getPipe().getPipeType() != IPipeTile.PipeType.ITEM) {
return null;
}
@ -113,12 +120,26 @@ public class DockingStationPipe extends DockingStation implements IRequestProvid
TileEntity connectedTile = getPipe().getWorld().getTileEntity(x() + dir.offsetX,
y() + dir.offsetY, z() + dir.offsetZ);
if (connectedTile instanceof IInventory) {
return (IInventory) connectedTile;
return InventoryWrapper.getWrappedInventory(connectedTile);
}
return null;
}
@Override
public ForgeDirection getItemInputSide() {
if (getPipe().getPipeType() != IPipeTile.PipeType.ITEM) {
return ForgeDirection.UNKNOWN;
}
if (!(getPipe().getPipe() instanceof PipeItemsWood)) {
return ForgeDirection.UNKNOWN;
}
int meta = ((TileEntity) getPipe()).getBlockMetadata();
return ForgeDirection.getOrientation(meta).getOpposite();
}
@Override
public IFluidHandler getFluidInput() {
if (getPipe().getPipeType() != IPipeTile.PipeType.FLUID) {
@ -141,6 +162,20 @@ public class DockingStationPipe extends DockingStation implements IRequestProvid
return null;
}
@Override
public ForgeDirection getFluidInputSide() {
if (getPipe().getPipeType() != IPipeTile.PipeType.FLUID) {
return ForgeDirection.UNKNOWN;
}
if (!(getPipe().getPipe() instanceof PipeFluidsWood)) {
return ForgeDirection.UNKNOWN;
}
int meta = ((TileEntity) getPipe()).getBlockMetadata();
return ForgeDirection.getOrientation(meta).getOpposite();
}
@Override
public IFluidHandler getFluidOutput() {
if (getPipe().getPipeType() != IPipeTile.PipeType.FLUID) {
@ -150,6 +185,11 @@ public class DockingStationPipe extends DockingStation implements IRequestProvid
return (IFluidHandler) ((Pipe) getPipe().getPipe()).transport;
}
@Override
public ForgeDirection getFluidOutputSide() {
return ForgeDirection.UNKNOWN;
}
@Override
public boolean providesPower() {
return getPipe().getPipeType() == IPipeTile.PipeType.POWER;

View file

@ -11,8 +11,6 @@ package buildcraft.robotics.ai;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.core.lib.inventory.ITransactor;
@ -83,7 +81,7 @@ public class AIRobotFetchAndEquipItemStack extends AIRobot {
ITransactor trans = Transactor.getTransactorFor(tileInventory);
ItemStack itemFound = trans.remove(filter, ForgeDirection.UNKNOWN, true);
ItemStack itemFound = trans.remove(filter, robot.getDockingStation().getItemInputSide(), true);
if (itemFound != null) {
robot.setItemInUse(itemFound);

View file

@ -8,8 +8,9 @@
*/
package buildcraft.robotics.ai;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.IInvSlot;
@ -64,15 +65,16 @@ public class AIRobotLoad extends AIRobot {
int loaded = 0;
IInventory tileInventory = station.getItemInput();
ISidedInventory tileInventory = station.getItemInput();
if (tileInventory == null) {
return false;
}
for (IInvSlot slot : InventoryIterator.getIterable(tileInventory)) {
for (IInvSlot slot : InventoryIterator.getIterable(tileInventory, station.getItemInputSide())) {
ItemStack stack = slot.getStackInSlot();
if (stack == null
|| !slot.canTakeStackFromSlot(stack)
|| !filter.matches(stack)
|| !ActionRobotFilter.canInteractWithItem(station, filter,
ActionStationProvideItems.class)) {

View file

@ -71,7 +71,9 @@ public class AIRobotLoadFluids extends AIRobot {
return 0;
}
FluidStack drainable = handler.drain(station.side, FluidContainerRegistry.BUCKET_VOLUME,
ForgeDirection side = station.getFluidInputSide();
FluidStack drainable = handler.drain(side, FluidContainerRegistry.BUCKET_VOLUME,
false);
if (drainable == null || !filter.matches(drainable.getFluid())) {
return 0;
@ -82,7 +84,7 @@ public class AIRobotLoadFluids extends AIRobot {
if (filled > 0 && doLoad) {
drainable.amount = filled;
handler.drain(station.side, drainable, true);
handler.drain(side, drainable, true);
}
return filled;
}

View file

@ -54,7 +54,7 @@ public class AIRobotUnload extends AIRobot {
return false;
}
ForgeDirection injectSide = station.side().getOpposite();
ForgeDirection injectSide = station.getItemOutputSide();
if (!output.canInjectItems(injectSide)) {
return false;
}

View file

@ -64,7 +64,7 @@ public class AIRobotUnloadFluids extends AIRobot {
}
drainable = drainable.copy();
int filled = fluidHandler.fill(station.side, drainable, doUnload);
int filled = fluidHandler.fill(station.getFluidOutputSide(), drainable, doUnload);
if (filled > 0 && doUnload) {
drainable.amount = filled;