Search in sources :

Example 31 with ItemStack

use of org.bukkit.inventory.ItemStack in project Denizen-For-Bukkit by DenizenScript.

the class dInventory method containsItem.

public boolean containsItem(dItem item, int amount) {
    if (item == null) {
        return false;
    }
    item = new dItem(item.getItemStack().clone());
    item.setAmount(1);
    String myItem = CoreUtilities.toLowerCase(item.getFullString());
    for (int i = 0; i < inventory.getSize(); i++) {
        ItemStack is = inventory.getItem(i);
        if (is == null) {
            continue;
        }
        is = is.clone();
        int count = is.getAmount();
        is.setAmount(1);
        String newItem = CoreUtilities.toLowerCase(new dItem(is).getFullString());
        if (myItem.equals(newItem)) {
            if (count <= amount) {
                amount -= count;
                if (amount == 0) {
                    return true;
                }
            } else if (count > amount) {
                return true;
            }
        }
    }
    return false;
}
Also used : ItemStack(org.bukkit.inventory.ItemStack)

Example 32 with ItemStack

use of org.bukkit.inventory.ItemStack in project Denizen-For-Bukkit by DenizenScript.

the class dInventory method setContents.

public void setContents(dList list) {
    int size;
    if (inventory == null) {
        size = (int) Math.ceil(list.size() / 9) * 9;
        if (size == 0) {
            size = 9;
        }
        inventory = Bukkit.getServer().createInventory(null, size);
        loadIdentifiers();
    } else {
        size = inventory.getSize();
    }
    ItemStack[] contents = new ItemStack[size];
    int filled = 0;
    for (dItem item : list.filter(dItem.class)) {
        contents[filled] = item.getItemStack();
        filled++;
    }
    final ItemStack air = new ItemStack(Material.AIR);
    while (filled < size) {
        contents[filled] = air;
        filled++;
    }
    inventory.setContents(contents);
    if (Depends.citizens != null && dNPC.matches(idHolder)) {
        // TODO: Directly store holder
        dNPC.valueOf(idHolder).getInventoryTrait().setContents(contents);
    }
}
Also used : ItemStack(org.bukkit.inventory.ItemStack)

Example 33 with ItemStack

use of org.bukkit.inventory.ItemStack in project Denizen-For-Bukkit by DenizenScript.

the class FishingTrait method reel.

// <--[action]
// @Actions
// reel in fishing rod
//
// @Triggers when the NPC reels in its fishing rod.
//
// @Context
// None
//
// -->
private void reel() {
    DenizenAPI.getDenizenNPC(npc).action("reel in fishing rod", null);
    int chance = (int) (Math.random() * 100);
    try {
        fishHook.remove();
    } catch (Exception e) {
    }
    if (catchPercent > chance && fishHook != null && catchType != FishingHelper.CatchType.NONE) {
        try {
            fish.remove();
        } catch (Exception e) {
        }
        Location location = fishHook.getLocation();
        ItemStack result = NMSHandler.getInstance().getFishingHelper().getResult(fishHook, catchType);
        if (result != null) {
            fish = location.getWorld().dropItem(location, result);
            Location npcLocation = npc.getEntity().getLocation();
            double d5 = npcLocation.getX() - location.getX();
            double d6 = npcLocation.getY() - location.getY();
            double d7 = npcLocation.getZ() - location.getZ();
            double d8 = Math.sqrt(d5 * d5 + d6 * d6 + d7 * d7);
            double d9 = 0.1D;
            fish.setVelocity(new Vector(d5 * d9, d6 * d9 + Math.sqrt(d8) * 0.08D, d7 * d9));
        }
        DenizenAPI.getDenizenNPC(npc).action("catch fish", null);
    }
    PlayerAnimation.ARM_SWING.play((Player) npc.getEntity());
}
Also used : ItemStack(org.bukkit.inventory.ItemStack) Vector(org.bukkit.util.Vector) Location(org.bukkit.Location)

Example 34 with ItemStack

use of org.bukkit.inventory.ItemStack in project Denizen-For-Bukkit by DenizenScript.

the class dInventory method getAttribute.

