Search in sources :

Example 1 with Chest

use of org.spongepowered.api.block.tileentity.carrier.Chest in project AdamantineShield by Karanum.

the class InventoryChangeListener method onInventoryTransfer.

@Listener
public void onInventoryTransfer(AffectSlotEvent e, @First Player p) {
    if (e.getTransactions().isEmpty())
        return;
    if (!(e.getTransactions().get(0).getSlot().parent() instanceof CarriedInventory))
        return;
    BlockCarrier carrier = null;
    CarriedInventory<?> c = (CarriedInventory<?>) e.getTransactions().get(0).getSlot().parent();
    if (c.getCarrier().get() instanceof BlockCarrier) {
        carrier = (BlockCarrier) c.getCarrier().get();
    }
    if (carrier == null)
        return;
    if (!logContainers && !(carrier instanceof Chest))
        return;
    long timestamp = new Date().getTime();
    int containerSize = c.iterator().next().capacity();
    for (SlotTransaction transaction : e.getTransactions()) {
        int slotId = transaction.getSlot().getProperty(SlotIndex.class, "slotindex").map(SlotIndex::getValue).orElse(-1);
        if (slotId >= containerSize)
            continue;
        ItemStackSnapshot origItem = transaction.getOriginal();
        ItemStackSnapshot finalItem = transaction.getFinal();
        if (origItem == finalItem)
            continue;
        if (origItem.createGameDictionaryEntry().matches(finalItem.createStack()) && ItemStackComparators.ITEM_DATA.compare(origItem.createStack(), finalItem.createStack()) == 0) {
            if (origItem.getQuantity() > finalItem.getQuantity()) {
                ItemStackSnapshot stack = ItemStack.builder().itemType(origItem.getType()).quantity(origItem.getQuantity() - finalItem.getQuantity()).build().createSnapshot();
                db.addToQueue(new InventoryQueueEntry(carrier, slotId, stack, ActionType.CONTAINER_REMOVE, p, timestamp));
            } else if (origItem.getQuantity() < finalItem.getQuantity()) {
                ItemStackSnapshot stack = ItemStack.builder().itemType(origItem.getType()).quantity(finalItem.getQuantity() - origItem.getQuantity()).build().createSnapshot();
                db.addToQueue(new InventoryQueueEntry(carrier, slotId, stack, ActionType.CONTAINER_ADD, p, timestamp));
            }
        } else {
            if (origItem.getType() != ItemTypes.NONE) {
                db.addToQueue(new InventoryQueueEntry(carrier, slotId, origItem, ActionType.CONTAINER_REMOVE, p, timestamp));
            }
            if (finalItem.getType() != ItemTypes.NONE) {
                db.addToQueue(new InventoryQueueEntry(carrier, slotId, finalItem, ActionType.CONTAINER_ADD, p, timestamp));
            }
        }
    }
}
Also used : Chest(org.spongepowered.api.block.tileentity.carrier.Chest) BlockCarrier(org.spongepowered.api.item.inventory.BlockCarrier) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) InventoryQueueEntry(com.karanumcoding.adamantineshield.db.queue.InventoryQueueEntry) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) SlotTransaction(org.spongepowered.api.item.inventory.transaction.SlotTransaction) Date(java.util.Date) Listener(org.spongepowered.api.event.Listener)

Example 2 with Chest

use of org.spongepowered.api.block.tileentity.carrier.Chest in project modules-extra by CubeEngine.

the class ItemDuctTransferListener method activate.

