Tried implementing tab complete per trigger, still WIP

This commit is contained in:
Stijn Bannink 2023-09-19 17:32:00 +02:00
parent 8d28a22d67
commit ecde72d943
12 changed files with 127 additions and 4 deletions

View file

@ -26,6 +26,14 @@ public final class ShowControlPlugin extends JavaPlugin {
commandManager.registerCommand(new ShowCMD()); commandManager.registerCommand(new ShowCMD());
commandManager.getCommandCompletions().registerCompletion("showname", c -> SCAPI.getShowsMap().keySet()); commandManager.getCommandCompletions().registerCompletion("showname", c -> SCAPI.getShowsMap().keySet());
commandManager.getCommandCompletions().registerCompletion("showtype", c -> SCAPI.getTriggers().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..."); getLogger().info("Loading GUI manageer...");
Inventory.init(this); Inventory.init(this);

View file

@ -3,6 +3,8 @@ package tech.sbdevelopment.showcontrol.api.triggers;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@Getter @Getter
public abstract class Trigger { public abstract class Trigger {
@ -13,6 +15,15 @@ public abstract class Trigger {
*/ */
public abstract void 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<String> getArgumentTabComplete(int index, String arg);
/** /**
* This method gets fired when the cue gets removed * This method gets fired when the cue gets removed
* It's not required, and does nothing if it's not needed. * It's not required, and does nothing if it's not needed.

View file

@ -5,6 +5,8 @@ import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import java.util.List;
@TriggerIdentifier(value = "animatronic", minArgs = 1, argDesc = "<name>", item = Material.ARMOR_STAND) @TriggerIdentifier(value = "animatronic", minArgs = 1, argDesc = "<name>", item = Material.ARMOR_STAND)
public class AnimaTrigger extends Trigger { public class AnimaTrigger extends Trigger {
public AnimaTrigger(String[] data) { public AnimaTrigger(String[] data) {
@ -15,4 +17,9 @@ public class AnimaTrigger extends Trigger {
public void trigger() { public void trigger() {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "anima play " + getDataString()); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "anima play " + getDataString());
} }
@Override
public List<String> getArgumentTabComplete(int index, String arg) {
return List.of(); //TODO Return list of animatronics if possible
}
} }

View file

@ -5,6 +5,8 @@ import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import java.util.List;
@TriggerIdentifier(value = "command", minArgs = 1, argDesc = "<command ...>", item = Material.COMMAND_BLOCK) @TriggerIdentifier(value = "command", minArgs = 1, argDesc = "<command ...>", item = Material.COMMAND_BLOCK)
public class CommandTrigger extends Trigger { public class CommandTrigger extends Trigger {
public CommandTrigger(String[] data) { public CommandTrigger(String[] data) {
@ -15,4 +17,9 @@ public class CommandTrigger extends Trigger {
public void trigger() { public void trigger() {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), getDataString()); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), getDataString());
} }
@Override
public List<String> getArgumentTabComplete(int index, String arg) {
return List.of();
}
} }

View file

@ -1,11 +1,16 @@
package tech.sbdevelopment.showcontrol.api.triggers.impl; package tech.sbdevelopment.showcontrol.api.triggers.impl;
import org.bukkit.*;
import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException;
import tech.sbdevelopment.showcontrol.api.triggers.Trigger; import tech.sbdevelopment.showcontrol.api.triggers.Trigger;
import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier;
import tech.sbdevelopment.showcontrol.elements.Fireworks; import tech.sbdevelopment.showcontrol.elements.Fireworks;
import tech.sbdevelopment.showcontrol.utils.Color; 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 = "<world> <x> <y> <z> <configuration ...>", item = Material.FIREWORK_ROCKET) @TriggerIdentifier(value = "firework", minArgs = 5, argDesc = "<world> <x> <y> <z> <configuration ...>", item = Material.FIREWORK_ROCKET)
public class FireworkTrigger extends Trigger { public class FireworkTrigger extends Trigger {
@ -59,6 +64,10 @@ public class FireworkTrigger extends Trigger {
continue; continue;
} }
//Limit value to 0-127
if (power < 0) power = 0;
if (power > 127) power = 127;
firework = firework.setPower(power); firework = firework.setPower(power);
} }
} }
@ -70,4 +79,35 @@ public class FireworkTrigger extends Trigger {
public void trigger() { public void trigger() {
Fireworks.spawn(fw, spawnLoc); Fireworks.spawn(fw, spawnLoc);
} }
@Override
public List<String> 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();
}
} }

View file

@ -8,6 +8,8 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import java.util.List;
@TriggerIdentifier(value = "laser", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>") @TriggerIdentifier(value = "laser", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>")
public class LaserTrigger extends Trigger { public class LaserTrigger extends Trigger {
private final String name; private final String name;
@ -46,6 +48,16 @@ public class LaserTrigger extends Trigger {
Lasers.move(name, newLocation); Lasers.move(name, newLocation);
} }
@Override
public List<String> 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 @Override
public void remove() { public void remove() {
Lasers.remove(name); Lasers.remove(name);

View file

@ -8,6 +8,9 @@ import org.bukkit.Location;
import org.bukkit.Particle; import org.bukkit.Particle;
import org.bukkit.World; import org.bukkit.World;
import java.util.Arrays;
import java.util.List;
@TriggerIdentifier(value = "particle", minArgs = 6, argDesc = "<world> <x> <y> <z> <type> <count>") @TriggerIdentifier(value = "particle", minArgs = 6, argDesc = "<world> <x> <y> <z> <type> <count>")
public class ParticleTrigger extends Trigger { public class ParticleTrigger extends Trigger {
private final Particle type; private final Particle type;
@ -52,4 +55,14 @@ public class ParticleTrigger extends Trigger {
public void trigger() { public void trigger() {
spawnLoc.getWorld().spawnParticle(type, spawnLoc, count); spawnLoc.getWorld().spawnParticle(type, spawnLoc, count);
} }
@Override
public List<String> 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();
}
} }

View file

@ -3,11 +3,14 @@ package tech.sbdevelopment.showcontrol.api.triggers.impl;
import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidArgumentException;
import tech.sbdevelopment.showcontrol.api.triggers.Trigger; import tech.sbdevelopment.showcontrol.api.triggers.Trigger;
import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier; import tech.sbdevelopment.showcontrol.api.triggers.TriggerIdentifier;
import tech.sbdevelopment.showcontrol.elements.Lasers;
import tech.sbdevelopment.showcontrol.elements.Spots; import tech.sbdevelopment.showcontrol.elements.Spots;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import java.util.List;
@TriggerIdentifier(value = "spot", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>") @TriggerIdentifier(value = "spot", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>")
public class SpotTrigger extends Trigger { public class SpotTrigger extends Trigger {
private final String name; private final String name;
@ -46,6 +49,16 @@ public class SpotTrigger extends Trigger {
Spots.move(name, newLocation); Spots.move(name, newLocation);
} }
@Override
public List<String> 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 @Override
public void remove() { public void remove() {
Spots.remove(name); Spots.remove(name);

View file

@ -1,6 +1,7 @@
package tech.sbdevelopment.showcontrol.commands; package tech.sbdevelopment.showcontrol.commands;
import co.aikar.commands.BaseCommand; import co.aikar.commands.BaseCommand;
import co.aikar.commands.CommandHelp;
import co.aikar.commands.annotation.*; import co.aikar.commands.annotation.*;
import tech.sbdevelopment.showcontrol.api.exceptions.InvalidTriggerException; import tech.sbdevelopment.showcontrol.api.exceptions.InvalidTriggerException;
import tech.sbdevelopment.showcontrol.api.exceptions.TooFewArgumentsException; import tech.sbdevelopment.showcontrol.api.exceptions.TooFewArgumentsException;
@ -15,6 +16,13 @@ import org.bukkit.entity.Player;
@CommandAlias("showcontrol|sc") @CommandAlias("showcontrol|sc")
@CommandPermission("sc.admin") @CommandPermission("sc.admin")
public class ShowCMD extends BaseCommand { public class ShowCMD extends BaseCommand {
@HelpCommand
@CatchUnknown
@Default
public static void onHelp(CommandSender sender, CommandHelp help) {
help.showHelp();
}
@Subcommand("create") @Subcommand("create")
@Description("") @Description("")
public void onCreate(CommandSender sender, @Single String name) { public void onCreate(CommandSender sender, @Single String name) {

View file

@ -1,6 +1,7 @@
package tech.sbdevelopment.showcontrol.elements; package tech.sbdevelopment.showcontrol.elements;
import fr.skytasul.guardianbeam.Laser; import fr.skytasul.guardianbeam.Laser;
import lombok.Getter;
import tech.sbdevelopment.showcontrol.ShowControlPlugin; import tech.sbdevelopment.showcontrol.ShowControlPlugin;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@ -9,6 +10,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class Lasers { public class Lasers {
@Getter
private static final Map<String, LaserRunnable> lasers = new HashMap<>(); private static final Map<String, LaserRunnable> lasers = new HashMap<>();
/** /**

View file

@ -1,6 +1,7 @@
package tech.sbdevelopment.showcontrol.elements; package tech.sbdevelopment.showcontrol.elements;
import fr.skytasul.guardianbeam.Laser; import fr.skytasul.guardianbeam.Laser;
import lombok.Getter;
import tech.sbdevelopment.showcontrol.ShowControlPlugin; import tech.sbdevelopment.showcontrol.ShowControlPlugin;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@ -9,6 +10,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class Spots { public class Spots {
@Getter
private static final Map<String, SpotRunnable> spots = new HashMap<>(); private static final Map<String, SpotRunnable> spots = new HashMap<>();
/** /**

View file

@ -4,7 +4,7 @@ import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /*
* Source from: * Source from:
* https://github.com/Mindgamesnl/OpenAudioMc/blob/master/plugin/src/main/java/com/craftmend/openaudiomc/spigot/modules/show/util/TimeParser.java * 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"); String[] tickSplit = input.split("t");
if (isValid(tickSplit)) { if (isValid(tickSplit)) {
time += Math.round(Integer.parseInt(tickSplit[0]) * 50); time += Integer.parseInt(tickSplit[0]) * 50L;
return time; return time;
} }
@ -48,7 +48,7 @@ public class TimeUtil {
} }
private static boolean isValid(String[] array) { 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) { public static String makeReadable(Long time) {