diff --git a/src/main/java/tech/sbdevelopment/showcontrol/ShowControlPlugin.java b/src/main/java/tech/sbdevelopment/showcontrol/ShowControlPlugin.java index 7ea0055..01458ea 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/ShowControlPlugin.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/ShowControlPlugin.java @@ -26,6 +26,14 @@ public final class ShowControlPlugin extends JavaPlugin { commandManager.registerCommand(new ShowCMD()); commandManager.getCommandCompletions().registerCompletion("showname", c -> SCAPI.getShowsMap().keySet()); commandManager.getCommandCompletions().registerCompletion("showtype", c -> SCAPI.getTriggers().keySet()); + commandManager.getCommandCompletions().registerCompletion("cuearg", c -> { + //Get the show type argument value, and return the tab complete for that argument + String showType = c.getContextValue(String.class, 2); + if (showType == null) { + return null; + } + return SCAPI.getTrigger().getArgumentTabComplete(c.getContextValue(Integer.class, 3), c.getContextValue(String.class, 4)); + }); getLogger().info("Loading GUI manageer..."); Inventory.init(this); diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/Trigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/Trigger.java index e555142..cb036db 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/Trigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/Trigger.java @@ -3,6 +3,8 @@ package tech.sbdevelopment.showcontrol.api.triggers; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.List; + @AllArgsConstructor @Getter public abstract class Trigger { @@ -13,6 +15,15 @@ public abstract class Trigger { */ public abstract void trigger(); + /** + * This method gets fired when a player wants to add a cue + * + * @param index The current argument index + * @param arg The current argument + * @return The tab complete value based on the index and argument + */ + public abstract List getArgumentTabComplete(int index, String arg); + /** * This method gets fired when the cue gets removed * It's not required, and does nothing if it's not needed. diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/AnimaTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/AnimaTrigger.java index be95e9f..d2276fe 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/AnimaTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/AnimaTrigger.java @@ -5,6 +5,8 @@ import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; import org.bukkit.Bukkit; import org.bukkit.Material; +import java.util.List; + @TriggerIdentifier(value = "animatronic", minArgs = 1, argDesc = "", item = Material.ARMOR_STAND) public class AnimaTrigger extends Trigger { public AnimaTrigger(String[] data) { @@ -15,4 +17,9 @@ public class AnimaTrigger extends Trigger { public void trigger() { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "anima play " + getDataString()); } + + @Override + public List getArgumentTabComplete(int index, String arg) { + return List.of(); //TODO Return list of animatronics if possible + } } diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/CommandTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/CommandTrigger.java index 0eb368f..188c8fb 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/CommandTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/CommandTrigger.java @@ -5,6 +5,8 @@ import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; import org.bukkit.Bukkit; import org.bukkit.Material; +import java.util.List; + @TriggerIdentifier(value = "command", minArgs = 1, argDesc = "", item = Material.COMMAND_BLOCK) public class CommandTrigger extends Trigger { public CommandTrigger(String[] data) { @@ -15,4 +17,9 @@ public class CommandTrigger extends Trigger { public void trigger() { Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), getDataString()); } + + @Override + public List getArgumentTabComplete(int index, String arg) { + return List.of(); + } } diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/FireworkTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/FireworkTrigger.java index 21da57a..6d54605 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/FireworkTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/FireworkTrigger.java @@ -1,11 +1,16 @@ package tech.sbdevelopment.showcontrol.api.triggers.impl; +import org.bukkit.*; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException; import tech.sbdevelopment.showcontrol.api.triggers.Trigger; import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; import tech.sbdevelopment.showcontrol.elements.Fireworks; import tech.sbdevelopment.showcontrol.utils.Color; -import org.bukkit.*; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; @TriggerIdentifier(value = "firework", minArgs = 5, argDesc = " ", item = Material.FIREWORK_ROCKET) public class FireworkTrigger extends Trigger { @@ -59,6 +64,10 @@ public class FireworkTrigger extends Trigger { continue; } + //Limit value to 0-127 + if (power < 0) power = 0; + if (power > 127) power = 127; + firework = firework.setPower(power); } } @@ -70,4 +79,35 @@ public class FireworkTrigger extends Trigger { public void trigger() { Fireworks.spawn(fw, spawnLoc); } + + @Override + public List getArgumentTabComplete(int index, String arg) { + if (index == 0) { + return Bukkit.getWorlds().stream().map(World::getName).toList(); + } else if (index == 4) { + if (arg.contains(":")) { + String[] split = arg.split(":"); + if (split.length != 2) return List.of(); + + String key = split[0]; + + if (key.equalsIgnoreCase("color")) { + return Arrays.stream(Color.values()).map(c -> "color:" + c.name()).toList(); + } else if (key.equalsIgnoreCase("shape")) { + return Arrays.stream(FireworkEffect.Type.values()).map(t -> "shape:" + t.name()).toList(); + } else if (key.equalsIgnoreCase("fade")) { + return Arrays.stream(Color.values()).map(c -> "fade:" + c.name()).toList(); + } else if (key.equalsIgnoreCase("effect")) { + return List.of("effect:trail", "effect:twinkle"); + } else if (key.equalsIgnoreCase("power")) { + return IntStream.rangeClosed(0, 127) + .mapToObj(i -> "power:" + i) + .collect(Collectors.toList()); + } + } else { + return List.of("color:", "shape:", "fade:", "effect:", "power:"); + } + } + return List.of(); + } } diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/LaserTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/LaserTrigger.java index 68c746e..e9c51ce 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/LaserTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/LaserTrigger.java @@ -8,6 +8,8 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import java.util.List; + @TriggerIdentifier(value = "laser", minArgs = 5, argDesc = " ") public class LaserTrigger extends Trigger { private final String name; @@ -46,6 +48,16 @@ public class LaserTrigger extends Trigger { Lasers.move(name, newLocation); } + @Override + public List getArgumentTabComplete(int index, String arg) { + if (index == 0) { + return Lasers.getLasers().keySet().stream().toList(); + } else if (index == 1) { + return Bukkit.getWorlds().stream().map(World::getName).toList(); + } + return List.of(); + } + @Override public void remove() { Lasers.remove(name); diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/ParticleTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/ParticleTrigger.java index 06937f8..a74a916 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/ParticleTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/ParticleTrigger.java @@ -8,6 +8,9 @@ import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.World; +import java.util.Arrays; +import java.util.List; + @TriggerIdentifier(value = "particle", minArgs = 6, argDesc = " ") public class ParticleTrigger extends Trigger { private final Particle type; @@ -52,4 +55,14 @@ public class ParticleTrigger extends Trigger { public void trigger() { spawnLoc.getWorld().spawnParticle(type, spawnLoc, count); } + + @Override + public List getArgumentTabComplete(int index, String arg) { + if (index == 0) { + return Bukkit.getWorlds().stream().map(World::getName).toList(); + } else if (index == 4) { + return Arrays.stream(Particle.values()).map(Enum::name).toList(); + } + return List.of(); + } } diff --git a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/SpotTrigger.java b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/SpotTrigger.java index 17115ce..b794d1c 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/SpotTrigger.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/api/triggers/impl/SpotTrigger.java @@ -3,11 +3,14 @@ package tech.sbdevelopment.showcontrol.api.triggers.impl; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException; import tech.sbdevelopment.showcontrol.api.triggers.Trigger; import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; +import tech.sbdevelopment.showcontrol.elements.Lasers; import tech.sbdevelopment.showcontrol.elements.Spots; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import java.util.List; + @TriggerIdentifier(value = "spot", minArgs = 5, argDesc = " ") public class SpotTrigger extends Trigger { private final String name; @@ -46,6 +49,16 @@ public class SpotTrigger extends Trigger { Spots.move(name, newLocation); } + @Override + public List getArgumentTabComplete(int index, String arg) { + if (index == 0) { + return Spots.getSpots().keySet().stream().toList(); + } else if (index == 1) { + return Bukkit.getWorlds().stream().map(World::getName).toList(); + } + return List.of(); + } + @Override public void remove() { Spots.remove(name); diff --git a/src/main/java/tech/sbdevelopment/showcontrol/commands/ShowCMD.java b/src/main/java/tech/sbdevelopment/showcontrol/commands/ShowCMD.java index 3cb1c3c..7fb8a16 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/commands/ShowCMD.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/commands/ShowCMD.java @@ -1,6 +1,7 @@ package tech.sbdevelopment.showcontrol.commands; import co.aikar.commands.BaseCommand; +import co.aikar.commands.CommandHelp; import co.aikar.commands.annotation.*; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidTriggerException; import tech.sbdevelopment.showcontrol.api.exceptions.TooFewArgumentsException; @@ -15,6 +16,13 @@ import org.bukkit.entity.Player; @CommandAlias("showcontrol|sc") @CommandPermission("sc.admin") public class ShowCMD extends BaseCommand { + @HelpCommand + @CatchUnknown + @Default + public static void onHelp(CommandSender sender, CommandHelp help) { + help.showHelp(); + } + @Subcommand("create") @Description("") public void onCreate(CommandSender sender, @Single String name) { diff --git a/src/main/java/tech/sbdevelopment/showcontrol/elements/Lasers.java b/src/main/java/tech/sbdevelopment/showcontrol/elements/Lasers.java index 59a63c3..a18cfd9 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/elements/Lasers.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/elements/Lasers.java @@ -1,6 +1,7 @@ package tech.sbdevelopment.showcontrol.elements; import fr.skytasul.guardianbeam.Laser; +import lombok.Getter; import tech.sbdevelopment.showcontrol.ShowControlPlugin; import org.bukkit.Location; import org.bukkit.scheduler.BukkitRunnable; @@ -9,6 +10,7 @@ import java.util.HashMap; import java.util.Map; public class Lasers { + @Getter private static final Map lasers = new HashMap<>(); /** diff --git a/src/main/java/tech/sbdevelopment/showcontrol/elements/Spots.java b/src/main/java/tech/sbdevelopment/showcontrol/elements/Spots.java index ba0f4bd..61c5cc3 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/elements/Spots.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/elements/Spots.java @@ -1,6 +1,7 @@ package tech.sbdevelopment.showcontrol.elements; import fr.skytasul.guardianbeam.Laser; +import lombok.Getter; import tech.sbdevelopment.showcontrol.ShowControlPlugin; import org.bukkit.Location; import org.bukkit.scheduler.BukkitRunnable; @@ -9,6 +10,7 @@ import java.util.HashMap; import java.util.Map; public class Spots { + @Getter private static final Map spots = new HashMap<>(); /** diff --git a/src/main/java/tech/sbdevelopment/showcontrol/utils/TimeUtil.java b/src/main/java/tech/sbdevelopment/showcontrol/utils/TimeUtil.java index 35257a1..ac3001a 100644 --- a/src/main/java/tech/sbdevelopment/showcontrol/utils/TimeUtil.java +++ b/src/main/java/tech/sbdevelopment/showcontrol/utils/TimeUtil.java @@ -4,7 +4,7 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.TimeUnit; -/** +/* * Source from: * https://github.com/Mindgamesnl/OpenAudioMc/blob/master/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/show/util/TimeParser.java */ @@ -40,7 +40,7 @@ public class TimeUtil { String[] tickSplit = input.split("t"); if (isValid(tickSplit)) { - time += Math.round(Integer.parseInt(tickSplit[0]) * 50); + time += Integer.parseInt(tickSplit[0]) * 50L; return time; } @@ -48,7 +48,7 @@ public class TimeUtil { } private static boolean isValid(String[] array) { - return array.length > 1 && array[0].length() > 0; + return array.length > 1 && !array[0].isEmpty(); } public static String makeReadable(Long time) {