From 6c19cfe128102492c9e6c94e317677a10f92826c Mon Sep 17 00:00:00 2001 From: Minecon724 Date: Fri, 31 Jan 2025 14:57:22 +0100 Subject: [PATCH] Make it better --- .../eu/m724/music_plugin/MusicCommands.java | 44 ------------- .../eu/m724/music_plugin/MusicPlugin.java | 3 +- .../eu/m724/music_plugin/TestCommand.java | 3 +- .../audio/channel/LocationalChannel.java | 4 ++ .../audio/player/OpusFilePlayer.java | 2 +- .../eu/m724/music_plugin/item/PmpCommand.java | 63 +++++++++++++++++++ .../item/PortableMediaPlayer.java | 30 ++++++--- .../eu/m724/music_plugin/library/Library.java | 15 ++++- .../eu/m724/music_plugin/library/Track.java | 35 +++-------- 9 files changed, 117 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/eu/m724/music_plugin/MusicCommands.java create mode 100644 src/main/java/eu/m724/music_plugin/item/PmpCommand.java diff --git a/src/main/java/eu/m724/music_plugin/MusicCommands.java b/src/main/java/eu/m724/music_plugin/MusicCommands.java deleted file mode 100644 index 866c1ce..0000000 --- a/src/main/java/eu/m724/music_plugin/MusicCommands.java +++ /dev/null @@ -1,44 +0,0 @@ -package eu.m724.music_plugin; - -import eu.m724.music_plugin.item.PortableMediaPlayer; -import eu.m724.music_plugin.item.PortableMediaPlayers; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.io.IOException; - -public class MusicCommands implements CommandExecutor { - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (command.getName().equals("pmp")) { - var p = (Player) sender; - var pmp = PortableMediaPlayers.get(p.getItemInHand()); - - switch (args[0]) { - case "info" -> { - sender.sendMessage(String.valueOf(pmp.id)); - sender.sendMessage(String.valueOf(pmp.premium)); - sender.sendMessage(pmp.engraving); - } - case "create" -> { - pmp = PortableMediaPlayer.create(args[0].equals("yes"), args[1]); - p.getInventory().addItem(pmp.getItemStack()); - } - case "play" -> { - var storage = MusicPlugin.getStorage(); - var path = storage.get(args[1], Integer.parseInt(args[2])); - - try { - pmp.play(path.toFile()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - } - - return true; - } -} diff --git a/src/main/java/eu/m724/music_plugin/MusicPlugin.java b/src/main/java/eu/m724/music_plugin/MusicPlugin.java index 7a64e81..9a234aa 100644 --- a/src/main/java/eu/m724/music_plugin/MusicPlugin.java +++ b/src/main/java/eu/m724/music_plugin/MusicPlugin.java @@ -6,6 +6,7 @@ import eu.m724.music_plugin.audio.storage.AudioFileStorage; import eu.m724.music_plugin.audio.Converter; import eu.m724.music_plugin.audio.storage.Downloader; import eu.m724.music_plugin.item.ItemEvents; +import eu.m724.music_plugin.item.PmpCommand; import eu.m724.music_plugin.item.speaker.BlockChecker; import net.bramp.ffmpeg.FFmpeg; import org.bukkit.NamespacedKey; @@ -59,7 +60,7 @@ public final class MusicPlugin extends JavaPlugin { .setExecutor(new TestCommand()); Objects.requireNonNull(getCommand("pmp")) - .setExecutor(new MusicCommands()); + .setExecutor(new PmpCommand()); getServer().getPluginManager().registerEvents(new ItemEvents(), this); diff --git a/src/main/java/eu/m724/music_plugin/TestCommand.java b/src/main/java/eu/m724/music_plugin/TestCommand.java index 4e3bc41..31cdc23 100644 --- a/src/main/java/eu/m724/music_plugin/TestCommand.java +++ b/src/main/java/eu/m724/music_plugin/TestCommand.java @@ -39,7 +39,7 @@ public class TestCommand implements CommandExecutor { } private void testDownload(Player player, String url) { - player.sendMessage("Downloading " + url); + player.sendMessage("Downloading..."); MusicPlugin.getDownloader().download(URI.create(url)).handle((hash, ex) -> { if (ex != null) { ex.printStackTrace(); @@ -61,6 +61,7 @@ public class TestCommand implements CommandExecutor { private void testConvert(Player player, String hash, int bitrate) { try { + player.sendMessage("Converting..."); MusicPlugin.getStorage().convert(MusicPlugin.getConverter(), hash, bitrate).handle((f, ex) -> { if (ex != null) { ex.printStackTrace(); diff --git a/src/main/java/eu/m724/music_plugin/audio/channel/LocationalChannel.java b/src/main/java/eu/m724/music_plugin/audio/channel/LocationalChannel.java index b51fd38..9359bba 100644 --- a/src/main/java/eu/m724/music_plugin/audio/channel/LocationalChannel.java +++ b/src/main/java/eu/m724/music_plugin/audio/channel/LocationalChannel.java @@ -34,4 +34,8 @@ public class LocationalChannel extends AbstractChannel { // we go getChannel() not just channel, because getChannel() creates it if it doesn't exist getAudioChannel().setDistance(distance); } + + public Location getLocation() { + return this.location; + } } diff --git a/src/main/java/eu/m724/music_plugin/audio/player/OpusFilePlayer.java b/src/main/java/eu/m724/music_plugin/audio/player/OpusFilePlayer.java index 6b43ea9..d21dd14 100644 --- a/src/main/java/eu/m724/music_plugin/audio/player/OpusFilePlayer.java +++ b/src/main/java/eu/m724/music_plugin/audio/player/OpusFilePlayer.java @@ -43,7 +43,7 @@ public class OpusFilePlayer { DebugLogger.finer("Changing channel..."); this.channel = channel; - if (!playing) { + if (playing) { // to not call events pointlessly var ote = this.onTrackEvent; this.onTrackEvent = (r) -> {}; diff --git a/src/main/java/eu/m724/music_plugin/item/PmpCommand.java b/src/main/java/eu/m724/music_plugin/item/PmpCommand.java new file mode 100644 index 0000000..7e1254b --- /dev/null +++ b/src/main/java/eu/m724/music_plugin/item/PmpCommand.java @@ -0,0 +1,63 @@ +package eu.m724.music_plugin.item; + +import eu.m724.music_plugin.MusicPlugin; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.Arrays; + +public class PmpCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + var player = (Player) sender; + var pmp = PortableMediaPlayers.get(player.getInventory().getItemInMainHand()); + + var action = args.length > 0 ? args[0] : null; + + if (action == null) { + if (pmp != null) { + sender.sendMessage("ID: " + pmp.id); + sender.sendMessage("Premium: " + pmp.premium); + + var capacityStr = ""; + var h = pmp.storageSeconds % 3600; + var m = (pmp.storageSeconds - (h * 3600)) % 60; + var s = pmp.storageSeconds - (h * 3600) - (m * 60); + if (h > 0) { + capacityStr += h + "h "; + } + capacityStr += m + "m " + s + "s "; + + sender.sendMessage("Capacity: " + capacityStr); + + sender.sendMessage("Bitrate: %d Kbps".formatted(pmp.audioBitrate / 1000)); + } + } + + if ("create".equals(action)) { + pmp = PortableMediaPlayer.create(args[1].equals("yes"), String.join(" ", Arrays.asList(args).subList(2, args.length))); + player.getInventory().addItem(pmp.getItemStack()); + } else if ("play".equals(action)) { + if (pmp != null) { + var storage = MusicPlugin.getStorage(); + var path = storage.get(args[1], Integer.parseInt(args[2])); + + try { + pmp.play(path.toFile()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + player.sendMessage("You must hold a Portable Music Player"); + } + } else { + player.sendMessage("create | play"); + } + + return true; + } +} diff --git a/src/main/java/eu/m724/music_plugin/item/PortableMediaPlayer.java b/src/main/java/eu/m724/music_plugin/item/PortableMediaPlayer.java index d0009d2..13a7279 100644 --- a/src/main/java/eu/m724/music_plugin/item/PortableMediaPlayer.java +++ b/src/main/java/eu/m724/music_plugin/item/PortableMediaPlayer.java @@ -13,6 +13,7 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; +import java.awt.*; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; @@ -22,13 +23,13 @@ import java.util.concurrent.ThreadLocalRandom; public class PortableMediaPlayer { static final NamespacedKey idKey = MusicPlugin.getNamespacedKey("player_id"); - static final NamespacedKey dataKey = MusicPlugin.getNamespacedKey("player_data");; + static final NamespacedKey dataKey = MusicPlugin.getNamespacedKey("player_data"); public final int id; // TODO configurable - private final int storageSeconds; - private final int audioBitrate; + public final int storageSeconds; + public final int audioBitrate; public final boolean premium; public final String engraving; @@ -66,7 +67,8 @@ public class PortableMediaPlayer { }); this.speaker = speaker; - player.setChannel(speaker.getChannel().getAudioChannel()); + if (player != null) + player.setChannel(speaker.getChannel().getAudioChannel()); } public void play(File file) throws IOException { @@ -130,16 +132,28 @@ public class PortableMediaPlayer { /* Item functions */ public ItemStack getItemStack() { - var is = new ItemStack(Material.IRON_INGOT); + var is = new ItemStack(premium ? Material.GOLD_INGOT : Material.IRON_INGOT); var meta = is.getItemMeta(); - meta.setItemName("Portable Music Player"); + if (premium) { + var hue = (id & 0xFFFFFF) / (float) 0xFFFFFF; + var saturation = (id >> 24) & 0xF; + var color = Color.getHSBColor(hue, 0.84f + saturation / 15.0f, 1.0f); + meta.setItemName(ChatColor.of(color) + "Portable Music Player"); + + if (engraving != null) + meta.setLore(List.of(ChatColor.of(color.darker()) + engraving)); + } else { + meta.setItemName("Portable Music Player"); + + if (engraving != null) // custom colors only in premium + meta.setLore(List.of(ChatColor.GRAY + ChatColor.stripColor(engraving))); + } + meta.addEnchant(Enchantment.UNBREAKING, 1, false); meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); meta.getPersistentDataContainer().set(idKey, PersistentDataType.INTEGER, id); meta.getPersistentDataContainer().set(dataKey, PersistentDataType.BYTE_ARRAY, getData()); - if (engraving != null) - meta.setLore(List.of(premium ? (ChatColor.GOLD + "" + ChatColor.BOLD + engraving) : (ChatColor.GRAY + ChatColor.stripColor(engraving)))); is.setItemMeta(meta); diff --git a/src/main/java/eu/m724/music_plugin/library/Library.java b/src/main/java/eu/m724/music_plugin/library/Library.java index 45bd2b7..643159d 100644 --- a/src/main/java/eu/m724/music_plugin/library/Library.java +++ b/src/main/java/eu/m724/music_plugin/library/Library.java @@ -1,5 +1,7 @@ package eu.m724.music_plugin.library; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -15,7 +17,18 @@ public class Library { tracks.remove(track); } - public Track getPlayingTrack() { + public Track getPlaying() { return tracks.get(playingTrack); } + + public static Library load(InputStream inputStream) throws IOException { + var tracks = new ArrayList(); + + byte[] bytes = new byte[32]; + while (inputStream.read(bytes) == 32) { + tracks.add(new Track(bytes)); + } + + return new Library() + } } diff --git a/src/main/java/eu/m724/music_plugin/library/Track.java b/src/main/java/eu/m724/music_plugin/library/Track.java index caa76a7..66f317e 100644 --- a/src/main/java/eu/m724/music_plugin/library/Track.java +++ b/src/main/java/eu/m724/music_plugin/library/Track.java @@ -1,37 +1,20 @@ package eu.m724.music_plugin.library; -import java.io.File; +import java.util.HexFormat; public class Track { - public final File file; + private final byte[] hash; - private int progress = 0; - private long started = -1; - - public Track(File file) { - this.file = file; + public Track(byte[] hash) { + assert hash.length == 32; + this.hash = hash; } - public int getProgress() { - if (started == -1) - return progress; - return (int) (System.currentTimeMillis() - started) + progress; + public Track(String hash) { + this(HexFormat.of().parseHex(hash)); } - public void hint(int frame) { - this.progress = frame * 20; - } - - public void pause() { - this.progress = getProgress(); - this.started = -1; - } - - public void unpause() { - this.started = System.currentTimeMillis(); - } - - public boolean paused() { - return started == -1; + public byte[] getHash() { + return hash; } }