private void activate() {
    List<Network> networks = new ArrayList<>();
    for (Iterator<Location<World>> it = this.promptedActivations.keySet().iterator(); it.hasNext(); ) {
        Location<World> loc = it.next();
        if (this.promptedActivations.get(loc) - 1000 > System.currentTimeMillis()) {
            promptedActivations.clear();
            continue;
        }
        it.remove();
        // Check if data is still present
        Optional<DuctData> data = loc.get(DuctData.class);
        if (data.isPresent()) {
            for (Direction dir : Direction.values()) {
                if (dir.isCardinal() || dir.isUpright()) {
                    BlockType type = loc.getRelative(dir).getBlockType();
                    if (STICKY_PISTON.equals(type) || OBSERVER.equals(type)) {
                        Optional<List<ItemStack>> filters = data.get().get(dir);
                        if (filters.isPresent()) {
                            Network network = manager.findNetwork(loc.getRelative(dir));
                            TileEntity te = loc.getTileEntity().get();
                            Inventory inventory = ((Carrier) te).getInventory();
                            if (te instanceof Chest) {
                                inventory = ((Chest) te).getDoubleChestInventory().orElse(inventory);
                            }
                            network.activate(inventory, filters.get());
                            networks.add(network);
                        }
                    }
                }
            }
        }
    }
    for (Network network : networks) {
        for (Location<World> exitLoc : network.exitPoints.keySet()) {
            Direction exitDir = exitLoc.get(Keys.DIRECTION).orElse(Direction.NONE).getOpposite();
            exitLoc = exitLoc.getRelative(exitDir.getOpposite());
            promptActivation(exitLoc.getTileEntity().filter(t -> t instanceof Carrier).map(Carrier.class::cast).orElse(null), true, null);
        }
    }
    if (promptedActivations.isEmpty()) {
        task.cancel();
    }
}
Also used : Inventory(org.spongepowered.api.item.inventory.Inventory) Chest(org.spongepowered.api.block.tileentity.carrier.Chest) Getter(org.spongepowered.api.event.filter.Getter) Keys(org.spongepowered.api.data.key.Keys) HashMap(java.util.HashMap) Itemduct(org.cubeengine.module.itemduct.Itemduct) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) Network(org.cubeengine.module.itemduct.Network) OBSERVER(org.spongepowered.api.block.BlockTypes.OBSERVER) ItemStack(org.spongepowered.api.item.inventory.ItemStack) TileEntity(org.spongepowered.api.block.tileentity.TileEntity) BlockCarrier(org.spongepowered.api.item.inventory.BlockCarrier) Map(java.util.Map) Task(org.spongepowered.api.scheduler.Task) InteractBlockEvent(org.spongepowered.api.event.block.InteractBlockEvent) PluginContainer(org.spongepowered.api.plugin.PluginContainer) ItemDuctManager(org.cubeengine.module.itemduct.ItemDuctManager) Location(org.spongepowered.api.world.Location) Iterator(java.util.Iterator) STICKY_PISTON(org.spongepowered.api.block.BlockTypes.STICKY_PISTON) Sponge(org.spongepowered.api.Sponge) InteractInventoryEvent(org.spongepowered.api.event.item.inventory.InteractInventoryEvent) Carrier(org.spongepowered.api.item.inventory.Carrier) Root(org.spongepowered.api.event.filter.cause.Root) Direction(org.spongepowered.api.util.Direction) List(java.util.List) Container(org.spongepowered.api.item.inventory.Container) MultiBlockCarrier(org.spongepowered.api.item.inventory.MultiBlockCarrier) ChangeInventoryEvent(org.spongepowered.api.event.item.inventory.ChangeInventoryEvent) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) World(org.spongepowered.api.world.World) BlockType(org.spongepowered.api.block.BlockType) HandTypes(org.spongepowered.api.data.type.HandTypes) Optional(java.util.Optional) Player(org.spongepowered.api.entity.living.player.Player) Listener(org.spongepowered.api.event.Listener) DuctData(org.cubeengine.module.itemduct.data.DuctData) Chest(org.spongepowered.api.block.tileentity.carrier.Chest) ArrayList(java.util.ArrayList) World(org.spongepowered.api.world.World) Direction(org.spongepowered.api.util.Direction) TileEntity(org.spongepowered.api.block.tileentity.TileEntity) BlockType(org.spongepowered.api.block.BlockType) Network(org.cubeengine.module.itemduct.Network) DuctData(org.cubeengine.module.itemduct.data.DuctData) ArrayList(java.util.ArrayList) List(java.util.List) BlockCarrier(org.spongepowered.api.item.inventory.BlockCarrier) Carrier(org.spongepowered.api.item.inventory.Carrier) MultiBlockCarrier(org.spongepowered.api.item.inventory.MultiBlockCarrier) Inventory(org.spongepowered.api.item.inventory.Inventory) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory) Location(org.spongepowered.api.world.Location)

Example 3 with Chest

use of org.spongepowered.api.block.tileentity.carrier.Chest in project modules-extra by CubeEngine.

the class Network method activate.

