Rewritten detector API

This commit is contained in:
SBDeveloper 2023-01-09 21:16:07 +01:00
parent 8ac4017b9b
commit 673f03a689
25 changed files with 253 additions and 232 deletions

23
pom.xml
View file

@ -33,6 +33,13 @@
<version>3.10.1</version> <version>3.10.1</version>
<configuration> <configuration>
<release>17</release> <release>17</release>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</path>
</annotationProcessorPaths>
<compilerArgs> <compilerArgs>
<arg>-parameters</arg> <arg>-parameters</arg>
</compilerArgs> </compilerArgs>
@ -69,6 +76,10 @@
<pattern>co.aikar.locales</pattern> <pattern>co.aikar.locales</pattern>
<shadedPattern>nl.sbdeveloper.showcontrol.libs.locales</shadedPattern> <shadedPattern>nl.sbdeveloper.showcontrol.libs.locales</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>org.reflections</pattern>
<shadedPattern>nl.sbdeveloper.showcontrol.libs.reflections</shadedPattern>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
</execution> </execution>
@ -132,5 +143,17 @@
<version>2.3.1</version> <version>2.3.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.10.2</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View file

@ -1,18 +1,14 @@
package nl.sbdeveloper.showcontrol; package nl.sbdeveloper.showcontrol;
import co.aikar.commands.PaperCommandManager; import co.aikar.commands.PaperCommandManager;
import nl.sbdeveloper.showcontrol.api.TriggerType; import nl.sbdeveloper.showcontrol.api.ShowAPI;
import nl.sbdeveloper.showcontrol.commands.ShowCMD; import nl.sbdeveloper.showcontrol.commands.ShowCMD;
import nl.sbdeveloper.showcontrol.data.DataConversion;
import nl.sbdeveloper.showcontrol.data.DataSaving; import nl.sbdeveloper.showcontrol.data.DataSaving;
import nl.sbdeveloper.showcontrol.data.Shows; import nl.sbdeveloper.showcontrol.data.Shows;
import nl.sbdeveloper.showcontrol.utils.Inventory; import nl.sbdeveloper.showcontrol.utils.Inventory;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.Arrays;
import java.util.stream.Collectors;
public final class ShowControlPlugin extends JavaPlugin { public final class ShowControlPlugin extends JavaPlugin {
private static ShowControlPlugin instance; private static ShowControlPlugin instance;
@ -20,15 +16,13 @@ public final class ShowControlPlugin extends JavaPlugin {
public void onEnable() { public void onEnable() {
instance = this; instance = this;
DataConversion.handle();
final PaperCommandManager commandManager = new PaperCommandManager(this); final PaperCommandManager commandManager = new PaperCommandManager(this);
commandManager.enableUnstableAPI("help"); commandManager.enableUnstableAPI("help");
commandManager.registerCommand(new ShowCMD()); commandManager.registerCommand(new ShowCMD());
commandManager.getCommandCompletions().registerCompletion("showname", c -> Shows.getShowsMap().keySet()); commandManager.getCommandCompletions().registerCompletion("showname", c -> Shows.getShowsMap().keySet());
commandManager.getCommandCompletions().registerStaticCompletion("showtype", Arrays.stream(TriggerType.values()).map(Enum::name).collect(Collectors.toList())); commandManager.getCommandCompletions().registerCompletion("showtype", c -> ShowAPI.getTriggers().keySet());
Inventory.init(); Inventory.init();

View file

@ -0,0 +1,7 @@
package nl.sbdeveloper.showcontrol.api;
import lombok.experimental.StandardException;
@StandardException
public class InvalidTriggerException extends Exception {
}

View file

@ -0,0 +1,57 @@
package nl.sbdeveloper.showcontrol.api;
import lombok.Getter;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit;
import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.scanners.Scanners;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class ShowAPI {
@Getter
private static final Map<String, Class<? extends Trigger>> triggers = new HashMap<>();
public static void index(Class<?> clazz, String... packages) {
Bukkit.getLogger().info("Indexing triggers for starting point " + clazz.getSimpleName() + "...");
FilterBuilder filterBuilder = new FilterBuilder();
for (String p : packages) filterBuilder.includePackage(p);
ConfigurationBuilder config = new ConfigurationBuilder()
.setScanners(Scanners.SubTypes.filterResultsBy(new FilterBuilder().includePattern(Trigger.class.getName())), Scanners.TypesAnnotated)
.setUrls(ClasspathHelper.forClass(clazz))
.filterInputsBy(filterBuilder);
Reflections reflections = new Reflections(config);
Set<Class<?>> trig = reflections.getTypesAnnotatedWith(TriggerIdentifier.class);
for (Class<?> trigger : trig) {
Bukkit.getLogger().info("Found trigger " + trigger.getSimpleName() + ".");
TriggerIdentifier identifier = trigger.getAnnotation(TriggerIdentifier.class);
triggers.put(identifier.value(), (Class<? extends Trigger>) trigger);
}
}
public static <T extends Trigger> T getTrigger(String data) throws ReflectiveOperationException, InvalidTriggerException, TooFewArgumentsException {
String[] dataSplitter = data.split(" ");
String[] dataSplitterNew = Arrays.copyOfRange(dataSplitter, 1, dataSplitter.length);
String triggerType = dataSplitter[0];
if (!triggers.containsKey(triggerType)) throw new InvalidTriggerException("Provided trigger " + triggerType + " does not exists!");
Constructor<T> ctor = (Constructor<T>) triggers.get(triggerType).getConstructor(String[].class);
if (dataSplitter.length < triggers.get(triggerType).getAnnotation(TriggerIdentifier.class).minArgs() + 1) throw new TooFewArgumentsException("Provided triggerdata " + data + " has too few arguments!");
return ctor.newInstance(dataSplitterNew);
}
}

View file

@ -1,14 +1,16 @@
package nl.sbdeveloper.showcontrol.api; package nl.sbdeveloper.showcontrol.api;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import java.util.UUID; import java.util.UUID;
/** /**
* A cue point of a show * A cue point of a show
*/ */
public class ShowCue { public class ShowCuePoint {
private final UUID cueID; private final UUID cueID;
private final Long time; private final Long time;
private final TriggerTask data; private final Trigger data;
/** /**
* Create a new cue point * Create a new cue point
@ -16,7 +18,7 @@ public class ShowCue {
* @param time The starttime (milli) * @param time The starttime (milli)
* @param data The data * @param data The data
*/ */
public ShowCue(Long time, TriggerTask data) { public ShowCuePoint(Long time, Trigger data) {
this(UUID.randomUUID(), time, data); this(UUID.randomUUID(), time, data);
} }
@ -27,7 +29,7 @@ public class ShowCue {
* @param time The starttime (milli) * @param time The starttime (milli)
* @param data The data * @param data The data
*/ */
public ShowCue(UUID uuid, Long time, TriggerTask data) { public ShowCuePoint(UUID uuid, Long time, Trigger data) {
this.cueID = uuid; this.cueID = uuid;
this.time = time; this.time = time;
this.data = data; this.data = data;
@ -56,7 +58,7 @@ public class ShowCue {
* *
* @return The data * @return The data
*/ */
public TriggerTask getTask() { public Trigger getTask() {
return data; return data;
} }
} }

View file

@ -0,0 +1,7 @@
package nl.sbdeveloper.showcontrol.api;
import lombok.experimental.StandardException;
@StandardException
public class TooFewArgumentsException extends Exception {
}

View file

@ -1,29 +0,0 @@
package nl.sbdeveloper.showcontrol.api;
import nl.sbdeveloper.showcontrol.api.triggers.*;
public enum TriggerType {
COMMAND(CommandTrigger.class, 2),
FIREWORK(FireworkTrigger.class, 6),
FAKE_FIREWORK(FakeFireworkTrigger.class, 7),
SPOT(SpotTrigger.class, 6),
LASER(LaserTrigger.class, 6),
ANIMA(AnimaTrigger.class, 2),
PARTICLE(ParticleTrigger.class, 7);
private final Class<? extends TriggerTask> trigger;
private final int minArgs;
TriggerType(Class<? extends TriggerTask> trigger, int minArgs) {
this.trigger = trigger;
this.minArgs = minArgs;
}
public Class<? extends TriggerTask> getTrigger() {
return trigger;
}
public int getMinArgs() {
return minArgs;
}
}

View file

@ -1,20 +0,0 @@
package nl.sbdeveloper.showcontrol.api.triggers;
import nl.sbdeveloper.showcontrol.api.TriggerTask;
import nl.sbdeveloper.showcontrol.api.TriggerType;
import org.bukkit.Bukkit;
public class AnimaTrigger extends TriggerTask {
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);
}
}

View file

@ -1,20 +0,0 @@
package nl.sbdeveloper.showcontrol.api.triggers;
import nl.sbdeveloper.showcontrol.api.TriggerTask;
import nl.sbdeveloper.showcontrol.api.TriggerType;
import org.bukkit.Bukkit;
public class CommandTrigger extends TriggerTask {
private final String command;
public CommandTrigger(String[] data) {
super(TriggerType.COMMAND, data);
this.command = getDataString();
}
@Override
public void trigger() {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), command);
}
}

View file

@ -1,17 +1,13 @@
package nl.sbdeveloper.showcontrol.api; package nl.sbdeveloper.showcontrol.api.triggers;
public abstract class TriggerTask { import lombok.AllArgsConstructor;
private final TriggerType type; import lombok.Getter;
@AllArgsConstructor
@Getter
public abstract class Trigger {
private final String[] dataString; private final String[] dataString;
/**
* Create a new trigger
*/
public TriggerTask(TriggerType type, String[] dataString) {
this.type = type;
this.dataString = dataString;
}
/** /**
* This method gets fired when the cue gets triggered * This method gets fired when the cue gets triggered
*/ */
@ -23,15 +19,6 @@ public abstract class TriggerTask {
*/ */
public void remove() {} public void remove() {}
/**
* Get the trigger type
*
* @return The trigger type
*/
public TriggerType getType() {
return type;
}
/** /**
* Get the datastring from this cue * Get the datastring from this cue
* *
@ -44,4 +31,8 @@ public abstract class TriggerTask {
} }
return builder.toString().trim(); return builder.toString().trim();
} }
public String getTriggerId() {
return getClass().getAnnotation(TriggerIdentifier.class).value();
}
} }

View file

@ -0,0 +1,14 @@
package nl.sbdeveloper.showcontrol.api.triggers;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TriggerIdentifier {
String value();
int minArgs() default 0;
String argDesc() default "";
}

View file

@ -0,0 +1,17 @@
package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit;
@TriggerIdentifier(value = "animatronic", minArgs = 1, argDesc = "<name>")
public class AnimaTrigger extends Trigger {
public AnimaTrigger(String[] data) {
super(data);
}
@Override
public void trigger() {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "anima play " + getDataString());
}
}

View file

@ -0,0 +1,17 @@
package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit;
@TriggerIdentifier(value = "command", minArgs = 1, argDesc = "<command ...>")
public class CommandTrigger extends Trigger {
public CommandTrigger(String[] data) {
super(data);
}
@Override
public void trigger() {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), getDataString());
}
}

View file

@ -1,7 +1,7 @@
package nl.sbdeveloper.showcontrol.api.triggers; package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.TriggerType; import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import nl.sbdeveloper.showcontrol.elements.Fireworks; import nl.sbdeveloper.showcontrol.elements.Fireworks;
import nl.sbdeveloper.showcontrol.utils.Color; import nl.sbdeveloper.showcontrol.utils.Color;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -9,12 +9,13 @@ import org.bukkit.FireworkEffect;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
public class FireworkTrigger extends TriggerTask { @TriggerIdentifier(value = "firework", minArgs = 5, argDesc = "<world> <x> <y> <z> <configuration ...>")
public class FireworkTrigger extends Trigger {
private Fireworks.Firework fw; private Fireworks.Firework fw;
private Location spawnLoc; private Location spawnLoc;
public FireworkTrigger(String[] data) { public FireworkTrigger(String[] data) {
super(TriggerType.FIREWORK, data); super(data);
World w = Bukkit.getWorld(data[0]); World w = Bukkit.getWorld(data[0]);
if (w == null) { if (w == null) {

View file

@ -0,0 +1,16 @@
package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
@TriggerIdentifier(value = "flamethrower", minArgs = 5, argDesc = "<world> <x> <y> <z> <delay>")
public class FlameThrowerTrigger extends Trigger {
public FlameThrowerTrigger(String[] dataString) {
super(dataString);
}
@Override
public void trigger() {
}
}

View file

@ -1,19 +1,19 @@
package nl.sbdeveloper.showcontrol.api.triggers; package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.TriggerType; import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import nl.sbdeveloper.showcontrol.elements.Lasers; import nl.sbdeveloper.showcontrol.elements.Lasers;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
public class LaserTrigger extends TriggerTask { @TriggerIdentifier(value = "laser", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>")
public class LaserTrigger extends Trigger {
private final String name; private final String name;
private Location newLocation; private Location newLocation;
//TODO Fix laser for 1.17
public LaserTrigger(String[] data) { public LaserTrigger(String[] data) {
super(TriggerType.LASER, data); super(data);
this.name = data[0]; this.name = data[0];
@ -44,8 +44,7 @@ public class LaserTrigger extends TriggerTask {
@Override @Override
public void trigger() { public void trigger() {
Bukkit.broadcastMessage("[ShowAPI] De trigger " + name + " is genegeerd, omdat de LASER is disabled."); Lasers.move(name, newLocation);
// ShowAPI.Lasers.move(name, newLocation);
} }
@Override @Override

View file

@ -1,19 +1,20 @@
package nl.sbdeveloper.showcontrol.api.triggers; package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.TriggerType; import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Particle; import org.bukkit.Particle;
import org.bukkit.World; import org.bukkit.World;
public class ParticleTrigger extends TriggerTask { @TriggerIdentifier(value = "particle", minArgs = 6, argDesc = "<world> <x> <y> <z> <type> <count>")
public class ParticleTrigger extends Trigger {
private Particle type; private Particle type;
private Location spawnLoc; private Location spawnLoc;
private int count; private int count;
public ParticleTrigger(String[] data) { public ParticleTrigger(String[] data) {
super(TriggerType.PARTICLE, data); super(data);
World w = Bukkit.getWorld(data[0]); World w = Bukkit.getWorld(data[0]);
if (w == null) { if (w == null) {

View file

@ -1,18 +1,19 @@
package nl.sbdeveloper.showcontrol.api.triggers; package nl.sbdeveloper.showcontrol.api.triggers.impl;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.api.TriggerType; import nl.sbdeveloper.showcontrol.api.triggers.TriggerIdentifier;
import nl.sbdeveloper.showcontrol.elements.Spots; import nl.sbdeveloper.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;
public class SpotTrigger extends TriggerTask { @TriggerIdentifier(value = "spot", minArgs = 5, argDesc = "<name> <world> <x> <y> <z>")
public class SpotTrigger extends Trigger {
private final String name; private final String name;
private Location newLocation; private Location newLocation;
public SpotTrigger(String[] data) { public SpotTrigger(String[] data) {
super(TriggerType.SPOT, data); super(data);
this.name = data[0]; this.name = data[0];
@ -43,7 +44,7 @@ public class SpotTrigger extends TriggerTask {
@Override @Override
public void trigger() { public void trigger() {
// ShowAPI.Spots.move(name, newLocation); Spots.move(name, newLocation);
Bukkit.broadcastMessage("[ShowAPI] De trigger " + name + " is genegeerd, omdat de SPOT is disabled."); Bukkit.broadcastMessage("[ShowAPI] De trigger " + name + " is genegeerd, omdat de SPOT is disabled.");
} }

View file

@ -2,10 +2,12 @@ package nl.sbdeveloper.showcontrol.commands;
import co.aikar.commands.BaseCommand; import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*; import co.aikar.commands.annotation.*;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.InvalidTriggerException;
import nl.sbdeveloper.showcontrol.api.ShowAPI;
import nl.sbdeveloper.showcontrol.api.TooFewArgumentsException;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.data.Shows; import nl.sbdeveloper.showcontrol.data.Shows;
import nl.sbdeveloper.showcontrol.gui.ShowCueGUI; import nl.sbdeveloper.showcontrol.gui.ShowCueGUI;
import nl.sbdeveloper.showcontrol.utils.MainUtil;
import nl.sbdeveloper.showcontrol.utils.TimeUtil; import nl.sbdeveloper.showcontrol.utils.TimeUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -67,8 +69,17 @@ public class ShowCMD extends BaseCommand {
return; return;
} }
TriggerTask data = MainUtil.parseData(args); Trigger data;
if (data == null) { try {
data = ShowAPI.getTrigger(args);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
sender.sendMessage(ChatColor.RED + "Er is iets fout gegaan! Vraag de server eigenaar voor meer informatie.");
return;
} catch (InvalidTriggerException e) {
sender.sendMessage(ChatColor.RED + "De meegegeven trigger bestaat niet.");
return;
} catch (TooFewArgumentsException e) {
sender.sendMessage(ChatColor.RED + "Je hebt niet genoeg informatie meegeven voor de trigger."); sender.sendMessage(ChatColor.RED + "Je hebt niet genoeg informatie meegeven voor de trigger.");
return; return;
} }

View file

@ -1,46 +0,0 @@
package nl.sbdeveloper.showcontrol.data;
import nl.sbdeveloper.showcontrol.ShowControlPlugin;
import nl.sbdeveloper.showcontrol.api.TriggerTask;
import nl.sbdeveloper.showcontrol.utils.MainUtil;
import nl.sbdeveloper.showcontrol.utils.YamlFile;
import java.io.File;
public class DataConversion {
public static void handle() {
if (isOldSystem()) convert();
}
private static boolean isOldSystem() {
File dataFolder = ShowControlPlugin.getInstance().getDataFolder();
File dataFile = new File(dataFolder, "data.yml");
return dataFile.exists();
}
private static void convert() {
File dataFolder = new File(ShowControlPlugin.getInstance().getDataFolder(), "data");
if(!dataFolder.exists()) {
dataFolder.mkdirs();
}
YamlFile dataFile = new YamlFile("data");
for (String name : dataFile.getFile().getConfigurationSection("Shows").getKeys(false)) {
//STEP 1: Convert to new system.
YamlFile showFile = new YamlFile("data/" + name);
for (String id : dataFile.getFile().getConfigurationSection("Shows." + name).getKeys(false)) {
TriggerTask data = MainUtil.parseData(dataFile.getFile().getString("Shows." + name + "." + id + ".Type") + " " + dataFile.getFile().getString("Shows." + name + "." + id + ".Data"));
long time = dataFile.getFile().getLong("Shows." + name + "." + id + ".Time");
showFile.getFile().set(id + ".Time", time);
showFile.getFile().set(id + ".Type", data.getType().name());
showFile.getFile().set(id + ".Data", data.getDataString());
}
showFile.saveFile();
}
//STEP 2: Remove old storage.
File data = new File(ShowControlPlugin.getInstance().getDataFolder(), "data.yml");
data.delete();
}
}

View file

@ -1,9 +1,11 @@
package nl.sbdeveloper.showcontrol.data; package nl.sbdeveloper.showcontrol.data;
import nl.sbdeveloper.showcontrol.ShowControlPlugin; import nl.sbdeveloper.showcontrol.ShowControlPlugin;
import nl.sbdeveloper.showcontrol.api.ShowCue; import nl.sbdeveloper.showcontrol.api.InvalidTriggerException;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.ShowAPI;
import nl.sbdeveloper.showcontrol.utils.MainUtil; import nl.sbdeveloper.showcontrol.api.ShowCuePoint;
import nl.sbdeveloper.showcontrol.api.TooFewArgumentsException;
import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.utils.YamlFile; import nl.sbdeveloper.showcontrol.utils.YamlFile;
import java.io.File; import java.io.File;
@ -23,24 +25,30 @@ public class DataSaving {
YamlFile showConfig = new YamlFile("data/" + showID); YamlFile showConfig = new YamlFile("data/" + showID);
files.put(showID, showConfig); files.put(showID, showConfig);
List<ShowCue> cues = new ArrayList<>(); List<ShowCuePoint> cues = new ArrayList<>();
for (String id : showConfig.getFile().getKeys(false)) { for (String id : showConfig.getFile().getKeys(false)) {
UUID cueID = UUID.fromString(id); UUID cueID = UUID.fromString(id);
TriggerTask data = MainUtil.parseData(showConfig.getFile().getString(id + ".Type") + " " + showConfig.getFile().getString(id + ".Data")); Trigger data;
try {
data = ShowAPI.getTrigger(showConfig.getFile().getString(id + ".Type") + " " + showConfig.getFile().getString(id + ".Data"));
} catch (ReflectiveOperationException | InvalidTriggerException | TooFewArgumentsException e) {
e.printStackTrace();
return;
}
long time = showConfig.getFile().getLong(id + ".Time"); long time = showConfig.getFile().getLong(id + ".Time");
cues.add(new ShowCue(cueID, time, data)); cues.add(new ShowCuePoint(cueID, time, data));
} }
Shows.getShowsMap().put(showID, cues); Shows.getShowsMap().put(showID, cues);
} }
} }
public static void save() { public static void save() {
for (Map.Entry<String, List<ShowCue>> entry : Shows.getShowsMap().entrySet()) { for (Map.Entry<String, List<ShowCuePoint>> entry : Shows.getShowsMap().entrySet()) {
YamlFile file = files.containsKey(entry.getKey()) ? files.get(entry.getKey()) : new YamlFile("data/" + entry.getKey()); YamlFile file = files.containsKey(entry.getKey()) ? files.get(entry.getKey()) : new YamlFile("data/" + entry.getKey());
for (ShowCue cue : entry.getValue()) { for (ShowCuePoint cue : entry.getValue()) {
file.getFile().set(cue.getCueID().toString() + ".Time", cue.getTime()); file.getFile().set(cue.getCueID().toString() + ".Time", cue.getTime());
file.getFile().set(cue.getCueID().toString() + ".Type", cue.getTask().getType().name()); file.getFile().set(cue.getCueID().toString() + ".Type", cue.getTask().getTriggerId());
file.getFile().set(cue.getCueID().toString() + ".Data", cue.getTask().getDataString()); file.getFile().set(cue.getCueID().toString() + ".Data", cue.getTask().getDataString());
} }
file.saveFile(); file.saveFile();

View file

@ -1,8 +1,9 @@
package nl.sbdeveloper.showcontrol.data; package nl.sbdeveloper.showcontrol.data;
import lombok.Getter;
import nl.sbdeveloper.showcontrol.ShowControlPlugin; import nl.sbdeveloper.showcontrol.ShowControlPlugin;
import nl.sbdeveloper.showcontrol.api.ShowCue; import nl.sbdeveloper.showcontrol.api.ShowCuePoint;
import nl.sbdeveloper.showcontrol.api.TriggerTask; import nl.sbdeveloper.showcontrol.api.triggers.Trigger;
import nl.sbdeveloper.showcontrol.utils.YamlFile; import nl.sbdeveloper.showcontrol.utils.YamlFile;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -10,18 +11,19 @@ import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class Shows { public class Shows {
private static final HashMap<String, List<ShowCue>> showsMap = new HashMap<>(); @Getter
private static final HashMap<String, List<ShowCuePoint>> showsMap = new HashMap<>();
private static final HashMap<String, ScheduledExecutorService> showTimers = new HashMap<>(); private static final HashMap<String, ScheduledExecutorService> showTimers = new HashMap<>();
public static void create(String name) { public static void create(String name) {
showsMap.put(name, new ArrayList<>()); showsMap.put(name, new ArrayList<>());
DataSaving.save(); DataSaving.save();
// Bukkit.getScheduler().runTaskAsynchronously(ShowAPIPlugin.getInstance(), DataSaving::save);
} }
public static void delete(String name) { public static void delete(String name) {
@ -35,19 +37,18 @@ public class Shows {
return showsMap.containsKey(name); return showsMap.containsKey(name);
} }
public static List<ShowCue> getPoints(String name) { public static List<ShowCuePoint> getPoints(String name) {
if (!exists(name)) return new ArrayList<>(); if (!exists(name)) return new ArrayList<>();
return showsMap.get(name); return showsMap.get(name);
} }
public static void addPoint(String name, Long time, TriggerTask data) { public static void addPoint(String name, Long time, Trigger data) {
if (!exists(name)) return; if (!exists(name)) return;
getPoints(name).add(new ShowCue(time, data)); getPoints(name).add(new ShowCuePoint(time, data));
DataSaving.save(); DataSaving.save();
// Bukkit.getScheduler().runTaskAsynchronously(ShowAPIPlugin.getInstance(), DataSaving::save);
} }
public static void removePoint(String name, ShowCue point) { public static void removePoint(String name, ShowCuePoint point) {
if (!exists(name)) return; if (!exists(name)) return;
point.getTask().remove(); point.getTask().remove();
@ -62,9 +63,7 @@ public class Shows {
public static void startShow(String name) { public static void startShow(String name) {
if (!exists(name)) return; if (!exists(name)) return;
ScheduledExecutorService showTimer = Executors.newSingleThreadScheduledExecutor(); ScheduledExecutorService showTimer = Executors.newSingleThreadScheduledExecutor();
Bukkit.getLogger().info("Scheduled show " + name); for (ShowCuePoint point : getPoints(name)) {
for (ShowCue point : getPoints(name)) {
Bukkit.getLogger().info("Point " + point.getTask().getDataString() + " on " + point.getTime());
showTimer.schedule(() -> Bukkit.getScheduler().runTask(ShowControlPlugin.getInstance(), () -> point.getTask().trigger()), point.getTime(), TimeUnit.MILLISECONDS); showTimer.schedule(() -> Bukkit.getScheduler().runTask(ShowControlPlugin.getInstance(), () -> point.getTask().trigger()), point.getTime(), TimeUnit.MILLISECONDS);
} }
showTimers.put(name, showTimer); showTimers.put(name, showTimer);
@ -76,8 +75,4 @@ public class Shows {
ScheduledExecutorService showTimer = showTimers.get(name); ScheduledExecutorService showTimer = showTimers.get(name);
showTimer.shutdownNow(); showTimer.shutdownNow();
} }
public static HashMap<String, List<ShowCue>> getShowsMap() {
return showsMap;
}
} }

View file

@ -4,7 +4,7 @@ import fr.minuskube.inv.ClickableItem;
import fr.minuskube.inv.content.InventoryContents; import fr.minuskube.inv.content.InventoryContents;
import fr.minuskube.inv.content.Pagination; import fr.minuskube.inv.content.Pagination;
import fr.minuskube.inv.content.SlotIterator; import fr.minuskube.inv.content.SlotIterator;
import nl.sbdeveloper.showcontrol.api.ShowCue; import nl.sbdeveloper.showcontrol.api.ShowCuePoint;
import nl.sbdeveloper.showcontrol.data.Shows; import nl.sbdeveloper.showcontrol.data.Shows;
import nl.sbdeveloper.showcontrol.utils.Inventory; import nl.sbdeveloper.showcontrol.utils.Inventory;
import nl.sbdeveloper.showcontrol.utils.ItemBuilder; import nl.sbdeveloper.showcontrol.utils.ItemBuilder;
@ -33,7 +33,7 @@ public class ShowCueGUI extends Inventory {
Pagination pagination = contents.pagination(); Pagination pagination = contents.pagination();
List<ClickableItem> items = new ArrayList<>(); List<ClickableItem> items = new ArrayList<>();
Shows.getPoints(showName).stream().sorted(Comparator.comparing(ShowCue::getTime)) Shows.getPoints(showName).stream().sorted(Comparator.comparing(ShowCuePoint::getTime))
.forEach(cue -> items.add(ClickableItem.of(MainUtil.pointToItem(cue), e -> { .forEach(cue -> items.add(ClickableItem.of(MainUtil.pointToItem(cue), e -> {
Shows.removePoint(showName, cue); Shows.removePoint(showName, cue);
open(player, pagination.getPage()); open(player, pagination.getPage());

View file

@ -1,17 +1,12 @@
package nl.sbdeveloper.showcontrol.utils; package nl.sbdeveloper.showcontrol.utils;
import nl.sbdeveloper.showcontrol.api.ShowCue; import nl.sbdeveloper.showcontrol.api.ShowCuePoint;
import nl.sbdeveloper.showcontrol.api.TriggerTask;
import nl.sbdeveloper.showcontrol.api.TriggerType;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.util.ChatPaginator; import org.bukkit.util.ChatPaginator;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class MainUtil { public class MainUtil {
@ -19,12 +14,12 @@ public class MainUtil {
return ChatColor.translateAlternateColorCodes('&', in); return ChatColor.translateAlternateColorCodes('&', in);
} }
public static ItemStack pointToItem(ShowCue point) { public static ItemStack pointToItem(ShowCuePoint point) {
ItemBuilder builder = new ItemBuilder(Material.NOTE_BLOCK); ItemBuilder builder = new ItemBuilder(Material.NOTE_BLOCK);
builder.setName(ChatColor.ITALIC + "TimeCode: " + TimeUtil.makeReadable(point.getTime())); builder.setName(ChatColor.ITALIC + "TimeCode: " + TimeUtil.makeReadable(point.getTime()));
List<String> lores = new ArrayList<>(); List<String> lores = new ArrayList<>();
lores.add(ChatColor.GREEN + "Type: " + ChatColor.AQUA + capitalize(point.getTask().getType().name())); lores.add(ChatColor.GREEN + "Type: " + ChatColor.AQUA + capitalize(point.getTask().getTriggerId()));
lores.add(ChatColor.GREEN + "Data:"); lores.add(ChatColor.GREEN + "Data:");
for (String str : ChatPaginator.paginate(point.getTask().getDataString(), 20).getLines()) { for (String str : ChatPaginator.paginate(point.getTask().getDataString(), 20).getLines()) {
lores.add(ChatColor.AQUA + ChatColor.stripColor(str)); lores.add(ChatColor.AQUA + ChatColor.stripColor(str));
@ -36,26 +31,6 @@ public class MainUtil {
return builder.toItemStack(); return builder.toItemStack();
} }
public static TriggerTask 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;
}
try {
Constructor<? extends TriggerTask> ctor = type.getTrigger().getConstructor(String[].class);
if (dataSplitter.length < type.getMinArgs()) return null;
return ctor.newInstance(dataSplitterNew);
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
return null;
}
}
public static String capitalize(String str) { public static String capitalize(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1); return str.substring(0, 1).toUpperCase() + str.substring(1);
} }

View file

@ -3,5 +3,5 @@ version: ${project.version}
main: nl.sbdeveloper.showcontrol.ShowControlPlugin main: nl.sbdeveloper.showcontrol.ShowControlPlugin
api-version: 1.13 api-version: 1.13
authors: [SBDeveloper] authors: [SBDeveloper]
description: Make perfect shows with this API! description: Create shows easily using this plugin!
website: https://sbdevelopment.tech website: https://sbdevelopment.tech