-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve default item attributes API (#10765)
- Loading branch information
1 parent
d408381
commit 6de7a1f
Showing
12 changed files
with
209 additions
and
100 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Jake Potrebic <jake.m.potrebic@gmail.com> | ||
Date: Sat, 8 May 2021 15:02:00 -0700 | ||
Subject: [PATCH] Improve item default attribute API | ||
|
||
|
||
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java | ||
index 04cb8279f2296cc42405355c7c1f120e761202c4..18862cce7e252e69153f0a5380aa07de26d9d2e7 100644 | ||
--- a/src/main/java/org/bukkit/Material.java | ||
+++ b/src/main/java/org/bukkit/Material.java | ||
@@ -4771,6 +4771,23 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla | ||
} | ||
// Paper end - item rarity API | ||
|
||
+ // Paper start - item default attributes API | ||
+ /** | ||
+ * Returns an immutable multimap of attributes for the slot. | ||
+ * {@link #isItem()} must be true for this material. | ||
+ * | ||
+ * @param equipmentSlot the slot to get the attributes for | ||
+ * @throws IllegalArgumentException if {@link #isItem()} is false | ||
+ * @return an immutable multimap of attributes | ||
+ * @deprecated use {@link #getDefaultAttributeModifiers(EquipmentSlot)} | ||
+ */ | ||
+ @NotNull | ||
+ @Deprecated(forRemoval = true, since = "1.20.5") | ||
+ public Multimap<Attribute, AttributeModifier> getItemAttributes(@NotNull EquipmentSlot equipmentSlot) { | ||
+ return this.getDefaultAttributeModifiers(equipmentSlot); | ||
+ } | ||
+ // Paper end - item default attributes API | ||
+ | ||
/** | ||
* Do not use for any reason. | ||
* | ||
@@ -5478,13 +5495,34 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla | ||
} | ||
} | ||
|
||
+ // Paper start - improve default item attribute API | ||
+ /** | ||
+ * Return an immutable copy of all default {@link Attribute}s and their {@link AttributeModifier}s. | ||
+ * <p> | ||
+ * Default attributes are those that are always preset on some items, unless | ||
+ * they are specifically overridden on that {@link ItemStack}. Examples include | ||
+ * the attack damage on weapons or the armor value on armor. | ||
+ * <p> | ||
+ * Only available when {@link #isItem()} is true. | ||
+ * | ||
+ * @return the immutable {@link Multimap} with the respective default | ||
+ * Attributes and modifiers, or an empty map if no attributes are set. | ||
+ */ | ||
+ public @NotNull @org.jetbrains.annotations.Unmodifiable Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers() { | ||
+ final ItemType type = this.asItemType(); | ||
+ Preconditions.checkArgument(type != null, "The Material is not an item!"); | ||
+ return type.getDefaultAttributeModifiers(); | ||
+ } | ||
+ // Paper end - improve default item attribute API | ||
+ | ||
/** | ||
* Return an immutable copy of all default {@link Attribute}s and their | ||
* {@link AttributeModifier}s for a given {@link EquipmentSlot}. | ||
- * | ||
- * Default attributes are those that are always preset on some items, such | ||
- * as the attack damage on weapons or the armor value on armor. | ||
- * | ||
+ * <p> | ||
+ * Default attributes are those that are always preset on some items, unless | ||
+ * they are specifically overridden on that {@link ItemStack}. Examples include | ||
+ * the attack damage on weapons or the armor value on armor. | ||
+ * <p> | ||
* Only available when {@link #isItem()} is true. | ||
* | ||
* @param slot the {@link EquipmentSlot} to check | ||
diff --git a/src/main/java/org/bukkit/inventory/ItemType.java b/src/main/java/org/bukkit/inventory/ItemType.java | ||
index 3d30c4957a2950ac8d4635ed7bb9bf39ca8cd158..077bd4d4e50169780f27e8502104e9e4b2ecdae6 100644 | ||
--- a/src/main/java/org/bukkit/inventory/ItemType.java | ||
+++ b/src/main/java/org/bukkit/inventory/ItemType.java | ||
@@ -2378,6 +2378,21 @@ public interface ItemType extends Keyed, Translatable, net.kyori.adventure.trans | ||
// @NotNull | ||
// EquipmentSlot getEquipmentSlot(); | ||
|
||
+ // Paper start - improve default item attribute API | ||
+ /** | ||
+ * Return an immutable copy of all default {@link Attribute}s and their | ||
+ * {@link AttributeModifier}s. | ||
+ * <p> | ||
+ * Default attributes are those that are always preset on some items, unless | ||
+ * they are specifically overridden on that {@link ItemStack}. Examples include | ||
+ * the attack damage on weapons or the armor value on armor. | ||
+ * | ||
+ * @return the immutable {@link Multimap} with the respective default | ||
+ * Attributes and modifiers, or an empty map if no attributes are set. | ||
+ */ | ||
+ @NotNull @org.jetbrains.annotations.Unmodifiable Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(); | ||
+ // Paper end - improve default item attribute API | ||
+ | ||
/** | ||
* Return an immutable copy of all default {@link Attribute}s and their | ||
* {@link AttributeModifier}s for a given {@link EquipmentSlot}. |
This file was deleted.
Oops, something went wrong.
92 changes: 92 additions & 0 deletions
92
patches/server/0551-Improve-item-default-attribute-API.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Jake Potrebic <jake.m.potrebic@gmail.com> | ||
Date: Sat, 8 May 2021 15:01:54 -0700 | ||
Subject: [PATCH] Improve item default attribute API | ||
|
||
Also fixes an issue where upstream isn't | ||
actually getting the correct default attributes | ||
|
||
diff --git a/src/main/java/org/bukkit/craftbukkit/attribute/CraftAttributeInstance.java b/src/main/java/org/bukkit/craftbukkit/attribute/CraftAttributeInstance.java | ||
index 8afbb8e0cb368e95f23bb78c1261f9aa9b8abd86..0a18983151d17b8e1460b82326b0380087e13795 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/attribute/CraftAttributeInstance.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/attribute/CraftAttributeInstance.java | ||
@@ -74,7 +74,7 @@ public class CraftAttributeInstance implements AttributeInstance { | ||
return new AttributeModifier(nms.id(), nms.name, nms.amount(), AttributeModifier.Operation.values()[nms.operation().ordinal()]); | ||
} | ||
|
||
- public static AttributeModifier convert(net.minecraft.world.entity.ai.attributes.AttributeModifier nms, EquipmentSlot slot) { | ||
- return new AttributeModifier(nms.id(), nms.name, nms.amount(), AttributeModifier.Operation.values()[nms.operation().ordinal()], slot); | ||
+ public static AttributeModifier convert(net.minecraft.world.entity.ai.attributes.AttributeModifier nms, net.minecraft.world.entity.EquipmentSlotGroup slot) { // Paper | ||
+ return new AttributeModifier(nms.id(), nms.name, nms.amount(), AttributeModifier.Operation.values()[nms.operation().ordinal()], org.bukkit.craftbukkit.CraftEquipmentSlot.getSlot(slot)); // Paper | ||
} | ||
} | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemType.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemType.java | ||
index 1aa8010e872686f392430ce47214a324d431cada..6bcc3192097dfbf378592fd2437a80dcd0825f13 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemType.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemType.java | ||
@@ -187,15 +187,34 @@ public class CraftItemType<M extends ItemMeta> implements ItemType.Typed<M>, Han | ||
// return CraftEquipmentSlot.getSlot(EntityInsentient.getEquipmentSlotForItem(CraftItemStack.asNMSCopy(ItemStack.of(this)))); | ||
// } | ||
|
||
+ // Paper start - improve default attribute API | ||
+ @Override | ||
+ public @NotNull Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers() { | ||
+ return this.getDefaultAttributeModifiers(sg -> true); | ||
+ } | ||
+ // Paper end - improve default attribute API | ||
+ | ||
@Override | ||
public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(EquipmentSlot slot) { | ||
- ImmutableMultimap.Builder<Attribute, AttributeModifier> defaultAttributes = ImmutableMultimap.builder(); | ||
+ // Paper start - improve/fix item default attribute API | ||
+ final net.minecraft.world.entity.EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); | ||
+ return this.getDefaultAttributeModifiers(sg -> sg.test(nmsSlot)); | ||
+ } | ||
|
||
- ItemAttributeModifiers nmsDefaultAttributes = this.item.getDefaultAttributeModifiers(); | ||
- nmsDefaultAttributes.forEach(CraftEquipmentSlot.getNMS(slot), (key, value) -> { | ||
- Attribute attribute = CraftAttribute.minecraftToBukkit(key.value()); | ||
- defaultAttributes.put(attribute, CraftAttributeInstance.convert(value, slot)); | ||
- }); | ||
+ private Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(final java.util.function.Predicate<net.minecraft.world.entity.EquipmentSlotGroup> slotPredicate) { | ||
+ final ImmutableMultimap.Builder<Attribute, AttributeModifier> defaultAttributes = ImmutableMultimap.builder(); | ||
+ ItemAttributeModifiers nmsDefaultAttributes = this.item.components().getOrDefault(DataComponents.ATTRIBUTE_MODIFIERS, ItemAttributeModifiers.EMPTY); | ||
+ if (nmsDefaultAttributes.modifiers().isEmpty()) { | ||
+ // we have to check both places cause for some reason vanilla puts default modifiers for armor in a different place | ||
+ nmsDefaultAttributes = this.item.getDefaultAttributeModifiers(); | ||
+ } | ||
+ for (final net.minecraft.world.item.component.ItemAttributeModifiers.Entry entry : nmsDefaultAttributes.modifiers()) { | ||
+ if (!slotPredicate.test(entry.slot())) continue; | ||
+ final Attribute attribute = CraftAttribute.minecraftHolderToBukkit(entry.attribute()); | ||
+ final AttributeModifier modifier = CraftAttributeInstance.convert(entry.modifier(), entry.slot()); | ||
+ defaultAttributes.put(attribute, modifier); | ||
+ } | ||
+ // Paper end - improve/fix item default attribute API | ||
|
||
return defaultAttributes.build(); | ||
} | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java | ||
index 952a8147947fa0e2a960628fc760212d3d206ce6..f0577689f4c57ce6254aad32ccf5d8eac961c9bd 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java | ||
@@ -399,15 +399,11 @@ public final class CraftMagicNumbers implements UnsafeValues { | ||
|
||
@Override | ||
public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(Material material, EquipmentSlot slot) { | ||
- ImmutableMultimap.Builder<Attribute, AttributeModifier> defaultAttributes = ImmutableMultimap.builder(); | ||
- | ||
- ItemAttributeModifiers nmsDefaultAttributes = CraftMagicNumbers.getItem(material).getDefaultAttributeModifiers(); | ||
- nmsDefaultAttributes.forEach(CraftEquipmentSlot.getNMS(slot), (key, value) -> { | ||
- Attribute attribute = CraftAttribute.minecraftToBukkit(key.value()); | ||
- defaultAttributes.put(attribute, CraftAttributeInstance.convert(value, slot)); | ||
- }); | ||
- | ||
- return defaultAttributes.build(); | ||
+ // Paper start - delegate to method on ItemType | ||
+ final org.bukkit.inventory.ItemType item = material.asItemType(); | ||
+ Preconditions.checkArgument(item != null, material + " is not an item and does not have default attributes"); | ||
+ return item.getDefaultAttributeModifiers(slot); | ||
+ // Paper end - delegate to method on ItemType | ||
} | ||
|
||
@Override |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.