From ac496b7184647b024a1f25ed0dc914c24a0e2578 Mon Sep 17 00:00:00 2001 From: stijnb1234 Date: Thu, 26 Nov 2020 10:08:08 +0100 Subject: [PATCH] v1.2 - Added Particle trigger, and a lot of fixes --- pom.xml | 2 +- .../java/nl/sbdeveloper/showapi/ShowAPI.java | 14 +++++ .../nl/sbdeveloper/showapi/ShowAPIPlugin.java | 1 + .../nl/sbdeveloper/showapi/api/ShowCue.java | 38 ++++++++++++- .../sbdeveloper/showapi/api/TriggerData.java | 10 ++++ .../sbdeveloper/showapi/api/TriggerType.java | 25 ++++++++- .../showapi/api/triggers/LaserTrigger.java | 19 ++++--- .../showapi/api/triggers/ParticleTrigger.java | 56 +++++++++++++++++++ .../showapi/api/triggers/SpotTrigger.java | 23 +++++--- .../nl/sbdeveloper/showapi/data/Shows.java | 19 ++++--- .../sbdeveloper/showapi/gui/ShowCueGUI.java | 11 ++-- .../nl/sbdeveloper/showapi/utils/Laser.java | 10 +++- .../sbdeveloper/showapi/utils/MainUtil.java | 32 ++++------- 13 files changed, 200 insertions(+), 60 deletions(-) create mode 100644 src/main/java/nl/sbdeveloper/showapi/api/triggers/ParticleTrigger.java diff --git a/pom.xml b/pom.xml index 4e59572..cc749a2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ nl.SBDeveloper ShowAPI - 1.1 + 1.2 jar ShowAPI https://sbdplugins.nl diff --git a/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java b/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java index 471dcdf..77a9d1f 100644 --- a/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java +++ b/src/main/java/nl/sbdeveloper/showapi/ShowAPI.java @@ -139,6 +139,12 @@ public class ShowAPI implements API, Listener { return true; } + public static void remove(String name) { + if (!spots.containsKey(name)) return; + + spots.get(name).cancel(); + } + private static class SpotRunnable extends BukkitRunnable { private final EnderCrystal crystal; private final String name; @@ -166,6 +172,7 @@ public class ShowAPI implements API, Listener { } public synchronized void cancel() throws IllegalStateException { + crystal.remove(); spots.remove(name); super.cancel(); } @@ -219,6 +226,13 @@ public class ShowAPI implements API, Listener { return true; } + public static void remove(String name) { + if (!lasers.containsKey(name)) return; + + lasers.get(name).cancel(); + lasers.remove(name); + } + private static class LaserRunnable extends BukkitRunnable { private final Laser laser; private final String name; diff --git a/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java b/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java index f33ddee..69fd929 100644 --- a/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java +++ b/src/main/java/nl/sbdeveloper/showapi/ShowAPIPlugin.java @@ -30,6 +30,7 @@ public final class ShowAPIPlugin extends JavaPlugin { APIManager.initAPI(ShowAPI.class); spiGUI = new SpiGUI(this); + spiGUI.setEnableAutomaticPagination(true); getCommand("mctpshow").setExecutor(new ShowCMD()); } diff --git a/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java b/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java index 1655c59..49bfbb4 100644 --- a/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java +++ b/src/main/java/nl/sbdeveloper/showapi/api/ShowCue.java @@ -14,34 +14,66 @@ public class ShowCue { private final TriggerData data; private int taskID; + /** + * Create a new cue point + * + * @param timeSeconds The starttime in seconds + * @param data The data + */ public ShowCue(int timeSeconds, TriggerData data) { - this.cueID = UUID.randomUUID(); - this.timeSeconds = timeSeconds; - this.data = data; + this(UUID.randomUUID(), timeSeconds, data); } + /** + * Load an exisiting cue point + * + * @param uuid The UUID + * @param timeSeconds The starttime in seconds + * @param data The data + */ public ShowCue(UUID uuid, int timeSeconds, TriggerData data) { this.cueID = uuid; this.timeSeconds = timeSeconds; this.data = data; } + /** + * Get the ID of the cue point + * + * @return The UUID + */ public UUID getCueID() { return cueID; } + /** + * Get the time in seconds + * + * @return The time in seconds + */ public int getTimeSeconds() { return timeSeconds; } + /** + * Get the data of this cue + * + * @return The data + */ public TriggerData getData() { return data; } + /** + * Start this cue point + */ public void runAtTime() { this.taskID = Bukkit.getScheduler().runTaskLater(ShowAPIPlugin.getInstance(), data::trigger, 20 * timeSeconds).getTaskId(); } + /** + * Cancel this cue point + */ public void cancel() { Bukkit.getScheduler().cancelTask(taskID); } diff --git a/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java b/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java index 2b71150..be8a712 100644 --- a/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java +++ b/src/main/java/nl/sbdeveloper/showapi/api/TriggerData.java @@ -17,6 +17,11 @@ public abstract class TriggerData { */ public void trigger() {} + /** + * This method gets fired when the cue gets removed + */ + public void remove() {} + /** * Get the trigger type * @@ -26,6 +31,11 @@ public abstract class TriggerData { return type; } + /** + * Get the datastring from this cue + * + * @return The datastring + */ public String getDataString() { StringBuilder builder = new StringBuilder(); for (String s : dataString) { diff --git a/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java b/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java index ceda5e6..b8b8252 100644 --- a/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java +++ b/src/main/java/nl/sbdeveloper/showapi/api/TriggerType.java @@ -1,5 +1,28 @@ package nl.sbdeveloper.showapi.api; +import nl.sbdeveloper.showapi.api.triggers.*; + public enum TriggerType { - COMMAND, FIREWORK, SPOT, LASER, ANIMA + COMMAND(CommandTrigger.class, 2), + FIREWORK(FireworkTrigger.class, 6), + SPOT(SpotTrigger.class, 6), + LASER(LaserTrigger.class, 6), + ANIMA(AnimaTrigger.class, 2), + PARTICLE(ParticleTrigger.class, 7); + + private final Class trigger; + private final int minArgs; + + TriggerType(Class trigger, int minArgs) { + this.trigger = trigger; + this.minArgs = minArgs; + } + + public Class getTrigger() { + return trigger; + } + + public int getMinArgs() { + return minArgs; + } } diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java index ba314ba..b00916d 100644 --- a/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java +++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/LaserTrigger.java @@ -8,13 +8,15 @@ import org.bukkit.Location; import org.bukkit.World; public class LaserTrigger extends TriggerData { - private String name; + private final String name; private Location newLocation; public LaserTrigger(String[] data) { super(TriggerType.LASER, data); - World w = Bukkit.getWorld(data[0]); + this.name = data[0]; + + World w = Bukkit.getWorld(data[1]); if (w == null) { Bukkit.getLogger().info("De wereld is null!"); return; @@ -24,9 +26,9 @@ public class LaserTrigger extends TriggerData { int y; int z; try { - x = Integer.parseInt(data[1]); - y = Integer.parseInt(data[2]); - z = Integer.parseInt(data[3]); + x = Integer.parseInt(data[2]); + y = Integer.parseInt(data[3]); + z = Integer.parseInt(data[4]); } catch (NumberFormatException ex) { Bukkit.getLogger().info("De positie is null!"); return; @@ -34,8 +36,6 @@ public class LaserTrigger extends TriggerData { this.newLocation = new Location(w, x, y, z); - this.name = data[4]; - if (!ShowAPI.Lasers.exists(name)) { ShowAPI.Lasers.start(name, newLocation); } @@ -45,4 +45,9 @@ public class LaserTrigger extends TriggerData { public void trigger() { ShowAPI.Lasers.move(name, newLocation); } + + @Override + public void remove() { + ShowAPI.Lasers.remove(name); + } } diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/ParticleTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/ParticleTrigger.java new file mode 100644 index 0000000..4a57307 --- /dev/null +++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/ParticleTrigger.java @@ -0,0 +1,56 @@ +package nl.sbdeveloper.showapi.api.triggers; + +import nl.sbdeveloper.showapi.api.TriggerData; +import nl.sbdeveloper.showapi.api.TriggerType; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.World; + +public class ParticleTrigger extends TriggerData { + private Particle type; + private Location spawnLoc; + private int count; + + public ParticleTrigger(String[] data) { + super(TriggerType.PARTICLE, 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); + + try { + this.type = Particle.valueOf(data[4]); + } catch (IllegalArgumentException ex) { + Bukkit.getLogger().info("De particle " + data[4] + " bestaat niet!"); + return; + } + + try { + this.count = Integer.parseInt(data[5]); + } catch (NumberFormatException ex) { + Bukkit.getLogger().info("Het aantal " + data[4] + " is incorrect!"); + } + } + + @Override + public void trigger() { + spawnLoc.getWorld().spawnParticle(type, spawnLoc, count); + } +} diff --git a/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java b/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java index ee2eac7..8e87f0c 100644 --- a/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java +++ b/src/main/java/nl/sbdeveloper/showapi/api/triggers/SpotTrigger.java @@ -8,13 +8,15 @@ import org.bukkit.Location; import org.bukkit.World; public class SpotTrigger extends TriggerData { - private String name; + private final String name; private Location newLocation; public SpotTrigger(String[] data) { super(TriggerType.SPOT, data); - World w = Bukkit.getWorld(data[0]); + this.name = data[0]; + + World w = Bukkit.getWorld(data[1]); if (w == null) { Bukkit.getLogger().info("De wereld is null!"); return; @@ -24,9 +26,9 @@ public class SpotTrigger extends TriggerData { int y; int z; try { - x = Integer.parseInt(data[1]); - y = Integer.parseInt(data[2]); - z = Integer.parseInt(data[3]); + x = Integer.parseInt(data[2]); + y = Integer.parseInt(data[3]); + z = Integer.parseInt(data[4]); } catch (NumberFormatException ex) { Bukkit.getLogger().info("De positie is null!"); return; @@ -34,10 +36,8 @@ public class SpotTrigger extends TriggerData { this.newLocation = new Location(w, x, y, z); - this.name = data[4]; - - if (!ShowAPI.Lasers.exists(name)) { - ShowAPI.Lasers.start(name, newLocation); + if (!ShowAPI.Spots.exists(name)) { + ShowAPI.Spots.start(name, newLocation); } } @@ -45,4 +45,9 @@ public class SpotTrigger extends TriggerData { public void trigger() { ShowAPI.Spots.move(name, newLocation); } + + @Override + public void remove() { + ShowAPI.Spots.remove(name); + } } diff --git a/src/main/java/nl/sbdeveloper/showapi/data/Shows.java b/src/main/java/nl/sbdeveloper/showapi/data/Shows.java index af064a1..ab9efaa 100644 --- a/src/main/java/nl/sbdeveloper/showapi/data/Shows.java +++ b/src/main/java/nl/sbdeveloper/showapi/data/Shows.java @@ -33,21 +33,22 @@ public class Shows { return showsMap.get(name); } - public static void removePoint(String name, ShowCue point) { - if (!exists(name)) return; - - showsMap.get(name).remove(point); - - ShowAPIPlugin.getData().getFile().set("Shows." + name + "." + point.getCueID(), null); - ShowAPIPlugin.getData().saveFile(); - } - public static void addPoint(String name, int sec, TriggerData data) { if (!exists(name)) return; getPoints(name).add(new ShowCue(sec, data)); Bukkit.getScheduler().runTaskAsynchronously(ShowAPIPlugin.getInstance(), DataSaving::save); } + public static void removePoint(String name, ShowCue point) { + if (!exists(name)) return; + + point.getData().remove(); + showsMap.get(name).remove(point); + + ShowAPIPlugin.getData().getFile().set("Shows." + name + "." + point.getCueID(), null); + ShowAPIPlugin.getData().saveFile(); + } + public static void startShow(String name) { if (!exists(name)) return; getPoints(name).forEach(ShowCue::runAtTime); diff --git a/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java b/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java index ac38fb2..1faa42f 100644 --- a/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java +++ b/src/main/java/nl/sbdeveloper/showapi/gui/ShowCueGUI.java @@ -12,16 +12,15 @@ import org.bukkit.event.inventory.InventoryClickEvent; public class ShowCueGUI { public static void openGUI(String name, Player p) { - SGMenu menu = ShowAPIPlugin.getSpiGUI().create(ChatColor.DARK_AQUA + "Show Cue Manager:", MainUtil.pointsToRow(Shows.getPoints(name).size())); + SGMenu menu = ShowAPIPlugin.getSpiGUI().create(ChatColor.DARK_AQUA + "Show Cue Manager:", 5); menu.setAutomaticPaginationEnabled(true); for (ShowCue cue : Shows.getPoints(name)) { SGButton button = new SGButton(MainUtil.pointToItem(cue)) - .withListener((InventoryClickEvent e) -> { - Shows.removePoint(name, cue); - - openGUI(name, p); //Refresh - }); + .withListener((InventoryClickEvent e) -> { + Shows.removePoint(name, cue); //Remove the point + openGUI(name, p); //Refresh + }); menu.addButton(button); } diff --git a/src/main/java/nl/sbdeveloper/showapi/utils/Laser.java b/src/main/java/nl/sbdeveloper/showapi/utils/Laser.java index 021eda7..46a7b23 100644 --- a/src/main/java/nl/sbdeveloper/showapi/utils/Laser.java +++ b/src/main/java/nl/sbdeveloper/showapi/utils/Laser.java @@ -158,6 +158,7 @@ public class Laser { static int generateEID() { return lastIssuedEID++; } + private static String nmsVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; private static int version = Integer.parseInt(Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3].substring(1).split("_")[1]); private static String npack = "net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + "."; private static String cpack = Bukkit.getServer().getClass().getPackage().getName() + "."; @@ -205,8 +206,13 @@ public class Laser { watcherName3 = "bA"; squidID = 74; guardianID = 31; - }else if (version >= 16) { - watcherName1 = "T"; + }else if (version == 16) { + if (nmsVersion.equals("v1_16_R3")) { + watcherName1 = "S"; + } else { + watcherName1 = "T"; + } + watcherName2 = "b"; watcherName3 = "d"; squidID = 74; diff --git a/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java b/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java index 5d7cb1e..87c8c82 100644 --- a/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java +++ b/src/main/java/nl/sbdeveloper/showapi/utils/MainUtil.java @@ -1,27 +1,22 @@ 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.ChatColor; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.util.ChatPaginator; -import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; 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())); @@ -50,19 +45,12 @@ public class MainUtil { 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); + try { + Constructor ctor = type.getTrigger().getConstructor(String[].class); + if (dataSplitter.length < type.getMinArgs()) return null; + return ctor.newInstance(new Object[] { dataSplitterNew }); + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + return null; } - - Bukkit.getLogger().info("Aan het einde. Incorrecte type of te weinig data!"); - return null; } }