diff --git a/paper-api/src/main/java/org/bukkit/Instrument.java b/paper-api/src/main/java/org/bukkit/Instrument.java index 92194803bc..de976be713 100644 --- a/paper-api/src/main/java/org/bukkit/Instrument.java +++ b/paper-api/src/main/java/org/bukkit/Instrument.java @@ -74,11 +74,43 @@ public enum Instrument { /** * Pling is normally played when a note block is on top of a glowstone block. */ - PLING(0xF); + PLING(0xF), + /** + * Zombie is normally played when a Zombie Head is on top of the note block. + */ + ZOMBIE, + /** + * Skeleton is normally played when a Skeleton Head is on top of the note block. + */ + SKELETON, + /** + * Creeper is normally played when a Creeper Head is on top of the note block. + */ + CREEPER, + /** + * Dragon is normally played when a Dragon Head is on top of the note block. + */ + DRAGON, + /** + * Wither Skeleton is normally played when a Wither Skeleton Head is on top of the note block. + */ + WITHER_SKELETON, + /** + * Piglin is normally played when a Piglin Head is on top of the note block. + */ + PIGLIN, + /** + * Custom Sound is normally played when a Player Head with the required data is on top of the note block. + */ + CUSTOM_HEAD; private final byte type; private static final Map BY_DATA = Maps.newHashMap(); + private Instrument() { + this(-1); + } + private Instrument(final int type) { this.type = (byte) type; } diff --git a/paper-api/src/main/java/org/bukkit/block/Skull.java b/paper-api/src/main/java/org/bukkit/block/Skull.java index 83ca284e02..8d4093a413 100644 --- a/paper-api/src/main/java/org/bukkit/block/Skull.java +++ b/paper-api/src/main/java/org/bukkit/block/Skull.java @@ -1,6 +1,7 @@ package org.bukkit.block; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.SkullType; import org.bukkit.block.data.BlockData; @@ -85,6 +86,27 @@ public interface Skull extends TileState { */ void setOwnerProfile(@Nullable PlayerProfile profile); + /** + * Gets the sound to play if the skull is placed on a note block. + *
+ * Note: This only works for player heads. For other heads, + * see {@link org.bukkit.Instrument}. + * + * @return the key of the sound, or null + */ + @Nullable + public NamespacedKey getNoteBlockSound(); + + /** + * Sets the sound to play if the skull is placed on a note block. + *
+ * Note: This only works for player heads. For other heads, + * see {@link org.bukkit.Instrument}. + * + * @param noteBlockSound the key of the sound to be played, or null + */ + public void setNoteBlockSound(@Nullable NamespacedKey noteBlockSound); + /** * Gets the rotation of the skull in the world (or facing direction if this * is a wall mounted skull). diff --git a/paper-api/src/main/java/org/bukkit/inventory/meta/SkullMeta.java b/paper-api/src/main/java/org/bukkit/inventory/meta/SkullMeta.java index dcefd0eea9..5a18a66a0b 100644 --- a/paper-api/src/main/java/org/bukkit/inventory/meta/SkullMeta.java +++ b/paper-api/src/main/java/org/bukkit/inventory/meta/SkullMeta.java @@ -1,5 +1,6 @@ package org.bukkit.inventory.meta; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.profile.PlayerProfile; import org.jetbrains.annotations.NotNull; @@ -79,6 +80,27 @@ public interface SkullMeta extends ItemMeta { */ void setOwnerProfile(@Nullable PlayerProfile profile); + /** + * Sets the sound to play if the skull is placed on a note block. + *
+ * Note: This only works for player heads. For other heads, + * see {@link org.bukkit.Instrument}. + * + * @param noteBlockSound the key of the sound to be played, or null + */ + void setNoteBlockSound(@Nullable NamespacedKey noteBlockSound); + + /** + * Gets the sound to play if the skull is placed on a note block. + *
+ * Note: This only works for player heads. For other heads, + * see {@link org.bukkit.Instrument}. + * + * @return the key of the sound, or null + */ + @Nullable + NamespacedKey getNoteBlockSound(); + @Override @NotNull SkullMeta clone(); diff --git a/paper-api/src/test/java/org/bukkit/InstrumentTest.java b/paper-api/src/test/java/org/bukkit/InstrumentTest.java index f6d261ae50..14ad060eba 100644 --- a/paper-api/src/test/java/org/bukkit/InstrumentTest.java +++ b/paper-api/src/test/java/org/bukkit/InstrumentTest.java @@ -8,6 +8,10 @@ public class InstrumentTest { @Test public void getByType() { for (Instrument instrument : Instrument.values()) { + if (instrument.getType() < 0) { + continue; + } + assertThat(Instrument.getByType(instrument.getType()), is(instrument)); } }