mirror of https://github.com/PaperMC/Paper.git
Add new component types
This commit is contained in:
parent
0fcd9ccb2a
commit
0a1884ec64
|
@ -6,68 +6,114 @@ Subject: [PATCH] WIP DataKey API
|
|||
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKey.java b/src/main/java/io/papermc/paper/datakey/DataKey.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..50f68d6d38eaad145896255212a1556df0aa9188
|
||||
index 0000000000000000000000000000000000000000..805926c7f8158680587e543e0f643d1e45d1a94a
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKey.java
|
||||
@@ -0,0 +1,13 @@
|
||||
@@ -0,0 +1,9 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import io.papermc.paper.registry.TypedKey;
|
||||
+import net.kyori.adventure.key.Key;
|
||||
+import org.bukkit.Keyed;
|
||||
+
|
||||
+public interface DataKey<T> extends Keyed {
|
||||
+
|
||||
+ // TODO: prolly get rid of
|
||||
+ Class<T> type();
|
||||
+
|
||||
+ Key key();
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKeyBridge.java b/src/main/java/io/papermc/paper/datakey/DataKeyBridge.java
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKeys.java b/src/main/java/io/papermc/paper/datakey/DataKeys.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..1c03ec8ef6aedf660144ed00da401fdcf7a48fb3
|
||||
index 0000000000000000000000000000000000000000..26b83069907bbf6dfae98f1a687a982855283b8e
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKeyBridge.java
|
||||
@@ -0,0 +1,24 @@
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKeys.java
|
||||
@@ -0,0 +1,73 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import net.kyori.adventure.util.Services;
|
||||
+import org.bukkit.Material;
|
||||
+import org.bukkit.inventory.meta.ItemMeta;
|
||||
+import io.papermc.paper.datakey.types.ItemLore;
|
||||
+import io.papermc.paper.datakey.types.Unbreakable;
|
||||
+import io.papermc.paper.util.Unit;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import org.bukkit.NamespacedKey;
|
||||
+import org.bukkit.Registry;
|
||||
+import org.bukkit.inventory.ItemRarity;
|
||||
+
|
||||
+public interface DataKeyBridge {
|
||||
+public class DataKeys {
|
||||
+
|
||||
+ PatchedDataKeyMap of(DataKeyMap keyMap);
|
||||
+ public static final DataKey<Integer> MAX_STACK_SIZE = register("max_stack_size");
|
||||
+ public static final DataKey<Integer> MAX_DAMAGE = register("max_damage");
|
||||
+ public static final DataKey<Integer> DAMAGE = register("damage");
|
||||
+ public static final DataKey<Unbreakable> UNBREAKABLE = register("unbreakable");
|
||||
+ public static final DataKey<Component> CUSTOM_NAME = register("custom_name");
|
||||
+ public static final DataKey<Component> ITEM_NAME = register("item_name");
|
||||
+ public static final DataKey<ItemLore> LORE = register("lore");
|
||||
+ public static final DataKey<ItemRarity> RARITY = register("rarity");
|
||||
+ // enchantments
|
||||
+ // can_place_on
|
||||
+ // can_break
|
||||
+ // attribute_modifiers
|
||||
+ // custom_model_data
|
||||
+ public static final DataKey<Unit> HIDE_ADDITIONAL_TOOLTIP = register("hide_additional_tooltip");
|
||||
+ public static final DataKey<Unit> HIDE_TOOLTIP = register("hide_tooltip");
|
||||
+ public static final DataKey<Integer> REPAIR_COST = register("repair_cost");
|
||||
+ public static final DataKey<Unit> CREATIVE_SLOT_LOCK = register("creative_slot_lock");
|
||||
+ public static final DataKey<Boolean> ENCHANTMENT_GLINT_OVERRIDE = register("enchantment_glint_override");
|
||||
+ public static final DataKey<Unit> INTANGIBLE_PROJECTILE = register("intangible_projectile");
|
||||
+ // food
|
||||
+ public static final DataKey<Unit> FIRE_RESISTANT = register("fire_resistant");
|
||||
+ // tool
|
||||
+ // stored_enchantments
|
||||
+ // dyed_color
|
||||
+ // map_color
|
||||
+ // map_id
|
||||
+ // map_decorations
|
||||
+ // map_post_processing
|
||||
+ // charged_projectiles
|
||||
+ // bundle_contents
|
||||
+ // potion_contents
|
||||
+ // suspicious_stew_effects
|
||||
+ // writable_book_content
|
||||
+ // written_book_content
|
||||
+ // trim
|
||||
+ // debug_stick_state
|
||||
+ // entity_data
|
||||
+ // bucket_entity_data
|
||||
+ // block_entity_data
|
||||
+ // instrument
|
||||
+ public static final DataKey<Integer> OMINOUS_BOTTLE_AMPLIFIER = register("ominous_bottle_amplifier");
|
||||
+ // recipes
|
||||
+ // lodestone_tracker
|
||||
+ // firework_explosion
|
||||
+ // fireworks
|
||||
+ // profile
|
||||
+ // note_block_sound
|
||||
+ // banner_patterns
|
||||
+ // base_color
|
||||
+ // pot_decorations
|
||||
+ // container
|
||||
+ // block_state
|
||||
+ // bees
|
||||
+ // lock
|
||||
+ // container_loot
|
||||
+
|
||||
+ DataKeyMap empty();
|
||||
+
|
||||
+ DataKeyMap itemStack(Material material);
|
||||
+
|
||||
+ PatchedDataKeyMap meta(Material material, ItemMeta itemMeta);
|
||||
+
|
||||
+ ItemMeta toMeta(Material material, PatchedDataKeyMap dataKeyMap);
|
||||
+
|
||||
+ static class Holder {
|
||||
+
|
||||
+ public static DataKeyBridge BRIDGE = Services.service(DataKeyBridge.class)
|
||||
+ .orElseThrow();
|
||||
+ @SuppressWarnings("unchecked")
|
||||
+ private static <T> DataKey<T> register(String name) {
|
||||
+ return (DataKey<T>) Registry.DATA_KEYS.get(NamespacedKey.minecraft(name));
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKeyMap.java b/src/main/java/io/papermc/paper/datakey/DataKeyMap.java
|
||||
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..648a235377199c82df3896bf5fa6781dd5cce27d
|
||||
index 0000000000000000000000000000000000000000..c542860ee47cdd02d55b39aa6f1fe29f4e85773a
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKeyMap.java
|
||||
@@ -0,0 +1,26 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/map/DataKeyMap.java
|
||||
@@ -0,0 +1,27 @@
|
||||
+package io.papermc.paper.datakey.map;
|
||||
+
|
||||
+import javax.annotation.Nullable;
|
||||
+import io.papermc.paper.datakey.DataKey;
|
||||
+import org.jetbrains.annotations.Nullable;
|
||||
+import java.util.Set;
|
||||
+
|
||||
+public interface DataKeyMap {
|
||||
+
|
||||
+ static DataKeyMap empty() {
|
||||
+ return DataKeyBridge.Holder.BRIDGE.empty();
|
||||
+ return DataKeyMapBridge.Holder.BRIDGE.empty();
|
||||
+ }
|
||||
+
|
||||
+ @Nullable
|
||||
|
@ -85,54 +131,59 @@ index 0000000000000000000000000000000000000000..648a235377199c82df3896bf5fa6781d
|
|||
+ }
|
||||
+
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKeys.java b/src/main/java/io/papermc/paper/datakey/DataKeys.java
|
||||
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..46281a7bfd00e7486cf92f4b081e714effc770fd
|
||||
index 0000000000000000000000000000000000000000..9da6ab689eb43eb960429fe9a752c0c6c4183232
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKeys.java
|
||||
@@ -0,0 +1,20 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/map/DataKeyMapBridge.java
|
||||
@@ -0,0 +1,26 @@
|
||||
+package io.papermc.paper.datakey.map;
|
||||
+
|
||||
+import io.papermc.paper.datakey.types.Unbreakable;
|
||||
+import net.kyori.adventure.key.Key;
|
||||
+import org.bukkit.NamespacedKey;
|
||||
+import org.bukkit.Registry;
|
||||
+import net.kyori.adventure.util.Services;
|
||||
+import org.bukkit.Material;
|
||||
+import org.bukkit.inventory.meta.ItemMeta;
|
||||
+import org.jetbrains.annotations.ApiStatus;
|
||||
+
|
||||
+public class DataKeys {
|
||||
+@ApiStatus.Internal
|
||||
+public interface DataKeyMapBridge {
|
||||
+
|
||||
+ public static final DataKey<Integer> MAX_STACK_SIZE = register("max_stack_size");
|
||||
+ public static final DataKey<Integer> MAX_DAMAGE = register("max_damage");
|
||||
+ public static final DataKey<Integer> DAMAGE = register("damage");
|
||||
+ public static final DataKey<Unbreakable> UNBREAKABLE = register("unbreakable");
|
||||
+ PatchedDataKeyMap of(DataKeyMap keyMap);
|
||||
+
|
||||
+ @SuppressWarnings("unchecked")
|
||||
+ private static <T> DataKey<T> register(String name) {
|
||||
+ return (DataKey<T>) Registry.DATA_KEYS.get(NamespacedKey.minecraft(name));
|
||||
+ DataKeyMap empty();
|
||||
+
|
||||
+ DataKeyMap itemStack(Material material);
|
||||
+
|
||||
+ PatchedDataKeyMap meta(Material material, ItemMeta itemMeta);
|
||||
+
|
||||
+ ItemMeta toMeta(Material material, PatchedDataKeyMap dataKeyMap);
|
||||
+
|
||||
+ class Holder {
|
||||
+
|
||||
+ public static DataKeyMapBridge BRIDGE = Services.service(DataKeyMapBridge.class)
|
||||
+ .orElseThrow();
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/PatchedDataKeyMap.java b/src/main/java/io/papermc/paper/datakey/PatchedDataKeyMap.java
|
||||
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..f5c8c3c4f6989119934e47f82a120e486108c699
|
||||
index 0000000000000000000000000000000000000000..4a3c74320909d5dadf4fdd48fceeb60da111c311
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/PatchedDataKeyMap.java
|
||||
@@ -0,0 +1,31 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/map/PatchedDataKeyMap.java
|
||||
@@ -0,0 +1,30 @@
|
||||
+package io.papermc.paper.datakey.map;
|
||||
+
|
||||
+import io.papermc.paper.datakey.DataKey;
|
||||
+import io.papermc.paper.datakey.patch.DataKeyMapPatch;
|
||||
+import org.jetbrains.annotations.NotNull;
|
||||
+import javax.annotation.Nullable;
|
||||
+import java.util.Objects;
|
||||
+import java.util.Optional;
|
||||
+import org.jetbrains.annotations.Nullable;
|
||||
+
|
||||
+public interface PatchedDataKeyMap extends DataKeyMap {
|
||||
+
|
||||
+ static PatchedDataKeyMap empty() {
|
||||
+ return DataKeyBridge.Holder.BRIDGE.of(DataKeyBridge.Holder.BRIDGE.empty());
|
||||
+ return DataKeyMapBridge.Holder.BRIDGE.of(DataKeyMapBridge.Holder.BRIDGE.empty());
|
||||
+ }
|
||||
+
|
||||
+ static PatchedDataKeyMap of(DataKeyMap map) {
|
||||
+ return DataKeyBridge.Holder.BRIDGE.of(map);
|
||||
+ return DataKeyMapBridge.Holder.BRIDGE.of(map);
|
||||
+ }
|
||||
+
|
||||
+ @Nullable
|
||||
|
@ -161,23 +212,50 @@ index 0000000000000000000000000000000000000000..325a597b8d3e0c574b7bc80b7c9d0dee
|
|||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridge.java b/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridge.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..04d908dc4133f853772813b87c4954eae00cfb5d
|
||||
index 0000000000000000000000000000000000000000..7f76327b085f3857739d328cffc441f745f32209
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridge.java
|
||||
@@ -0,0 +1,13 @@
|
||||
@@ -0,0 +1,19 @@
|
||||
+package io.papermc.paper.datakey.types;
|
||||
+
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.kyori.adventure.util.Services;
|
||||
+import org.jetbrains.annotations.ApiStatus;
|
||||
+import java.util.List;
|
||||
+
|
||||
+@ApiStatus.Internal
|
||||
+public interface ComponentTypesBridge {
|
||||
+
|
||||
+ Unbreakable unbreakable(boolean showInTooltip);
|
||||
+
|
||||
+ ItemLore lore(List<Component> componentList);
|
||||
+
|
||||
+ public static class Holder {
|
||||
+ public static ComponentTypesBridge BRIDGE = Services.service(ComponentTypesBridge.class)
|
||||
+ .orElseThrow();
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/ItemLore.java b/src/main/java/io/papermc/paper/datakey/types/ItemLore.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b300d11642bb0c0bf5b68556cd211e31120d9af0
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/types/ItemLore.java
|
||||
@@ -0,0 +1,15 @@
|
||||
+package io.papermc.paper.datakey.types;
|
||||
+
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import java.util.List;
|
||||
+
|
||||
+public interface ItemLore {
|
||||
+
|
||||
+ static ItemLore lore(List<Component> showInTooltip) {
|
||||
+ return ComponentTypesBridge.Holder.BRIDGE.lore(showInTooltip);
|
||||
+ }
|
||||
+
|
||||
+ List<Component> lines();
|
||||
+
|
||||
+ List<Component> styledLines();
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/Unbreakable.java b/src/main/java/io/papermc/paper/datakey/types/Unbreakable.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..d6dc5fa334679767096da9f80740bbc9d9630617
|
||||
|
@ -199,8 +277,36 @@ index 0000000000000000000000000000000000000000..d6dc5fa334679767096da9f80740bbc9
|
|||
+ @Contract("_ -> new")
|
||||
+ Unbreakable showInTooltip(boolean hideInTooltip);
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/util/Unit.java b/src/main/java/io/papermc/paper/util/Unit.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..540bf0c6f3f33bd3b7282ce9b51d32707d8ffc63
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/util/Unit.java
|
||||
@@ -0,0 +1,8 @@
|
||||
+package io.papermc.paper.util;
|
||||
+
|
||||
+public interface Unit {
|
||||
+
|
||||
+ static Unit of() {
|
||||
+ return UnitHolder.UNIT;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/util/UnitHolder.java b/src/main/java/io/papermc/paper/util/UnitHolder.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..5312745cb67d48e2370251fb45aa2c5c93c52107
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/util/UnitHolder.java
|
||||
@@ -0,0 +1,8 @@
|
||||
+package io.papermc.paper.util;
|
||||
+
|
||||
+
|
||||
+class UnitHolder {
|
||||
+
|
||||
+ static final Unit UNIT = new Unit() {
|
||||
+ };
|
||||
+}
|
||||
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
|
||||
index 82d009c0bbe4b3026a535e02d6e0ed20c7bd525d..14de901564c8f8d7049047593bd16bc4d88505b2 100644
|
||||
index 82d009c0bbe4b3026a535e02d6e0ed20c7bd525d..2e829272171761da93c8d44d3c04e23e3c25516a 100644
|
||||
--- a/src/main/java/org/bukkit/Material.java
|
||||
+++ b/src/main/java/org/bukkit/Material.java
|
||||
@@ -128,7 +128,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
@ -208,28 +314,20 @@ index 82d009c0bbe4b3026a535e02d6e0ed20c7bd525d..14de901564c8f8d7049047593bd16bc4
|
|||
public enum Material implements Keyed, Translatable, net.kyori.adventure.translation.Translatable { // Paper
|
||||
//<editor-fold desc="Materials" defaultstate="collapsed">
|
||||
- AIR(9648, 0),
|
||||
+ AIR(9648, 64), // Paper - air techncially stacks to 64
|
||||
+ AIR(9648, 64), // Paper - air technically stacks to 64
|
||||
STONE(22948),
|
||||
GRANITE(21091),
|
||||
POLISHED_GRANITE(5477),
|
||||
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
|
||||
index 542c0516e19b6177ff8007ca6f8955dc9082da95..b5e02cdebcd42fe2b5121ae459463af5d74ecfcb 100644
|
||||
index 542c0516e19b6177ff8007ca6f8955dc9082da95..329480202c35908bb2ce6970d23f486b9666652c 100644
|
||||
--- a/src/main/java/org/bukkit/Registry.java
|
||||
+++ b/src/main/java/org/bukkit/Registry.java
|
||||
@@ -9,6 +9,7 @@ import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
+import io.papermc.paper.datakey.DataKey;
|
||||
import org.bukkit.advancement.Advancement;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.block.Biome;
|
||||
@@ -317,6 +318,8 @@ public interface Registry<T extends Keyed> extends Iterable<T> {
|
||||
@@ -317,6 +317,8 @@ public interface Registry<T extends Keyed> extends Iterable<T> {
|
||||
return StreamSupport.stream(this.spliterator(), false);
|
||||
}
|
||||
};
|
||||
+
|
||||
+ Registry<io.papermc.paper.datakey.DataKey<?>> DATA_KEYS = (Registry) Bukkit.getRegistry(DataKey.class);
|
||||
+ Registry<io.papermc.paper.datakey.DataKey<?>> DATA_KEYS = (Registry) Bukkit.getRegistry(io.papermc.paper.datakey.DataKey.class);
|
||||
// Paper end
|
||||
|
||||
/**
|
||||
|
@ -246,31 +344,39 @@ 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..5a7d77948934c89bcedfe728a82e42e3c7c0a2c7 100644
|
||||
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..d036e24e602d086e962723cb96a5e3896172e1b9 100644
|
||||
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
|
||||
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
|
||||
@@ -29,7 +29,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List; // Paper
|
||||
import java.util.Map;
|
||||
+import io.papermc.paper.datakey.map.PatchedDataKeyMap;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Translatable;
|
||||
@@ -29,7 +30,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
private Material type = Material.AIR;
|
||||
private int amount = 0;
|
||||
private MaterialData data = null;
|
||||
- private ItemMeta meta;
|
||||
+ private io.papermc.paper.datakey.PatchedDataKeyMap dataKeyMap; // Paper
|
||||
+ private PatchedDataKeyMap dataKeyMap; // Paper
|
||||
|
||||
@Utility
|
||||
protected ItemStack() {}
|
||||
@@ -86,6 +86,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -86,6 +87,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
Preconditions.checkArgument(type != null, "Material cannot be null");
|
||||
this.type = type;
|
||||
this.amount = amount;
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.of(io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.itemStack(type)); // Paper
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.of(io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.itemStack(type)); // Paper
|
||||
if (damage != 0) {
|
||||
setDurability(damage);
|
||||
}
|
||||
@@ -148,10 +149,8 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -148,10 +150,8 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@Deprecated // Paper
|
||||
public void setType(@NotNull Material type) {
|
||||
Preconditions.checkArgument(type != null, "Material cannot be null");
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.meta(type, Bukkit.getItemFactory().asMetaFor(io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.toMeta(this.type, this.dataKeyMap), type)); // Paper - update type first too, we need the old context to resolve the meta from the type
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.meta(type, Bukkit.getItemFactory().asMetaFor(this.getItemMeta(), type)); // Paper - update type first too, we need the old context to resolve the meta from the type
|
||||
this.type = type;
|
||||
- if (this.meta != null) {
|
||||
- this.meta = Bukkit.getItemFactory().asMetaFor(meta, type);
|
||||
|
@ -278,20 +384,15 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
if (type.isLegacy()) {
|
||||
createData((byte) 0);
|
||||
} else {
|
||||
@@ -275,11 +274,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -275,6 +275,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
*/
|
||||
@Utility
|
||||
public int getMaxStackSize() {
|
||||
- if (meta != null && meta.hasMaxStackSize()) {
|
||||
- return meta.getMaxStackSize();
|
||||
- }
|
||||
-
|
||||
- return getType().getMaxStackSize();
|
||||
+ return this.getDataKeyMap().get(io.papermc.paper.datakey.DataKeys.MAX_STACK_SIZE); // Paper
|
||||
}
|
||||
|
||||
private void createData(final byte data) {
|
||||
@@ -335,9 +330,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
+ ItemMeta meta = getItemMeta();
|
||||
if (meta != null && meta.hasMaxStackSize()) {
|
||||
return meta.getMaxStackSize();
|
||||
}
|
||||
@@ -335,9 +336,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
try {
|
||||
ItemStack itemStack = (ItemStack) super.clone();
|
||||
|
||||
|
@ -302,7 +403,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
|
||||
if (this.data != null) {
|
||||
itemStack.data = this.data.clone();
|
||||
@@ -357,7 +350,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -357,7 +356,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
hash = hash * 31 + getType().hashCode();
|
||||
hash = hash * 31 + getAmount();
|
||||
hash = hash * 31 + (getDurability() & 0xffff);
|
||||
|
@ -311,34 +412,34 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
|
||||
return hash;
|
||||
}
|
||||
@@ -369,7 +362,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -369,7 +368,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
* @return True if this has the given enchantment
|
||||
*/
|
||||
public boolean containsEnchantment(@NotNull Enchantment ench) {
|
||||
- return meta == null ? false : meta.hasEnchant(ench);
|
||||
+ return io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap()).hasEnchant(ench); // Paper
|
||||
+ return this.getItemMeta().hasEnchant(ench); // Paper
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -379,7 +372,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -379,7 +378,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
* @return Level of the enchantment, or 0
|
||||
*/
|
||||
public int getEnchantmentLevel(@NotNull Enchantment ench) {
|
||||
- return meta == null ? 0 : meta.getEnchantLevel(ench);
|
||||
+ return io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap()).getEnchantLevel(ench); // Paper
|
||||
+ return this.getItemMeta().getEnchantLevel(ench); // Paper
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,7 +382,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -389,7 +388,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
*/
|
||||
@NotNull
|
||||
public Map<Enchantment, Integer> getEnchantments() {
|
||||
- return meta == null ? ImmutableMap.<Enchantment, Integer>of() : meta.getEnchants();
|
||||
+ return io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap()).getEnchants(); // Paper
|
||||
+ return this.getItemMeta().getEnchants(); // Paper
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -465,10 +458,11 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -465,10 +464,11 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
* @param level Level of the enchantment
|
||||
*/
|
||||
public void addUnsafeEnchantment(@NotNull Enchantment ench, int level) {
|
||||
|
@ -351,7 +452,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -480,10 +474,10 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -480,10 +480,10 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
*/
|
||||
public int removeEnchantment(@NotNull Enchantment ench) {
|
||||
int level = getEnchantmentLevel(ench);
|
||||
|
@ -364,7 +465,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
return level;
|
||||
}
|
||||
|
||||
@@ -491,11 +485,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -491,11 +491,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
* Removes all enchantments on this ItemStack.
|
||||
*/
|
||||
public void removeEnchantments() {
|
||||
|
@ -377,16 +478,16 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
}
|
||||
|
||||
@Override
|
||||
@@ -647,7 +637,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -647,7 +643,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
*/
|
||||
@UndefinedNullability // Paper
|
||||
public ItemMeta getItemMeta() {
|
||||
- return this.meta == null ? Bukkit.getItemFactory().getItemMeta(this.type) : this.meta.clone();
|
||||
+ return io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap());
|
||||
+ return io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.toMeta(this.type, this.getDataKeyMap());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -656,7 +646,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -656,7 +652,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
* @return Returns true if some meta data has been set for this item
|
||||
*/
|
||||
public boolean hasItemMeta() {
|
||||
|
@ -395,12 +496,12 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -677,22 +667,13 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -677,22 +673,13 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
*/
|
||||
private boolean setItemMeta0(@Nullable ItemMeta itemMeta, @NotNull Material material) {
|
||||
if (itemMeta == null) {
|
||||
- this.meta = null;
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.PatchedDataKeyMap.of(io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.itemStack(material));
|
||||
+ this.dataKeyMap = PatchedDataKeyMap.of(io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.itemStack(material));
|
||||
return true;
|
||||
}
|
||||
if (!Bukkit.getItemFactory().isApplicable(itemMeta, material)) {
|
||||
|
@ -416,17 +517,17 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..5a7d77948934c89bcedfe728a82e42e3
|
|||
- if (this.meta == itemMeta) {
|
||||
- this.meta = itemMeta.clone();
|
||||
- }
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.DataKeyBridge.Holder.BRIDGE.meta(material, itemMeta);
|
||||
+ this.dataKeyMap = io.papermc.paper.datakey.map.DataKeyMapBridge.Holder.BRIDGE.meta(material, itemMeta);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1073,4 +1054,10 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
@@ -1073,4 +1060,10 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
||||
return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player);
|
||||
}
|
||||
// Paper end - expose itemstack tooltip lines
|
||||
+ // Paper start
|
||||
+ @NotNull
|
||||
+ public io.papermc.paper.datakey.PatchedDataKeyMap getDataKeyMap() {
|
||||
+ public PatchedDataKeyMap getDataKeyMap() {
|
||||
+ return this.dataKeyMap;
|
||||
+ }
|
||||
+ // Paper end
|
|
@ -3,21 +3,29 @@ From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|||
Date: Sun, 28 Apr 2024 19:53:01 -0400
|
||||
Subject: [PATCH] WIP DataKey API
|
||||
|
||||
squash! WIP DataKey API
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java b/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..8b46aea00d695704b42e265d374e61d6a6b0d2f7
|
||||
index 0000000000000000000000000000000000000000..d1b5eff0a0ef9c40892f7e8804309619770712cc
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java
|
||||
@@ -0,0 +1,37 @@
|
||||
@@ -0,0 +1,60 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import io.papermc.paper.adventure.PaperAdventure;
|
||||
+import io.papermc.paper.datakey.types.ItemLore;
|
||||
+import io.papermc.paper.datakey.types.PaperItemLore;
|
||||
+import io.papermc.paper.datakey.types.PaperUnbreakable;
|
||||
+import io.papermc.paper.datakey.types.Unbreakable;
|
||||
+import io.papermc.paper.util.Unit;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.minecraft.core.component.DataComponentType;
|
||||
+import net.minecraft.core.component.DataComponents;
|
||||
+import net.minecraft.core.registries.BuiltInRegistries;
|
||||
+import net.minecraft.resources.ResourceLocation;
|
||||
+import net.minecraft.world.item.Rarity;
|
||||
+import org.bukkit.inventory.ItemRarity;
|
||||
+import java.util.HashMap;
|
||||
+import java.util.Map;
|
||||
+import java.util.function.Function;
|
||||
|
@ -31,8 +39,24 @@ index 0000000000000000000000000000000000000000..8b46aea00d695704b42e265d374e61d6
|
|||
+ registerIdentity(DataComponents.MAX_DAMAGE, Integer.class);
|
||||
+ registerIdentity(DataComponents.MAX_STACK_SIZE, Integer.class);
|
||||
+ register(DataComponents.UNBREAKABLE, DataKeys.UNBREAKABLE, Unbreakable.class, (api) -> ((PaperUnbreakable) api).getHandle(), PaperUnbreakable::new);
|
||||
+ register(DataComponents.CUSTOM_NAME, DataKeys.CUSTOM_NAME, Component.class, PaperAdventure::asVanilla, PaperAdventure::asAdventure);
|
||||
+ register(DataComponents.ITEM_NAME, DataKeys.ITEM_NAME, Component.class, PaperAdventure::asVanilla, PaperAdventure::asAdventure);
|
||||
+ register(DataComponents.LORE, DataKeys.LORE, ItemLore.class, (api) -> ((PaperItemLore) api).getHandle(), PaperItemLore::new);
|
||||
+ register(DataComponents.RARITY, DataKeys.RARITY, ItemRarity.class, (api) -> Rarity.valueOf(api.name()), (nms) -> ItemRarity.valueOf(nms.name()));
|
||||
+ registerUnit(DataComponents.HIDE_ADDITIONAL_TOOLTIP);
|
||||
+ registerUnit(DataComponents.HIDE_TOOLTIP);
|
||||
+ registerIdentity(DataComponents.REPAIR_COST, Integer.class);
|
||||
+ registerUnit(DataComponents.CREATIVE_SLOT_LOCK);
|
||||
+ registerIdentity(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, Boolean.class);
|
||||
+ registerUnit(DataComponents.INTANGIBLE_PROJECTILE);
|
||||
+ registerUnit(DataComponents.FIRE_RESISTANT);
|
||||
+ registerIdentity(DataComponents.OMINOUS_BOTTLE_AMPLIFIER, Integer.class);
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ public static void registerUnit(DataComponentType<net.minecraft.util.Unit> type) {
|
||||
+ ADAPTERS.put(BuiltInRegistries.DATA_COMPONENT_TYPE.getKey(type), new ComponentAdapter<>(type, Unit.class, unit -> net.minecraft.util.Unit.INSTANCE, unit -> Unit.of()));
|
||||
+ }
|
||||
+ public static <COMMON> void registerIdentity(DataComponentType<COMMON> type, Class<COMMON> apiTypeValidation) {
|
||||
+ ADAPTERS.put(BuiltInRegistries.DATA_COMPONENT_TYPE.getKey(type), new ComponentAdapter<>(type, apiTypeValidation, (c) -> c, (c) -> c));
|
||||
+ }
|
||||
|
@ -49,26 +73,28 @@ index 0000000000000000000000000000000000000000..8b46aea00d695704b42e265d374e61d6
|
|||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/DataKeyBridgeImpl.java b/src/main/java/io/papermc/paper/datakey/DataKeyBridgeImpl.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..9df5dc277906248c2bdfd13d7ab14f3b2a001101
|
||||
index 0000000000000000000000000000000000000000..0a391811ef46087b6bc382da64c42d3b9383c3c6
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/DataKeyBridgeImpl.java
|
||||
@@ -0,0 +1,59 @@
|
||||
@@ -0,0 +1,61 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import com.mojang.authlib.GameProfile;
|
||||
+import io.papermc.paper.datakey.map.DataKeyMap;
|
||||
+import io.papermc.paper.datakey.map.DataKeyMapBridge;
|
||||
+import io.papermc.paper.datakey.map.PatchedDataKeyMap;
|
||||
+import net.minecraft.core.component.DataComponentMap;
|
||||
+import net.minecraft.core.component.DataComponents;
|
||||
+import net.minecraft.core.component.PatchedDataComponentMap;
|
||||
+import net.minecraft.world.item.Item;
|
||||
+import net.minecraft.world.item.ItemStack;
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.Material;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftItemType;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftMetaItem;
|
||||
+import org.bukkit.inventory.meta.ItemMeta;
|
||||
+
|
||||
+public class DataKeyBridgeImpl implements DataKeyBridge {
|
||||
+public class DataKeyBridgeImpl implements DataKeyMapBridge {
|
||||
+ @Override
|
||||
+ public PatchedDataKeyMap of(final DataKeyMap keyMap) {
|
||||
+ return new PaperPatchedDataKeyMap(new PatchedDataComponentMap(((PaperDataKeyMap) keyMap).nmsComponentMap));
|
||||
|
@ -114,10 +140,10 @@ index 0000000000000000000000000000000000000000..9df5dc277906248c2bdfd13d7ab14f3b
|
|||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/PaperComponentType.java b/src/main/java/io/papermc/paper/datakey/PaperComponentType.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..086b38f0f9d0c744dd5519c8f50b75d165c84bd5
|
||||
index 0000000000000000000000000000000000000000..d78d42a76cfc8c816635ce16cd9e830fd04bced5
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/PaperComponentType.java
|
||||
@@ -0,0 +1,70 @@
|
||||
@@ -0,0 +1,57 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import com.google.common.base.Preconditions;
|
||||
|
@ -142,12 +168,10 @@ index 0000000000000000000000000000000000000000..086b38f0f9d0c744dd5519c8f50b75d1
|
|||
+ return CraftRegistry.bukkitToMinecraft(bukkitDamageType);
|
||||
+ }
|
||||
+
|
||||
+ public static DataKey minecraftToBukkit(DataComponentType<?> minecraftDamageType) {
|
||||
+ public static DataKey<?> minecraftToBukkit(DataComponentType<?> minecraftDamageType) {
|
||||
+ return CraftRegistry.minecraftToBukkit(minecraftDamageType, Registries.DATA_COMPONENT_TYPE, Registry.DATA_KEYS);
|
||||
+ }
|
||||
+
|
||||
+ private final Class<T> type;
|
||||
+
|
||||
+ private final NamespacedKey key;
|
||||
+ private final ComponentAdapters.ComponentAdapter<T, NMS> adapter;
|
||||
+ private final DataComponentType<NMS> dataComponentType;
|
||||
|
@ -155,20 +179,9 @@ index 0000000000000000000000000000000000000000..086b38f0f9d0c744dd5519c8f50b75d1
|
|||
+ public PaperComponentType(NamespacedKey namespacedKey, DataComponentType<?> dataComponentType) {
|
||||
+ this.key = namespacedKey;
|
||||
+ this.adapter = (ComponentAdapters.ComponentAdapter<T, NMS>) ComponentAdapters.ADAPTERS.get(CraftNamespacedKey.toMinecraft(key));
|
||||
+ if (this.adapter != null) {
|
||||
+ this.type = this.adapter.apiTypeValidation();
|
||||
+ } else {
|
||||
+ this.type = null;
|
||||
+ }
|
||||
+ this.dataComponentType = (DataComponentType<NMS>) dataComponentType;
|
||||
+ }
|
||||
+
|
||||
+ // TODO: should we even have type?
|
||||
+ @Override
|
||||
+ public Class<T> type() {
|
||||
+ return this.type;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public @NotNull NamespacedKey getKey() {
|
||||
+ return this.key;
|
||||
|
@ -180,7 +193,7 @@ index 0000000000000000000000000000000000000000..086b38f0f9d0c744dd5519c8f50b75d1
|
|||
+ }
|
||||
+
|
||||
+ public ComponentAdapters.ComponentAdapter<T, NMS> getAdapter() {
|
||||
+ return adapter;
|
||||
+ return this.adapter;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
|
@ -190,19 +203,17 @@ index 0000000000000000000000000000000000000000..086b38f0f9d0c744dd5519c8f50b75d1
|
|||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/PaperDataKeyMap.java b/src/main/java/io/papermc/paper/datakey/PaperDataKeyMap.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b04010b9dff6d86bc38ddeab199ac4fb5cc0b699
|
||||
index 0000000000000000000000000000000000000000..e55c1bcbf62de62d7699cf2a050132b208083a3d
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/PaperDataKeyMap.java
|
||||
@@ -0,0 +1,39 @@
|
||||
@@ -0,0 +1,38 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import io.papermc.paper.datakey.patch.DataKeyMapPatch;
|
||||
+import io.papermc.paper.datakey.map.DataKeyMap;
|
||||
+import java.util.HashSet;
|
||||
+import java.util.Set;
|
||||
+import net.minecraft.core.component.DataComponentMap;
|
||||
+import net.minecraft.core.component.DataComponentType;
|
||||
+import net.minecraft.core.component.PatchedDataComponentMap;
|
||||
+import org.jetbrains.annotations.NotNull;
|
||||
+import org.jetbrains.annotations.Nullable;
|
||||
+
|
||||
+public class PaperDataKeyMap implements DataKeyMap {
|
||||
|
@ -218,8 +229,9 @@ index 0000000000000000000000000000000000000000..b04010b9dff6d86bc38ddeab199ac4fb
|
|||
+ public <T> T get(final DataKey<T> type) {
|
||||
+ PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
|
||||
+ ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
|
||||
+ Object keyValue = this.nmsComponentMap.get(paperComponentType.getHandle());
|
||||
+
|
||||
+ return adapter.apiConverter().apply(this.nmsComponentMap.get(paperComponentType.getHandle()));
|
||||
+ return keyValue == null ? null : adapter.apiConverter().apply(keyValue);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
|
@ -235,13 +247,13 @@ index 0000000000000000000000000000000000000000..b04010b9dff6d86bc38ddeab199ac4fb
|
|||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..d1a361f8e472db9ae1bb10e0effc0679d067d57d
|
||||
index 0000000000000000000000000000000000000000..a7bd48c01c473ccde84760d121dcad73aa6d0a59
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataKeyMap.java
|
||||
@@ -0,0 +1,73 @@
|
||||
@@ -0,0 +1,58 @@
|
||||
+package io.papermc.paper.datakey;
|
||||
+
|
||||
+import com.google.common.collect.Sets;
|
||||
+import io.papermc.paper.datakey.map.PatchedDataKeyMap;
|
||||
+import io.papermc.paper.datakey.patch.DataKeyMapPatch;
|
||||
+import net.minecraft.core.component.DataComponentType;
|
||||
+import net.minecraft.core.component.PatchedDataComponentMap;
|
||||
|
@ -262,7 +274,7 @@ index 0000000000000000000000000000000000000000..d1a361f8e472db9ae1bb10e0effc0679
|
|||
+ PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
|
||||
+ ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
|
||||
+
|
||||
+ return adapter.apiConverter().apply(this.patched().set(paperComponentType.getHandle(), adapter.nmsConverter().apply(value)));
|
||||
+ return adapter.apiConverter().apply(this.patched().set(paperComponentType.getHandle(), value == null ? null : adapter.nmsConverter().apply(value)));
|
||||
+ }
|
||||
+
|
||||
+ @Nullable
|
||||
|
@ -271,7 +283,12 @@ index 0000000000000000000000000000000000000000..d1a361f8e472db9ae1bb10e0effc0679
|
|||
+ PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
|
||||
+ ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
|
||||
+
|
||||
+ return adapter.apiConverter().apply(this.patched().remove(adapter.type()));
|
||||
+ Object removed = this.patched().remove(adapter.type());
|
||||
+ if (removed == null) {
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ return adapter.apiConverter().apply(removed);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
|
@ -288,44 +305,70 @@ index 0000000000000000000000000000000000000000..d1a361f8e472db9ae1bb10e0effc0679
|
|||
+ return new PaperPatchedDataKeyMap(this.patched().copy());
|
||||
+ }
|
||||
+
|
||||
+ @Nullable
|
||||
+ @Override
|
||||
+ public <T> T get(final DataKey<T> type) {
|
||||
+ PaperComponentType<T, Object> paperComponentType = (PaperComponentType<T, Object>) type;
|
||||
+ ComponentAdapters.ComponentAdapter<T, Object> adapter = paperComponentType.getAdapter();
|
||||
+
|
||||
+ return adapter.apiConverter().apply(this.nmsComponentMap.get(paperComponentType.getHandle()));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public Set<DataKey<?>> keySet() {
|
||||
+ Set<DataComponentType<?>> nmsKeys = this.nmsComponentMap.keySet();
|
||||
+ Set<DataKey<?>> keys = new HashSet<>(nmsKeys.size());
|
||||
+ for (DataComponentType<?> nmsKey : nmsKeys) {
|
||||
+ keys.add(PaperComponentType.minecraftToBukkit(nmsKey));
|
||||
+ }
|
||||
+
|
||||
+ return keys;
|
||||
+ }
|
||||
+
|
||||
+ public PatchedDataComponentMap patched() {
|
||||
+ return ((PatchedDataComponentMap) this.nmsComponentMap);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridgesImpl.java b/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridgesImpl.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..1b70278f2abcdb3a64d3004fa56cb1bb96d48f73
|
||||
index 0000000000000000000000000000000000000000..318bc1876857e17c767057fac669442735af0a8c
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridgesImpl.java
|
||||
@@ -0,0 +1,9 @@
|
||||
@@ -0,0 +1,23 @@
|
||||
+package io.papermc.paper.datakey.types;
|
||||
+
|
||||
+import io.papermc.paper.adventure.PaperAdventure;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import java.util.ArrayList;
|
||||
+import java.util.List;
|
||||
+
|
||||
+public class ComponentTypesBridgesImpl implements ComponentTypesBridge {
|
||||
+
|
||||
+ @Override
|
||||
+ public Unbreakable unbreakable(final boolean showInTooltip) {
|
||||
+ return new PaperUnbreakable(new net.minecraft.world.item.component.Unbreakable(showInTooltip));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ItemLore lore(final List<Component> componentList) {
|
||||
+ List<net.minecraft.network.chat.Component> nmsComponentList = new ArrayList<>(componentList.size());
|
||||
+ for (Component adventure : componentList) {
|
||||
+ nmsComponentList.add(PaperAdventure.asVanilla(adventure));
|
||||
+ }
|
||||
+ return new PaperItemLore(new net.minecraft.world.item.component.ItemLore(nmsComponentList));
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/PaperItemLore.java b/src/main/java/io/papermc/paper/datakey/types/PaperItemLore.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..ecc799921c6dd62d13399d7f14315503f9f5a2e5
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/datakey/types/PaperItemLore.java
|
||||
@@ -0,0 +1,26 @@
|
||||
+package io.papermc.paper.datakey.types;
|
||||
+
|
||||
+import com.google.common.collect.Lists;
|
||||
+import io.papermc.paper.adventure.PaperAdventure;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.minecraft.world.item.component.ItemLore;
|
||||
+import org.bukkit.craftbukkit.util.Handleable;
|
||||
+import java.util.List;
|
||||
+
|
||||
+public record PaperItemLore(ItemLore itemLore) implements io.papermc.paper.datakey.types.ItemLore, Handleable<ItemLore> {
|
||||
+
|
||||
+ @Override
|
||||
+ public ItemLore getHandle() {
|
||||
+ return this.itemLore;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public List<Component> lines() {
|
||||
+ return Lists.transform(this.itemLore.lines(), PaperAdventure::asAdventure);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public List<Component> styledLines() {
|
||||
+ return Lists.transform(this.itemLore.styledLines(), PaperAdventure::asAdventure);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/datakey/types/PaperUnbreakable.java b/src/main/java/io/papermc/paper/datakey/types/PaperUnbreakable.java
|
||||
new file mode 100644
|
||||
|
@ -354,27 +397,6 @@ index 0000000000000000000000000000000000000000..0e7874ffecc62edf53498ae7502d57cf
|
|||
+ return this.unbreakable;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
|
||||
index 36e3415b9312d3a80c9f5e1c36b42b7ea30c31c5..64519e035a034dcb609b0c45066a75de089c00a8 100644
|
||||
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
|
||||
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
|
||||
@@ -228,7 +228,7 @@ public final class ItemStack implements DataComponentHolder {
|
||||
@Deprecated
|
||||
@Nullable
|
||||
private Item item;
|
||||
- final PatchedDataComponentMap components;
|
||||
+ PatchedDataComponentMap components; // Paper
|
||||
@Nullable
|
||||
private Entity entityRepresentation;
|
||||
|
||||
@@ -1251,6 +1251,7 @@ public final class ItemStack implements DataComponentHolder {
|
||||
public void setItem(Item item) {
|
||||
this.bukkitStack = null; // Paper
|
||||
this.item = item;
|
||||
+ this.components = new PatchedDataComponentMap(item.asItem().components());
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
|
||||
index 73472890e30180dc3cb6aa1bd9c5815087334682..189b8d995caa7e8190c6c07400c75d791f6465ed 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
|
||||
|
@ -392,18 +414,10 @@ index 73472890e30180dc3cb6aa1bd9c5815087334682..189b8d995caa7e8190c6c07400c75d79
|
|||
return null;
|
||||
}
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
||||
index eba5a27e452c4063567fb02d6aabdfb0446d5daf..7d8d7174d44d08752e90568cd06c1bea2831482f 100644
|
||||
index eba5a27e452c4063567fb02d6aabdfb0446d5daf..2ab8cc39ef9a039c620b5784d150bc519177b462 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
|
||||
@@ -18,6 +18,7 @@ import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.material.MaterialData;
|
||||
+import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@DelegateDeserialization(ItemStack.class)
|
||||
public final class CraftItemStack extends ItemStack {
|
||||
@@ -202,7 +203,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
@@ -202,7 +202,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
|
||||
@Override
|
||||
public int getMaxStackSize() {
|
||||
|
@ -412,7 +426,7 @@ index eba5a27e452c4063567fb02d6aabdfb0446d5daf..7d8d7174d44d08752e90568cd06c1bea
|
|||
}
|
||||
|
||||
// Paper start
|
||||
@@ -329,7 +330,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
@@ -329,7 +329,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
// Paper start - support updating profile after resolving it
|
||||
final CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator() {
|
||||
@Override
|
||||
|
@ -421,7 +435,7 @@ index eba5a27e452c4063567fb02d6aabdfb0446d5daf..7d8d7174d44d08752e90568cd06c1bea
|
|||
itemStack.set(DataComponents.PROFILE, new net.minecraft.world.item.component.ResolvableProfile(gameProfile));
|
||||
}
|
||||
};
|
||||
@@ -697,7 +698,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
@@ -697,7 +697,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
// Paper start - support updating profile after resolving it
|
||||
CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator() {
|
||||
@Override
|
||||
|
@ -430,7 +444,7 @@ index eba5a27e452c4063567fb02d6aabdfb0446d5daf..7d8d7174d44d08752e90568cd06c1bea
|
|||
item.set(DataComponents.PROFILE, new net.minecraft.world.item.component.ResolvableProfile(gameProfile));
|
||||
}
|
||||
};
|
||||
@@ -742,7 +743,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
@@ -742,7 +742,7 @@ public final class CraftItemStack extends ItemStack {
|
||||
|
||||
@Override
|
||||
public boolean hasItemMeta() {
|
||||
|
@ -439,16 +453,15 @@ index eba5a27e452c4063567fb02d6aabdfb0446d5daf..7d8d7174d44d08752e90568cd06c1bea
|
|||
}
|
||||
|
||||
static boolean hasItemMeta(net.minecraft.world.item.ItemStack item) {
|
||||
@@ -767,5 +768,15 @@ public final class CraftItemStack extends ItemStack {
|
||||
@@ -767,5 +767,14 @@ public final class CraftItemStack extends ItemStack {
|
||||
mirrored.setItemMeta(mirrored.getItemMeta());
|
||||
return mirrored;
|
||||
}
|
||||
+
|
||||
+ @NotNull
|
||||
+ @Override
|
||||
+ public io.papermc.paper.datakey.PatchedDataKeyMap getDataKeyMap() {
|
||||
+ public io.papermc.paper.datakey.PaperPatchedDataKeyMap getDataKeyMap() {
|
||||
+ if (this.handle == null) {
|
||||
+ return new io.papermc.paper.datakey.PaperPatchedDataKeyMap(new net.minecraft.core.component.PatchedDataComponentMap(net.minecraft.core.component.DataComponentMap.EMPTY)); // Paper
|
||||
+ return new io.papermc.paper.datakey.PaperPatchedDataKeyMap(new net.minecraft.core.component.PatchedDataComponentMap(net.minecraft.core.component.DataComponentMap.EMPTY)); // Paper
|
||||
+ }
|
||||
+
|
||||
+ return new io.papermc.paper.datakey.PaperPatchedDataKeyMap((net.minecraft.core.component.PatchedDataComponentMap) this.handle.getComponents()); // Paper
|
||||
|
@ -497,11 +510,11 @@ index c2517ad00b6efba47e792a46e591038d79cb3a82..bae381c1a60fb25d271e49829b0a086f
|
|||
if (this.hasDisplayName()) {
|
||||
itemTag.put(CraftMetaItem.NAME, this.displayName);
|
||||
}
|
||||
diff --git a/src/main/resources/META-INF/services/io.papermc.paper.datakey.DataKeyBridge b/src/main/resources/META-INF/services/io.papermc.paper.datakey.DataKeyBridge
|
||||
diff --git a/src/main/resources/META-INF/services/io.papermc.paper.datakey.map.DataKeyMapBridge b/src/main/resources/META-INF/services/io.papermc.paper.datakey.map.DataKeyMapBridge
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..2b625546a2053c9131124d983f1a8c0512e7c88c
|
||||
--- /dev/null
|
||||
+++ b/src/main/resources/META-INF/services/io.papermc.paper.datakey.DataKeyBridge
|
||||
+++ b/src/main/resources/META-INF/services/io.papermc.paper.datakey.map.DataKeyMapBridge
|
||||
@@ -0,0 +1 @@
|
||||
+io.papermc.paper.datakey.DataKeyBridgeImpl
|
||||
diff --git a/src/main/resources/META-INF/services/io.papermc.paper.datakey.types.ComponentTypesBridge b/src/main/resources/META-INF/services/io.papermc.paper.datakey.types.ComponentTypesBridge
|
||||
|
@ -512,6 +525,386 @@ index 0000000000000000000000000000000000000000..d43e2b2d0e86ed585ba7bfd4e26d6259
|
|||
@@ -0,0 +1 @@
|
||||
+io.papermc.paper.datakey.types.ComponentTypesBridgesImpl
|
||||
\ No newline at end of file
|
||||
diff --git a/src/test/java/io/papermc/paper/item/MetaComparisonTest.java b/src/test/java/io/papermc/paper/item/MetaComparisonTest.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..03aeb992c274d762c1b3475458851671d3045ffc
|
||||
--- /dev/null
|
||||
+++ b/src/test/java/io/papermc/paper/item/MetaComparisonTest.java
|
||||
@@ -0,0 +1,284 @@
|
||||
+package io.papermc.paper.item;
|
||||
+
|
||||
+import com.destroystokyo.paper.profile.CraftPlayerProfile;
|
||||
+import com.destroystokyo.paper.profile.PlayerProfile;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.kyori.adventure.text.event.HoverEvent;
|
||||
+import net.kyori.adventure.text.format.NamedTextColor;
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.ChatColor;
|
||||
+import org.bukkit.Color;
|
||||
+import org.bukkit.Material;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftItemFactory;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||
+import org.bukkit.enchantments.Enchantment;
|
||||
+import org.bukkit.inventory.ItemFactory;
|
||||
+import org.bukkit.inventory.ItemStack;
|
||||
+import org.bukkit.inventory.meta.BookMeta;
|
||||
+import org.bukkit.inventory.meta.ItemMeta;
|
||||
+import org.bukkit.inventory.meta.PotionMeta;
|
||||
+import org.bukkit.inventory.meta.SkullMeta;
|
||||
+import org.bukkit.potion.PotionEffect;
|
||||
+import org.bukkit.potion.PotionEffectType;
|
||||
+import org.bukkit.support.AbstractTestingBase;
|
||||
+import org.bukkit.util.Consumer;
|
||||
+import org.junit.jupiter.api.Assertions;
|
||||
+import org.junit.jupiter.api.Test;
|
||||
+
|
||||
+import java.util.UUID;
|
||||
+
|
||||
+// TODO: This should technically be used to compare legacy meta vs the newly implemented
|
||||
+public class MetaComparisonTest extends AbstractTestingBase {
|
||||
+
|
||||
+ private static final ItemFactory FACTORY = CraftItemFactory.instance();
|
||||
+
|
||||
+ @Test
|
||||
+ public void testMetaApplication() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+
|
||||
+ ItemMeta meta = itemStack.getItemMeta();
|
||||
+ meta.setCustomModelData(1);
|
||||
+
|
||||
+ ItemMeta converted = FACTORY.asMetaFor(meta, Material.GOLD_INGOT);
|
||||
+ Assertions.assertEquals(converted.getCustomModelData(), meta.getCustomModelData());
|
||||
+
|
||||
+ ItemMeta convertedAdvanced = FACTORY.asMetaFor(meta, Material.PLAYER_HEAD);
|
||||
+ Assertions.assertEquals(convertedAdvanced.getCustomModelData(), meta.getCustomModelData());
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testMetaApplicationDowngrading() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.PLAYER_HEAD);
|
||||
+ PlayerProfile profile = Bukkit.createProfile("Owen1212055");
|
||||
+
|
||||
+ SkullMeta meta = (SkullMeta) itemStack.getItemMeta();
|
||||
+ meta.setPlayerProfile(profile);
|
||||
+
|
||||
+ SkullMeta converted = (SkullMeta) FACTORY.asMetaFor(meta, Material.PLAYER_HEAD);
|
||||
+ Assertions.assertEquals(converted.getPlayerProfile(), meta.getPlayerProfile());
|
||||
+
|
||||
+ SkullMeta downgraded = (SkullMeta) FACTORY.asMetaFor(FACTORY.asMetaFor(meta, Material.STONE), Material.PLAYER_HEAD);
|
||||
+ Assertions.assertNull(downgraded.getPlayerProfile());
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testMetaApplicationDowngradingPotion() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.POTION);
|
||||
+ Color color = Color.BLUE;
|
||||
+
|
||||
+ PotionMeta meta = (PotionMeta) itemStack.getItemMeta();
|
||||
+ meta.setColor(color);
|
||||
+
|
||||
+ PotionMeta converted = (PotionMeta) FACTORY.asMetaFor(meta, Material.POTION);
|
||||
+ Assertions.assertEquals(converted.getColor(), color);
|
||||
+
|
||||
+ PotionMeta downgraded = (PotionMeta) FACTORY.asMetaFor(FACTORY.asMetaFor(meta, Material.STONE), Material.POTION);
|
||||
+ Assertions.assertNull(downgraded.getColor());
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ @Test
|
||||
+ public void testNullMeta() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.AIR);
|
||||
+
|
||||
+ //Assertions.assertFalse(itemStack.hasItemMeta());
|
||||
+ Assertions.assertNull(itemStack.getItemMeta());
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testPotionMeta() {
|
||||
+ PotionEffect potionEffect = new PotionEffect(PotionEffectType.SPEED, 10, 10, false);
|
||||
+ ItemStack nmsItemStack = new ItemStack(Material.POTION, 1);
|
||||
+
|
||||
+ testSetAndGet(nmsItemStack,
|
||||
+ (meta) -> ((PotionMeta) meta).addCustomEffect(potionEffect, true),
|
||||
+ (meta) -> Assertions.assertEquals(potionEffect, ((PotionMeta) meta).getCustomEffects().get(0))
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testEnchantment() {
|
||||
+ ItemStack stack = new ItemStack(Material.STICK, 1);
|
||||
+
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> Assertions.assertTrue(meta.addEnchant(Enchantment.SHARPNESS, 1, true)),
|
||||
+ (meta) -> Assertions.assertEquals(1, meta.getEnchantLevel(Enchantment.SHARPNESS))
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ //@Test
|
||||
+ public void testPlayerHead() {
|
||||
+ PlayerProfile profile = new CraftPlayerProfile(UUID.randomUUID(), "Owen1212055");
|
||||
+ ItemStack stack = new ItemStack(Material.PLAYER_HEAD, 1);
|
||||
+
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((SkullMeta) meta).setPlayerProfile(profile),
|
||||
+ (meta) -> {
|
||||
+ Assertions.assertTrue(((SkullMeta) meta).hasOwner());
|
||||
+ Assertions.assertEquals(profile, ((SkullMeta) meta).getPlayerProfile());
|
||||
+ }
|
||||
+ );
|
||||
+
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((SkullMeta) meta).setOwner("Owen1212055"),
|
||||
+ (meta) -> {
|
||||
+ Assertions.assertTrue(((SkullMeta) meta).hasOwner());
|
||||
+ Assertions.assertEquals("Owen1212055", ((SkullMeta) meta).getOwner());
|
||||
+ }
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testBookMetaAuthor() {
|
||||
+ ItemStack stack = new ItemStack(Material.WRITTEN_BOOK, 1);
|
||||
+
|
||||
+ // Legacy string
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).setAuthor("Owen1212055"),
|
||||
+ (meta) -> Assertions.assertEquals("Owen1212055", ((BookMeta) meta).getAuthor())
|
||||
+ );
|
||||
+
|
||||
+ // Component Colored
|
||||
+ Component coloredName = Component.text("Owen1212055", NamedTextColor.DARK_GRAY);
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).author(coloredName),
|
||||
+ (meta) -> Assertions.assertEquals(coloredName, ((BookMeta) meta).author())
|
||||
+ );
|
||||
+
|
||||
+ // Simple text
|
||||
+ Component name = Component.text("Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).author(name),
|
||||
+ (meta) -> Assertions.assertEquals(name, ((BookMeta) meta).author())
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testBookMetaTitle() {
|
||||
+ ItemStack stack = new ItemStack(Material.WRITTEN_BOOK, 1);
|
||||
+
|
||||
+ // Legacy string
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).setTitle("Owen1212055"),
|
||||
+ (meta) -> Assertions.assertEquals("Owen1212055", ((BookMeta) meta).getTitle())
|
||||
+ );
|
||||
+
|
||||
+ // Component Colored
|
||||
+ Component coloredName = Component.text("Owen1212055", NamedTextColor.DARK_GRAY);
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).title(coloredName),
|
||||
+ (meta) -> Assertions.assertEquals(coloredName, ((BookMeta) meta).title())
|
||||
+ );
|
||||
+
|
||||
+ // Simple text
|
||||
+ Component name = Component.text("Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).title(name),
|
||||
+ (meta) -> Assertions.assertEquals(name, ((BookMeta) meta).title())
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ @Test
|
||||
+ public void testWriteableBookPages() {
|
||||
+ ItemStack stack = new ItemStack(Material.WRITABLE_BOOK, 1);
|
||||
+
|
||||
+ // Writeable books are serialized as plain text, but has weird legacy color support.
|
||||
+ // So, we need to test to make sure that all works here.
|
||||
+
|
||||
+ // Legacy string
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPage("Owen1212055"),
|
||||
+ (meta) -> Assertions.assertEquals("Owen1212055", ((BookMeta) meta).getPage(1))
|
||||
+ );
|
||||
+
|
||||
+ // Legacy string colored
|
||||
+ String translatedLegacy = ChatColor.translateAlternateColorCodes('&', "&7Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPage(translatedLegacy),
|
||||
+ (meta) -> Assertions.assertEquals(translatedLegacy, ((BookMeta) meta).getPage(1))
|
||||
+ );
|
||||
+
|
||||
+ // Component Colored
|
||||
+ Component coloredName = Component.text("Owen1212055", NamedTextColor.DARK_GRAY);
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(coloredName),
|
||||
+ (meta) -> Assertions.assertEquals(coloredName, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+
|
||||
+ // Simple text
|
||||
+ Component name = Component.text("Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(name),
|
||||
+ (meta) -> Assertions.assertEquals(name, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+
|
||||
+ // Simple text + hover... should NOT be saved
|
||||
+ // As this is plain text
|
||||
+ Component nameWithHover = Component.text("Owen1212055")
|
||||
+ .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Hover")));
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(nameWithHover),
|
||||
+ (meta) -> Assertions.assertEquals(name, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testWrittenBookPages() {
|
||||
+ ItemStack stack = new ItemStack(Material.WRITTEN_BOOK, 1);
|
||||
+
|
||||
+ // Writeable books are serialized as plain text, but has weird legacy color support.
|
||||
+ // So, we need to test to make sure that all works here.
|
||||
+
|
||||
+ // Legacy string
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPage("Owen1212055"),
|
||||
+ (meta) -> Assertions.assertEquals("Owen1212055", ((BookMeta) meta).getPage(1))
|
||||
+ );
|
||||
+
|
||||
+ // Legacy string colored
|
||||
+ String translatedLegacy = ChatColor.translateAlternateColorCodes('&', "&7Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPage(translatedLegacy),
|
||||
+ (meta) -> Assertions.assertEquals(translatedLegacy, ((BookMeta) meta).getPage(1))
|
||||
+ );
|
||||
+
|
||||
+ // Component Colored
|
||||
+ Component coloredName = Component.text("Owen1212055", NamedTextColor.DARK_GRAY);
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(coloredName),
|
||||
+ (meta) -> Assertions.assertEquals(coloredName, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+
|
||||
+ // Simple text
|
||||
+ Component name = Component.text("Owen1212055");
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(name),
|
||||
+ (meta) -> Assertions.assertEquals(name, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+
|
||||
+ // Simple text + hover... should be saved
|
||||
+ Component nameWithHover = Component.text("Owen1212055")
|
||||
+ .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Hover")));
|
||||
+ testSetAndGet(stack,
|
||||
+ (meta) -> ((BookMeta) meta).addPages(nameWithHover),
|
||||
+ (meta) -> Assertions.assertEquals(nameWithHover, ((BookMeta) meta).page(1))
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ private void testSetAndGet(org.bukkit.inventory.ItemStack itemStack,
|
||||
+ Consumer<ItemMeta> set,
|
||||
+ Consumer<ItemMeta> get) {
|
||||
+ ItemMeta craftMeta = CraftItemStack.getItemMeta(CraftItemStack.asNMSCopy(itemStack)); // TODO: This should be converted to use the old meta when this is added.
|
||||
+ ItemMeta paperMeta = CraftItemStack.getItemMeta(CraftItemStack.asNMSCopy(itemStack));
|
||||
+ // Test craft meta
|
||||
+ set.accept(craftMeta);
|
||||
+ get.accept(craftMeta);
|
||||
+
|
||||
+ // Test paper meta
|
||||
+ set.accept(paperMeta);
|
||||
+ get.accept(paperMeta);
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
diff --git a/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java b/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..c60ec00464d5d4216544240f64a867e51ac7335d
|
||||
--- /dev/null
|
||||
+++ b/src/test/java/io/papermc/paper/item/MetaDataKeyMetaTest.java
|
||||
@@ -0,0 +1,84 @@
|
||||
+package io.papermc.paper.item;
|
||||
+
|
||||
+import io.papermc.paper.datakey.DataKey;
|
||||
+import io.papermc.paper.datakey.DataKeys;
|
||||
+import io.papermc.paper.datakey.types.Unbreakable;
|
||||
+import io.papermc.paper.util.Unit;
|
||||
+import org.bukkit.Material;
|
||||
+import org.bukkit.inventory.ItemFlag;
|
||||
+import org.bukkit.inventory.ItemStack;
|
||||
+import org.bukkit.inventory.meta.Damageable;
|
||||
+import org.bukkit.inventory.meta.ItemMeta;
|
||||
+import org.bukkit.inventory.meta.Repairable;
|
||||
+import org.bukkit.support.AbstractTestingBase;
|
||||
+import org.junit.jupiter.api.Assertions;
|
||||
+import org.junit.jupiter.api.Test;
|
||||
+import java.util.function.BiConsumer;
|
||||
+import java.util.function.Function;
|
||||
+
|
||||
+public class MetaDataKeyMetaTest extends AbstractTestingBase {
|
||||
+
|
||||
+ @Test
|
||||
+ public void testMaxStackSizeIntegrity() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.MAX_STACK_SIZE, 32, ItemMeta::getMaxStackSize, ItemMeta::setMaxStackSize, ItemMeta.class);
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testMaxDamageIntegrity() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.MAX_DAMAGE, 120, Damageable::getMaxDamage, Damageable::setMaxDamage, Damageable.class);
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testDamageIntegrity() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.DAMAGE, 120, Damageable::getDamage, Damageable::setDamage, Damageable.class);
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testRepairCost() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.REPAIR_COST, 120, Repairable::getRepairCost, Repairable::setRepairCost, Repairable.class);
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testUnbreakable() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ itemStack.getDataKeyMap().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);
|
||||
+ Assertions.assertFalse(itemStack.getItemMeta().isUnbreakable());
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testToolTipAdditional() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ itemStack.getDataKeyMap().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP, Unit.of());
|
||||
+
|
||||
+ Assertions.assertTrue(itemStack.getItemMeta().getItemFlags().contains(ItemFlag.HIDE_ADDITIONAL_TOOLTIP));
|
||||
+ itemStack.getDataKeyMap().set(DataKeys.HIDE_ADDITIONAL_TOOLTIP, null);
|
||||
+ Assertions.assertFalse(itemStack.getItemMeta().getItemFlags().contains(ItemFlag.HIDE_ADDITIONAL_TOOLTIP));
|
||||
+ }
|
||||
+
|
||||
+ @Test
|
||||
+ public void testToolTip() {
|
||||
+ ItemStack itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.HIDE_TOOLTIP, Unit.of(), (meta) -> meta.isHideTooltip() ? Unit.of() : null, (meta, val) -> meta.setHideTooltip(val != null), ItemMeta.class);
|
||||
+ itemStack = new ItemStack(Material.STONE);
|
||||
+ testSimpleValue(itemStack, DataKeys.HIDE_TOOLTIP, null, (meta) -> meta.isHideTooltip() ? Unit.of() : null, (meta, val) -> meta.setHideTooltip(false), ItemMeta.class);
|
||||
+ }
|
||||
+
|
||||
+ @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));
|
||||
+
|
||||
+ Assertions.assertEquals(metaGetter.apply((M) itemStack.getItemMeta()), value);
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+}
|
||||
diff --git a/src/test/java/org/bukkit/PerMaterialTest.java b/src/test/java/org/bukkit/PerMaterialTest.java
|
||||
index 702a0c29dc2a7fc435fa590c5c66347aea0e014b..419a7dbbe9c50099a4d35c564f7e9c2ba652be75 100644
|
||||
--- a/src/test/java/org/bukkit/PerMaterialTest.java
|
|
@ -0,0 +1,37 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
||||
Date: Mon, 29 Apr 2024 08:11:45 -0400
|
||||
Subject: [PATCH] fixup! Test changes
|
||||
|
||||
|
||||
diff --git a/src/test/java/org/bukkit/support/DummyServer.java b/src/test/java/org/bukkit/support/DummyServer.java
|
||||
index 7a4681155f740a98ecafa0b992eae1fb5524551f..c94ce4a85716debf5ab5dd67471361425f22a8c2 100644
|
||||
--- a/src/test/java/org/bukkit/support/DummyServer.java
|
||||
+++ b/src/test/java/org/bukkit/support/DummyServer.java
|
||||
@@ -57,8 +57,25 @@ public final class DummyServer {
|
||||
final org.bukkit.plugin.PluginManager pluginManager = new io.papermc.paper.plugin.manager.PaperPluginManagerImpl(instance, new org.bukkit.command.SimpleCommandMap(instance), null);
|
||||
when(instance.getPluginManager()).thenReturn(pluginManager);
|
||||
when(instance.getTag(anyString(), any(org.bukkit.NamespacedKey.class), any())).thenAnswer(ignored -> new io.papermc.paper.util.EmptyTag());
|
||||
+ when(instance.createProfile(any(), anyString())).thenAnswer(invocation -> {
|
||||
+ java.util.UUID uuid = invocation.getArgument(0, java.util.UUID.class);
|
||||
+ String name = invocation.getArgument(1, String.class);
|
||||
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, name);
|
||||
+ });
|
||||
+ when(instance.createProfile(anyString())).thenAnswer(invocation -> {
|
||||
+ String name = invocation.getArgument(0, String.class);
|
||||
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(null, name);
|
||||
+ });
|
||||
+ when(instance.createProfileExact(any(), anyString())).thenAnswer(invocation -> {
|
||||
+ java.util.UUID uuid = invocation.getArgument(0, java.util.UUID.class);
|
||||
+ String name = invocation.getArgument(1, String.class);
|
||||
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, name);
|
||||
+ });
|
||||
+ when(instance.createProfile(any(java.util.UUID.class))).thenAnswer(invocation -> {
|
||||
+ java.util.UUID uuid = invocation.getArgument(0, java.util.UUID.class);
|
||||
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, null);
|
||||
+ });
|
||||
// paper end - testing additions
|
||||
-
|
||||
Bukkit.setServer(instance);
|
||||
} catch (Throwable t) {
|
||||
throw new Error(t);
|
Loading…
Reference in New Issue