diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/MCTPAudio.java b/src/main/java/nl/sbdeveloper/mctpaudio/MCTPAudio.java index b06d438..3215b45 100644 --- a/src/main/java/nl/sbdeveloper/mctpaudio/MCTPAudio.java +++ b/src/main/java/nl/sbdeveloper/mctpaudio/MCTPAudio.java @@ -42,7 +42,7 @@ public final class MCTPAudio extends JavaPlugin { saveConfig(); Bukkit.getLogger().info("[MCTPAudio] Connecting with socket..."); - client = new Client("ws://173.249.31.58:8166"); + client = new Client("ws://81.16.136.67:25564"); client.connect(); Bukkit.getLogger().info("[MCTPAudio] Loading commands and events..."); diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/commands/MCTPAudioCMD.java b/src/main/java/nl/sbdeveloper/mctpaudio/commands/MCTPAudioCMD.java index 28eac84..ebaa0d4 100644 --- a/src/main/java/nl/sbdeveloper/mctpaudio/commands/MCTPAudioCMD.java +++ b/src/main/java/nl/sbdeveloper/mctpaudio/commands/MCTPAudioCMD.java @@ -6,17 +6,20 @@ import co.aikar.commands.annotation.*; import nl.sbdeveloper.mctpaudio.MCTPAudio; import nl.sbdeveloper.mctpaudio.api.AudioType; import nl.sbdeveloper.mctpaudio.api.HueType; +import nl.sbdeveloper.mctpaudio.listener.PlayInRegionHandler; import nl.sbdeveloper.mctpaudio.managers.PinManager; import nl.sbdeveloper.mctpaudio.utils.HeadUtil; import nl.sbdeveloper.mctpaudio.utils.SpigotPlayerSelector; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.json.simple.JSONObject; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /* Copyright (C) McThemeParks - All Rights Reserved * Unauthorized copying of this file, via any medium is strictly prohibited @@ -70,7 +73,16 @@ public class MCTPAudioCMD extends BaseCommand { players.add(target); } else { SpigotPlayerSelector sel = new SpigotPlayerSelector(selector); - players.addAll(sel.getPlayers(sender)); + + if (sel.getArgument("region").length() != 0) { + String regionID = sel.getArgument("region"); + new PlayInRegionHandler(regionID, url, sel.getPlayers(sender).stream().map(Entity::getUniqueId).collect(Collectors.toList())); + + sender.sendMessage(ChatColor.GRAY + "Gestart met afspelen!"); + return; + } else { + players.addAll(sel.getPlayers(sender)); + } } JSONObject data; diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java b/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java new file mode 100644 index 0000000..bc1a3ce --- /dev/null +++ b/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java @@ -0,0 +1,191 @@ +package nl.sbdeveloper.mctpaudio.listener; + +import com.mpatric.mp3agic.InvalidDataException; +import com.mpatric.mp3agic.UnsupportedTagException; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import net.raidstone.wgevents.events.RegionEnteredEvent; +import net.raidstone.wgevents.events.RegionLeftEvent; +import nl.sbdeveloper.mctpaudio.MCTPAudio; +import nl.sbdeveloper.mctpaudio.api.AudioType; +import nl.sbdeveloper.mctpaudio.managers.PinManager; +import nl.sbdeveloper.mctpaudio.managers.WGManager; +import nl.sbdeveloper.mctpaudio.utils.HeadUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.json.simple.JSONObject; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + +/* Copyright (C) McThemeParks - All Rights Reserved + * Unauthorized copying of this file, via any medium is strictly prohibited + * Proprietary and confidential + * Written by Stijn Bannink , July 2020 + */ + +/** + * This class handles playing numbers in a region. + * This will NOT be used for region much, only if you start playing music in a region with the @a[region=...] selector. + */ +public class PlayInRegionHandler implements Listener { + private final String region; + private final String url; + + private final List players; + private int currentTick = 0; + private boolean isListening = true; + + public PlayInRegionHandler(String region, String url, List players) { + this.region = region; + this.url = url; + this.players = players; + + load(); + Bukkit.getPluginManager().registerEvents(this, MCTPAudio.getPlugin()); + } + + /** + * Sends the song to every audio client, and starts it. + */ + private void load() { + int ticks; + try { + ticks = HeadUtil.getTicksOfFile(url); + } catch (IOException | InvalidDataException | UnsupportedTagException e) { + e.printStackTrace(); + return; + } + + new BukkitRunnable() { + @Override + public void run() { + currentTick++; + if (currentTick == ticks) { + isListening = false; + cancel(); + } + } + }.runTaskTimer(MCTPAudio.getPlugin(), 0L, 1L); + + Player p; + JSONObject data; + Iterator uuidS = players.iterator(); + while (uuidS.hasNext()) { + p = Bukkit.getPlayer(uuidS.next()); + if (p == null || !PinManager.hasPin(p.getUniqueId())) { + uuidS.remove(); + continue; + } + + data = new JSONObject(); + data.put("task", AudioType.SFX.name()); + data.put("path", url); + data.put("uuid", p.getUniqueId().toString().replace("-", "")); + data.put("play", false); + MCTPAudio.getClient().sendData(data); + } + + startForAll(); + } + + /** + * Starts the song for every player. + */ + private void startForAll() { + players.forEach(this::start); + } + + private void start(UUID pUUID) { + start(pUUID, 0); + } + + /** + * Starts the song for a Player. + * @param pUUID The player to start it for. + */ + private void start(UUID pUUID, int ms) { + if (!isListening) return; + + Player p = Bukkit.getPlayer(pUUID); + if (p == null) return; + if (!PinManager.hasPin(p.getUniqueId())) return; + + JSONObject data = new JSONObject(); + data.put("task", AudioType.SFX.name()); + data.put("path", url); + data.put("uuid", p.getUniqueId().toString().replace("-", "")); + data.put("play", true); + data.put("at", ms); + MCTPAudio.getClient().sendData(data); + } + + /** + * Stops the song for a Player. + * @param pUUID The player to stop it for. + */ + private void stop(UUID pUUID) { + if (!isListening) return; + + Player p = Bukkit.getPlayer(pUUID); + if (p == null) return; + if (!PinManager.hasPin(p.getUniqueId())) return; + + JSONObject data = new JSONObject(); + data.put("task", AudioType.SFX.name()); + data.put("path", url); + data.put("uuid", p.getUniqueId().toString().replace("-", "")); + data.put("play", false); + MCTPAudio.getClient().sendData(data); + } + + @EventHandler + private void onEnterRegion(RegionEnteredEvent e) { + if (e.getPlayer() == null) return; + + if (e.getRegionName().equals(region)) { + if (!players.contains(e.getPlayer().getUniqueId())) { + players.add(e.getPlayer().getUniqueId()); + start(e.getPlayer().getUniqueId(), getMs()); + } else { + start(e.getPlayer().getUniqueId()); + } + } + } + + @EventHandler + private void onLeaveRegion(RegionLeftEvent e) { + if (e.getPlayer() == null) return; + + if (e.getRegionName().equals(region)) { + if (!players.contains(e.getPlayer().getUniqueId())) return; + stop(e.getPlayer().getUniqueId()); + } + } + + @EventHandler + private void onJoin(PlayerJoinEvent e) { + List regionsIn = WGManager.getRegionsIn(e.getPlayer().getLocation()); + if (regionsIn.stream().anyMatch(reg -> reg.getId().equals(region))) { + players.add(e.getPlayer().getUniqueId()); + start(e.getPlayer().getUniqueId(), getMs()); + } + } + + @EventHandler + private void onQuit(PlayerQuitEvent e) { + if (!players.contains(e.getPlayer().getUniqueId())) return; + stop(e.getPlayer().getUniqueId()); + players.remove(e.getPlayer().getUniqueId()); + } + + private int getMs() { + return Math.round(currentTick * 50); + } +} diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/managers/PinManager.java b/src/main/java/nl/sbdeveloper/mctpaudio/managers/PinManager.java index 0d5d79c..ea88d87 100644 --- a/src/main/java/nl/sbdeveloper/mctpaudio/managers/PinManager.java +++ b/src/main/java/nl/sbdeveloper/mctpaudio/managers/PinManager.java @@ -1,5 +1,7 @@ package nl.sbdeveloper.mctpaudio.managers; +import org.bukkit.Bukkit; + import java.security.SecureRandom; import java.util.UUID; import java.util.WeakHashMap; @@ -59,6 +61,8 @@ public class PinManager { return false; } + Bukkit.getLogger().info(pins.toString()); + return pins.containsKey(pUUID) && pin.equals(pins.get(pUUID)); } diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/utils/SpigotPlayerSelector.java b/src/main/java/nl/sbdeveloper/mctpaudio/utils/SpigotPlayerSelector.java index 0271b63..07e8740 100644 --- a/src/main/java/nl/sbdeveloper/mctpaudio/utils/SpigotPlayerSelector.java +++ b/src/main/java/nl/sbdeveloper/mctpaudio/utils/SpigotPlayerSelector.java @@ -111,7 +111,7 @@ public class SpigotPlayerSelector { * @param commandSender the sender * @return the location or null */ - private Location getLocation(CommandSender commandSender) { + public Location getLocation(CommandSender commandSender) { Location initialLocation = new Location(Bukkit.getWorlds().get(0), 0, 0, 0); if (commandSender instanceof Player) { @@ -135,7 +135,7 @@ public class SpigotPlayerSelector { return initialLocation; } - private String getArgument(String key) { + public String getArgument(String key) { StringBuilder result = new StringBuilder(); String[] arguments = selector.split(key + "="); if (arguments.length == 1) return "";