From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Fri, 22 Jun 2018 22:59:18 -0400
Subject: [PATCH] ItemStack API additions for quantity/flags/lore


diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 84a399e0..4a27f4fc 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -0,0 +0,0 @@ package org.bukkit.inventory;
 
 import com.google.common.collect.ImmutableMap;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.Validate;
 import org.bukkit.Bukkit;
@@ -0,0 +0,0 @@ import org.bukkit.inventory.meta.Damageable;
 import org.bukkit.inventory.meta.ItemMeta;
 import org.bukkit.material.MaterialData;
 
+import javax.annotation.Nullable;
+
 /**
  * Represents a stack of items
  */
@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable {
         // Requires access to NMS
         return ensureServerConversions().getMaxItemUseDuration();
     }
+
+    /**
+     * Clones the itemstack and returns it a single quantity.
+     * @return The new itemstack with 1 quantity
+     */
+    public ItemStack asOne() {
+        return asQuantity(1);
+    }
+
+    /**
+     * Clones the itemstack and returns it as the specified quantity
+     * @param qty The quantity of the cloned item
+     * @return The new itemstack with specified quantity
+     */
+    public ItemStack asQuantity(int qty) {
+        ItemStack clone = clone();
+        clone.setAmount(qty);
+        return clone;
+    }
+
+    /**
+     * Adds 1 to this itemstack. Will not go over the items max stack size.
+     * @return The same item (not a clone)
+     */
+    public ItemStack add() {
+        return add(1);
+    }
+
+    /**
+     * Adds quantity to this itemstack. Will not go over the items max stack size.
+     *
+     * @param qty The amount to add
+     * @return The same item (not a clone)
+     */
+    public ItemStack add(int qty) {
+        setAmount(Math.min(getMaxStackSize(), getAmount() + qty));
+        return this;
+    }
+
+    /**
+     * Subtracts 1 to this itemstack.  Going to 0 or less will invalidate the item.
+     * @return The same item (not a clone)
+     */
+    public ItemStack subtract() {
+        return subtract(1);
+    }
+
+    /**
+     * Subtracts quantity to this itemstack. Going to 0 or less will invalidate the item.
+     *
+     * @param qty The amount to add
+     * @return The same item (not a clone)
+     */
+    public ItemStack subtract(int qty) {
+        setAmount(Math.max(0, getAmount() - qty));
+        return this;
+    }
+
+    /**
+     * If the item has lore, returns it, else it will return null
+     * @return The lore, or null
+     */
+    @Nullable
+    public List<String> getLore() {
+        if (!hasItemMeta()) {
+            return null;
+        }
+        ItemMeta itemMeta = getItemMeta();
+        if (!itemMeta.hasLore()) {
+            return null;
+        }
+        return itemMeta.getLore();
+    }
+
+    /**
+     * Sets the lore for this item.
+     * Removes lore when given null.
+     *
+     * @param lore the lore that will be set
+     */
+    public void setLore(List<String> lore) {
+        ItemMeta itemMeta = getItemMeta();
+        itemMeta.setLore(lore);
+        setItemMeta(itemMeta);
+    }
+
+    /**
+     * Set itemflags which should be ignored when rendering a ItemStack in the Client. This Method does silently ignore double set itemFlags.
+     *
+     * @param itemFlags The hideflags which shouldn't be rendered
+     */
+    public void addItemFlags(ItemFlag... itemFlags) {
+        ItemMeta itemMeta = getItemMeta();
+        itemMeta.addItemFlags(itemFlags);
+        setItemMeta(itemMeta);
+    }
+
+    /**
+     * Remove specific set of itemFlags. This tells the Client it should render it again. This Method does silently ignore double removed itemFlags.
+     *
+     * @param itemFlags Hideflags which should be removed
+     */
+    public void removeItemFlags(ItemFlag... itemFlags) {
+        ItemMeta itemMeta = getItemMeta();
+        itemMeta.removeItemFlags(itemFlags);
+        setItemMeta(itemMeta);
+    }
+
+    /**
+     * Get current set itemFlags. The collection returned is unmodifiable.
+     *
+     * @return A set of all itemFlags set
+     */
+    public Set<ItemFlag> getItemFlags() {
+        ItemMeta itemMeta = getItemMeta();
+        return itemMeta.getItemFlags();
+    }
+
+    /**
+     * Check if the specified flag is present on this item.
+     *
+     * @param flag the flag to check
+     * @return if it is present
+     */
+    public boolean hasItemFlag(ItemFlag flag) {
+        ItemMeta itemMeta = getItemMeta();
+        return itemMeta.hasItemFlag(flag);
+    }
     // Paper end
 }
--