public void activate(Inventory inventory, List<ItemStack> filters) {
    if (isStorage()) {
        pullFromStorage(inventory, filters);
        return;
    }
    for (Map.Entry<Location<World>, DuctData> entry : exitPoints.entrySet()) {
        Inventory pollFrom = inventory;
        Location<World> loc = entry.getKey();
        DuctData data = entry.getValue();
        Direction dir = loc.get(Keys.DIRECTION).orElse(Direction.NONE).getOpposite();
        Location<World> targetLoc = loc.getRelative(dir.getOpposite());
        TileEntity te = targetLoc.getTileEntity().get();
        Inventory target = ((Carrier) te).getInventory();
        if (te instanceof Dropper) {
            Network nw = manager.findNetwork(targetLoc);
            nw.transferToStorage(queryFiltered(filters, inventory), data.get(dir).get());
            continue;
        }
        if (te instanceof Chest) {
            target = ((Chest) te).getDoubleChestInventory().orElse(target);
        }
        Optional<List<ItemStack>> targetFilter = data.get(dir);
        if (targetFilter.isPresent()) {
            if (// Only allow to extract items in the filter
            !filters.isEmpty()) {
                // TODO more filters
                pollFrom = queryFiltered(filters, inventory);
            }
            Inventory pollFromTo = pollFrom;
            if (// Only allow to insert items in the filter
            !targetFilter.get().isEmpty()) {
                // TODO more filters
                pollFromTo = queryFiltered(targetFilter.get(), inventory);
            }
            // For all filtered slots
            doTransfer(pollFromTo, target);
        }
    }
}
Also used : Chest(org.spongepowered.api.block.tileentity.carrier.Chest) World(org.spongepowered.api.world.World) Direction(org.spongepowered.api.util.Direction) Dropper(org.spongepowered.api.block.tileentity.carrier.Dropper) TileEntity(org.spongepowered.api.block.tileentity.TileEntity) DuctData(org.cubeengine.module.itemduct.data.DuctData) List(java.util.List) Carrier(org.spongepowered.api.item.inventory.Carrier) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) Inventory(org.spongepowered.api.item.inventory.Inventory) Location(org.spongepowered.api.world.Location)

Example 4 with Chest

use of org.spongepowered.api.block.tileentity.carrier.Chest in project modules-extra by CubeEngine.

the class Network method transferToStorage.

private void transferToStorage(Inventory inventory, List<ItemStack> filters) {
    if (// Only allow to extract items in the filter
    !filters.isEmpty()) {
        // TODO more filters
        inventory = queryFiltered(filters, inventory);
    }
    for (Location<World> targetLoc : storage) {
        TileEntity te = targetLoc.getTileEntity().get();
        Inventory target = ((Carrier) te).getInventory();
        if (te instanceof Chest) {
            target = ((Chest) te).getDoubleChestInventory().orElse(target);
        }
        doTransfer(inventory, target);
    }
}
Also used : TileEntity(org.spongepowered.api.block.tileentity.TileEntity) Chest(org.spongepowered.api.block.tileentity.carrier.Chest) Carrier(org.spongepowered.api.item.inventory.Carrier) World(org.spongepowered.api.world.World) Inventory(org.spongepowered.api.item.inventory.Inventory)

Example 5 with Chest

use of org.spongepowered.api.block.tileentity.carrier.Chest in project modules-extra by CubeEngine.

the class Network method pullFromStorage.

private void pullFromStorage(Inventory inventory, List<ItemStack> filters) {
    for (Location<World> targetLoc : storage) {
        TileEntity te = targetLoc.getTileEntity().get();
        Inventory pollFrom = ((Carrier) te).getInventory();
        if (te instanceof Chest) {
            pollFrom = ((Chest) te).getDoubleChestInventory().orElse(pollFrom);
        }
        if (// Only allow to extract items in the filter
        !filters.isEmpty()) {
            // TODO more filters
            pollFrom = queryFiltered(filters, inventory);
        }
        doTransfer(pollFrom, inventory);
    }
}
Also used : TileEntity(org.spongepowered.api.block.tileentity.TileEntity) Chest(org.spongepowered.api.block.tileentity.carrier.Chest) Carrier(org.spongepowered.api.item.inventory.Carrier) World(org.spongepowered.api.world.World) Inventory(org.spongepowered.api.item.inventory.Inventory)

Aggregations

Chest (org.spongepowered.api.block.tileentity.carrier.Chest)8 TileEntity (org.spongepowered.api.block.tileentity.TileEntity)6 World (org.spongepowered.api.world.World)6 Carrier (org.spongepowered.api.item.inventory.Carrier)4 Inventory (org.spongepowered.api.item.inventory.Inventory)4 Listener (org.spongepowered.api.event.Listener)3 Direction (org.spongepowered.api.util.Direction)3 HashSet (java.util.HashSet)2 List (java.util.List)2 Map (java.util.Map)2 DuctData (org.cubeengine.module.itemduct.data.DuctData)2 BlockCarrier (org.spongepowered.api.item.inventory.BlockCarrier)2 CarriedInventory (org.spongepowered.api.item.inventory.type.CarriedInventory)2 Location (org.spongepowered.api.world.Location)2 InventoryQueueEntry (com.karanumcoding.adamantineshield.db.queue.InventoryQueueEntry)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 LinkedHashMap (java.util.LinkedHashMap)1