////////////////////////
//  Attributes
/////////////////////
public String getAttribute(Attribute attribute) {
    if (attribute == null) {
        return null;
    }
    // -->
    if (attribute.startsWith("empty_slots")) {
        int full = new dInventory(inventory).count(null, true);
        return new Element(inventory.getSize() - full).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("can_fit") && attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
        dItem item = dItem.valueOf(attribute.getContext(1));
        if (item == null) {
            return null;
        }
        int attribs = 1;
        int qty = 1;
        InventoryType type = inventory.getType();
        dInventory dummyInv = new dInventory(Bukkit.createInventory(null, type == InventoryType.PLAYER ? InventoryType.CHEST : type, inventory.getTitle()));
        ItemStack[] contents = getStorageContents();
        if (dummyInv.getInventoryType() == InventoryType.CHEST) {
            dummyInv.setSize(contents.length);
        }
        if (contents.length != dummyInv.getSize()) {
            contents = Arrays.copyOf(contents, dummyInv.getSize());
        }
        dummyInv.setContents(contents);
        // -->
        if ((attribute.getAttribute(2).startsWith("quantity") || attribute.getAttribute(2).startsWith("qty")) && attribute.hasContext(2) && aH.matchesInteger(attribute.getContext(2))) {
            qty = attribute.getIntContext(2);
            attribs = 2;
        }
        item.setAmount(qty);
        List<ItemStack> leftovers = dummyInv.addWithLeftovers(0, true, item.getItemStack());
        return new Element(leftovers.isEmpty()).getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("include") && attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
        dItem item = dItem.valueOf(attribute.getContext(1));
        if (item == null) {
            return null;
        }
        int attribs = 1;
        int qty = 1;
        dInventory dummyInv = new dInventory(Bukkit.createInventory(null, inventory.getType(), inventory.getTitle()));
        if (inventory.getType() == InventoryType.CHEST) {
            dummyInv.setSize(inventory.getSize());
        }
        dummyInv.setContents(getContents());
        // -->
        if ((attribute.getAttribute(2).startsWith("quantity") || attribute.getAttribute(2).startsWith("qty")) && attribute.hasContext(2) && aH.matchesInteger(attribute.getContext(2))) {
            qty = attribute.getIntContext(2);
            attribs = 2;
        }
        item.setAmount(qty);
        dummyInv.add(0, item.getItemStack());
        return dummyInv.getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("is_empty")) {
        boolean empty = true;
        for (ItemStack item : getStorageContents()) {
            if (item != null && item.getType() != Material.AIR) {
                empty = false;
                break;
            }
        }
        return new Element(empty).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("is_full")) {
        boolean full = true;
        for (ItemStack item : getStorageContents()) {
            if ((item == null) || (item.getType() == Material.AIR) || (item.getAmount() < item.getMaxStackSize())) {
                full = false;
                break;
            }
        }
        return new Element(full).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("contains.display") && attribute.hasContext(2)) {
        String search_string = attribute.getContext(2);
        boolean strict = false;
        if (CoreUtilities.toLowerCase(search_string).startsWith("strict:") && search_string.length() > 7) {
            strict = true;
            search_string = search_string.substring(7);
        }
        if (search_string.length() == 0) {
            return null;
        }
        int qty = 1;
        int attribs = 2;
        // -->
        if ((attribute.getAttribute(3).startsWith("quantity") || attribute.getAttribute(3).startsWith("qty")) && attribute.hasContext(3) && aH.matchesInteger(attribute.getContext(3))) {
            qty = attribute.getIntContext(3);
            attribs = 3;
        }
        int found_items = 0;
        if (strict) {
            for (ItemStack item : getContents()) {
                if (item != null && item.getType() == Material.WRITTEN_BOOK && ((BookMeta) item.getItemMeta()).getTitle().equalsIgnoreCase(search_string)) {
                    found_items += item.getAmount();
                    if (found_items >= qty) {
                        break;
                    }
                } else if (item != null && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equalsIgnoreCase(search_string)) {
                    found_items += item.getAmount();
                    if (found_items >= qty) {
                        break;
                    }
                }
            }
        } else {
            for (ItemStack item : getContents()) {
                if (item != null && item.getType() == Material.WRITTEN_BOOK && CoreUtilities.toLowerCase(((BookMeta) item.getItemMeta()).getTitle()).contains(CoreUtilities.toLowerCase(search_string))) {
                    found_items += item.getAmount();
                    if (found_items >= qty) {
                        break;
                    }
                } else if (item != null && item.hasItemMeta() && item.getItemMeta().hasDisplayName() && CoreUtilities.toLowerCase(item.getItemMeta().getDisplayName()).contains(CoreUtilities.toLowerCase(search_string))) {
                    found_items += item.getAmount();
                    if (found_items >= qty) {
                        break;
                    }
                }
            }
        }
        return new Element(found_items >= qty).getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("contains.lore") && attribute.hasContext(2)) {
        String search_string = attribute.getContext(2);
        boolean strict = false;
        if (CoreUtilities.toLowerCase(search_string).startsWith("strict:")) {
            strict = true;
            search_string = search_string.substring(7);
        }
        if (search_string.length() == 0) {
            return null;
        }
        dList lore = dList.valueOf(search_string);
        int qty = 1;
        int attribs = 2;
        // -->
        if ((attribute.getAttribute(3).startsWith("quantity") || attribute.getAttribute(3).startsWith("qty")) && attribute.hasContext(3) && aH.matchesInteger(attribute.getContext(3))) {
            qty = attribute.getIntContext(3);
            attribs = 3;
        }
        int found_items = 0;
        if (strict) {
            strict_items: for (ItemStack item : getContents()) {
                if (item != null && item.hasItemMeta() && item.getItemMeta().hasLore()) {
                    List<String> item_lore = item.getItemMeta().getLore();
                    if (lore.size() != item_lore.size()) {
                        continue;
                    }
                    for (int i = 0; i < item_lore.size(); i++) {
                        if (lore.get(i).equalsIgnoreCase(item_lore.get(i))) {
                            if (i == lore.size()) {
                                found_items += item.getAmount();
                                if (found_items >= qty) {
                                    break strict_items;
                                }
                            }
                        } else {
                            continue strict_items;
                        }
                    }
                }
            }
        } else {
            for (ItemStack item : getContents()) {
                if (item != null && item.hasItemMeta() && item.getItemMeta().hasLore()) {
                    List<String> item_lore = item.getItemMeta().getLore();
                    int loreCount = 0;
                    lines: for (String line : lore) {
                        for (String item_line : item_lore) {
                            if (CoreUtilities.toLowerCase(item_line).contains(CoreUtilities.toLowerCase(line))) {
                                loreCount++;
                                continue lines;
                            }
                        }
                    }
                    if (loreCount == lore.size()) {
                        found_items += item.getAmount();
                        if (found_items >= qty) {
                            break;
                        }
                    }
                }
            }
        }
        return new Element(found_items >= qty).getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("contains.material") && attribute.hasContext(2) && dMaterial.matches(attribute.getContext(2))) {
        dMaterial material = dMaterial.valueOf(attribute.getContext(2));
        int qty = 1;
        int attribs = 2;
        // -->
        if ((attribute.getAttribute(3).startsWith("quantity") || attribute.getAttribute(3).startsWith("qty")) && attribute.hasContext(3) && aH.matchesInteger(attribute.getContext(3))) {
            qty = attribute.getIntContext(3);
            attribs = 3;
        }
        int found_items = 0;
        for (ItemStack item : getContents()) {
            if (item != null && item.getType() == material.getMaterial()) {
                found_items += item.getAmount();
                if (found_items >= qty) {
                    break;
                }
            }
        }
        return new Element(found_items >= qty).getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("contains_any") && attribute.hasContext(1)) {
        dList list = dList.valueOf(attribute.getContext(1));
        if (list.isEmpty()) {
            return null;
        }
        int qty = 1;
        int attribs = 1;
        // -->
        if ((attribute.getAttribute(2).startsWith("quantity") || attribute.getAttribute(2).startsWith("qty")) && attribute.hasContext(2) && aH.matchesInteger(attribute.getContext(2))) {
            qty = attribute.getIntContext(2);
            attribs = 2;
        }
        List<dItem> contains = list.filter(dItem.class, attribute.getScriptEntry());
        if (!contains.isEmpty()) {
            for (dItem item : contains) {
                if (containsItem(item, qty)) {
                    return Element.TRUE.getAttribute(attribute.fulfill(attribs));
                }
            }
        }
        return Element.FALSE.getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("contains") && attribute.hasContext(1)) {
        dList list = dList.valueOf(attribute.getContext(1));
        if (list.isEmpty()) {
            return null;
        }
        int qty = 1;
        int attribs = 1;
        // -->
        if ((attribute.getAttribute(2).startsWith("quantity") || attribute.getAttribute(2).startsWith("qty")) && attribute.hasContext(2) && aH.matchesInteger(attribute.getContext(2))) {
            qty = attribute.getIntContext(2);
            attribs = 2;
        }
        // TODO: Fix logic
        List<dItem> contains = list.filter(dItem.class, attribute.getScriptEntry());
        if (!contains.isEmpty()) {
            for (dItem item : contains) {
                if (containsItem(item, qty)) {
                    return Element.TRUE.getAttribute(attribute.fulfill(attribs));
                }
            }
        }
        return Element.FALSE.getAttribute(attribute.fulfill(attribs));
    }
    // -->
    if (attribute.startsWith("first_empty")) {
        return new Element(firstEmpty(0)).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("find.material") && attribute.hasContext(2) && dMaterial.matches(attribute.getContext(2))) {
        dMaterial material = dMaterial.valueOf(attribute.getContext(2));
        if (material == null) {
            return null;
        }
        int slot = -1;
        for (int i = 0; i < inventory.getSize(); i++) {
            if (inventory.getItem(i) != null && inventory.getItem(i).getType() == material.getMaterial()) {
                slot = i + 1;
                break;
            }
        }
        return new Element(slot).getAttribute(attribute.fulfill(2));
    }
    // -->
    if (attribute.startsWith("find_imperfect") && attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
        dItem item = dItem.valueOf(attribute.getContext(1), attribute.getScriptEntry() != null ? ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getPlayer() : null, attribute.getScriptEntry() != null ? ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getNPC() : null);
        item.setAmount(1);
        int slot = -1;
        for (int i = 0; i < inventory.getSize(); i++) {
            if (inventory.getItem(i) != null) {
                dItem compare_to = new dItem(inventory.getItem(i).clone());
                compare_to.setAmount(1);
                if (item.identify().equalsIgnoreCase(compare_to.identify())) {
                    slot = i + 1;
                    break;
                }
            }
        }
        return new Element(slot).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("find") && attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
        dItem item = dItem.valueOf(attribute.getContext(1), attribute.getScriptEntry() != null ? ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getPlayer() : null, attribute.getScriptEntry() != null ? ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getNPC() : null);
        item.setAmount(1);
        int slot = -1;
        for (int i = 0; i < inventory.getSize(); i++) {
            if (inventory.getItem(i) != null) {
                dItem compare_to = new dItem(inventory.getItem(i).clone());
                compare_to.setAmount(1);
                if (item.getFullString().equalsIgnoreCase(compare_to.getFullString())) {
                    slot = i + 1;
                    break;
                }
            }
        }
        return new Element(slot).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("id_type")) {
        return new Element(idType).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("notable_name")) {
        String notname = NotableManager.getSavedId(this);
        if (notname == null) {
            return null;
        }
        return new Element(notname).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("location")) {
        dLocation location = getLocation();
        if (location == null) {
            return null;
        }
        return location.getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("quantity") || attribute.startsWith("qty")) {
        if (attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
            return new Element(count(dItem.valueOf(attribute.getContext(1), ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getPlayer(), ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getNPC()).getItemStack(), false)).getAttribute(attribute.fulfill(1));
        } else {
            return new Element(count(null, false)).getAttribute(attribute.fulfill(1));
        }
    }
    // -->
    if (attribute.startsWith("stacks")) {
        if (attribute.hasContext(1) && dItem.matches(attribute.getContext(1))) {
            return new Element(count(dItem.valueOf(attribute.getContext(1), ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getPlayer(), ((BukkitScriptEntryData) attribute.getScriptEntry().entryData).getNPC()).getItemStack(), true)).getAttribute(attribute.fulfill(1));
        } else {
            return new Element(count(null, true)).getAttribute(attribute.fulfill(1));
        }
    }
    // -->
    if (attribute.startsWith("slot") && attribute.hasContext(1) && aH.matchesInteger(attribute.getContext(1))) {
        int slot = new Element(attribute.getContext(1)).asInt() - 1;
        if (slot < 0) {
            slot = 0;
        } else if (slot > getInventory().getSize() - 1) {
            slot = getInventory().getSize() - 1;
        }
        return new dItem(getInventory().getItem(slot)).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("inventory_type")) {
        return new Element(inventory instanceof HorseInventory ? "HORSE" : getInventory().getType().name()).getAttribute(attribute.fulfill(1));
    }
    // -->
    if (attribute.startsWith("equipment")) {
        dList equipment = getEquipment();
        if (equipment == null) {
            return null;
        }
        return equipment.getAttribute(attribute.fulfill(1));
    }
    if (inventory instanceof CraftingInventory) {
        CraftingInventory craftingInventory = (CraftingInventory) inventory;
        // -->
        if (attribute.startsWith("matrix")) {
            dList recipeList = new dList();
            for (ItemStack item : craftingInventory.getMatrix()) {
                if (item != null) {
                    recipeList.add(new dItem(item).identify());
                } else {
                    recipeList.add(new dItem(Material.AIR).identify());
                }
            }
            return recipeList.getAttribute(attribute.fulfill(1));
        }
        // -->
        if (attribute.startsWith("result")) {
            ItemStack result = craftingInventory.getResult();
            if (result == null) {
                return null;
            }
            return new dItem(result).getAttribute(attribute.fulfill(1));
        }
    }
    // -->
    if (attribute.startsWith("type")) {
        return new Element("Inventory").getAttribute(attribute.fulfill(1));
    }
    // Iterate through this object's properties' attributes
    for (Property property : PropertyParser.getProperties(this)) {
        String returned = property.getAttribute(attribute);
        if (returned != null) {
            return returned;
        }
    }
    return new Element(identify()).getAttribute(attribute);
}
Also used : CraftingInventory(org.bukkit.inventory.CraftingInventory) InventoryType(org.bukkit.event.inventory.InventoryType) BukkitScriptEntryData(net.aufdemrand.denizen.BukkitScriptEntryData) HorseInventory(org.bukkit.inventory.HorseInventory) ItemStack(org.bukkit.inventory.ItemStack) BookMeta(org.bukkit.inventory.meta.BookMeta) Property(net.aufdemrand.denizencore.objects.properties.Property)

