Make it better
This commit is contained in:
parent
9e7feaaf35
commit
6c19cfe128
9 changed files with 117 additions and 82 deletions
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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.Converter;
|
||||||
import eu.m724.music_plugin.audio.storage.Downloader;
|
import eu.m724.music_plugin.audio.storage.Downloader;
|
||||||
import eu.m724.music_plugin.item.ItemEvents;
|
import eu.m724.music_plugin.item.ItemEvents;
|
||||||
|
import eu.m724.music_plugin.item.PmpCommand;
|
||||||
import eu.m724.music_plugin.item.speaker.BlockChecker;
|
import eu.m724.music_plugin.item.speaker.BlockChecker;
|
||||||
import net.bramp.ffmpeg.FFmpeg;
|
import net.bramp.ffmpeg.FFmpeg;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
|
|
@ -59,7 +60,7 @@ public final class MusicPlugin extends JavaPlugin {
|
||||||
.setExecutor(new TestCommand());
|
.setExecutor(new TestCommand());
|
||||||
|
|
||||||
Objects.requireNonNull(getCommand("pmp"))
|
Objects.requireNonNull(getCommand("pmp"))
|
||||||
.setExecutor(new MusicCommands());
|
.setExecutor(new PmpCommand());
|
||||||
|
|
||||||
getServer().getPluginManager().registerEvents(new ItemEvents(), this);
|
getServer().getPluginManager().registerEvents(new ItemEvents(), this);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ public class TestCommand implements CommandExecutor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testDownload(Player player, String url) {
|
private void testDownload(Player player, String url) {
|
||||||
player.sendMessage("Downloading " + url);
|
player.sendMessage("Downloading...");
|
||||||
MusicPlugin.getDownloader().download(URI.create(url)).handle((hash, ex) -> {
|
MusicPlugin.getDownloader().download(URI.create(url)).handle((hash, ex) -> {
|
||||||
if (ex != null) {
|
if (ex != null) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
@ -61,6 +61,7 @@ public class TestCommand implements CommandExecutor {
|
||||||
|
|
||||||
private void testConvert(Player player, String hash, int bitrate) {
|
private void testConvert(Player player, String hash, int bitrate) {
|
||||||
try {
|
try {
|
||||||
|
player.sendMessage("Converting...");
|
||||||
MusicPlugin.getStorage().convert(MusicPlugin.getConverter(), hash, bitrate).handle((f, ex) -> {
|
MusicPlugin.getStorage().convert(MusicPlugin.getConverter(), hash, bitrate).handle((f, ex) -> {
|
||||||
if (ex != null) {
|
if (ex != null) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
|
||||||
|
|
@ -34,4 +34,8 @@ public class LocationalChannel extends AbstractChannel<LocationalAudioChannel> {
|
||||||
// we go getChannel() not just channel, because getChannel() creates it if it doesn't exist
|
// we go getChannel() not just channel, because getChannel() creates it if it doesn't exist
|
||||||
getAudioChannel().setDistance(distance);
|
getAudioChannel().setDistance(distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return this.location;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ public class OpusFilePlayer {
|
||||||
DebugLogger.finer("Changing channel...");
|
DebugLogger.finer("Changing channel...");
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
|
|
||||||
if (!playing) {
|
if (playing) {
|
||||||
// to not call events pointlessly
|
// to not call events pointlessly
|
||||||
var ote = this.onTrackEvent;
|
var ote = this.onTrackEvent;
|
||||||
this.onTrackEvent = (r) -> {};
|
this.onTrackEvent = (r) -> {};
|
||||||
|
|
|
||||||
63
src/main/java/eu/m724/music_plugin/item/PmpCommand.java
Normal file
63
src/main/java/eu/m724/music_plugin/item/PmpCommand.java
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,6 +13,7 @@ import org.bukkit.inventory.ItemFlag;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
import org.bukkit.persistence.PersistentDataType;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|
@ -22,13 +23,13 @@ import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class PortableMediaPlayer {
|
public class PortableMediaPlayer {
|
||||||
static final NamespacedKey idKey = MusicPlugin.getNamespacedKey("player_id");
|
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;
|
public final int id;
|
||||||
|
|
||||||
// TODO configurable
|
// TODO configurable
|
||||||
private final int storageSeconds;
|
public final int storageSeconds;
|
||||||
private final int audioBitrate;
|
public final int audioBitrate;
|
||||||
|
|
||||||
public final boolean premium;
|
public final boolean premium;
|
||||||
public final String engraving;
|
public final String engraving;
|
||||||
|
|
@ -66,7 +67,8 @@ public class PortableMediaPlayer {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.speaker = speaker;
|
this.speaker = speaker;
|
||||||
player.setChannel(speaker.getChannel().getAudioChannel());
|
if (player != null)
|
||||||
|
player.setChannel(speaker.getChannel().getAudioChannel());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void play(File file) throws IOException {
|
public void play(File file) throws IOException {
|
||||||
|
|
@ -130,16 +132,28 @@ public class PortableMediaPlayer {
|
||||||
/* Item functions */
|
/* Item functions */
|
||||||
|
|
||||||
public ItemStack getItemStack() {
|
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();
|
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.addEnchant(Enchantment.UNBREAKING, 1, false);
|
||||||
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
|
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
|
||||||
meta.getPersistentDataContainer().set(idKey, PersistentDataType.INTEGER, id);
|
meta.getPersistentDataContainer().set(idKey, PersistentDataType.INTEGER, id);
|
||||||
meta.getPersistentDataContainer().set(dataKey, PersistentDataType.BYTE_ARRAY, getData());
|
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);
|
is.setItemMeta(meta);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package eu.m724.music_plugin.library;
|
package eu.m724.music_plugin.library;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -15,7 +17,18 @@ public class Library {
|
||||||
tracks.remove(track);
|
tracks.remove(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Track getPlayingTrack() {
|
public Track getPlaying() {
|
||||||
return tracks.get(playingTrack);
|
return tracks.get(playingTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Library load(InputStream inputStream) throws IOException {
|
||||||
|
var tracks = new ArrayList<Track>();
|
||||||
|
|
||||||
|
byte[] bytes = new byte[32];
|
||||||
|
while (inputStream.read(bytes) == 32) {
|
||||||
|
tracks.add(new Track(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Library()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,20 @@
|
||||||
package eu.m724.music_plugin.library;
|
package eu.m724.music_plugin.library;
|
||||||
|
|
||||||
import java.io.File;
|
import java.util.HexFormat;
|
||||||
|
|
||||||
public class Track {
|
public class Track {
|
||||||
public final File file;
|
private final byte[] hash;
|
||||||
|
|
||||||
private int progress = 0;
|
public Track(byte[] hash) {
|
||||||
private long started = -1;
|
assert hash.length == 32;
|
||||||
|
this.hash = hash;
|
||||||
public Track(File file) {
|
|
||||||
this.file = file;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getProgress() {
|
public Track(String hash) {
|
||||||
if (started == -1)
|
this(HexFormat.of().parseHex(hash));
|
||||||
return progress;
|
|
||||||
return (int) (System.currentTimeMillis() - started) + progress;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void hint(int frame) {
|
public byte[] getHash() {
|
||||||
this.progress = frame * 20;
|
return hash;
|
||||||
}
|
|
||||||
|
|
||||||
public void pause() {
|
|
||||||
this.progress = getProgress();
|
|
||||||
this.started = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unpause() {
|
|
||||||
this.started = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean paused() {
|
|
||||||
return started == -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue