mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appears to apply and compile correctly Paper Changes: 54890033 [Auto] Updated Upstream (CraftBukkit) f96c6f5c [Auto] Updated Upstream (CraftBukkit) 4be8312f [CI-SKIP] [Auto] Rebuild Patches 43e5174a Fix Entity Teleportation and cancel velocity if teleported (#4210) 0fb3daf4 [Auto] Updated Upstream (CraftBukkit) 819ff324 Use wrapped StructureManager to prevent worldgen deadlock 507f302c Fix Zombie ShouldBurnInDay API (#4268) ef5af6f6 [Auto] Updated Upstream (CraftBukkit) 101b0110 [Auto] Updated Upstream (Bukkit/CraftBukkit) 03689cf9 Fix javadoc (#4276) c247857f Cache block data strings ce2eae5c [Auto] Updated Upstream (Bukkit/CraftBukkit) 563f77ad install remapped server jar to paper package space 1ab021dd Updated Upstream (Bukkit/CraftBukkit) c970f880 Properly pass the close reason for new inventory opens (#2658) (#4247) 07bca94f Create HoverEvent from ItemStack Entity da33f8bb Add a way to get translation keys for blocks, entities and materials 5a20cbd7 Add more Evoker API 7a3e2520 [Auto] Updated Upstream (CraftBukkit) b0cbebdc Fix build conflicts dfc54a8b Add zombie targets turtle egg config (#4181) 0fe00f61 Add BellRingEvent for village bells (#2230) 414e5e1d fix #4144 (#4170) 5c7f3fc0 Fix PersistentDataContainer contract violation (_->!null returns null) (#3990) 65dbf5ff [CI-SKIP] [Auto] Rebuild Patches 7ed0f7f0 Fix NPE in getBedSpawnLocation (#4238) 9e0f1101 [CI-SKIP] Add issue template 6c138412 Fix CraftTeam null check (#4249) 32e45448 Update Paperclip b84a37b7 Update Armor items in PlayerArmorChangeEvent (#4243) a67abf5b Increase visibility of a few methods 7d69214b [Auto] Updated Upstream (CraftBukkit) cbfc2362 PortalCreateEvent needs to know its entity 29032edb Fix PersistentDataContainer contract violation (_->!null returns null) f42c53df [CI-SKIP] [Auto] Rebuild Patches 3efe45f5 Port Eigencraft to 1.16 0bad6958 Make engine-mode 2 truly random cd06ca5e Updated Upstream (CraftBukkit) ef36b4f8 Fix TNT not pushing creative players 915fe522 Fix hex colors not working in some kick messages f5904171 [Auto] Updated Upstream (Bukkit/CraftBukkit) 757948dc [Auto] Updated Upstream (CraftBukkit) 0893de14 Fix reading the brand message from clients 243d2313 Updated Upstream (Bukkit/CraftBukkit) 4cc7de6c Add playPickupItemAnimation to LivingEntity 20fc1b5c [Auto] Updated Upstream (CraftBukkit/Spigot) 655258b3 [Auto] Updated Upstream (CraftBukkit) 167b1db6 Fix some modded clients getting kicked for invalid payload - Fixes #4201 7f0786cd Fix enderdragon tracking range to honor vanilla 586073c3 [CI-SKIP] Update README.md (for 1.16.2) (#4202) 853f4168 Remove debug 4d7ea429 fix config option in last commit 74d27463 Buffer joins to world ac96307b [CI-SKIP] switch back to trusty now we figured out the issue c97ce029 1.16.2 Release (#4123) 5486b3db Fix javadocs failing jenkins builds (#4189) 1330eb5f Brand support b8372fc0 Improve handling of indestructable blocks a2a06640 Add moon phase API 47f71aea Fix SpawnChangeEvent not firing for all use-cases b6c860f2 Don't require FACING data 0c1716a1 Add #setMaxPlayers API 02aed275 [CI-SKIP] Require dependencies script (#4172) 1ccc1c67 Add smithing item helpers 627f4b85 Brand support 20d9ec6b Fix MC-197271 e9287056 [CI-SKIP] Update issue templates with notices dccaf59a MC-197883: Bandaid decode issue 99a1e58f Merge branch 'master' into progress/1.16.2 ecbc5ca0 Updated Upstream (CraftBukkit) 99362d3c Decomp fix 5f9861a0 Fix MC-197883 by specifying the typeKey 1d8c9c23 [CI-SKIP] Make checkoutpr.sh use $SHELL (#4167) 2b1ca210 update checkout-pr to latest I use 95c9b45d Fix IDE Debug JVM Flag 2 (#4141) 9e6d742c Merge remote-tracking branch 'origin/master' into progress/1.16.2 c8542f23 Fix MC-99259 Wither Boss Bar doesn't update until invulnerability period is over (#4164) 862b8c18 Updated Upstream (Bukkit/CraftBukkit) 100d51eb Do not obfuscate air (#4149) 47740f67 Updated Upstream (CraftBukkit) 948c20e0 Merge remote-tracking branch 'origin/master' into progress/1.16.2 1daafe45 Updated Upstream (Bukkit/CraftBukkit) 98828b00 Merge pull request #4132 from Proximyst/progress/1.16.2 b23f27f8 Fix incorrect return for WorldServer#addAllEntitiesSafely (#3) 5085fa30 Fix MC-187716 Use configured height c44add5a Initialise a new chunk section if none was found yet updated 74a4d5f8 Remove armour stand double add to world 6d25cc4e Don't mark null chunk sections for block updates 1ba2f214 Updated Upstream (Bukkit/CraftBukkit) d29d5aaa Fix anti xray ce6bbaa4 Import fastutil classes patch 9d4616a4 Updated Upstream (Bukkit/CraftBukkit) 109d072b Fix test, add strider mob goal and fix piglin goals e6caaa20 Fix running; forgot to push this ee7dce8b Add this to SHIT_TO_CHECK.md aswell d378257c Fix IDE debug JVM flag for 1.16.2 0d8db446 Merge pull request #4112 from BillyGalbreath/progress/1.16.2 d319d8c4 It compiles! 8f8371c5 Add an OBFHELPER 9caa8e9f missed this 3ce5a5d7 volatile 159eb2e1 Oopsies 7eb08d2f Almost ready 7ca11e97 Current progress on 1.16.2 Tuinity Changes: eaa6b50 Fix missing block property portal crash fea5fbd Retain vanilla behavior for error correction rules in collisions 9eb1a3e Do not add a delayed unload ticket for some ticket types
699 lines
22 KiB
Diff
699 lines
22 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
Date: Sun, 15 Mar 2020 20:52:12 -0500
|
|
Subject: [PATCH] ItemStack convenience methods
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
|
|
index 4ba991b7..a2e476f1 100644
|
|
--- a/src/main/java/org/bukkit/Material.java
|
|
+++ b/src/main/java/org/bukkit/Material.java
|
|
@@ -8645,4 +8645,36 @@ public enum Material implements Keyed {
|
|
// </editor-fold>
|
|
}
|
|
}
|
|
+
|
|
+ // Purpur start
|
|
+ public boolean isArmor() {
|
|
+ switch (this) {
|
|
+ // <editor-fold defaultstate="collapsed" desc="isarmor">
|
|
+ case LEATHER_BOOTS:
|
|
+ case LEATHER_CHESTPLATE:
|
|
+ case LEATHER_HELMET:
|
|
+ case LEATHER_LEGGINGS:
|
|
+ case CHAINMAIL_BOOTS:
|
|
+ case CHAINMAIL_CHESTPLATE:
|
|
+ case CHAINMAIL_HELMET:
|
|
+ case CHAINMAIL_LEGGINGS:
|
|
+ case IRON_BOOTS:
|
|
+ case IRON_CHESTPLATE:
|
|
+ case IRON_HELMET:
|
|
+ case IRON_LEGGINGS:
|
|
+ case GOLDEN_BOOTS:
|
|
+ case GOLDEN_CHESTPLATE:
|
|
+ case GOLDEN_HELMET:
|
|
+ case GOLDEN_LEGGINGS:
|
|
+ case DIAMOND_BOOTS:
|
|
+ case DIAMOND_CHESTPLATE:
|
|
+ case DIAMOND_HELMET:
|
|
+ case DIAMOND_LEGGINGS:
|
|
+ case TURTLE_HELMET:
|
|
+ return true;
|
|
+ default:
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+ // Purpur end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
index ccd81fca..3fecde7a 100644
|
|
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
@@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|
import org.bukkit.material.MaterialData;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
+// Purpur start
|
|
+import com.google.common.collect.Multimap;
|
|
+import java.util.Collection;
|
|
+import org.bukkit.attribute.Attribute;
|
|
+import org.bukkit.attribute.AttributeModifier;
|
|
+import org.bukkit.block.data.BlockData;
|
|
+import org.bukkit.inventory.meta.BlockDataMeta;
|
|
+import org.bukkit.inventory.meta.Repairable;
|
|
+import org.bukkit.persistence.PersistentDataContainer;
|
|
+import org.bukkit.persistence.PersistentDataHolder;
|
|
+import com.destroystokyo.paper.Namespaced;
|
|
+// Purpur end
|
|
|
|
/**
|
|
* Represents a stack of items.
|
|
@@ -791,4 +803,627 @@ public class ItemStack implements Cloneable, ConfigurationSerializable {
|
|
return itemMeta.hasItemFlag(flag);
|
|
}
|
|
// Paper end
|
|
+
|
|
+ // Purpur start
|
|
+ /**
|
|
+ * Gets the display name that is set.
|
|
+ * <p>
|
|
+ * Plugins should check that hasDisplayName() returns <code>true</code>
|
|
+ * before calling this method.
|
|
+ *
|
|
+ * @return the display name that is set
|
|
+ */
|
|
+ @NotNull
|
|
+ public String getDisplayName() {
|
|
+ return getItemMeta().getDisplayName();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the display name.
|
|
+ *
|
|
+ * @param name the name to set
|
|
+ */
|
|
+ public void setDisplayName(@Nullable String name) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setDisplayName(name);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for existence of a display name.
|
|
+ *
|
|
+ * @return true if this has a display name
|
|
+ */
|
|
+ public boolean hasDisplayName() {
|
|
+ return getItemMeta().hasDisplayName();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the localized display name that is set.
|
|
+ * <p>
|
|
+ * Plugins should check that hasLocalizedName() returns <code>true</code>
|
|
+ * before calling this method.
|
|
+ *
|
|
+ * @return the localized name that is set
|
|
+ */
|
|
+ @NotNull
|
|
+ public String getLocalizedName() {
|
|
+ return getItemMeta().getLocalizedName();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the localized name.
|
|
+ *
|
|
+ * @param name the name to set
|
|
+ */
|
|
+ public void setLocalizedName(@Nullable String name) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setLocalizedName(name);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for existence of a localized name.
|
|
+ *
|
|
+ * @return true if this has a localized name
|
|
+ */
|
|
+ public boolean hasLocalizedName() {
|
|
+ return getItemMeta().hasLocalizedName();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for existence of lore.
|
|
+ *
|
|
+ * @return true if this has lore
|
|
+ */
|
|
+ public boolean hasLore() {
|
|
+ return getItemMeta().hasLore();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for existence of the specified enchantment.
|
|
+ *
|
|
+ * @param ench enchantment to check
|
|
+ * @return true if this enchantment exists for this meta
|
|
+ */
|
|
+ public boolean hasEnchant(@NotNull Enchantment ench) {
|
|
+ return getItemMeta().hasEnchant(ench);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for the level of the specified enchantment.
|
|
+ *
|
|
+ * @param ench enchantment to check
|
|
+ * @return The level that the specified enchantment has, or 0 if none
|
|
+ */
|
|
+ public int getEnchantLevel(@NotNull Enchantment ench) {
|
|
+ return getItemMeta().getEnchantLevel(ench);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns a copy the enchantments in this ItemMeta. <br>
|
|
+ * Returns an empty map if none.
|
|
+ *
|
|
+ * @return An immutable copy of the enchantments
|
|
+ */
|
|
+ @NotNull
|
|
+ public Map<Enchantment, Integer> getEnchants() {
|
|
+ return getItemMeta().getEnchants();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Adds the specified enchantment to this item meta.
|
|
+ *
|
|
+ * @param ench Enchantment to add
|
|
+ * @param level Level for the enchantment
|
|
+ * @param ignoreLevelRestriction this indicates the enchantment should be
|
|
+ * applied, ignoring the level limit
|
|
+ * @return true if the item meta changed as a result of this call, false
|
|
+ * otherwise
|
|
+ */
|
|
+ public boolean addEnchant(@NotNull Enchantment ench, int level, boolean ignoreLevelRestriction) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.addEnchant(ench, level, ignoreLevelRestriction);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Removes the specified enchantment from this item meta.
|
|
+ *
|
|
+ * @param ench Enchantment to remove
|
|
+ * @return true if the item meta changed as a result of this call, false
|
|
+ * otherwise
|
|
+ */
|
|
+ public boolean removeEnchant(@NotNull Enchantment ench) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.removeEnchant(ench);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for the existence of any enchantments.
|
|
+ *
|
|
+ * @return true if an enchantment exists on this meta
|
|
+ */
|
|
+ public boolean hasEnchants() {
|
|
+ return getItemMeta().hasEnchants();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks if the specified enchantment conflicts with any enchantments in
|
|
+ * this ItemMeta.
|
|
+ *
|
|
+ * @param ench enchantment to test
|
|
+ * @return true if the enchantment conflicts, false otherwise
|
|
+ */
|
|
+ public boolean hasConflictingEnchant(@NotNull Enchantment ench) {
|
|
+ return getItemMeta().hasConflictingEnchant(ench);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the custom model data.
|
|
+ * <p>
|
|
+ * CustomModelData is an integer that may be associated client side with a
|
|
+ * custom item model.
|
|
+ *
|
|
+ * @param data the data to set, or null to clear
|
|
+ */
|
|
+ public void setCustomModelData(@Nullable Integer data) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setCustomModelData(data);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the custom model data that is set.
|
|
+ * <p>
|
|
+ * CustomModelData is an integer that may be associated client side with a
|
|
+ * custom item model.
|
|
+ * <p>
|
|
+ * Plugins should check that hasCustomModelData() returns <code>true</code>
|
|
+ * before calling this method.
|
|
+ *
|
|
+ * @return the localized name that is set
|
|
+ */
|
|
+ public int getCustomModelData() {
|
|
+ return getItemMeta().getCustomModelData();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for existence of custom model data.
|
|
+ * <p>
|
|
+ * CustomModelData is an integer that may be associated client side with a
|
|
+ * custom item model.
|
|
+ *
|
|
+ * @return true if this has custom model data
|
|
+ */
|
|
+ public boolean hasCustomModelData() {
|
|
+ return getItemMeta().hasCustomModelData();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns whether the item has block data currently attached to it.
|
|
+ *
|
|
+ * @return whether block data is already attached
|
|
+ */
|
|
+ public boolean hasBlockData() {
|
|
+ return ((BlockDataMeta) getItemMeta()).hasBlockData();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns the currently attached block data for this item or creates a new
|
|
+ * one if one doesn't exist.
|
|
+ *
|
|
+ * The state is a copy, it must be set back (or to another item) with
|
|
+ * {@link #setBlockData(BlockData)}
|
|
+ *
|
|
+ * @param material the material we wish to get this data in the context of
|
|
+ * @return the attached data or new data
|
|
+ */
|
|
+ @NotNull
|
|
+ public BlockData getBlockData(@NotNull Material material) {
|
|
+ return ((BlockDataMeta) getItemMeta()).getBlockData(material);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Attaches a copy of the passed block data to the item.
|
|
+ *
|
|
+ * @param blockData the block data to attach to the block.
|
|
+ * @throws IllegalArgumentException if the blockData is null or invalid for
|
|
+ * this item.
|
|
+ */
|
|
+ public void setBlockData(@NotNull BlockData blockData) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ ((BlockDataMeta) itemMeta).setBlockData(blockData);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the repair penalty
|
|
+ *
|
|
+ * @return the repair penalty
|
|
+ */
|
|
+ public int getRepairCost() {
|
|
+ return ((Repairable) getItemMeta()).getRepairCost();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the repair penalty
|
|
+ *
|
|
+ * @param cost repair penalty
|
|
+ */
|
|
+ public void setRepairCost(int cost) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ ((Repairable) itemMeta).setRepairCost(cost);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks to see if this has a repair penalty
|
|
+ *
|
|
+ * @return true if this has a repair penalty
|
|
+ */
|
|
+ public boolean hasRepairCost() {
|
|
+ return ((Repairable) getItemMeta()).hasRepairCost();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Return if the unbreakable tag is true. An unbreakable item will not lose
|
|
+ * durability.
|
|
+ *
|
|
+ * @return true if the unbreakable tag is true
|
|
+ */
|
|
+ public boolean isUnbreakable() {
|
|
+ return getItemMeta().isUnbreakable();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the unbreakable tag. An unbreakable item will not lose durability.
|
|
+ *
|
|
+ * @param unbreakable true if set unbreakable
|
|
+ */
|
|
+ public void setUnbreakable(boolean unbreakable) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setUnbreakable(unbreakable);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for the existence of any AttributeModifiers.
|
|
+ *
|
|
+ * @return true if any AttributeModifiers exist
|
|
+ */
|
|
+ public boolean hasAttributeModifiers() {
|
|
+ return getItemMeta().hasAttributeModifiers();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Return an immutable copy of all Attributes and
|
|
+ * their modifiers in this ItemMeta.<br>
|
|
+ * Returns null if none exist.
|
|
+ *
|
|
+ * @return an immutable {@link Multimap} of Attributes
|
|
+ * and their AttributeModifiers, or null if none exist
|
|
+ */
|
|
+ @Nullable
|
|
+ public Multimap<Attribute, AttributeModifier> getAttributeModifiers() {
|
|
+ return getItemMeta().getAttributeModifiers();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Return an immutable copy of all {@link Attribute}s and their
|
|
+ * {@link AttributeModifier}s for a given {@link EquipmentSlot}.<br>
|
|
+ * Any {@link AttributeModifier} that does have have a given
|
|
+ * {@link EquipmentSlot} will be returned. This is because
|
|
+ * AttributeModifiers without a slot are active in any slot.<br>
|
|
+ * If there are no attributes set for the given slot, an empty map
|
|
+ * will be returned.
|
|
+ *
|
|
+ * @param slot the {@link EquipmentSlot} to check
|
|
+ * @return the immutable {@link Multimap} with the
|
|
+ * respective Attributes and modifiers, or an empty map
|
|
+ * if no attributes are set.
|
|
+ */
|
|
+ @NotNull
|
|
+ public Multimap<Attribute, AttributeModifier> getAttributeModifiers(@Nullable EquipmentSlot slot) {
|
|
+ return getItemMeta().getAttributeModifiers(slot);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Return an immutable copy of all {@link AttributeModifier}s
|
|
+ * for a given {@link Attribute}
|
|
+ *
|
|
+ * @param attribute the {@link Attribute}
|
|
+ * @return an immutable collection of {@link AttributeModifier}s
|
|
+ * or null if no AttributeModifiers exist for the Attribute.
|
|
+ * @throws NullPointerException if Attribute is null
|
|
+ */
|
|
+ @Nullable
|
|
+ public Collection<AttributeModifier> getAttributeModifiers(@NotNull Attribute attribute) {
|
|
+ return getItemMeta().getAttributeModifiers(attribute);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Add an Attribute and it's Modifier.
|
|
+ * AttributeModifiers can now support {@link EquipmentSlot}s.
|
|
+ * If not set, the {@link AttributeModifier} will be active in ALL slots.
|
|
+ * <br>
|
|
+ * Two {@link AttributeModifier}s that have the same {@link java.util.UUID}
|
|
+ * cannot exist on the same Attribute.
|
|
+ *
|
|
+ * @param attribute the {@link Attribute} to modify
|
|
+ * @param modifier the {@link AttributeModifier} specifying the modification
|
|
+ * @return true if the Attribute and AttributeModifier were
|
|
+ * successfully added
|
|
+ * @throws NullPointerException if Attribute is null
|
|
+ * @throws NullPointerException if AttributeModifier is null
|
|
+ * @throws IllegalArgumentException if AttributeModifier already exists
|
|
+ */
|
|
+ public boolean addAttributeModifier(@NotNull Attribute attribute, @NotNull AttributeModifier modifier) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.addAttributeModifier(attribute, modifier);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set all {@link Attribute}s and their {@link AttributeModifier}s.
|
|
+ * To clear all currently set Attributes and AttributeModifiers use
|
|
+ * null or an empty Multimap.
|
|
+ * If not null nor empty, this will filter all entries that are not-null
|
|
+ * and add them to the ItemStack.
|
|
+ *
|
|
+ * @param attributeModifiers the new Multimap containing the Attributes
|
|
+ * and their AttributeModifiers
|
|
+ */
|
|
+ public void setAttributeModifiers(@Nullable Multimap<Attribute, AttributeModifier> attributeModifiers) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setAttributeModifiers(attributeModifiers);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Remove all {@link AttributeModifier}s associated with the given
|
|
+ * {@link Attribute}.
|
|
+ * This will return false if nothing was removed.
|
|
+ *
|
|
+ * @param attribute attribute to remove
|
|
+ * @return true if all modifiers were removed from a given
|
|
+ * Attribute. Returns false if no attributes were
|
|
+ * removed.
|
|
+ * @throws NullPointerException if Attribute is null
|
|
+ */
|
|
+ public boolean removeAttributeModifier(@NotNull Attribute attribute) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.removeAttributeModifier(attribute);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Remove all {@link Attribute}s and {@link AttributeModifier}s for a
|
|
+ * given {@link EquipmentSlot}.<br>
|
|
+ * If the given {@link EquipmentSlot} is null, this will remove all
|
|
+ * {@link AttributeModifier}s that do not have an EquipmentSlot set.
|
|
+ *
|
|
+ * @param slot the {@link EquipmentSlot} to clear all Attributes and
|
|
+ * their modifiers for
|
|
+ * @return true if all modifiers were removed that match the given
|
|
+ * EquipmentSlot.
|
|
+ */
|
|
+ public boolean removeAttributeModifier(@Nullable EquipmentSlot slot) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.removeAttributeModifier(slot);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Remove a specific {@link Attribute} and {@link AttributeModifier}.
|
|
+ * AttributeModifiers are matched according to their {@link java.util.UUID}.
|
|
+ *
|
|
+ * @param attribute the {@link Attribute} to remove
|
|
+ * @param modifier the {@link AttributeModifier} to remove
|
|
+ * @return if any attribute modifiers were remove
|
|
+ *
|
|
+ * @throws NullPointerException if the Attribute is null
|
|
+ * @throws NullPointerException if the AttributeModifier is null
|
|
+ *
|
|
+ * @see AttributeModifier#getUniqueId()
|
|
+ */
|
|
+ public boolean removeAttributeModifier(@NotNull Attribute attribute, @NotNull AttributeModifier modifier) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ boolean result = itemMeta.removeAttributeModifier(attribute, modifier);
|
|
+ setItemMeta(itemMeta);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns a custom tag container capable of storing tags on the object.
|
|
+ *
|
|
+ * Note that the tags stored on this container are all stored under their
|
|
+ * own custom namespace therefore modifying default tags using this
|
|
+ * {@link PersistentDataHolder} is impossible.
|
|
+ *
|
|
+ * @return the persistent metadata container
|
|
+ */
|
|
+ @NotNull
|
|
+ public PersistentDataContainer getPersistentDataContainer() {
|
|
+ return getItemMeta().getPersistentDataContainer();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks to see if this item has damage
|
|
+ *
|
|
+ * @return true if this has damage
|
|
+ */
|
|
+ public boolean hasDamage() {
|
|
+ return ((Damageable) getItemMeta()).hasDamage();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the damage
|
|
+ *
|
|
+ * @return the damage
|
|
+ */
|
|
+ public int getDamage() {
|
|
+ return ((Damageable) getItemMeta()).getDamage();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the damage
|
|
+ *
|
|
+ * @param damage item damage
|
|
+ */
|
|
+ public void setDamage(int damage) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ ((Damageable) itemMeta).setDamage(damage);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the collection of namespaced keys that the item can destroy in {@link org.bukkit.GameMode#ADVENTURE}
|
|
+ *
|
|
+ * @return Set of {@link com.destroystokyo.paper.Namespaced}
|
|
+ */
|
|
+ @NotNull
|
|
+ public Set<Namespaced> getDestroyableKeys() {
|
|
+ return getItemMeta().getDestroyableKeys();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the collection of namespaced keys that the item can destroy in {@link org.bukkit.GameMode#ADVENTURE}
|
|
+ *
|
|
+ * @param canDestroy Collection of {@link com.destroystokyo.paper.Namespaced}
|
|
+ */
|
|
+ public void setDestroyableKeys(@NotNull Collection<Namespaced> canDestroy) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setDestroyableKeys(canDestroy);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the collection of namespaced keys that the item can be placed on in {@link org.bukkit.GameMode#ADVENTURE}
|
|
+ *
|
|
+ * @return Set of {@link com.destroystokyo.paper.Namespaced}
|
|
+ */
|
|
+ @NotNull
|
|
+ public Set<Namespaced> getPlaceableKeys() {
|
|
+ return getItemMeta().getPlaceableKeys();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the set of namespaced keys that the item can be placed on in {@link org.bukkit.GameMode#ADVENTURE}
|
|
+ *
|
|
+ * @param canPlaceOn Collection of {@link com.destroystokyo.paper.Namespaced}
|
|
+ */
|
|
+ @NotNull
|
|
+ public void setPlaceableKeys(@NotNull Collection<Namespaced> canPlaceOn) {
|
|
+ ItemMeta itemMeta = getItemMeta();
|
|
+ itemMeta.setPlaceableKeys(canPlaceOn);
|
|
+ setItemMeta(itemMeta);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for the existence of any keys that the item can be placed on
|
|
+ *
|
|
+ * @return true if this item has placeable keys
|
|
+ */
|
|
+ public boolean hasPlaceableKeys() {
|
|
+ return getItemMeta().hasPlaceableKeys();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks for the existence of any keys that the item can destroy
|
|
+ *
|
|
+ * @return true if this item has destroyable keys
|
|
+ */
|
|
+ public boolean hasDestroyableKeys() {
|
|
+ return getItemMeta().hasDestroyableKeys();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Repairs this item by 1 durability
|
|
+ */
|
|
+ public void repair() {
|
|
+ repair(1);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Damages this item by 1 durability
|
|
+ *
|
|
+ * @return True if damage broke the item
|
|
+ */
|
|
+ public boolean damage() {
|
|
+ return damage(1);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Repairs this item's durability by amount
|
|
+ *
|
|
+ * @param amount Amount of durability to repair
|
|
+ */
|
|
+ public void repair(int amount) {
|
|
+ damage(-amount);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Damages this item's durability by amount
|
|
+ *
|
|
+ * @param amount Amount of durability to damage
|
|
+ * @return True if damage broke the item
|
|
+ */
|
|
+ public boolean damage(int amount) {
|
|
+ return damage(amount, false);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Damages this item's durability by amount
|
|
+ *
|
|
+ * @param amount Amount of durability to damage
|
|
+ * @param ignoreUnbreaking Ignores unbreaking enchantment
|
|
+ * @return True if damage broke the item
|
|
+ */
|
|
+ public boolean damage(int amount, boolean ignoreUnbreaking) {
|
|
+ Damageable damageable = (Damageable) getItemMeta();
|
|
+ if (amount > 0) {
|
|
+ int unbreaking = getEnchantLevel(Enchantment.DURABILITY);
|
|
+ int reduce = 0;
|
|
+ for (int i = 0; unbreaking > 0 && i < amount; ++i) {
|
|
+ if (reduceDamage(java.util.concurrent.ThreadLocalRandom.current(), unbreaking)) {
|
|
+ ++reduce;
|
|
+ }
|
|
+ }
|
|
+ amount -= reduce;
|
|
+ if (amount <= 0) {
|
|
+ return isBroke(damageable.getDamage());
|
|
+ }
|
|
+ }
|
|
+ int damage = damageable.getDamage() + amount;
|
|
+ damageable.setDamage(damage);
|
|
+ setItemMeta((ItemMeta) damageable);
|
|
+ return isBroke(damage);
|
|
+ }
|
|
+
|
|
+ public boolean isBroke(int damage) {
|
|
+ if (damage > getType().getMaxDurability()) {
|
|
+ if (getAmount() > 0) {
|
|
+ // ensure it "breaks"
|
|
+ setAmount(0);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ private boolean reduceDamage(java.util.Random random, int unbreaking) {
|
|
+ if (getType().isArmor()) {
|
|
+ return random.nextFloat() < 0.6F;
|
|
+ }
|
|
+ return random.nextInt(unbreaking + 1) > 0;
|
|
+ }
|
|
+
|
|
+ // Purpur end
|
|
}
|