Added playing music (with selector support)
This commit is contained in:
parent
73626afe80
commit
d74df6404a
3 changed files with 198 additions and 1 deletions
|
@ -1,11 +1,17 @@
|
||||||
package me.mctp;
|
package me.mctp;
|
||||||
|
|
||||||
|
import me.mctp.api.AudioType;
|
||||||
import me.mctp.managers.PinManager;
|
import me.mctp.managers.PinManager;
|
||||||
|
import me.mctp.utils.SpigotPlayerSelector;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class MCTPAudioCmd implements CommandExecutor {
|
public class MCTPAudioCmd implements CommandExecutor {
|
||||||
|
|
||||||
|
@ -13,7 +19,45 @@ public class MCTPAudioCmd implements CommandExecutor {
|
||||||
|
|
||||||
public boolean onCommand(CommandSender sender, Command cmd, String commandlabel, String[] args) {
|
public boolean onCommand(CommandSender sender, Command cmd, String commandlabel, String[] args) {
|
||||||
if (cmd.getName().equalsIgnoreCase("mctpaudio")) {
|
if (cmd.getName().equalsIgnoreCase("mctpaudio")) {
|
||||||
sender.sendMessage(prefix + "MCTP Audio command!");
|
// /mctpaudio play SELECTOR TYPE URL
|
||||||
|
if (args.length == 4 && args[0].equalsIgnoreCase("play")) {
|
||||||
|
AudioType type;
|
||||||
|
try {
|
||||||
|
type = AudioType.valueOf(args[2].toUpperCase());
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
sender.sendMessage(prefix + args[1] + " is geen correcte type.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<Player> players = new ArrayList<>();
|
||||||
|
Player target = Bukkit.getPlayer(args[1]);
|
||||||
|
if (target != null) {
|
||||||
|
if (!PinManager.hasPin(target.getUniqueId())) {
|
||||||
|
sender.sendMessage(prefix + "Die speler is niet verbonden met de client.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
players.add(target);
|
||||||
|
} else {
|
||||||
|
SpigotPlayerSelector selector = new SpigotPlayerSelector(args[1]);
|
||||||
|
players.addAll(selector.getPlayers(sender));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject data;
|
||||||
|
for (Player p : players) {
|
||||||
|
data = new JSONObject();
|
||||||
|
|
||||||
|
if (!PinManager.hasPin(p.getUniqueId())) continue;
|
||||||
|
|
||||||
|
data.put("action", type.name());
|
||||||
|
data.put("path", args[3]);
|
||||||
|
data.put("uuid", p.getUniqueId().toString().replace("-", ""));
|
||||||
|
Main.getClient().sendData(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.sendMessage(prefix + "Gestart met afspelen!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else if (cmd.getName().equalsIgnoreCase("audio")) {
|
} else if (cmd.getName().equalsIgnoreCase("audio")) {
|
||||||
if (!(sender instanceof Player)) {
|
if (!(sender instanceof Player)) {
|
||||||
sender.sendMessage(prefix + "Alleen spelers kunnen verbinden met onze audioclient.");
|
sender.sendMessage(prefix + "Alleen spelers kunnen verbinden met onze audioclient.");
|
||||||
|
|
5
src/me/mctp/api/AudioType.java
Normal file
5
src/me/mctp/api/AudioType.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package me.mctp.api;
|
||||||
|
|
||||||
|
public enum AudioType {
|
||||||
|
MUSIC, SFX, RADIO
|
||||||
|
}
|
148
src/me/mctp/utils/SpigotPlayerSelector.java
Normal file
148
src/me/mctp/utils/SpigotPlayerSelector.java
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
package me.mctp.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
import org.bukkit.command.BlockCommandSender;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class SpigotPlayerSelector {
|
||||||
|
|
||||||
|
private String selector;
|
||||||
|
|
||||||
|
public SpigotPlayerSelector(String selector) {
|
||||||
|
this.selector = selector;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this turns selectors like @a[r=5] into a usable list, since
|
||||||
|
* 1.13 spigot removed this feature, FOR SOME REASON.. thanks guys..
|
||||||
|
*
|
||||||
|
* @param commandSender the sender
|
||||||
|
* @return players following the selector
|
||||||
|
*/
|
||||||
|
public List<Player> getPlayers(CommandSender commandSender) {
|
||||||
|
List<Player> players = new ArrayList<>();
|
||||||
|
|
||||||
|
if (selector.startsWith("@p")) {
|
||||||
|
//get Location
|
||||||
|
Location standPoint = getLocation(commandSender);
|
||||||
|
|
||||||
|
if (getArgument("r").length() != 0) {
|
||||||
|
int radius = Integer.parseInt(getArgument("r"));
|
||||||
|
Player nearest = Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.min(Comparator.comparing(player -> player.getLocation().distance(standPoint)))
|
||||||
|
.filter(player -> radius > player.getLocation().distance(standPoint))
|
||||||
|
.get();
|
||||||
|
players.add(nearest);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getArgument("distance").length() != 0) {
|
||||||
|
int distance = Integer.parseInt(getArgument("distance"));
|
||||||
|
Player nearest = Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.min(Comparator.comparing(player -> player.getLocation().distance(standPoint)))
|
||||||
|
.filter(player -> distance > player.getLocation().distance(standPoint))
|
||||||
|
.get();
|
||||||
|
players.add(nearest);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.min(Comparator.comparing(player -> player.getLocation().distance(standPoint)))
|
||||||
|
.ifPresent(players::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (selector.startsWith("@a")) {
|
||||||
|
//everyone
|
||||||
|
Location standPoint = getLocation(commandSender);
|
||||||
|
|
||||||
|
if (getArgument("region").length() != 0) {
|
||||||
|
//TODO FIX REGION SELECTOR
|
||||||
|
} else if (getArgument("r").length() != 0) {
|
||||||
|
int radius = Integer.parseInt(getArgument("r"));
|
||||||
|
players.addAll(Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.filter(player -> radius > player.getLocation().distance(standPoint))
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
} else if (getArgument("distance").length() != 0) {
|
||||||
|
int distance = Integer.parseInt(getArgument("distance"));
|
||||||
|
players.addAll(Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.filter(player -> distance > player.getLocation().distance(standPoint))
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
players.addAll(Bukkit.getOnlinePlayers().stream()
|
||||||
|
.filter(player -> player.getLocation().getWorld().getName().equals(standPoint.getWorld().getName()))
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (selector.length() <= 16) {
|
||||||
|
//player
|
||||||
|
Player player = Bukkit.getPlayer(selector);
|
||||||
|
if (player != null) players.add(player);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//you fucked it
|
||||||
|
commandSender.sendMessage("Invalid player query. Try something like @a, @p, username or other arguments.");
|
||||||
|
}
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* attempt to parse the location
|
||||||
|
*
|
||||||
|
* @param commandSender the sender
|
||||||
|
* @return the location or null
|
||||||
|
*/
|
||||||
|
private Location getLocation(CommandSender commandSender) {
|
||||||
|
Location initialLocation = new Location(Bukkit.getWorlds().get(0), 0, 0, 0);
|
||||||
|
|
||||||
|
if (commandSender instanceof Player) {
|
||||||
|
initialLocation = ((Player) commandSender).getLocation();
|
||||||
|
} else if (commandSender instanceof BlockCommandSender) {
|
||||||
|
initialLocation = ((BlockCommandSender) commandSender).getBlock().getLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getArgument("x").equals("") && !getArgument("y").equals("") && !getArgument("z").equals("")) {
|
||||||
|
try {
|
||||||
|
int x = Integer.parseInt(getArgument("x"));
|
||||||
|
int y = Integer.parseInt(getArgument("y"));
|
||||||
|
int z = Integer.parseInt(getArgument("z"));
|
||||||
|
return new Location(initialLocation.getWorld(), x, y, z);
|
||||||
|
} catch (Exception e) {
|
||||||
|
commandSender.sendMessage("An error occurred when parsing the location as an Integer");
|
||||||
|
return initialLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return initialLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getArgument(String key) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
String[] arguments = selector.split(key + "=");
|
||||||
|
if (arguments.length == 1) return "";
|
||||||
|
for (byte type : arguments[1].getBytes()) {
|
||||||
|
char element = (char) type;
|
||||||
|
if (element == ',' || element == ']') {
|
||||||
|
return result.toString();
|
||||||
|
} else {
|
||||||
|
result.append(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString().replaceAll(".", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue