}
items.add(new Tuple2<ItemInfo, Integer>(new ItemInfo(itemID, itemData), amount));
}
Inventory cartinventory = ((StorageMinecart) event.getMinecart()).getInventory();
ArrayList<ItemStack> leftovers = new ArrayList<ItemStack>();
// search for containers
List<Chest> containers = new ArrayList<Chest>(RailUtil.getNearbyChests(event.getBlocks().base));
containers.addAll(RailUtil.getNearbyChests(event.getBlocks().rail));
// are there any containers?
if (containers.isEmpty()) return;
if (collecting) {
// collecting
ArrayList<ItemStack> transferItems = new ArrayList<ItemStack>();
if (!items.isEmpty()) {
for (ItemStack item : cartinventory.getContents()) {
if (!ItemUtil.isStackValid(item))
continue;
Iterator<Tuple2<ItemInfo, Integer>> iter = items.iterator();
while(iter.hasNext()) {
Tuple2<ItemInfo, Integer> inf = iter.next();
if (inf.a.getId() < 0 || inf.a.getType() == item.getType()) {
if (inf.a.getData() < 0 || inf.a.getData() == item.getDurability()) {
if(inf.b < 0) {
transferItems.add(item.clone());
cartinventory.remove(item);
} else {
ItemStack stack = item.clone();
if(item.getAmount() > inf.b) {
stack.setAmount(inf.b);
iter.remove();
items.add(new Tuple2<ItemInfo, Integer>(inf.a, 0));
} else {
iter.remove();
items.add(new Tuple2<ItemInfo, Integer>(inf.a, inf.b - stack.getAmount()));
}
transferItems.add(stack.clone());
cartinventory.removeItem(stack);
}
}
}
}
}
} else {
transferItems.addAll(Arrays.asList(cartinventory.getContents()));
cartinventory.clear();
}
transferItems.removeAll(Collections.singleton(null));
// is cart non-empty?
if (transferItems.isEmpty()) return;
CraftBookPlugin.logDebugMessage("collecting " + transferItems.size() + " item stacks", "cart-deposit.collect");
for (ItemStack stack: transferItems)
CraftBookPlugin.logDebugMessage("collecting " + stack.getAmount() + " items of type " + stack.getType().toString(), "cart-deposit.collect");
for (Chest container : containers) {
if (transferItems.isEmpty()) {
break;
}
Inventory containerinventory = container.getInventory();
leftovers.addAll(containerinventory.addItem(transferItems.toArray(new ItemStack[transferItems.size()
])).values());
transferItems.clear();
transferItems.addAll(leftovers);
leftovers.clear();
container.update();
}
CraftBookPlugin.logDebugMessage("collected items. " + transferItems.size() + " stacks left over.", "cart-deposit.collect");
leftovers.addAll(cartinventory.addItem(transferItems.toArray(new ItemStack[transferItems.size()])).values());
transferItems.clear();
transferItems.addAll(leftovers);
leftovers.clear();
CraftBookPlugin.logDebugMessage("collection done. " + transferItems.size() + " stacks wouldn't fit back.", "cart-deposit.collect");
} else {
// depositing
ArrayList<ItemStack> transferitems = new ArrayList<ItemStack>();
for (Chest container : containers) {
Inventory containerinventory = container.getInventory();
if (!items.isEmpty()) {
for (ItemStack item : containerinventory.getContents()) {
if (!ItemUtil.isStackValid(item))
continue;
Iterator<Tuple2<ItemInfo, Integer>> iter = items.iterator();
while(iter.hasNext()) {
Tuple2<ItemInfo, Integer> inf = iter.next();
if (inf.a.getId() < 0 || inf.a.getType() == item.getType())
if (inf.a.getData() < 0 || inf.a.getData() == item.getDurability()) {
if(inf.b < 0) {
transferitems.add(item.clone());
cartinventory.remove(item);
} else {
ItemStack stack = item.clone();
if(item.getAmount() > inf.b) {
stack.setAmount(inf.b);
iter.remove();
items.add(new Tuple2<ItemInfo, Integer>(inf.a, 0));
} else {
iter.remove();
items.add(new Tuple2<ItemInfo, Integer>(inf.a, inf.b - stack.getAmount()));
}
transferitems.add(stack.clone());
cartinventory.removeItem(stack);
}
}
}
}
} else {
transferitems.addAll(Arrays.asList(containerinventory.getContents()));
containerinventory.clear();
}
container.update();
}
transferitems.removeAll(Collections.singleton(null));
// are chests empty?
if (transferitems.isEmpty()) return;
CraftBookPlugin.logDebugMessage("depositing " + transferitems.size() + " stacks", "cart-deposit.deposit");
for (ItemStack stack: transferitems)
CraftBookPlugin.logDebugMessage("depositing " + stack.getAmount() + " items oftype " + stack.getType().toString(), "cart-deposit.deposit");
leftovers.addAll(cartinventory.addItem(transferitems.toArray(new ItemStack[transferitems.size()])).values());
transferitems.clear();
transferitems.addAll(leftovers);
leftovers.clear();
CraftBookPlugin.logDebugMessage("deposited, " + transferitems.size() + " items left over.", "cart-deposit.deposit");
for (Chest container : containers) {
if (transferitems.isEmpty()) {
break;
}
Inventory containerinventory = container.getInventory();
leftovers.addAll(containerinventory.addItem(transferitems.toArray(new ItemStack[transferitems.size()])).values());
containerinventory.clear();
for(ItemStack item : leftovers)
containerinventory.addItem(item);
transferitems.clear();
transferitems.addAll(leftovers);
leftovers.clear();
}