Example 35 with ItemStack

use of org.bukkit.inventory.ItemStack in project Denizen-For-Bukkit by DenizenScript.

the class dInventory method addWithLeftovers.

public List<ItemStack> addWithLeftovers(int slot, boolean keepMaxStackSize, ItemStack... items) {
    if (inventory == null || items == null) {
        return null;
    }
    List<ItemStack> leftovers = new ArrayList<ItemStack>();
    for (int i = 0; i < items.length; i++) {
        ItemStack item = items[i];
        if (item == null) {
            continue;
        }
        int amount = item.getAmount();
        int max;
        if (keepMaxStackSize) {
            max = item.getMaxStackSize();
        } else {
            max = 64;
        }
        while (true) {
            // Do we already have a stack of it?
            int firstPartial = firstPartial(slot, item);
            // Drat! no partial stack
            if (firstPartial == -1) {
                // Find a free spot!
                int firstFree = firstEmpty(slot);
                if (firstFree == -1) {
                    // No space at all!
                    leftovers.add(item);
                    break;
                } else {
                    // More than a single stack!
                    if (amount > max) {
                        ItemStack clone = item.clone();
                        clone.setAmount(max);
                        inventory.setItem(firstFree, clone);
                        item.setAmount(amount -= max);
                    } else {
                        // Just store it
                        inventory.setItem(firstFree, item);
                        break;
                    }
                }
            } else {
                // So, apparently it might only partially fit, well lets do just that
                ItemStack partialItem = inventory.getItem(firstPartial);
                int partialAmount = partialItem.getAmount();
                int total = amount + partialAmount;
                // Check if it fully fits
                if (total <= max) {
                    partialItem.setAmount(total);
                    break;
                }
                // It fits partially
                partialItem.setAmount(max);
                item.setAmount(amount = total - max);
            }
        }
    }
    return leftovers;
}
Also used : ItemStack(org.bukkit.inventory.ItemStack)

Aggregations

ItemStack (org.bukkit.inventory.ItemStack)1282 Player (org.bukkit.entity.Player)262 EventHandler (org.bukkit.event.EventHandler)183 ItemMeta (org.bukkit.inventory.meta.ItemMeta)167 ArrayList (java.util.ArrayList)130 Inventory (org.bukkit.inventory.Inventory)115 Location (org.bukkit.Location)88 Material (org.bukkit.Material)87 PlayerInventory (org.bukkit.inventory.PlayerInventory)84 Entity (org.bukkit.entity.Entity)63 Block (org.bukkit.block.Block)52 TagCompound (de.keyle.knbt.TagCompound)47 Map (java.util.Map)44 LivingEntity (org.bukkit.entity.LivingEntity)44 HashMap (java.util.HashMap)40 Mage (com.elmakers.mine.bukkit.api.magic.Mage)39 Enchantment (org.bukkit.enchantments.Enchantment)38 SkullMeta (org.bukkit.inventory.meta.SkullMeta)38 Vector (org.bukkit.util.Vector)35 Test (org.junit.Test)32