Started with show (GUI) system

This commit is contained in:
stijnb1234 2020-11-12 22:23:49 +01:00
parent 83aa45ac7f
commit de7cc235b4
18 changed files with 721 additions and 8 deletions

25
pom.xml
View file

@ -49,6 +49,16 @@
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>org.inventivetalent.apihelper</pattern>
<shadedPattern>nl.sbdeveloper.showapi.helpers.apihelper</shadedPattern>
</relocation>
<relocation>
<pattern>com.samjakob.spigui</pattern>
<shadedPattern>nl.sbdeveloper.showapi.helpers.guihelper</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
@ -102,25 +112,30 @@
<id>inventive-repo</id>
<url>https://repo.inventivetalent.org/content/groups/public/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.inventivetalent</groupId>
<artifactId>apimanager</artifactId>
<version>1.0.3-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
@ -128,5 +143,11 @@
<version>18.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.samjakob</groupId>
<artifactId>SpiGUI</artifactId>
<version>v1.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View file

@ -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<String, SpotRunnable> spots = new HashMap<>();
private static final Map<String, SpotRunnable> 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<String, LaserRunnable> lasers = new HashMap<>();
private static final Map<String, LaserRunnable> 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

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -0,0 +1,5 @@
package nl.sbdeveloper.showapi.api;
public enum TriggerType {
COMMAND, FIREWORK, SPOT, LASER, ANIMA
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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 <Naam>
/mctpshow delete <Naam>
/mctpshow add <Naam> <Tijd> <Type> <Data ...>
/mctpshow start <Naam>
/mctpshow cancel <Naam>
/mctpshow gui <Naam>
*/
@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;
}
}

View file

@ -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<String, List<ShowCue>> 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<ShowCue> 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);
}
}

View file

@ -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<ShowCue> 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());
}
}

View file

@ -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;
}
}

View file

@ -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<String> 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;
}
}

View file

@ -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;
}
}
}
}

View file

@ -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