diff --git a/pom.xml b/pom.xml
index 460dc8a..4e59572 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,6 +49,16 @@
false
+
+
+ org.inventivetalent.apihelper
+ nl.sbdeveloper.showapi.helpers.apihelper
+
+
+ com.samjakob.spigui
+ nl.sbdeveloper.showapi.helpers.guihelper
+
+
@@ -102,25 +112,30 @@
inventive-repo
https://repo.inventivetalent.org/content/groups/public/
+
+ jitpack.io
+ https://jitpack.io
+
org.bukkit
craftbukkit
- 1.15.2-R0.1-SNAPSHOT
+ 1.16.4-R0.1-SNAPSHOT
provided
org.spigotmc
spigot-api
- 1.15.2-R0.1-SNAPSHOT
+ 1.16.4-R0.1-SNAPSHOT
provided
org.inventivetalent
apimanager
1.0.3-SNAPSHOT
+ compile
org.jetbrains
@@ -128,5 +143,11 @@
18.0.0
compile
+
+ com.samjakob
+ SpiGUI
+ v1.1
+ compile
+
diff --git a/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java b/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java
index af1b05b..471dcdf 100644
--- a/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java
+++ b/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java
@@ -7,7 +7,6 @@ import org.bukkit.FireworkEffect;
import org.bukkit.Location;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Firework;
import org.bukkit.event.Listener;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.Plugin;
@@ -33,7 +32,7 @@ public class ShowAPI implements API, Listener {
@Override
public void init(Plugin plugin) {
if (VersionUtil.getVersion() < 9 || VersionUtil.getVersion() > 16) {
- logger.severe("This API only works from 1.9 to 1.16.1.");
+ logger.severe("Deze API werkt alleen tussen 1.9.x en 1.16.x.");
disable(plugin);
return;
}
@@ -53,7 +52,7 @@ public class ShowAPI implements API, Listener {
}
public static class Firework {
- private FireworkEffect.Builder effectBuilder;
+ private final FireworkEffect.Builder effectBuilder;
private int power;
public Firework() {
@@ -102,7 +101,17 @@ public class ShowAPI implements API, Listener {
//SPOTS -> End Crystals
public static class Spots {
- private static Map spots = new HashMap<>();
+ private static final Map spots = new HashMap<>();
+
+ /**
+ * Check if a spot exists
+ *
+ * @param name The name of the spot
+ * @return true if it exists, false if not
+ */
+ public static boolean exists(String name) {
+ return spots.containsKey(name);
+ }
/**
* Spawn a new spot, and start it
@@ -165,7 +174,17 @@ public class ShowAPI implements API, Listener {
//LASERS -> Guardian beams
public static class Lasers {
- private static Map lasers = new HashMap<>();
+ private static final Map lasers = new HashMap<>();
+
+ /**
+ * Check if a laser exists
+ *
+ * @param name The name of the laser
+ * @return true if it exists, false if not
+ */
+ public static boolean exists(String name) {
+ return lasers.containsKey(name);
+ }
/**
* Spawn a new laser, and start it
diff --git a/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java b/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java
index 807179d..415b03c 100644
--- a/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java
+++ b/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java
@@ -1,12 +1,15 @@
package nl.sbdeveloper.showapi;
+import com.samjakob.spigui.SpiGUI;
+import nl.sbdeveloper.showapi.commands.ShowCMD;
import org.bukkit.plugin.java.JavaPlugin;
import org.inventivetalent.apihelper.APIManager;
public final class ShowAPIPlugin extends JavaPlugin {
private static ShowAPIPlugin instance;
- private ShowAPI showAPI = new ShowAPI();
+ private final ShowAPI showAPI = new ShowAPI();
+ private static SpiGUI spiGUI;
@Override
public void onLoad() {
@@ -16,7 +19,12 @@ public final class ShowAPIPlugin extends JavaPlugin {
@Override
public void onEnable() {
instance = this;
+
APIManager.initAPI(ShowAPI.class);
+
+ spiGUI = new SpiGUI(this);
+
+ getCommand("mctpshow").setExecutor(new ShowCMD());
}
@Override
@@ -28,4 +36,8 @@ public final class ShowAPIPlugin extends JavaPlugin {
public static ShowAPIPlugin getInstance() {
return instance;
}
+
+ public static SpiGUI getSpiGUI() {
+ return spiGUI;
+ }
}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java b/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java
new file mode 100644
index 0000000..39ff887
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java
@@ -0,0 +1,34 @@
+package nl.sbdeveloper.showapi.api;
+
+import nl.sbdeveloper.showapi.ShowAPIPlugin;
+import org.bukkit.Bukkit;
+
+/**
+ * A cue point of a show
+ */
+public class ShowCue {
+ private final int timeSeconds;
+ private final TriggerData data;
+ private int taskID;
+
+ public ShowCue(int timeSeconds, TriggerData data) {
+ this.timeSeconds = timeSeconds;
+ this.data = data;
+ }
+
+ public int getTimeSeconds() {
+ return timeSeconds;
+ }
+
+ public TriggerData getData() {
+ return data;
+ }
+
+ public void runAtTime() {
+ this.taskID = Bukkit.getScheduler().runTaskLater(ShowAPIPlugin.getInstance(), data::trigger, 20 * timeSeconds).getTaskId();
+ }
+
+ public void cancel() {
+ Bukkit.getScheduler().cancelTask(taskID);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java b/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java
new file mode 100644
index 0000000..2b71150
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java
@@ -0,0 +1,36 @@
+package nl.sbdeveloper.showapi.api;
+
+public abstract class TriggerData {
+ private final TriggerType type;
+ private final String[] dataString;
+
+ /**
+ * Create a new trigger
+ */
+ public TriggerData(TriggerType type, String[] dataString) {
+ this.type = type;
+ this.dataString = dataString;
+ }
+
+ /**
+ * This method gets fired when the cue gets triggered
+ */
+ public void trigger() {}
+
+ /**
+ * Get the trigger type
+ *
+ * @return The trigger type
+ */
+ public TriggerType getType() {
+ return type;
+ }
+
+ public String getDataString() {
+ StringBuilder builder = new StringBuilder();
+ for (String s : dataString) {
+ builder.append(s).append(" ");
+ }
+ return builder.toString().trim();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java b/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java
new file mode 100644
index 0000000..ceda5e6
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java
@@ -0,0 +1,5 @@
+package nl.sbdeveloper.showapi.api;
+
+public enum TriggerType {
+ COMMAND, FIREWORK, SPOT, LASER, ANIMA
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/AnimaTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/AnimaTrigger.java
new file mode 100644
index 0000000..98ba2a9
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/AnimaTrigger.java
@@ -0,0 +1,20 @@
+package nl.sbdeveloper.showapi.api.triggers;
+
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import org.bukkit.Bukkit;
+
+public class AnimaTrigger extends TriggerData {
+ private final String name;
+
+ public AnimaTrigger(String[] data) {
+ super(TriggerType.ANIMA, data);
+
+ this.name = getDataString();
+ }
+
+ @Override
+ public void trigger() {
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "anima play " + name);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/CommandTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/CommandTrigger.java
new file mode 100644
index 0000000..9b7b7e8
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/CommandTrigger.java
@@ -0,0 +1,20 @@
+package nl.sbdeveloper.showapi.api.triggers;
+
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import org.bukkit.Bukkit;
+
+public class CommandTrigger extends TriggerData {
+ private final String command;
+
+ public CommandTrigger(String[] data) {
+ super(TriggerType.COMMAND, data);
+
+ this.command = getDataString();
+ }
+
+ @Override
+ public void trigger() {
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/FireworkTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/FireworkTrigger.java
new file mode 100644
index 0000000..7e33801
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/FireworkTrigger.java
@@ -0,0 +1,76 @@
+package nl.sbdeveloper.showapi.api.triggers;
+
+import nl.sbdeveloper.showapi.ShowAPI;
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import nl.sbdeveloper.showapi.utils.Color;
+import org.bukkit.Bukkit;
+import org.bukkit.FireworkEffect;
+import org.bukkit.Location;
+import org.bukkit.World;
+
+public class FireworkTrigger extends TriggerData {
+ private ShowAPI.Fireworks.Firework fw;
+ private Location spawnLoc;
+
+ public FireworkTrigger(String[] data) {
+ super(TriggerType.FIREWORK, data);
+
+ World w = Bukkit.getWorld(data[0]);
+ if (w == null) {
+ Bukkit.getLogger().info("De wereld is null!");
+ return;
+ }
+
+ int x;
+ int y;
+ int z;
+ try {
+ x = Integer.parseInt(data[1]);
+ y = Integer.parseInt(data[2]);
+ z = Integer.parseInt(data[3]);
+ } catch (NumberFormatException ex) {
+ Bukkit.getLogger().info("De positie is incorrect!");
+ return;
+ }
+
+ this.spawnLoc = new Location(w, x, y, z);
+
+ ShowAPI.Fireworks.Firework firework = new ShowAPI.Fireworks.Firework();
+ for (int i = 4; i < data.length; i++) {
+ if (data[i].split(":").length != 2) continue;
+
+ String key = data[i].split(":")[0];
+ String value = data[i].split(":")[1];
+ if (key.equalsIgnoreCase("color")) {
+ firework = firework.addColor(Color.valueOf(value.toUpperCase()).getBukkitColor());
+ } else if (key.equalsIgnoreCase("shape")) {
+ firework = firework.setType(FireworkEffect.Type.valueOf(value.toUpperCase()));
+ } else if (key.equalsIgnoreCase("fade")) {
+ firework = firework.addFade(Color.valueOf(value.toUpperCase()).getBukkitColor());
+ } else if (key.equalsIgnoreCase("effect")) {
+ if (value.equalsIgnoreCase("trail")) {
+ firework = firework.addTrail();
+ } else if (value.equalsIgnoreCase("twinkle")) {
+ firework = firework.addFlicker();
+ }
+ } else if (key.equalsIgnoreCase("power")) {
+ int power;
+ try {
+ power = Integer.parseInt(value);
+ } catch (NumberFormatException ex) {
+ continue;
+ }
+
+ firework = firework.setPower(power);
+ }
+ }
+
+ this.fw = firework;
+ }
+
+ @Override
+ public void trigger() {
+ ShowAPI.Fireworks.spawn(fw, spawnLoc);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java
new file mode 100644
index 0000000..ba314ba
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java
@@ -0,0 +1,48 @@
+package nl.sbdeveloper.showapi.api.triggers;
+
+import nl.sbdeveloper.showapi.ShowAPI;
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+
+public class LaserTrigger extends TriggerData {
+ private String name;
+ private Location newLocation;
+
+ public LaserTrigger(String[] data) {
+ super(TriggerType.LASER, data);
+
+ World w = Bukkit.getWorld(data[0]);
+ if (w == null) {
+ Bukkit.getLogger().info("De wereld is null!");
+ return;
+ }
+
+ int x;
+ int y;
+ int z;
+ try {
+ x = Integer.parseInt(data[1]);
+ y = Integer.parseInt(data[2]);
+ z = Integer.parseInt(data[3]);
+ } catch (NumberFormatException ex) {
+ Bukkit.getLogger().info("De positie is null!");
+ return;
+ }
+
+ this.newLocation = new Location(w, x, y, z);
+
+ this.name = data[4];
+
+ if (!ShowAPI.Lasers.exists(name)) {
+ ShowAPI.Lasers.start(name, newLocation);
+ }
+ }
+
+ @Override
+ public void trigger() {
+ ShowAPI.Lasers.move(name, newLocation);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java
new file mode 100644
index 0000000..ee2eac7
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java
@@ -0,0 +1,48 @@
+package nl.sbdeveloper.showapi.api.triggers;
+
+import nl.sbdeveloper.showapi.ShowAPI;
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+
+public class SpotTrigger extends TriggerData {
+ private String name;
+ private Location newLocation;
+
+ public SpotTrigger(String[] data) {
+ super(TriggerType.SPOT, data);
+
+ World w = Bukkit.getWorld(data[0]);
+ if (w == null) {
+ Bukkit.getLogger().info("De wereld is null!");
+ return;
+ }
+
+ int x;
+ int y;
+ int z;
+ try {
+ x = Integer.parseInt(data[1]);
+ y = Integer.parseInt(data[2]);
+ z = Integer.parseInt(data[3]);
+ } catch (NumberFormatException ex) {
+ Bukkit.getLogger().info("De positie is null!");
+ return;
+ }
+
+ this.newLocation = new Location(w, x, y, z);
+
+ this.name = data[4];
+
+ if (!ShowAPI.Lasers.exists(name)) {
+ ShowAPI.Lasers.start(name, newLocation);
+ }
+ }
+
+ @Override
+ public void trigger() {
+ ShowAPI.Spots.move(name, newLocation);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/commands/ShowCMD.java b/src/main/java/nl/sbdeveloper/showapi/commands/ShowCMD.java
new file mode 100644
index 0000000..90f339a
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/commands/ShowCMD.java
@@ -0,0 +1,120 @@
+package nl.sbdeveloper.showapi.commands;
+
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.data.Shows;
+import nl.sbdeveloper.showapi.gui.ShowCueGUI;
+import nl.sbdeveloper.showapi.utils.MainUtil;
+import nl.sbdeveloper.showapi.utils.TimeUtil;
+import org.bukkit.ChatColor;
+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;
+
+public class ShowCMD implements CommandExecutor {
+ /*
+ /mctpshow create
+ /mctpshow delete
+ /mctpshow add
+ /mctpshow start
+ /mctpshow cancel
+ /mctpshow gui
+ */
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String[] args) {
+ if (label.equalsIgnoreCase("mctpshow")) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(ChatColor.RED + "Je moet een speler zijn om dit te doen.");
+ return false;
+ }
+
+ Player p = (Player) sender;
+ if (!p.hasPermission("mctp.show")) {
+ p.sendMessage(ChatColor.RED + "Je hebt hier geen permissie voor.");
+ return false;
+ }
+
+ if (args.length == 2 && args[0].equalsIgnoreCase("create")) {
+ String name = args[1];
+ if (Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat al.");
+ return false;
+ }
+
+ Shows.create(name);
+
+ p.sendMessage(ChatColor.GREEN + "De show " + ChatColor.WHITE + name + ChatColor.GREEN + " is aangemaakt!");
+ return true;
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("delete")) {
+ String name = args[1];
+ if (!Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat niet.");
+ return false;
+ }
+
+ Shows.delete(name);
+
+ p.sendMessage(ChatColor.GREEN + "De show " + ChatColor.WHITE + name + ChatColor.GREEN + " is verwijderd!");
+ return true;
+ } else if (args.length >= 5 && args[0].equalsIgnoreCase("add")) {
+ String name = args[1];
+ if (!Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat niet.");
+ return false;
+ }
+
+ int seconds = TimeUtil.parseSeconds(args[2]);
+
+ StringBuilder builder = new StringBuilder();
+ for (int i = 3; i < args.length; i++) {
+ builder.append(args[i]).append(" ");
+ }
+ TriggerData data = MainUtil.parseData(builder.toString().trim());
+
+ if (data == null) {
+ p.sendMessage(ChatColor.RED + "Je hebt niet genoeg informatie meegeven voor de trigger.");
+ return false;
+ }
+
+ Shows.addPoint(name, seconds, data);
+
+ p.sendMessage(ChatColor.GREEN + "De show " + ChatColor.WHITE + name + ChatColor.GREEN + " bevat nu een extra punt!");
+ return true;
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("start")) {
+ String name = args[1];
+ if (!Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat niet.");
+ return false;
+ }
+
+ Shows.startShow(name);
+
+ p.sendMessage(ChatColor.GREEN + "De show " + ChatColor.WHITE + name + ChatColor.GREEN + " is gestart!");
+ return true;
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("cancel")) {
+ String name = args[1];
+ if (!Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat niet.");
+ return false;
+ }
+
+ Shows.cancelShow(name);
+
+ p.sendMessage(ChatColor.GREEN + "De show " + ChatColor.WHITE + name + ChatColor.GREEN + " is gestopt!");
+ return true;
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("gui")) {
+ String name = args[1];
+ if (!Shows.exists(name)) {
+ p.sendMessage(ChatColor.RED + "Die show bestaat niet.");
+ return false;
+ }
+
+ ShowCueGUI.openGUI(name, p);
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/data/Shows.java b/src/main/java/nl/sbdeveloper/showapi/data/Shows.java
new file mode 100644
index 0000000..cbf0d42
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/data/Shows.java
@@ -0,0 +1,44 @@
+package nl.sbdeveloper.showapi.data;
+
+import nl.sbdeveloper.showapi.api.ShowCue;
+import nl.sbdeveloper.showapi.api.TriggerData;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class Shows {
+ private static final HashMap> showsMap = new HashMap<>();
+
+ public static void create(String name) {
+ showsMap.put(name, new ArrayList<>());
+ }
+
+ public static void delete(String name) {
+ showsMap.remove(name);
+ }
+
+ public static boolean exists(String name) {
+ return showsMap.containsKey(name);
+ }
+
+ public static List getPoints(String name) {
+ if (!exists(name)) return new ArrayList<>();
+ return showsMap.get(name);
+ }
+
+ public static void addPoint(String name, int sec, TriggerData data) {
+ if (!exists(name)) return;
+ getPoints(name).add(new ShowCue(sec, data));
+ }
+
+ public static void startShow(String name) {
+ if (!exists(name)) return;
+ getPoints(name).forEach(ShowCue::runAtTime);
+ }
+
+ public static void cancelShow(String name) {
+ if (!exists(name)) return;
+ getPoints(name).forEach(ShowCue::cancel);
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java b/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java
new file mode 100644
index 0000000..e150f29
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java
@@ -0,0 +1,35 @@
+package nl.sbdeveloper.showapi.gui;
+
+import com.samjakob.spigui.SGMenu;
+import com.samjakob.spigui.buttons.SGButton;
+import nl.sbdeveloper.showapi.ShowAPIPlugin;
+import nl.sbdeveloper.showapi.api.ShowCue;
+import nl.sbdeveloper.showapi.data.Shows;
+import nl.sbdeveloper.showapi.utils.MainUtil;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.InventoryClickEvent;
+
+import java.util.List;
+
+public class ShowCueGUI {
+ public static void openGUI(String name, Player p) {
+ List points = Shows.getPoints(name);
+
+ SGMenu menu = ShowAPIPlugin.getSpiGUI().create(ChatColor.DARK_AQUA + "Show Cue Manager:", MainUtil.pointsToRow(points.size()));
+ menu.setAutomaticPaginationEnabled(true);
+
+ for (ShowCue cue : points) {
+ SGButton button = new SGButton(MainUtil.pointToItem(cue))
+ .withListener((InventoryClickEvent e) -> {
+ points.remove(cue);
+
+ openGUI(name, p); //Refresh
+ });
+
+ menu.addButton(button);
+ }
+
+ p.openInventory(menu.getInventory());
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/utils/Color.java b/src/main/java/nl/sbdeveloper/showapi/utils/Color.java
new file mode 100644
index 0000000..3bf4839
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/utils/Color.java
@@ -0,0 +1,31 @@
+package nl.sbdeveloper.showapi.utils;
+
+public enum Color {
+ WHITE(org.bukkit.Color.fromRGB(16777215)),
+ SILVER(org.bukkit.Color.fromRGB(12632256)),
+ GRAY(org.bukkit.Color.fromRGB(8421504)),
+ BLACK(org.bukkit.Color.fromRGB(0)),
+ RED(org.bukkit.Color.fromRGB(16711680)),
+ MAROON(org.bukkit.Color.fromRGB(8388608)),
+ YELLOW(org.bukkit.Color.fromRGB(16776960)),
+ OLIVE(org.bukkit.Color.fromRGB(8421376)),
+ LIME(org.bukkit.Color.fromRGB(65280)),
+ GREEN(org.bukkit.Color.fromRGB(32768)),
+ AQUA(org.bukkit.Color.fromRGB(65535)),
+ TEAL(org.bukkit.Color.fromRGB(32896)),
+ BLUE(org.bukkit.Color.fromRGB(255)),
+ NAVY(org.bukkit.Color.fromRGB(128)),
+ FUCHSIA(org.bukkit.Color.fromRGB(16711935)),
+ PURPLE(org.bukkit.Color.fromRGB(8388736)),
+ ORANGE(org.bukkit.Color.fromRGB(16753920));
+
+ private final org.bukkit.Color color;
+
+ Color(org.bukkit.Color color) {
+ this.color = color;
+ }
+
+ public org.bukkit.Color getBukkitColor() {
+ return color;
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java b/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java
new file mode 100644
index 0000000..5d7cb1e
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java
@@ -0,0 +1,68 @@
+package nl.sbdeveloper.showapi.utils;
+
+import com.samjakob.spigui.item.ItemBuilder;
+import nl.sbdeveloper.showapi.ShowAPI;
+import nl.sbdeveloper.showapi.api.ShowCue;
+import nl.sbdeveloper.showapi.api.TriggerData;
+import nl.sbdeveloper.showapi.api.TriggerType;
+import nl.sbdeveloper.showapi.api.triggers.*;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.*;
+import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.ArrayUtils;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.util.ChatPaginator;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MainUtil {
+ public static int pointsToRow(int points) {
+ return (int) Math.ceil((double) points / 9);
+ }
+
+ public static ItemStack pointToItem(ShowCue point) {
+ ItemBuilder builder = new ItemBuilder(Material.NOTE_BLOCK);
+ builder.name(ChatColor.ITALIC + "TimeCode: " + TimeUtil.showTime(point.getTimeSeconds()));
+
+ List lores = new ArrayList<>();
+ lores.add(ChatColor.GREEN + "Type: " + ChatColor.AQUA + StringUtils.capitalize(point.getData().getType().name()));
+ lores.add(ChatColor.GREEN + "Data:");
+ for (String str : ChatPaginator.paginate(point.getData().getDataString(), 20).getLines()) {
+ lores.add(ChatColor.AQUA + ChatColor.stripColor(str));
+ }
+ lores.add("");
+ lores.add(ChatColor.RED + ChatColor.BOLD.toString() + "Click to remove!");
+
+ builder.lore(lores);
+ return builder.build();
+ }
+
+ public static TriggerData parseData(String data) {
+ String[] dataSplitter = data.split(" ");
+ String[] dataSplitterNew = Arrays.copyOfRange(dataSplitter, 1, dataSplitter.length);
+
+ TriggerType type;
+ try {
+ type = TriggerType.valueOf(dataSplitter[0].toUpperCase());
+ } catch (IllegalArgumentException ex) {
+ return null;
+ }
+
+ if (type == TriggerType.COMMAND && dataSplitter.length >= 2) {
+ return new CommandTrigger(dataSplitterNew);
+ } else if (type == TriggerType.FIREWORK && dataSplitter.length >= 6) {
+ return new FireworkTrigger(dataSplitterNew);
+ } else if (type == TriggerType.LASER && dataSplitter.length == 6) {
+ return new LaserTrigger(dataSplitterNew);
+ } else if (type == TriggerType.SPOT && dataSplitter.length == 6) {
+ return new SpotTrigger(dataSplitterNew);
+ } else if (type == TriggerType.ANIMA && dataSplitter.length == 2) {
+ return new AnimaTrigger(dataSplitterNew);
+ }
+
+ Bukkit.getLogger().info("Aan het einde. Incorrecte type of te weinig data!");
+ return null;
+ }
+}
diff --git a/src/main/java/nl/sbdeveloper/showapi/utils/TimeUtil.java b/src/main/java/nl/sbdeveloper/showapi/utils/TimeUtil.java
new file mode 100644
index 0000000..ebcc156
--- /dev/null
+++ b/src/main/java/nl/sbdeveloper/showapi/utils/TimeUtil.java
@@ -0,0 +1,70 @@
+package nl.sbdeveloper.showapi.utils;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeParseException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class TimeUtil {
+ private static final int s = 1000;
+ private static final int m = s * 60;
+ private static final int h = m * 60;
+ private static final int d = h * 24;
+ private static final int w = d * 7;
+ private static final int y = (int)(d * 365.25);
+
+ public static String showTime(int seconds) {
+ LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
+ return timeOfDay.toString();
+ }
+
+ public static int parseSeconds(String str) {
+ try {
+ LocalTime localTime = LocalTime.parse(str);
+ return localTime.toSecondOfDay();
+ } catch (DateTimeParseException ex) {
+ Pattern pattern = Pattern.compile("^(-?(?:\\d+)?\\.?\\d+) *(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$");
+ Matcher matcher = pattern.matcher(str);
+
+ if (!matcher.find()) return 0;
+
+ float n = Float.parseFloat(matcher.group(1));
+ switch (matcher.group(2).toLowerCase()) {
+ case "years":
+ case "year":
+ case "yrs":
+ case "yr":
+ case "y":
+ return (int)(n * y) / 1000;
+ case "weeks":
+ case "week":
+ case "w":
+ return (int)(n * w) / 1000;
+ case "days":
+ case "day":
+ case "d":
+ return (int)(n * d) / 1000;
+ case "hours":
+ case "hour":
+ case "hrs":
+ case "hr":
+ case "h":
+ return (int)(n * h) / 1000;
+ case "minutes":
+ case "minute":
+ case "mins":
+ case "min":
+ case "m":
+ return (int)(n * m) / 1000;
+ case "seconds":
+ case "second":
+ case "secs":
+ case "sec":
+ case "s":
+ return (int)(n * s) / 1000;
+ default:
+ return 0;
+ }
+ }
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index df9d989..6ac19ef 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -5,3 +5,9 @@ api-version: 1.13
authors: [SBDeveloper]
description: Make perfect shows with this API!
website: https://sbdplugins.nl
+commands:
+ mctpshow:
+ description: Het show command!
+permissions:
+ mctp.show:
+ description: De permissie voor /mctpshow
\ No newline at end of file