Search in sources :

Example 1 with SpecialInventoryHandler

use of logisticspipes.proxy.specialinventoryhandler.SpecialInventoryHandler in project LogisticsPipes by RS485.

the class ModuleCCBasedQuickSort method tick.

@Override
public void tick() {
    IInventoryUtil invUtil = _service.getPointedInventory(true);
    if (invUtil == null) {
        return;
    }
    handleSinkResponses(invUtil);
    if (--currentTick > 0) {
        return;
    }
    if (stalled) {
        currentTick = stalledDelay;
    } else {
        currentTick = normalDelay;
    }
    if (!_service.canUseEnergy(500)) {
        stalled = true;
        return;
    }
    if ((!(invUtil instanceof SpecialInventoryHandler) && invUtil.getSizeInventory() == 0) || !_service.canUseEnergy(500)) {
        stalled = true;
        return;
    }
    //incremented at the end of the previous loop.
    if (lastStackLookedAt >= invUtil.getSizeInventory()) {
        lastStackLookedAt = 0;
    }
    ItemStack slot = invUtil.getStackInSlot(lastStackLookedAt);
    while (slot == null) {
        lastStackLookedAt++;
        if (lastStackLookedAt >= invUtil.getSizeInventory()) {
            lastStackLookedAt = 0;
        }
        slot = invUtil.getStackInSlot(lastStackLookedAt);
        if (lastStackLookedAt == lastSuceededStack) {
            stalled = true;
            send();
            // then we have been around the list without sending, halt for now
            return;
        }
    }
    send();
    if (!sinkResponses.containsKey(lastStackLookedAt)) {
        createSinkMessage(lastStackLookedAt, ItemIdentifierStack.getFromStack(slot));
    }
    lastStackLookedAt++;
    checkSize();
}
Also used : IInventoryUtil(logisticspipes.interfaces.IInventoryUtil) SpecialInventoryHandler(logisticspipes.proxy.specialinventoryhandler.SpecialInventoryHandler) ItemStack(net.minecraft.item.ItemStack)

Example 2 with SpecialInventoryHandler

use of logisticspipes.proxy.specialinventoryhandler.SpecialInventoryHandler in project LogisticsPipes by RS485.

the class ModuleQuickSort method tick.

