diff --git a/pom.xml b/pom.xml
index 4c7bcaa..1545e0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,6 +80,10 @@
sk89q-repo
https://maven.enginehub.org/repo/
+
+ MG-Dev Jenkins CI Maven Repository
+ https://ci.mg-dev.eu/plugin/repository/everything
+
@@ -127,5 +131,17 @@
0.5.0-SNAPSHOT
compile
+
+ com.bergerkiller.bukkit
+ BKCommonLib
+ 1.16.5-v2
+ provided
+
+
+ com.bergerkiller.bukkit
+ TrainCarts
+ 1.16.5-v1
+ provided
+
diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/api/maps/SongList.java b/src/main/java/nl/sbdeveloper/mctpaudio/api/maps/SongList.java
index e27c21f..2579dd8 100644
--- a/src/main/java/nl/sbdeveloper/mctpaudio/api/maps/SongList.java
+++ b/src/main/java/nl/sbdeveloper/mctpaudio/api/maps/SongList.java
@@ -15,26 +15,38 @@ import java.util.Random;
* @param The type you want to store
*/
public class SongList extends ArrayList {
- public void shuffle() {
- Random random = new Random();
+ private final Random r = new Random();
- for (int index = 0; index < this.size(); index++) {
- int secondIndex = random.nextInt(this.size());
+ /**
+ * Shuffle this List
+ */
+ public void shuffle() {
+ for (int index = 0; index < size(); index++) {
+ int secondIndex = r.nextInt(size());
swap(index, secondIndex);
}
}
+ /**
+ * Get a random item from this List
+ *
+ * @return The random element
+ */
public E getRandom() {
- Random random = new Random();
-
- return this.get(random.nextInt(this.size()));
+ return get(r.nextInt(size()));
}
+ /**
+ * Swaps two elements in an {@link ArrayList}
+ *
+ * @param firstIndex The first index
+ * @param secondIndex The second index
+ */
private void swap(int firstIndex, int secondIndex) {
- E first = this.get(firstIndex);
- E second = this.get(secondIndex);
+ E first = get(firstIndex);
+ E second = get(secondIndex);
- this.set(secondIndex, first);
- this.set(firstIndex, second);
+ set(secondIndex, first);
+ set(firstIndex, second);
}
}
\ No newline at end of file
diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java b/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java
index edc7807..4c43726 100644
--- a/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java
+++ b/src/main/java/nl/sbdeveloper/mctpaudio/listener/PlayInRegionHandler.java
@@ -15,8 +15,6 @@ 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;
diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/listener/WGListener.java b/src/main/java/nl/sbdeveloper/mctpaudio/listener/WGListener.java
index df6e0c1..e98ac6e 100644
--- a/src/main/java/nl/sbdeveloper/mctpaudio/listener/WGListener.java
+++ b/src/main/java/nl/sbdeveloper/mctpaudio/listener/WGListener.java
@@ -1,11 +1,19 @@
package nl.sbdeveloper.mctpaudio.listener;
+import com.bergerkiller.bukkit.common.entity.CommonEntityController;
+import com.bergerkiller.bukkit.common.events.EntityMoveEvent;
+import com.bergerkiller.bukkit.tc.controller.MinecartGroup;
+import com.bergerkiller.bukkit.tc.controller.MinecartGroupStore;
+import com.bergerkiller.bukkit.tc.controller.MinecartMember;
+import com.bergerkiller.bukkit.tc.controller.MinecartMemberStore;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
+import net.raidstone.wgevents.events.RegionsEnteredEvent;
import nl.sbdeveloper.mctpaudio.MCTPAudio;
import nl.sbdeveloper.mctpaudio.managers.PinManager;
import nl.sbdeveloper.mctpaudio.managers.WGManager;
-import net.raidstone.wgevents.events.RegionsEnteredEvent;
+import org.bukkit.Bukkit;
import org.bukkit.Location;
+import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -27,28 +35,53 @@ public class WGListener implements Listener {
* Music detection
*/
@EventHandler
- public void onMove(PlayerMoveEvent e) {
+ public void onPlayerMove(PlayerMoveEvent e) {
handlePlayerMovement(e.getPlayer(), e.getFrom(), e.getTo());
}
@EventHandler
- public void onTeleport(PlayerTeleportEvent e) {
+ public void onPlayerTeleport(PlayerTeleportEvent e) {
handlePlayerMovement(e.getPlayer(), e.getFrom(), e.getTo());
}
+ @EventHandler
+ public void onEntityMove(EntityMoveEvent e) {
+ MinecartGroup group = MinecartGroupStore.get(e.getEntity());
+ MinecartMember> member = MinecartMemberStore.getFromEntity(e.getEntity());
+
+ if (group != null && group.stream().map(gMember -> gMember.getEntity().getPlayerPassengers()).mapToLong(Collection::size).sum() != 0) {
+ group.stream().map(CommonEntityController::getEntity).forEach(ent ->
+ ent.getPlayerPassengers().forEach(p -> handlePlayerMovement(p, ent.getLastLocation(), ent.getLocation())));
+ } else if (member != null && !member.getEntity().getPlayerPassengers().isEmpty()) {
+ member.getEntity().getPlayerPassengers().forEach(p ->
+ handlePlayerMovement(p, member.getEntity().getLastLocation(), member.getEntity().getLocation()));
+ }
+ }
+
private void handlePlayerMovement(Player player, Location from, Location to) {
if (to == null || from.getWorld() == null || to.getWorld() == null) return;
if (from.getBlockX() != to.getBlockX() || from.getBlockY() != to.getBlockY() || from.getBlockZ() != to.getBlockZ()) {
- Set list = MCTPAudio.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false);
+ if (!PinManager.hasPin(player.getUniqueId())) return;
- if (!PinManager.hasPin(Objects.requireNonNull(player).getUniqueId())) return;
+ Set list = MCTPAudio.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false);
List fromRegions = WGManager.getRegionsIn(from).stream().map(ProtectedRegion::getId).collect(Collectors.toList());
List toRegions = WGManager.getRegionsIn(to).stream().map(ProtectedRegion::getId).collect(Collectors.toList());
if ((Collections.disjoint(list, fromRegions) && !Collections.disjoint(list, toRegions)) || (!Collections.disjoint(list, fromRegions) && !Collections.disjoint(list, toRegions))) {
//Walked in a region
+ boolean found = false;
+ for (Entity ent : to.getChunk().getEntities()) {
+ MinecartMember> member = MinecartMemberStore.getFromEntity(ent);
+ if (member == null) continue;
+ if (member.getEntity().getPlayerPassengers().contains(player)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) return; //The player is inside a vehicle, ignore...
if (!Collections.disjoint(list, fromRegions) && !Collections.disjoint(list, toRegions)) {
Optional name = fromRegions.stream().filter(list::contains).findFirst();
diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/radio/Playlist.java b/src/main/java/nl/sbdeveloper/mctpaudio/radio/Playlist.java
index b16b9f1..f66349c 100644
--- a/src/main/java/nl/sbdeveloper/mctpaudio/radio/Playlist.java
+++ b/src/main/java/nl/sbdeveloper/mctpaudio/radio/Playlist.java
@@ -25,6 +25,7 @@ public class Playlist {
private boolean running = false;
private BukkitTask currentTimer;
+ private int faultCounter = 0;
/**
* Create a new PlayList object
@@ -75,21 +76,44 @@ public class Playlist {
* Go to the next song
*/
public void nextSong() {
- if (currentTimer != null) return;
+ if (currentTimer != null) return; //A song is playing?
+
+ if (faultCounter > 4) stop(); //FALLBACK! 4 errors occured.
if (playList.isEmpty()) {
- //All numbers played
- playList = (SongList) playedList.clone(); //Copy a clone.
playedList.clear();
+ start();
}
//Get song
String nextURL = playList.getRandom();
if (nextURL == null) return;
+ //Remove from PlayList and add to PlayedList
playList.remove(nextURL);
playedList.add(nextURL);
+ //Get ticks of song
+ int ticks;
+ try {
+ ticks = HeadUtil.getTicksOfFile(nextURL);
+ } catch (InvalidDataException | UnsupportedTagException ex) {
+ ex.printStackTrace();
+ nextSong();
+ return;
+ } catch (IOException ex) {
+ faultCounter++;
+ nextSong();
+ return;
+ }
+
+ if (ticks == 0) {
+ Bukkit.getLogger().info("0 ticks");
+ nextSong();
+ return;
+ }
+
+ //Send to client
JSONObject data;
for (Player p : Bukkit.getOnlinePlayers()) {
data = new JSONObject();
@@ -102,29 +126,17 @@ public class Playlist {
MCTPAudio.getClient().sendData(data);
}
- int ticks;
- try {
- ticks = HeadUtil.getTicksOfFile(nextURL);
- } catch (IOException | InvalidDataException | UnsupportedTagException e) {
- e.printStackTrace();
- nextSong();
- return;
- }
-
- if (ticks == 0) {
- Bukkit.getLogger().info("0 ticks");
- nextSong();
- return;
- }
-
Bukkit.getLogger().info("Started song with duration: " + ticks / 20 + " sec.");
+ faultCounter = 0;
+
+ //And started timer, so that it starts a new song if the old one is done
currentTimer = Bukkit.getScheduler().runTaskLaterAsynchronously(MCTPAudio.getPlugin(), () -> {
currentTimer = null;
nextSong();
}, ticks);
- //Shuffle playlist again
+ //And shuffle the playlist now
playList.shuffle();
}
diff --git a/src/main/java/nl/sbdeveloper/mctpaudio/socket/Client.java b/src/main/java/nl/sbdeveloper/mctpaudio/socket/Client.java
index e103515..c4c9bbd 100644
--- a/src/main/java/nl/sbdeveloper/mctpaudio/socket/Client.java
+++ b/src/main/java/nl/sbdeveloper/mctpaudio/socket/Client.java
@@ -100,26 +100,26 @@ public class Client {
AudioConnectionUpdateEvent event = new AudioConnectionUpdateEvent(p, true);
Bukkit.getPluginManager().callEvent(event);
- if (!event.isCancelled()) {
- List regions = WGManager.getRegionsIn(p.getLocation()).stream().map(ProtectedRegion::getId).collect(Collectors.toList());
- Set list = MCTPAudio.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false);
- Optional regionName = regions.stream().filter(list::contains).findFirst();
- regionName.ifPresentOrElse(name -> {
- String regionURL = MCTPAudio.getPlugin().getConfig().getString("Regions." + name);
+ List regions = WGManager.getRegionsIn(p.getLocation()).stream().map(ProtectedRegion::getId).collect(Collectors.toList());
+ Set list = MCTPAudio.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false);
+ Optional regionName = regions.stream().filter(list::contains).findFirst();
+ regionName.ifPresentOrElse(name -> {
+ String regionURL = MCTPAudio.getPlugin().getConfig().getString("Regions." + name);
- JSONObject data = new JSONObject();
- data.put("task", "MUSIC");
- data.put("path", regionURL);
- data.put("uuid", p.getUniqueId().toString().replace("-", ""));
- MCTPAudio.getClient().sendData(data);
- }, () -> {
- JSONObject data = new JSONObject();
- data.put("task", "SFX");
- data.put("path", "http://audio.mcthemeparks.eu/assets/music/oaintro.mp3");
- data.put("uuid", p.getUniqueId().toString().replace("-", ""));
- MCTPAudio.getClient().sendData(data);
- });
- }
+ JSONObject data = new JSONObject();
+ data.put("task", "MUSIC");
+ data.put("path", regionURL);
+ data.put("uuid", p.getUniqueId().toString().replace("-", ""));
+ MCTPAudio.getClient().sendData(data);
+ }, () -> {
+ if (!event.isCancelled()) return;
+
+ JSONObject data = new JSONObject();
+ data.put("task", "SFX");
+ data.put("path", "http://audio.mcthemeparks.eu/assets/music/oaintro.mp3");
+ data.put("uuid", p.getUniqueId().toString().replace("-", ""));
+ MCTPAudio.getClient().sendData(data);
+ });
}
JSONObject reply = new JSONObject();
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 240ea6d..1e26430 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -2,7 +2,7 @@ name: MCTPAudio
version: ${project.version}
main: nl.sbdeveloper.mctpaudio.MCTPAudio
api-version: 1.16
-depend: [ WorldGuard ]
+depend: [ WorldGuard, Train_Carts ]
authors: [ SBDeveloper ]
description: The audio plugin of MCThemeParks!
website: https://mcthemeparks.eu