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;
}
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);
}
}
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());
}
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);
}
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;
}
Aggregations