@Override
public void tick() {
    if (--currentTick > 0) {
        return;
    }
    if (stalled) {
        currentTick = stalledDelay;
    } else {
        currentTick = normalDelay;
    }
    //Extract Item
    IInventoryUtil invUtil = _service.getPointedInventory(true);
    if (invUtil == null) {
        return;
    }
    if (!_service.canUseEnergy(500)) {
        stalled = true;
        return;
    }
    if (invUtil instanceof SpecialInventoryHandler) {
        Map<ItemIdentifier, Integer> items = invUtil.getItemsAndCount();
        if (lastSuceededStack >= items.size()) {
            lastSuceededStack = 0;
        }
        if (lastStackLookedAt >= items.size()) {
            lastStackLookedAt = 0;
        }
        int lookedAt = 0;
        for (Entry<ItemIdentifier, Integer> item : items.entrySet()) {
            // spool to current place
            lookedAt++;
            if (lookedAt <= lastStackLookedAt) {
                continue;
            }
            LinkedList<Integer> jamList = new LinkedList<>();
            Pair<Integer, SinkReply> reply = _service.hasDestination(item.getKey(), false, jamList);
            if (reply == null) {
                if (lastStackLookedAt == lastSuceededStack) {
                    stalled = true;
                }
                lastStackLookedAt++;
                return;
            }
            if (!_service.useEnergy(500)) {
                stalled = true;
                lastStackLookedAt++;
                return;
            }
            stalled = false;
            //send up to one stack
            int maxItemsToSend = item.getKey().getMaxStackSize();
            int availableItems = Math.min(maxItemsToSend, item.getValue());
            while (reply != null) {
                int count = availableItems;
                if (reply.getValue2().maxNumberOfItems != 0) {
                    count = Math.min(count, reply.getValue2().maxNumberOfItems);
                }
                ItemStack stackToSend = invUtil.getMultipleItems(item.getKey(), count);
                if (stackToSend == null || stackToSend.stackSize == 0) {
                    break;
                }
                availableItems -= stackToSend.stackSize;
                _service.sendStack(stackToSend, reply, ItemSendMode.Fast);
                _service.spawnParticle(Particles.OrangeParticle, 8);
                if (availableItems <= 0) {
                    break;
                }
                jamList.add(reply.getValue1());
                reply = _service.hasDestination(item.getKey(), false, jamList);
            }
            if (availableItems > 0) {
                //if we didn't send maxItemsToSend, try next item next time
                lastSuceededStack = lastStackLookedAt;
                lastStackLookedAt++;
            } else {
                lastSuceededStack = lastStackLookedAt - 1;
                if (lastSuceededStack < 0) {
                    lastSuceededStack = items.size() - 1;
                }
            }
            return;
        }
    } else {
        if ((!(invUtil instanceof SpecialInventoryHandler) && invUtil.getSizeInventory() == 0) || !_service.canUseEnergy(500)) {
            stalled = true;
            return;
        }
        if (lastSuceededStack >= invUtil.getSizeInventory()) {
            lastSuceededStack = 0;
        }
        //incremented at the end of the previous loop.
        if (lastStackLookedAt >= invUtil.getSizeInventory()) {
            lastStackLookedAt = 0;
        }
        ItemStack slot = invUtil.getStackInSlot(lastStackLookedAt);
        while (slot == null) {
            lastStackLookedAt++;
            if (lastStackLookedAt >= invUtil.getSizeInventory()) {
                lastStackLookedAt = 0;
            }
            slot = invUtil.getStackInSlot(lastStackLookedAt);
            if (lastStackLookedAt == lastSuceededStack) {
                stalled = true;
                send();
                // then we have been around the list without sending, halt for now
                return;
            }
        }
        send();
        // begin duplicate code
        List<Integer> jamList = new LinkedList<>();
        Pair<Integer, SinkReply> reply = _service.hasDestination(ItemIdentifier.get(slot), false, jamList);
        if (reply == null) {
            if (lastStackLookedAt == lastSuceededStack) {
                stalled = true;
            }
            lastStackLookedAt++;
            return;
        }
        if (!_service.useEnergy(500)) {
            stalled = true;
            lastStackLookedAt++;
            return;
        }
        stalled = false;
        //don't directly modify the stack in the inv
        int sizePrev;
        slot = slot.copy();
        sizePrev = slot.stackSize;
        boolean partialSend = false;
        while (reply != null) {
            int count = slot.stackSize;
            if (reply.getValue2().maxNumberOfItems > 0) {
                count = Math.min(count, reply.getValue2().maxNumberOfItems);
            }
            ItemStack stackToSend = slot.splitStack(count);
            _service.sendStack(stackToSend, reply, ItemSendMode.Fast);
            _service.spawnParticle(Particles.OrangeParticle, 8);
            if (slot.stackSize == 0) {
                break;
            }
            jamList.add(reply.getValue1());
            reply = _service.hasDestination(ItemIdentifier.get(slot), false, jamList);
        }
        ItemStack returned = null;
        int amountToExtract = sizePrev - slot.stackSize;
        if (slot.stackSize > 0) {
            partialSend = true;
        }
        returned = invUtil.decrStackSize(lastStackLookedAt, amountToExtract);
        if (returned.stackSize != amountToExtract) {
            throw new UnsupportedOperationException("Couldn't extract the already sended items from the inventory.");
        }
        lastSuceededStack = lastStackLookedAt;
        // end duplicate code
        lastStackLookedAt++;
        if (partialSend) {
            if (lastStackLookedAt >= invUtil.getSizeInventory()) {
                lastStackLookedAt = 0;
            }
            while (lastStackLookedAt != lastSuceededStack) {
                ItemStack tstack = invUtil.getStackInSlot(lastStackLookedAt);
                if (tstack != null && !slot.isItemEqual(tstack)) {
                    break;
                }
                lastStackLookedAt++;
                if (lastStackLookedAt >= invUtil.getSizeInventory()) {
                    lastStackLookedAt = 0;
                }
            }
        }
    }
}
Also used : IInventoryUtil(logisticspipes.interfaces.IInventoryUtil) LinkedList(java.util.LinkedList) ItemIdentifier(logisticspipes.utils.item.ItemIdentifier) SinkReply(logisticspipes.utils.SinkReply) SpecialInventoryHandler(logisticspipes.proxy.specialinventoryhandler.SpecialInventoryHandler) ItemStack(net.minecraft.item.ItemStack)

Aggregations

IInventoryUtil (logisticspipes.interfaces.IInventoryUtil)2 SpecialInventoryHandler (logisticspipes.proxy.specialinventoryhandler.SpecialInventoryHandler)2 ItemStack (net.minecraft.item.ItemStack)2 LinkedList (java.util.LinkedList)1 SinkReply (logisticspipes.utils.SinkReply)1 ItemIdentifier (logisticspipes.utils.item.ItemIdentifier)1