First attempt at removing StackUtil.
This commit is contained in:
parent
9e7e30bcfc
commit
5a6fcf03d2
6 changed files with 185 additions and 6 deletions
32
common/buildcraft/core/inventory/Transactor.java
Normal file
32
common/buildcraft/core/inventory/Transactor.java
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package buildcraft.core.inventory;
|
||||||
|
|
||||||
|
import buildcraft.api.core.Orientations;
|
||||||
|
import buildcraft.api.inventory.ISpecialInventory;
|
||||||
|
import net.minecraft.src.IInventory;
|
||||||
|
import net.minecraft.src.ItemStack;
|
||||||
|
import net.minecraftforge.common.ISidedInventory;
|
||||||
|
|
||||||
|
public abstract class Transactor {
|
||||||
|
|
||||||
|
public ItemStack add(ItemStack stack, Orientations orientation, boolean doAdd) {
|
||||||
|
ItemStack added = stack.copy();
|
||||||
|
added.stackSize = inject(stack, orientation, doAdd);
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract int inject(ItemStack stack, Orientations orientation, boolean doAdd);
|
||||||
|
|
||||||
|
public static Transactor getTransactorFor(Object object) {
|
||||||
|
|
||||||
|
if(object instanceof ISpecialInventory)
|
||||||
|
return new TransactorSpecial((ISpecialInventory)object);
|
||||||
|
|
||||||
|
else if(object instanceof ISidedInventory)
|
||||||
|
return new TransactorSided((ISidedInventory)object);
|
||||||
|
|
||||||
|
else if(object instanceof IInventory)
|
||||||
|
return new TransactorSimple((IInventory)object);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
33
common/buildcraft/core/inventory/TransactorSided.java
Normal file
33
common/buildcraft/core/inventory/TransactorSided.java
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
package buildcraft.core.inventory;
|
||||||
|
|
||||||
|
import buildcraft.api.core.Orientations;
|
||||||
|
import net.minecraft.src.ItemStack;
|
||||||
|
import net.minecraftforge.common.ISidedInventory;
|
||||||
|
|
||||||
|
public class TransactorSided extends TransactorSimple {
|
||||||
|
|
||||||
|
ISidedInventory sided;
|
||||||
|
|
||||||
|
public TransactorSided(ISidedInventory inventory) {
|
||||||
|
super(inventory);
|
||||||
|
this.sided = inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getPartialSlot(ItemStack stack, Orientations orientation, int skipAhead) {
|
||||||
|
|
||||||
|
if(skipAhead < sided.getStartInventorySide(orientation.toDirection())
|
||||||
|
|| skipAhead > sided.getStartInventorySide(orientation.toDirection()) + sided.getSizeInventorySide(orientation.toDirection()))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return getPartialSlot(stack, skipAhead, sided.getStartInventorySide(orientation.toDirection()) + sided.getSizeInventorySide(orientation.toDirection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getEmptySlot(Orientations orientation) {
|
||||||
|
return getEmptySlot(sided.getStartInventorySide(orientation.toDirection()),
|
||||||
|
sided.getStartInventorySide(orientation.toDirection()) + sided.getSizeInventorySide(orientation.toDirection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
95
common/buildcraft/core/inventory/TransactorSimple.java
Normal file
95
common/buildcraft/core/inventory/TransactorSimple.java
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
package buildcraft.core.inventory;
|
||||||
|
|
||||||
|
import net.minecraft.src.IInventory;
|
||||||
|
import net.minecraft.src.ItemStack;
|
||||||
|
import buildcraft.api.core.Orientations;
|
||||||
|
|
||||||
|
public class TransactorSimple extends Transactor {
|
||||||
|
|
||||||
|
private IInventory inventory;
|
||||||
|
|
||||||
|
public TransactorSimple(IInventory inventory) {
|
||||||
|
this.inventory = inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int inject(ItemStack stack, Orientations orientation, boolean doAdd) {
|
||||||
|
|
||||||
|
int injected = 0;
|
||||||
|
|
||||||
|
int slot = 0;
|
||||||
|
while((slot = getPartialSlot(stack, orientation, slot)) >= 0
|
||||||
|
&& injected < stack.stackSize)
|
||||||
|
injected += addToSlot(slot, stack, injected, doAdd);
|
||||||
|
|
||||||
|
slot = 0;
|
||||||
|
while((slot = getEmptySlot(orientation)) >= 0
|
||||||
|
&& injected < stack.stackSize)
|
||||||
|
injected += addToSlot(slot, stack, injected, doAdd);
|
||||||
|
|
||||||
|
return injected;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getPartialSlot(ItemStack stack, Orientations orientation, int skipAhead) {
|
||||||
|
return getPartialSlot(stack, skipAhead, inventory.getSizeInventory());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getPartialSlot(ItemStack stack, int startSlot, int endSlot) {
|
||||||
|
|
||||||
|
for(int i = startSlot; i < endSlot; i++) {
|
||||||
|
if(inventory.getStackInSlot(i) == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!inventory.getStackInSlot(i).isItemEqual(stack))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(inventory.getStackInSlot(i).stackSize >= inventory.getStackInSlot(i).getMaxStackSize())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getEmptySlot(Orientations orientation) {
|
||||||
|
return getEmptySlot(0, inventory.getSizeInventory());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getEmptySlot(int startSlot, int endSlot) {
|
||||||
|
for(int i = startSlot; i < endSlot; i++)
|
||||||
|
if(inventory.getStackInSlot(i) == null)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int addToSlot(int slot, ItemStack stack, int injected, boolean doAdd) {
|
||||||
|
int remaining = stack.stackSize - injected;
|
||||||
|
|
||||||
|
if(inventory.getStackInSlot(slot) == null) {
|
||||||
|
if(doAdd) {
|
||||||
|
inventory.setInventorySlotContents(slot, stack.copy());
|
||||||
|
inventory.getStackInSlot(slot).stackSize = remaining;
|
||||||
|
}
|
||||||
|
return remaining;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!inventory.getStackInSlot(slot).isItemEqual(stack))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int space = inventory.getStackInSlot(slot).getMaxStackSize() - inventory.getStackInSlot(slot).stackSize;
|
||||||
|
if(space <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if(space >= remaining) {
|
||||||
|
if(doAdd)
|
||||||
|
inventory.getStackInSlot(slot).stackSize += remaining;
|
||||||
|
return remaining;
|
||||||
|
} else {
|
||||||
|
if(doAdd)
|
||||||
|
inventory.getStackInSlot(slot).stackSize = inventory.getStackInSlot(slot).getMaxStackSize();
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
common/buildcraft/core/inventory/TransactorSpecial.java
Normal file
20
common/buildcraft/core/inventory/TransactorSpecial.java
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package buildcraft.core.inventory;
|
||||||
|
|
||||||
|
import net.minecraft.src.ItemStack;
|
||||||
|
import buildcraft.api.core.Orientations;
|
||||||
|
import buildcraft.api.inventory.ISpecialInventory;
|
||||||
|
|
||||||
|
public class TransactorSpecial extends Transactor {
|
||||||
|
|
||||||
|
protected ISpecialInventory inventory;
|
||||||
|
|
||||||
|
public TransactorSpecial(ISpecialInventory inventory) {
|
||||||
|
this.inventory = inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int inject(ItemStack stack, Orientations orientation, boolean doAdd) {
|
||||||
|
return inventory.addItem(stack, doAdd, orientation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -148,7 +148,6 @@ public class TileAssemblyTable extends TileEntity implements IMachine, IInventor
|
||||||
}
|
}
|
||||||
|
|
||||||
StackUtil stackUtils = new StackUtil(currentRecipe.output.copy());
|
StackUtil stackUtils = new StackUtil(currentRecipe.output.copy());
|
||||||
|
|
||||||
boolean added = stackUtils.addToRandomInventory(this, Orientations.Unknown);
|
boolean added = stackUtils.addToRandomInventory(this, Orientations.Unknown);
|
||||||
|
|
||||||
if (!added || stackUtils.items.stackSize > 0) {
|
if (!added || stackUtils.items.stackSize > 0) {
|
||||||
|
|
|
@ -28,10 +28,10 @@ import buildcraft.api.transport.IPipedItem;
|
||||||
import buildcraft.core.DefaultProps;
|
import buildcraft.core.DefaultProps;
|
||||||
import buildcraft.core.EntityPassiveItem;
|
import buildcraft.core.EntityPassiveItem;
|
||||||
import buildcraft.core.IMachine;
|
import buildcraft.core.IMachine;
|
||||||
|
import buildcraft.core.inventory.Transactor;
|
||||||
import buildcraft.core.network.PacketIds;
|
import buildcraft.core.network.PacketIds;
|
||||||
import buildcraft.core.network.PacketPipeTransportContent;
|
import buildcraft.core.network.PacketPipeTransportContent;
|
||||||
import buildcraft.core.proxy.CoreProxy;
|
import buildcraft.core.proxy.CoreProxy;
|
||||||
import buildcraft.core.utils.StackUtil;
|
|
||||||
import buildcraft.core.utils.Utils;
|
import buildcraft.core.utils.Utils;
|
||||||
|
|
||||||
import net.minecraft.src.EntityItem;
|
import net.minecraft.src.EntityItem;
|
||||||
|
@ -152,7 +152,7 @@ public class PipeTransportItems extends PipeTransport {
|
||||||
|
|
||||||
return pipe.pipe.transport instanceof PipeTransportItems;
|
return pipe.pipe.transport instanceof PipeTransportItems;
|
||||||
} else if (entity instanceof IInventory)
|
} else if (entity instanceof IInventory)
|
||||||
if (new StackUtil(item.getItemStack()).checkAvailableSlot((IInventory) entity, false, o.reverse()))
|
if(Transactor.getTransactorFor(entity).add(item.getItemStack(), o.reverse(), false).stackSize > 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -255,13 +255,13 @@ public class PipeTransportItems extends PipeTransport {
|
||||||
|
|
||||||
((PipeTransportItems) pipe.pipe.transport).entityEntering(data.item, data.orientation);
|
((PipeTransportItems) pipe.pipe.transport).entityEntering(data.item, data.orientation);
|
||||||
} else if (tile instanceof IInventory) {
|
} else if (tile instanceof IInventory) {
|
||||||
StackUtil utils = new StackUtil(data.item.getItemStack());
|
ItemStack added = Transactor.getTransactorFor(tile).add(data.item.getItemStack(), data.orientation.reverse(), true);
|
||||||
|
|
||||||
if (!CoreProxy.proxy.isRemote(worldObj))
|
if (!CoreProxy.proxy.isRemote(worldObj))
|
||||||
if (utils.checkAvailableSlot((IInventory) tile, true, data.orientation.reverse()) && utils.items.stackSize == 0)
|
if(added.stackSize >= data.item.getItemStack().stackSize)
|
||||||
data.item.remove();
|
data.item.remove();
|
||||||
else {
|
else {
|
||||||
data.item.setItemStack(utils.items);
|
data.item.getItemStack().stackSize -= added.stackSize;
|
||||||
EntityItem dropped = data.item.toEntityItem(data.orientation);
|
EntityItem dropped = data.item.toEntityItem(data.orientation);
|
||||||
|
|
||||||
if (dropped != null)
|
if (dropped != null)
|
||||||
|
|
Loading…
Reference in a new issue