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.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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
getAudioChannel().setDistance(distance);
|
||||
}
|
||||
|
||||
public Location getLocation() {
|
||||
return this.location;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) -> {};
|
||||
|
|
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.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);
|
||||
|
||||
|
|
|
@ -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<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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue