Search in sources :

Example 6 with Carrier

use of org.spongepowered.api.item.inventory.Carrier 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 7 with Carrier

use of org.spongepowered.api.item.inventory.Carrier 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 8 with Carrier

use of org.spongepowered.api.item.inventory.Carrier 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 9 with Carrier

use of org.spongepowered.api.item.inventory.Carrier in project SpongeCommon by SpongePowered.

the class AdvancementTest method onChangeInventory.

@SuppressWarnings("ConstantConditions")
@Listener
public void onChangeInventory(ChangeInventoryEvent event, @First Player player, @Getter("getTargetInventory") CarriedInventory<?> container) {
    if (!container.getName().get().equals("Furnace")) {
        return;
    }
    final Carrier carrier = container.getCarrier().orElse(null);
    if (!(carrier instanceof Furnace)) {
        return;
    }
    final Furnace furnace = (Furnace) carrier;
    final int passed = furnace.passedBurnTime().get();
    final int max = furnace.maxBurnTime().get();
    if (max <= 0 || passed >= max) {
        return;
    }
    for (SlotTransaction transaction : event.getTransactions()) {
        if (transaction.getSlot().getInventoryProperty(SlotIndex.class).get().getValue() == 0) {
            if (transaction.getFinal().getType() == ItemTypes.DIRT) {
                player.getProgress(this.cookDirtAdvancement).grant();
            } else if (this.suicidalAdvancement != null && (transaction.getFinal().getType() == ItemTypes.TNT || transaction.getFinal().getType() == ItemTypes.TNT_MINECART)) {
                player.getProgress(this.suicidalAdvancement).grant();
                final Explosion explosion = Explosion.builder().location(furnace.getLocation()).shouldBreakBlocks(true).canCauseFire(true).shouldDamageEntities(true).radius(7).build();
                explosion.getWorld().triggerExplosion(explosion);
            }
        }
    }
}
Also used : Explosion(org.spongepowered.api.world.explosion.Explosion) SlotIndex(org.spongepowered.api.item.inventory.property.SlotIndex) Carrier(org.spongepowered.api.item.inventory.Carrier) Furnace(org.spongepowered.api.block.tileentity.carrier.Furnace) SlotTransaction(org.spongepowered.api.item.inventory.transaction.SlotTransaction) Listener(org.spongepowered.api.event.Listener)

Example 10 with Carrier

use of org.spongepowered.api.item.inventory.Carrier in project SpongeCommon by SpongePowered.

the class CustomInventoryTest method interactCarrier.

private void interactCarrier(InteractBlockEvent.Primary event, Player player, Location<World> loc) {
    loc.getTileEntity().ifPresent(te -> {
        if (te instanceof Carrier) {
            BasicCarrier myCarrier = new BasicCarrier();
            Inventory custom = Inventory.builder().from(((Carrier) te).getInventory()).property(InventoryTitle.PROPERTY_NAME, InventoryTitle.of(Text.of("Custom ", ((Carrier) te).getInventory().getName()))).withCarrier(myCarrier).build(this);
            myCarrier.init(custom);
            Sponge.getCauseStackManager().pushCause(player);
            player.openInventory(custom);
            Sponge.getCauseStackManager().popCause();
            event.setCancelled(true);
        }
    });
}
Also used : Carrier(org.spongepowered.api.item.inventory.Carrier) Inventory(org.spongepowered.api.item.inventory.Inventory) CarriedInventory(org.spongepowered.api.item.inventory.type.CarriedInventory)

Aggregations

Carrier (org.spongepowered.api.item.inventory.Carrier)17 Inventory (org.spongepowered.api.item.inventory.Inventory)10 World (org.spongepowered.api.world.World)8 ItemStack (org.spongepowered.api.item.inventory.ItemStack)7 Listener (org.spongepowered.api.event.Listener)5 TileEntity (org.spongepowered.api.block.tileentity.TileEntity)4 Map (java.util.Map)3 DuctData (org.cubeengine.module.itemduct.data.DuctData)3 LanternItemStack (org.lanternpowered.server.inventory.LanternItemStack)3 Chest (org.spongepowered.api.block.tileentity.carrier.Chest)3 Direction (org.spongepowered.api.util.Direction)3 Vector3d (com.flowpowered.math.vector.Vector3d)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 CauseStack (org.lanternpowered.server.event.CauseStack)2 BlockType (org.spongepowered.api.block.BlockType)2 Entity (org.spongepowered.api.entity.Entity)2 Player (org.spongepowered.api.entity.living.player.Player)2 Container (org.spongepowered.api.item.inventory.Container)2