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