Package com.sk89q.craftbook.mechanics.ic.gates.world.items

Source Code of com.sk89q.craftbook.mechanics.ic.gates.world.items.ContainerCollector

package com.sk89q.craftbook.mechanics.ic.gates.world.items;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Item;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;

import com.sk89q.craftbook.ChangedSign;
import com.sk89q.craftbook.bukkit.util.BukkitUtil;
import com.sk89q.craftbook.mechanics.ic.AbstractICFactory;
import com.sk89q.craftbook.mechanics.ic.AbstractSelfTriggeredIC;
import com.sk89q.craftbook.mechanics.ic.ChipState;
import com.sk89q.craftbook.mechanics.ic.IC;
import com.sk89q.craftbook.mechanics.ic.ICFactory;
import com.sk89q.craftbook.mechanics.pipe.PipeRequestEvent;
import com.sk89q.craftbook.util.InventoryUtil;
import com.sk89q.craftbook.util.ItemSyntax;
import com.sk89q.craftbook.util.ItemUtil;
import com.sk89q.craftbook.util.SignUtil;

/**
* @author Me4502
*/
public class ContainerCollector extends AbstractSelfTriggeredIC {

    public ContainerCollector(Server server, ChangedSign sign, ICFactory factory) {

        super(server, sign, factory);
    }

    @Override
    public String getTitle() {

        return "Container Collector";
    }

    @Override
    public String getSignTitle() {

        return "CONTAINER COLLECT";
    }

    @Override
    public void trigger(ChipState chip) {

        if (chip.getInput(0))
            chip.setOutput(0, scanForItems());
    }

    @Override
    public void think(ChipState chip) {

        chip.setOutput(0, scanForItems());
    }

    ItemStack doWant, doNotWant;

    Block chest;

    @Override
    public void load() {

        doWant = ItemSyntax.getItem(getLine(2));
        doNotWant = ItemSyntax.getItem(getLine(3));
        chest = getBackBlock().getRelative(0, 1, 0);
    }

    protected boolean scanForItems() {

        boolean collected = false;
        for (Item item : ItemUtil.getItemsAtBlock(BukkitUtil.toSign(getSign()).getBlock()))
            if(item.isValid() && !item.isDead())
                if(collectItem(item))
                    collected = true;

        return collected;
    }

    public boolean collectItem(Item item) {

        ItemStack stack = item.getItemStack();

        if(!ItemUtil.isStackValid(stack))
            return false;

        // Check to see if it matches either test stack, if not stop
        if (doWant != null && !ItemUtil.areItemsIdentical(doWant, stack))
            return false;

        if (doNotWant != null && ItemUtil.areItemsIdentical(doNotWant, stack))
            return false;

        BlockFace back = SignUtil.getBack(BukkitUtil.toSign(getSign()).getBlock());
        Block pipe = getBackBlock().getRelative(back);

        PipeRequestEvent event = new PipeRequestEvent(pipe, new ArrayList<ItemStack>(Arrays.asList(stack)), getBackBlock());
        Bukkit.getPluginManager().callEvent(event);

        if(event.getItems().isEmpty()) {
            item.remove();
            return true;
        }

        if(!InventoryUtil.doesBlockHaveInventory(chest))
            return false;

        // Add the items to a container, and destroy them.
        List<ItemStack> leftovers = InventoryUtil.addItemsToInventory((InventoryHolder)chest.getState(), stack);
        if(leftovers.isEmpty()) {
            item.remove();
            return true;
        } else {
            if(ItemUtil.areItemsIdentical(leftovers.get(0), stack) && leftovers.get(0).getAmount() != stack.getAmount()) {
                if(!ItemUtil.isStackValid(leftovers.get(0)))
                    item.remove();
                else
                    item.setItemStack(leftovers.get(0));
                return true;
            }
        }

        return false;
    }

    public static class Factory extends AbstractICFactory {

        public Factory(Server server) {

            super(server);
        }

        @Override
        public IC create(ChangedSign sign) {

            return new ContainerCollector(getServer(), sign, this);
        }

        @Override
        public String getShortDescription() {

            return "Collects items into above chest.";
        }

        @Override
        public String[] getLineHelp() {

            return new String[] {"included id:data", "excluded id:data"};
        }
    }
}
TOP

Related Classes of com.sk89q.craftbook.mechanics.ic.gates.world.items.ContainerCollector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.