fix interesting delivery robot bug, improve StatementParameterItemStackExact further
This commit is contained in:
parent
70cc38697e
commit
9bfc13031b
|
@ -2,4 +2,5 @@ Bugs fixed:
|
||||||
|
|
||||||
* [#3839] Attempt to work around potential world corruption?
|
* [#3839] Attempt to work around potential world corruption?
|
||||||
* [#3837] Oil spawn in mid-air on superflat
|
* [#3837] Oil spawn in mid-air on superflat
|
||||||
* Potential direction statement parameter crash in gate GUI
|
* Delivery robots dropping requested item if occupies >1 slot
|
||||||
|
* Potential direction statement parameter crash in gate GUI
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.core.lib.inventory;
|
package buildcraft.core.lib.inventory;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import net.minecraft.entity.item.EntityItem;
|
import net.minecraft.entity.item.EntityItem;
|
||||||
import net.minecraft.inventory.IInventory;
|
import net.minecraft.inventory.IInventory;
|
||||||
import net.minecraft.inventory.InventoryLargeChest;
|
import net.minecraft.inventory.InventoryLargeChest;
|
||||||
|
@ -238,4 +240,55 @@ public final class InvUtils {
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Iterable<IInvSlot> getItems(final IInventory inv, final IStackFilter filter) {
|
||||||
|
return new Iterable<IInvSlot>() {
|
||||||
|
@Override
|
||||||
|
public Iterator<IInvSlot> iterator() {
|
||||||
|
return new Iterator<IInvSlot>() {
|
||||||
|
private final Iterator<IInvSlot> parent = InventoryIterator.getIterable(inv).iterator();
|
||||||
|
private boolean searched = false;
|
||||||
|
private IInvSlot next;
|
||||||
|
|
||||||
|
private void find() {
|
||||||
|
next = null;
|
||||||
|
searched = true;
|
||||||
|
|
||||||
|
while (parent.hasNext()) {
|
||||||
|
IInvSlot s = parent.next();
|
||||||
|
if (s.getStackInSlot() != null && filter.matches(s.getStackInSlot())) {
|
||||||
|
next = s;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
if (!searched) {
|
||||||
|
find();
|
||||||
|
}
|
||||||
|
|
||||||
|
return next != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IInvSlot next() {
|
||||||
|
if (!searched) {
|
||||||
|
find();
|
||||||
|
}
|
||||||
|
|
||||||
|
IInvSlot current = next;
|
||||||
|
find();
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException("Remove not supported.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,16 @@ import buildcraft.api.statements.IStatementParameter;
|
||||||
import buildcraft.api.statements.StatementMouseClick;
|
import buildcraft.api.statements.StatementMouseClick;
|
||||||
|
|
||||||
public class StatementParameterItemStackExact implements IStatementParameter {
|
public class StatementParameterItemStackExact implements IStatementParameter {
|
||||||
|
|
||||||
protected ItemStack stack;
|
protected ItemStack stack;
|
||||||
|
private int availableSlots;
|
||||||
|
|
||||||
|
public StatementParameterItemStackExact() {
|
||||||
|
this(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatementParameterItemStackExact(int availableSlots) {
|
||||||
|
this.availableSlots = availableSlots;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IIcon getIcon() {
|
public IIcon getIcon() {
|
||||||
|
@ -30,8 +38,10 @@ public class StatementParameterItemStackExact implements IStatementParameter {
|
||||||
if (areItemsEqual(this.stack, stack)) {
|
if (areItemsEqual(this.stack, stack)) {
|
||||||
if (mouse.getButton() == 0) {
|
if (mouse.getButton() == 0) {
|
||||||
this.stack.stackSize += (mouse.isShift()) ? 16 : 1;
|
this.stack.stackSize += (mouse.isShift()) ? 16 : 1;
|
||||||
if (this.stack.stackSize > this.stack.getMaxStackSize()) {
|
|
||||||
this.stack.stackSize = this.stack.getMaxStackSize();
|
int maxSize = availableSlots < 0 ? 64 : Math.min(64, this.stack.getMaxStackSize() * availableSlots);
|
||||||
|
if (this.stack.stackSize > maxSize) {
|
||||||
|
this.stack.stackSize = maxSize;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.stack.stackSize -= (mouse.isShift()) ? 16 : 1;
|
this.stack.stackSize -= (mouse.isShift()) ? 16 : 1;
|
||||||
|
@ -46,8 +56,10 @@ public class StatementParameterItemStackExact implements IStatementParameter {
|
||||||
if (this.stack != null) {
|
if (this.stack != null) {
|
||||||
if (mouse.getButton() == 0) {
|
if (mouse.getButton() == 0) {
|
||||||
this.stack.stackSize += (mouse.isShift()) ? 16 : 1;
|
this.stack.stackSize += (mouse.isShift()) ? 16 : 1;
|
||||||
if (this.stack.stackSize > this.stack.getMaxStackSize()) {
|
|
||||||
this.stack.stackSize = this.stack.getMaxStackSize();
|
int maxSize = availableSlots < 0 ? 64 : Math.min(64, this.stack.getMaxStackSize() * availableSlots);
|
||||||
|
if (this.stack.stackSize > maxSize) {
|
||||||
|
this.stack.stackSize = maxSize;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.stack.stackSize -= (mouse.isShift()) ? 16 : 1;
|
this.stack.stackSize -= (mouse.isShift()) ? 16 : 1;
|
||||||
|
@ -66,10 +78,15 @@ public class StatementParameterItemStackExact implements IStatementParameter {
|
||||||
stack.writeToNBT(tagCompound);
|
stack.writeToNBT(tagCompound);
|
||||||
compound.setTag("stack", tagCompound);
|
compound.setTag("stack", tagCompound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compound.setInteger("availableSlots", availableSlots);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT(NBTTagCompound compound) {
|
public void readFromNBT(NBTTagCompound compound) {
|
||||||
|
if (compound.hasKey("availableSlots")) {
|
||||||
|
availableSlots = compound.getInteger("availableSlots");
|
||||||
|
}
|
||||||
stack = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("stack"));
|
stack = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("stack"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,10 +104,11 @@ public class EntityRobot extends EntityRobotBase implements
|
||||||
public static final ResourceLocation ROBOT_BASE = new ResourceLocation(
|
public static final ResourceLocation ROBOT_BASE = new ResourceLocation(
|
||||||
DefaultProps.TEXTURE_PATH_ROBOTS + "/robot_base.png");
|
DefaultProps.TEXTURE_PATH_ROBOTS + "/robot_base.png");
|
||||||
public static final int MAX_WEARABLES = 8;
|
public static final int MAX_WEARABLES = 8;
|
||||||
|
public static final int TRANSFER_INV_SLOTS = 4;
|
||||||
|
|
||||||
private static Set<Integer> blacklistedItemsForUpdate = Sets.newHashSet();
|
private static Set<Integer> blacklistedItemsForUpdate = Sets.newHashSet();
|
||||||
|
|
||||||
public LaserData laser = new LaserData();
|
public LaserData laser = new LaserData();
|
||||||
public DockingStation linkedDockingStation;
|
public DockingStation linkedDockingStation;
|
||||||
public BlockIndex linkedDockingStationIndex;
|
public BlockIndex linkedDockingStationIndex;
|
||||||
public ForgeDirection linkedDockingStationSide;
|
public ForgeDirection linkedDockingStationSide;
|
||||||
|
@ -131,7 +132,7 @@ public class EntityRobot extends EntityRobotBase implements
|
||||||
private List<ItemStack> wearables = new ArrayList<ItemStack>();
|
private List<ItemStack> wearables = new ArrayList<ItemStack>();
|
||||||
|
|
||||||
private boolean needsUpdate = false;
|
private boolean needsUpdate = false;
|
||||||
private ItemStack[] inv = new ItemStack[4];
|
private ItemStack[] inv = new ItemStack[TRANSFER_INV_SLOTS];
|
||||||
private FluidStack tank;
|
private FluidStack tank;
|
||||||
private int maxFluid = FluidContainerRegistry.BUCKET_VOLUME * 4;
|
private int maxFluid = FluidContainerRegistry.BUCKET_VOLUME * 4;
|
||||||
private ResourceLocation texture;
|
private ResourceLocation texture;
|
||||||
|
|
|
@ -53,25 +53,32 @@ public class AIRobotDeliverRequested extends AIRobot {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IInvSlot slot = InvUtils.getItem(robot, new ArrayStackOrListFilter(requested.getStack()));
|
|
||||||
|
|
||||||
if (slot == null) {
|
|
||||||
setSuccess(false);
|
|
||||||
terminate();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IRequestProvider requester = requested.getRequester(robot.worldObj);
|
IRequestProvider requester = requested.getRequester(robot.worldObj);
|
||||||
if (requester == null) {
|
if (requester == null) {
|
||||||
setSuccess(false);
|
setSuccess(false);
|
||||||
terminate();
|
terminate();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ItemStack newStack = requester.offerItem(requested.getSlot(), slot.getStackInSlot().copy());
|
|
||||||
|
|
||||||
if (newStack == null || newStack.stackSize != slot.getStackInSlot().stackSize) {
|
// TODO: Make this not exceed the requested amount of items.
|
||||||
slot.setStackInSlot(newStack);
|
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (IInvSlot slot : InvUtils.getItems(robot, new ArrayStackOrListFilter(requested.getStack()))) {
|
||||||
|
int difference = slot.getStackInSlot().stackSize;
|
||||||
|
ItemStack newStack = requester.offerItem(requested.getSlot(), slot.getStackInSlot().copy());
|
||||||
|
|
||||||
|
if (newStack == null) {
|
||||||
|
slot.setStackInSlot(newStack);
|
||||||
|
} else if (newStack.stackSize != slot.getStackInSlot().stackSize) {
|
||||||
|
slot.setStackInSlot(newStack);
|
||||||
|
difference = newStack.stackSize - difference;
|
||||||
|
}
|
||||||
|
|
||||||
|
count += difference;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setSuccess(count > 0);
|
||||||
terminate();
|
terminate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import net.minecraft.client.renderer.texture.IIconRegister;
|
||||||
import buildcraft.api.statements.IStatementParameter;
|
import buildcraft.api.statements.IStatementParameter;
|
||||||
import buildcraft.core.lib.utils.StringUtils;
|
import buildcraft.core.lib.utils.StringUtils;
|
||||||
import buildcraft.core.statements.StatementParameterItemStackExact;
|
import buildcraft.core.statements.StatementParameterItemStackExact;
|
||||||
|
import buildcraft.robotics.EntityRobot;
|
||||||
|
|
||||||
public class ActionStationRequestItems extends ActionStationInputItems {
|
public class ActionStationRequestItems extends ActionStationInputItems {
|
||||||
|
|
||||||
|
@ -42,6 +43,6 @@ public class ActionStationRequestItems extends ActionStationInputItems {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IStatementParameter createParameter(int index) {
|
public IStatementParameter createParameter(int index) {
|
||||||
return new StatementParameterItemStackExact();
|
return new StatementParameterItemStackExact(EntityRobot.TRANSFER_INV_SLOTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue