diff --git a/patches/api/0480-WIP-DataComponent-API.patch b/patches/api/0480-WIP-DataComponent-API.patch index 732e017c20..639fd14ae7 100644 --- a/patches/api/0480-WIP-DataComponent-API.patch +++ b/patches/api/0480-WIP-DataComponent-API.patch @@ -67,10 +67,10 @@ index 0000000000000000000000000000000000000000..50d15b4e0ed5cd17fdc95476ee4650ef +} diff --git a/src/main/java/io/papermc/paper/component/DataComponentTypes.java b/src/main/java/io/papermc/paper/component/DataComponentTypes.java new file mode 100644 -index 0000000000000000000000000000000000000000..dfb4bfa4183818d7aa6a714979b5f7b8808867f0 +index 0000000000000000000000000000000000000000..f400a1e230c51c96584e91a663d6f3500b0fb966 --- /dev/null +++ b/src/main/java/io/papermc/paper/component/DataComponentTypes.java -@@ -0,0 +1,112 @@ +@@ -0,0 +1,114 @@ +package io.papermc.paper.component; + +import io.papermc.paper.component.item.BannerPatternLayers; @@ -86,6 +86,7 @@ index 0000000000000000000000000000000000000000..dfb4bfa4183818d7aa6a714979b5f7b8 +import io.papermc.paper.component.item.ItemContainerContents; +import io.papermc.paper.component.item.ItemEnchantments; +import io.papermc.paper.component.item.ItemLore; ++import io.papermc.paper.component.item.JukeboxPlayable; +import io.papermc.paper.component.item.LockCode; +import io.papermc.paper.component.item.LodestoneTracker; +import io.papermc.paper.component.item.MapDecorations; @@ -156,6 +157,7 @@ index 0000000000000000000000000000000000000000..dfb4bfa4183818d7aa6a714979b5f7b8 + // block_entity_data + public static final DataComponentType.Valued INSTRUMENT = valued("instrument"); + public static final DataComponentType.Valued OMINOUS_BOTTLE_AMPLIFIER = valued("ominous_bottle_amplifier"); ++ public static final DataComponentType.Valued JUKEBOX_PLAYALE = valued("jukebox_playable"); + public static final DataComponentType.Valued> RECIPES = valued("recipes"); + public static final DataComponentType.Valued LODESTONE_TRACKER = valued("lodestone_tracker"); + public static final DataComponentType.Valued FIREWORK_EXPLOSION = valued("firework_explosion"); @@ -363,10 +365,10 @@ index 0000000000000000000000000000000000000000..48f5b0a3bceb4312a5a2e10ee27811ce +} diff --git a/src/main/java/io/papermc/paper/component/item/ComponentTypesBridge.java b/src/main/java/io/papermc/paper/component/item/ComponentTypesBridge.java new file mode 100644 -index 0000000000000000000000000000000000000000..6b00f5383bb3c957da62d2abe675f0d3059bad33 +index 0000000000000000000000000000000000000000..106790f1eb225fc6557d412f075fd40aeeebe412 --- /dev/null +++ b/src/main/java/io/papermc/paper/component/item/ComponentTypesBridge.java -@@ -0,0 +1,76 @@ +@@ -0,0 +1,78 @@ +package io.papermc.paper.component.item; + +import io.papermc.paper.util.Filtered; @@ -442,6 +444,8 @@ index 0000000000000000000000000000000000000000..6b00f5383bb3c957da62d2abe675f0d3 + LockCode.Builder lockCode(); + + ItemContainerContents.Builder itemContainerContents(); ++ ++ JukeboxPlayable.Builder jukeboxPlayable(); +} diff --git a/src/main/java/io/papermc/paper/component/item/CustomModelData.java b/src/main/java/io/papermc/paper/component/item/CustomModelData.java new file mode 100644 @@ -862,6 +866,40 @@ index 0000000000000000000000000000000000000000..f2db3054e16bcdd615b98cc728d17f96 + @NonNull Builder addAllLines(@NonNull List<@NonNull ? extends ComponentLike> lines); + } +} +diff --git a/src/main/java/io/papermc/paper/component/item/JukeboxPlayable.java b/src/main/java/io/papermc/paper/component/item/JukeboxPlayable.java +new file mode 100644 +index 0000000000000000000000000000000000000000..85ebf9c5e372ffc15b556c48f52baba540da1afa +--- /dev/null ++++ b/src/main/java/io/papermc/paper/component/item/JukeboxPlayable.java +@@ -0,0 +1,28 @@ ++package io.papermc.paper.component.item; ++ ++import io.papermc.paper.component.ComponentBuilder; ++import org.bukkit.JukeboxSong; ++import org.bukkit.attribute.Attribute; ++import org.bukkit.attribute.AttributeModifier; ++import org.checkerframework.checker.nullness.qual.NonNull; ++import org.jetbrains.annotations.ApiStatus; ++import org.jetbrains.annotations.Contract; ++import org.jetbrains.annotations.Unmodifiable; ++import java.util.List; ++ ++public interface JukeboxPlayable extends ShownInTooltip { ++ ++ @Contract(value = "-> new", pure = true) ++ static JukeboxPlayable.@NonNull Builder jukeboxPlayable() { ++ return ComponentTypesBridge.bridge().jukeboxPlayable(); ++ } ++ ++ ++ @ApiStatus.NonExtendable ++ interface Builder extends ShownInTooltip.Builder, ComponentBuilder { ++ ++ @Contract(value = "_, -> this", mutates = "this") ++ @NonNull ++ Builder jukeboxSong(@NonNull JukeboxSong song); ++ } ++} diff --git a/src/main/java/io/papermc/paper/component/item/LockCode.java b/src/main/java/io/papermc/paper/component/item/LockCode.java new file mode 100644 index 0000000000000000000000000000000000000000..dfcd12fe3fed01ff93bce6eca732bd6f1f4cf5fd diff --git a/patches/server/1026-WIP-DataComponent-API.patch b/patches/server/1026-WIP-DataComponent-API.patch index 0d37202d54..02052bb2f2 100644 --- a/patches/server/1026-WIP-DataComponent-API.patch +++ b/patches/server/1026-WIP-DataComponent-API.patch @@ -40,10 +40,10 @@ index 0000000000000000000000000000000000000000..e538819c873a324c58bcd8e73f89510e +} diff --git a/src/main/java/io/papermc/paper/component/ComponentAdapters.java b/src/main/java/io/papermc/paper/component/ComponentAdapters.java new file mode 100644 -index 0000000000000000000000000000000000000000..067930a2f5d3655f74a52c75a10d1d2958c1adfa +index 0000000000000000000000000000000000000000..ca118915720c35075e0ceead4f5fbb2f2ae7835b --- /dev/null +++ b/src/main/java/io/papermc/paper/component/ComponentAdapters.java -@@ -0,0 +1,181 @@ +@@ -0,0 +1,183 @@ +package io.papermc.paper.component; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -61,6 +61,7 @@ index 0000000000000000000000000000000000000000..067930a2f5d3655f74a52c75a10d1d29 +import io.papermc.paper.component.item.PaperItemContainerContents; +import io.papermc.paper.component.item.PaperItemEnchantments; +import io.papermc.paper.component.item.PaperItemLore; ++import io.papermc.paper.component.item.PaperJukeboxPlayable; +import io.papermc.paper.component.item.PaperLockCode; +import io.papermc.paper.component.item.PaperLodestoneTracker; +import io.papermc.paper.component.item.PaperMapDecorations; @@ -164,6 +165,7 @@ index 0000000000000000000000000000000000000000..067930a2f5d3655f74a52c75a10d1d29 + // block entity data + register(DataComponents.INSTRUMENT, CraftMusicInstrument::minecraftHolderToBukkit, CraftMusicInstrument::bukkitToMinecraftHolder); + registerIdentity(DataComponents.OMINOUS_BOTTLE_AMPLIFIER); ++ register(DataComponents.JUKEBOX_PLAYABLE, PaperJukeboxPlayable::new); + register(DataComponents.RECIPES, nms -> { + final List api = new ArrayList<>(nms.size()); + for (final ResourceLocation location : nms) { @@ -351,10 +353,10 @@ index 0000000000000000000000000000000000000000..5639559368e6866e9b0afa6688f3b12c +} diff --git a/src/main/java/io/papermc/paper/component/item/ComponentTypesBridgesImpl.java b/src/main/java/io/papermc/paper/component/item/ComponentTypesBridgesImpl.java new file mode 100644 -index 0000000000000000000000000000000000000000..5c26aec36c4e2ad2cc683735485f139cb32c05be +index 0000000000000000000000000000000000000000..8b130ee6a8eaa74e4899429d4f707e2e2615e9d0 --- /dev/null +++ b/src/main/java/io/papermc/paper/component/item/ComponentTypesBridgesImpl.java -@@ -0,0 +1,150 @@ +@@ -0,0 +1,155 @@ +package io.papermc.paper.component.item; + +import io.papermc.paper.util.Filtered; @@ -461,6 +463,11 @@ index 0000000000000000000000000000000000000000..5c26aec36c4e2ad2cc683735485f139c + } + + @Override ++ public JukeboxPlayable.Builder jukeboxPlayable() { ++ return new PaperJukeboxPlayable.BuilderImpl(); ++ } ++ ++ @Override + public WrittenBookContent.Builder writtenBookContent(final Filtered title, final String author) { + return new PaperWrittenBookContent.BuilderImpl(title, author); + } @@ -1563,6 +1570,74 @@ index 0000000000000000000000000000000000000000..66c18c734d25fa4184f62146cdb84953 + } + } +} +diff --git a/src/main/java/io/papermc/paper/component/item/PaperJukeboxPlayable.java b/src/main/java/io/papermc/paper/component/item/PaperJukeboxPlayable.java +new file mode 100644 +index 0000000000000000000000000000000000000000..dbf25090748b0c6b675a4681f0d0c1b826f6757b +--- /dev/null ++++ b/src/main/java/io/papermc/paper/component/item/PaperJukeboxPlayable.java +@@ -0,0 +1,62 @@ ++package io.papermc.paper.component.item; ++ ++import com.google.common.base.Preconditions; ++import java.util.ArrayList; ++import java.util.List; ++import net.minecraft.world.item.EitherHolder; ++import org.bukkit.JukeboxSong; ++import org.bukkit.attribute.Attribute; ++import org.bukkit.attribute.AttributeModifier; ++import org.bukkit.craftbukkit.CraftEquipmentSlot; ++import org.bukkit.craftbukkit.CraftJukeboxSong; ++import org.bukkit.craftbukkit.attribute.CraftAttribute; ++import org.bukkit.craftbukkit.attribute.CraftAttributeInstance; ++import org.bukkit.craftbukkit.util.Handleable; ++import org.checkerframework.checker.nullness.qual.NonNull; ++import org.checkerframework.framework.qual.DefaultQualifier; ++ ++import static io.papermc.paper.component.item.ComponentUtils.transform; ++ ++@DefaultQualifier(NonNull.class) ++public record PaperJukeboxPlayable( ++ net.minecraft.world.item.JukeboxPlayable impl ++) implements JukeboxPlayable, Handleable { ++ ++ @Override ++ public net.minecraft.world.item.JukeboxPlayable getHandle() { ++ return this.impl; ++ } ++ ++ @Override ++ public boolean showInTooltip() { ++ return this.impl.showInTooltip(); ++ } ++ ++ @Override ++ public PaperJukeboxPlayable showInTooltip(final boolean showInTooltip) { ++ return new PaperJukeboxPlayable(this.impl.withTooltip(showInTooltip)); ++ } ++ ++ static final class BuilderImpl implements Builder { ++ ++ private JukeboxSong song = null; ++ private boolean showInTooltip = true; ++ ++ @Override ++ public Builder showInTooltip(final boolean showInTooltip) { ++ this.showInTooltip = showInTooltip; ++ return this; ++ } ++ ++ @Override ++ public @NonNull Builder jukeboxSong(@NonNull final JukeboxSong song) { ++ this.song = song; ++ return this; ++ } ++ ++ @Override ++ public @NonNull JukeboxPlayable build() { ++ return new PaperJukeboxPlayable(new net.minecraft.world.item.JukeboxPlayable(new EitherHolder<>(CraftJukeboxSong.bukkitToMinecraftHolder(this.song)), this.showInTooltip)); ++ } ++ } ++} diff --git a/src/main/java/io/papermc/paper/component/item/PaperLockCode.java b/src/main/java/io/papermc/paper/component/item/PaperLockCode.java new file mode 100644 index 0000000000000000000000000000000000000000..0e6320385a3eaea265bd3ffd2a9ee8310b18599d