add holder for ItemStack

This commit is contained in:
Jake Potrebic 2024-04-29 11:29:13 -07:00 committed by Owen1212055
parent 0bd0027954
commit 26bf30cc16
No known key found for this signature in database
GPG Key ID: 2133292072886A30
2 changed files with 140 additions and 92 deletions

View File

@ -110,33 +110,6 @@ index 0000000000000000000000000000000000000000..6d227528930c4d25ebfcc8829057cbac
+ return (DataKey.Valued<T>) Registry.DATA_KEYS.get(NamespacedKey.minecraft(name));
+ }
+}
diff --git a/src/main/java/io/papermc/paper/datakey/PatchedDataComponentHolder.java b/src/main/java/io/papermc/paper/datakey/PatchedDataComponentHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..a226c4d1d901ea6086ac49263a0f21867328e36f
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/PatchedDataComponentHolder.java
@@ -0,0 +1,21 @@
+package io.papermc.paper.datakey;
+
+import io.papermc.paper.datakey.map.DataKeyMap;
+import org.jetbrains.annotations.Nullable;
+
+public interface PatchedDataComponentHolder {
+
+ DataKeyMap data();
+
+ @Nullable
+ <T> T setData(DataKey.Valued<T> type, @Nullable T value);
+
+ @Nullable
+ <T> T setData(DataKey.NonValued type);
+
+ @Nullable
+ <T> T removeData(DataKey type);
+
+ boolean hasData(DataKey type);
+
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/DataKeyMap.java b/src/main/java/io/papermc/paper/datakey/map/DataKeyMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..75d07bd3ec9b51f039715590881272eced13ea4f
@ -170,10 +143,10 @@ index 0000000000000000000000000000000000000000..75d07bd3ec9b51f039715590881272ec
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/DataKeyMapBridge.java b/src/main/java/io/papermc/paper/datakey/map/DataKeyMapBridge.java
new file mode 100644
index 0000000000000000000000000000000000000000..9da6ab689eb43eb960429fe9a752c0c6c4183232
index 0000000000000000000000000000000000000000..889439e91b4785b1090894815bb6ba739363244f
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/map/DataKeyMapBridge.java
@@ -0,0 +1,26 @@
@@ -0,0 +1,27 @@
+package io.papermc.paper.datakey.map;
+
+import net.kyori.adventure.util.Services;
@ -194,6 +167,7 @@ index 0000000000000000000000000000000000000000..9da6ab689eb43eb960429fe9a752c0c6
+
+ ItemMeta toMeta(Material material, PatchedDataKeyMap dataKeyMap);
+
+ @ApiStatus.Internal
+ class Holder {
+
+ public static DataKeyMapBridge BRIDGE = Services.service(DataKeyMapBridge.class)
@ -202,10 +176,10 @@ index 0000000000000000000000000000000000000000..9da6ab689eb43eb960429fe9a752c0c6
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMap.java b/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..3340e13d6f161c521af5bca7a57c173bc0bdfead
index 0000000000000000000000000000000000000000..5aa31b3d178f5b3453d6f864a243ca5933fe88cc
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMap.java
@@ -0,0 +1,36 @@
@@ -0,0 +1,33 @@
+package io.papermc.paper.datakey.map;
+
+import io.papermc.paper.datakey.DataKey;
@ -223,17 +197,14 @@ index 0000000000000000000000000000000000000000..3340e13d6f161c521af5bca7a57c173b
+ return DataKeyMapBridge.Holder.BRIDGE.of(map);
+ }
+
+ @Nullable
+ <T> T set(DataKey.Valued<T> type, @Nullable T value);
+ <T> void set(DataKey.Valued<T> type, @Nullable T value);
+
+ void set(DataKey.NonValued type);
+
+ <T> void remove(DataKey.Valued<T> type);
+
+ // Returns if this value was previously set
+ boolean set(DataKey.NonValued type);
+
+ @Nullable
+ <T> T remove(DataKey.Valued<T> type);
+
+ // Returns if this value was previously set
+ boolean remove(DataKey.NonValued type);
+ void remove(DataKey.NonValued type);
+
+ @NotNull
+ DataKeyMapPatch asPatch();
@ -242,6 +213,41 @@ index 0000000000000000000000000000000000000000..3340e13d6f161c521af5bca7a57c173b
+
+ PatchedDataKeyMap clone();
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMapHolder.java b/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMapHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..aa37cdc7b0628870e4a2013900632ea36fa3597c
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMapHolder.java
@@ -0,0 +1,29 @@
+package io.papermc.paper.datakey.map;
+
+import io.papermc.paper.datakey.DataKey;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+@ApiStatus.NonExtendable
+@ApiStatus.Experimental
+public interface PatchedDataKeyMapHolder {
+
+ @NotNull PatchedDataKeyMap data();
+
+ default <T> void setData(final DataKey.@NotNull Valued<T> dataKey, final @Nullable T value) {
+ this.data().set(dataKey, value);
+ }
+
+ default void setData(final DataKey.@NotNull NonValued dataKey) {
+ this.data().set(dataKey);
+ }
+
+ default <T> void removeData(final DataKey.@NotNull Valued<T> dataKey) {
+ this.data().remove(dataKey);
+ }
+
+ default void removeData(final DataKey.@NotNull NonValued dataKey) {
+ this.data().remove(dataKey);
+ }
+}
diff --git a/src/main/java/io/papermc/paper/datakey/patch/DataKeyMapPatch.java b/src/main/java/io/papermc/paper/datakey/patch/DataKeyMapPatch.java
new file mode 100644
index 0000000000000000000000000000000000000000..325a597b8d3e0c574b7bc80b7c9d0deeb3b28037
@ -370,7 +376,7 @@ index 98a970a6582dca22e719a31559c7becea4725cb2..84708afee2316108babbd64c9c667146
/**
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e3896172e1b9 100644
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..4625bc9194f03d3aff5e90aaf536b32109c364fa 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap;
@ -381,7 +387,12 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e389
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Translatable;
@@ -29,7 +30,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
@@ -25,11 +26,11 @@ import org.jetbrains.annotations.Nullable;
* use this class to encapsulate Materials for which {@link Material#isItem()}
* returns false.</b>
*/
-public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem>, net.kyori.adventure.translation.Translatable { // Paper
+public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem>, net.kyori.adventure.translation.Translatable, io.papermc.paper.datakey.map.PatchedDataKeyMapHolder { // Paper
private Material type = Material.AIR;
private int amount = 0;
private MaterialData data = null;
@ -425,7 +436,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e389
- if (this.meta != null) {
- itemStack.meta = this.meta.clone();
- }
+ itemStack.dataKeyMap = this.getDataKeyMap().clone(); // Paper
+ itemStack.dataKeyMap = this.data().clone(); // Paper
if (this.data != null) {
itemStack.data = this.data.clone();
@ -509,7 +520,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e389
@UndefinedNullability // Paper
public ItemMeta getItemMeta() {
- return this.meta == null ? Bukkit.getItemFactory().getItemMeta(this.type) : this.meta.clone();
+ return io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap());
+ return io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.toMeta(this.type, this.data());
}
/**
@ -547,13 +558,14 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e389
return true;
}
@@ -1073,4 +1060,10 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
@@ -1073,4 +1060,11 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player);
}
// Paper end - expose itemstack tooltip lines
+ // Paper start
+ @NotNull
+ public PatchedDataKeyMap getDataKeyMap() {
+ @Override
+ public PatchedDataKeyMap data() {
+ return this.dataKeyMap;
+ }
+ // Paper end

View File

@ -150,58 +150,64 @@ index e55c1bcbf62de62d7699cf2a050132b208083a3d..478c73363e64e861a8285234f2f294f4
+ }
}
diff --git a/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java
index a7bd48c01c473ccde84760d121dcad73aa6d0a59..36802d32ed1724e87f707c0cc46e566ef04a5b77 100644
index a7bd48c01c473ccde84760d121dcad73aa6d0a59..c218949484a1f9484a1e0fd41fb0f10bddfe1c11 100644
--- a/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java
+++ b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java
@@ -17,16 +17,25 @@ public class PaperPatchedDataKeyMap extends PaperDataKeyMap implements PatchedDa
@Nullable
@Override
- public <T> T set(final DataKey<T> type, @Nullable final T value) {
+ public <T> T set(final DataKey.Valued<T> type, @Nullable final T value) {
PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
return adapter.apiConverter().apply(this.patched().set(paperComponentType.getHandle(), value == null ? null : adapter.nmsConverter().apply(value)));
@@ -15,27 +15,40 @@ public class PaperPatchedDataKeyMap extends PaperDataKeyMap implements PatchedDa
super(patchedDataKeyMap);
}
- @Nullable
+ @SuppressWarnings("unchecked")
@Override
- public <T> T remove(final DataKey<T> type) {
+ public boolean set(final DataKey.NonValued type) {
+ PaperComponentType<?, Object> paperComponentType = (PaperComponentType<?, Object>) type;
+ ComponentAdapters.ComponentAdapter<?, Object> adapter = paperComponentType.getAdapter();
+
+ boolean hasValue = this.has(type);
+ this.patched().set(paperComponentType.getHandle(), adapter.nmsConverter().apply(null));
+ return hasValue;
+ }
+
+ @Override
+ public <T> @Nullable T remove(final DataKey.Valued<T> type) {
PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
- public <T> T set(final DataKey<T> type, @Nullable final T value) {
- PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
- ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
+ public <T> void set(final DataKey.Valued<T> type, @Nullable final T value) {
+ final PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
+ final ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
@@ -38,6 +47,19 @@ public class PaperPatchedDataKeyMap extends PaperDataKeyMap implements PatchedDa
return adapter.apiConverter().apply(removed);
- return adapter.apiConverter().apply(this.patched().set(paperComponentType.getHandle(), value == null ? null : adapter.nmsConverter().apply(value)));
+ this.patched().set(paperComponentType.getHandle(), value == null ? null : adapter.nmsConverter().apply(value));
}
+ @Override
+ public boolean remove(final DataKey.NonValued type) {
+ PaperComponentType<?, Object> paperComponentType = (PaperComponentType<?, Object>) type;
+ ComponentAdapters.ComponentAdapter<?, Object> adapter = paperComponentType.getAdapter();
+
+ Object removed = this.patched().remove(adapter.type());
+ if (removed == null) {
+ return false;
+ }
+
+ return true;
- @Nullable
+ @SuppressWarnings("unchecked")
@Override
- public <T> T remove(final DataKey<T> type) {
- PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
- ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
+ public void set(final DataKey.NonValued type) {
+ final PaperComponentType<?, Object> paperComponentType = (PaperComponentType<?, Object>) type;
+ final ComponentAdapters.ComponentAdapter<?, Object> adapter = paperComponentType.getAdapter();
- Object removed = this.patched().remove(adapter.type());
- if (removed == null) {
- return null;
- }
+ this.patched().set(paperComponentType.getHandle(), adapter.nmsConverter().apply(null));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> void remove(final DataKey.Valued<T> type) {
+ final PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
+ final ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
+
+ this.patched().remove(adapter.type());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void remove(final DataKey.NonValued type) {
+ final PaperComponentType<?, Object> paperComponentType = (PaperComponentType<?, Object>) type;
+ final ComponentAdapters.ComponentAdapter<?, Object> adapter = paperComponentType.getAdapter();
- return adapter.apiConverter().apply(removed);
+ this.patched().remove(adapter.type());
}
@Override
public @NotNull DataKeyMapPatch asPatch() {
return null;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
index 189b8d995caa7e8190c6c07400c75d791f6465ed..2ea46a3620fffcee18ad0e1d571ebfeedb66fd41 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
@ -215,8 +221,21 @@ index 189b8d995caa7e8190c6c07400c75d791f6465ed..2ea46a3620fffcee18ad0e1d571ebfee
}
// Paper end
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
index 2ab8cc39ef9a039c620b5784d150bc519177b462..78e76bb3d21eacbe59fe7959de5ba8489aaa1693 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
@@ -769,7 +769,7 @@ public final class CraftItemStack extends ItemStack {
}
@Override
- public io.papermc.paper.datakey.PaperPatchedDataKeyMap getDataKeyMap() {
+ public io.papermc.paper.datakey.PaperPatchedDataKeyMap data() {
if (this.handle == null) {
return new io.papermc.paper.datakey.PaperPatchedDataKeyMap(new net.minecraft.core.component.PatchedDataComponentMap(net.minecraft.core.component.DataComponentMap.EMPTY)); // Paper
}
diff --git a/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java b/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java
index c60ec00464d5d4216544240f64a867e51ac7335d..517ea27fe792b1e6ec54075b4330d9a08c834bcf 100644
index c60ec00464d5d4216544240f64a867e51ac7335d..a97e1d5612f900f15fca468877428a0eda21a2c3 100644
--- a/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java
+++ b/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java
@@ -3,7 +3,6 @@ package io.papermc.paper.item;
@ -227,16 +246,29 @@ index c60ec00464d5d4216544240f64a867e51ac7335d..517ea27fe792b1e6ec54075b4330d9a0
import org.bukkit.Material;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
@@ -56,23 +55,23 @@ public class MetaDataKeyMetaTest extends AbstractTestingBase {
@@ -45,36 +44,36 @@ public class MetaDataKeyMetaTest extends AbstractTestingBase {
@Test
public void testUnbreakable() {
ItemStack itemStack = new ItemStack(Material.STONE);
- itemStack.getDataKeyMap().set(DataKeys.UNBREAKABLE, Unbreakable.of(false));
+ itemStack.data().set(DataKeys.UNBREAKABLE, Unbreakable.of(false));
Assertions.assertTrue(itemStack.getItemMeta().isUnbreakable());
Assertions.assertTrue(itemStack.getItemMeta().getItemFlags().contains(ItemFlag.HIDE_UNBREAKABLE));
- itemStack.getDataKeyMap().set(DataKeys.UNBREAKABLE, null);
+ itemStack.data().set(DataKeys.UNBREAKABLE, null);
Assertions.assertFalse(itemStack.getItemMeta().isUnbreakable());
}
@Test
public void testToolTipAdditional() {
ItemStack itemStack = new ItemStack(Material.STONE);
- itemStack.getDataKeyMap().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP, Unit.of());
+ itemStack.getDataKeyMap().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP);
+ itemStack.data().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP);
Assertions.assertTrue(itemStack.getItemMeta().getItemFlags().contains(ItemFlag.HIDE_ADDITIONAL_TOOLTIP));
- itemStack.getDataKeyMap().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP, null);
+ itemStack.getDataKeyMap().remove(DataKeys.HIDE_ADDITIONAL_TOOLTIP);
+ itemStack.data().remove(DataKeys.HIDE_ADDITIONAL_TOOLTIP);
Assertions.assertFalse(itemStack.getItemMeta().getItemFlags().contains(ItemFlag.HIDE_ADDITIONAL_TOOLTIP));
}
@ -257,7 +289,11 @@ index c60ec00464d5d4216544240f64a867e51ac7335d..517ea27fe792b1e6ec54075b4330d9a0
@SuppressWarnings("unchecked")
- private static <T, M> void testSimpleValue(ItemStack itemStack, DataKey<T> dataKey, T value, Function<M, T> metaGetter, BiConsumer<M, T> metaSetter, Class<M> meta) {
- itemStack.getDataKeyMap().set(dataKey, value);
- Assertions.assertEquals(value, itemStack.getDataKeyMap().get(dataKey));
+ private static <T, M> void testSimpleValue(ItemStack itemStack, DataKey.Valued<T> dataKey, T value, Function<M, T> metaGetter, BiConsumer<M, T> metaSetter, Class<M> meta) {
itemStack.getDataKeyMap().set(dataKey, value);
Assertions.assertEquals(value, itemStack.getDataKeyMap().get(dataKey));
+ itemStack.data().set(dataKey, value);
+ Assertions.assertEquals(value, itemStack.data().get(dataKey));
Assertions.assertEquals(metaGetter.apply((M) itemStack.getItemMeta()), value);