From 10125ab2ba10e524b75a345287156ffcb4ca686a Mon Sep 17 00:00:00 2001 From: ImproperIssues Date: Sun, 16 Jul 2023 22:56:25 -0700 Subject: [PATCH] added gui --- build/libs/ExplosionsControl-3.0.jar | Bin 18495 -> 39347 bytes build/resources/main/plugin.yml | 17 +++ .../compileJava/previous-compilation-data.bin | Bin 16185 -> 17743 bytes .../explosionscontrol/ExplosionsControl.java | 23 +++- .../commands/BukkitCommand.java | 8 ++ .../commands/commands/ConfigWorldCommand.java | 47 ++++++++ .../commands/UpdateWorldsCommand.java | 42 +++++++ .../explosionscontrol/data/ExplosionGui.java | 75 +++++++++++++ .../explosionscontrol/data/ItemBuilder.java | 103 ++++++++++++++++++ .../explosionscontrol/data/Mode.java | 50 ++++++++- .../events/InventoryListener.java | 87 +++++++++++++++ .../explosionscontrol/utils/ArrayUtils.java | 41 +++++++ .../explosionscontrol/utils/ItemPresets.java | 39 +++++++ .../explosionscontrol/utils/StringUtils.java | 18 +++ .../explosionscontrol/utils/Timer.java | 89 +++++++++++++++ src/main/resources/plugin.yml | 17 +++ 16 files changed, 651 insertions(+), 5 deletions(-) create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/commands/BukkitCommand.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/ConfigWorldCommand.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/UpdateWorldsCommand.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionGui.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/data/ItemBuilder.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/ArrayUtils.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/ItemPresets.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/StringUtils.java create mode 100644 src/main/java/io/github/itzispyder/explosionscontrol/utils/Timer.java diff --git a/build/libs/ExplosionsControl-3.0.jar b/build/libs/ExplosionsControl-3.0.jar index 17a5d648938b076475046db1a5eb15ed0dabf38c..24e64f257b804eddeaea17e51bee1ccedde1cf46 100644 GIT binary patch delta 24368 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 bf7{JRvdf|qF_gr#09t?`0RV7%^U41KSVq`Y diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index fc7d685..611fcc6 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -5,3 +5,20 @@ api-version: 1.17 authors: [ ImproperIssues ] description: Manager server explosions with just a few simple clicks! website: github.com/ItziSpyder +permissions: + exc.commands.updateworlds: + description: Command access + default: op + exc.commands.configworlds: + description: Command access + default: op +commands: + updateworlds: + description: Update all world explosion configs + usage: /updateworlds + permission: exc.commands.updateworlds + configworld: + description: Config world explosion configs + usage: /configworld + permission: exc.commands.configworld + diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 0a50b4bcf3e2e960af5fdf60f91b7d3e96c45ea5..de6015f754c6d803e887ecb658959553176dda96 100644 GIT binary patch literal 17743 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 A6aWAK diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java index 9f604fc..ec92010 100644 --- a/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java @@ -1,8 +1,13 @@ package io.github.itzispyder.explosionscontrol; +import io.github.itzispyder.explosionscontrol.commands.BukkitCommand; +import io.github.itzispyder.explosionscontrol.commands.commands.ConfigWorldCommand; +import io.github.itzispyder.explosionscontrol.commands.commands.UpdateWorldsCommand; import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.events.InventoryListener; import io.github.itzispyder.explosionscontrol.utils.Text; import org.bukkit.Bukkit; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.util.logging.Logger; @@ -10,12 +15,14 @@ import java.util.logging.Logger; public final class ExplosionsControl extends JavaPlugin { public static final Logger logger = Bukkit.getLogger(); - public static final String starter = Text.color("&7[&6Ex&eC&7] &r"); + public static final PluginManager pm = Bukkit.getPluginManager(); + public static final String starter = Text.color("&7[&6Ex&eC&7]&r "); public static ExplosionsControl instance; @Override public void onEnable() { instance = this; + this.init(); ExplosionConfig.updateAllWorlds(); } @@ -23,4 +30,18 @@ public final class ExplosionsControl extends JavaPlugin { public void onDisable() { ExplosionConfig.updateAllWorlds(); } + + public void init() { + // listeners + pm.registerEvents(new InventoryListener(), this); + + // commands + addCommand(new UpdateWorldsCommand()); + addCommand(new ConfigWorldCommand()); + } + + public void addCommand(BukkitCommand command) { + getCommand(command.getName()).setExecutor(command); + getCommand(command.getName()).setTabCompleter(command); + } } diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/commands/BukkitCommand.java b/src/main/java/io/github/itzispyder/explosionscontrol/commands/BukkitCommand.java new file mode 100644 index 0000000..3dc6d6e --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/commands/BukkitCommand.java @@ -0,0 +1,8 @@ +package io.github.itzispyder.explosionscontrol.commands; + +import org.bukkit.command.TabExecutor; + +public interface BukkitCommand extends TabExecutor { + + String getName(); +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/ConfigWorldCommand.java b/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/ConfigWorldCommand.java new file mode 100644 index 0000000..20b89bf --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/ConfigWorldCommand.java @@ -0,0 +1,47 @@ +package io.github.itzispyder.explosionscontrol.commands.commands; + +import io.github.itzispyder.explosionscontrol.commands.BukkitCommand; +import io.github.itzispyder.explosionscontrol.commands.CmdExHandler; +import io.github.itzispyder.explosionscontrol.commands.TabComplBuilder; +import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.data.ExplosionGui; +import io.github.itzispyder.explosionscontrol.utils.ArrayUtils; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +public class ConfigWorldCommand implements BukkitCommand { + + @Override + public String getName() { + return "configworld"; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + try { + Player player = (Player)sender; + World world = Bukkit.getWorld(args[0]); + ExplosionConfig config = ExplosionConfig.load(world); + ExplosionGui gui = new ExplosionGui(config); + + player.openInventory(gui.loadGui()); + } + catch (Exception ex) { + CmdExHandler handler = new CmdExHandler(ex, command); + sender.sendMessage(handler.getHelp()); + } + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return new TabComplBuilder(sender, command, alias, args) + .add(1, ArrayUtils.toNewList(Bukkit.getWorlds(), World::getName)) + .build(); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/UpdateWorldsCommand.java b/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/UpdateWorldsCommand.java new file mode 100644 index 0000000..0ea6d80 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/commands/commands/UpdateWorldsCommand.java @@ -0,0 +1,42 @@ +package io.github.itzispyder.explosionscontrol.commands.commands; + +import io.github.itzispyder.explosionscontrol.commands.BukkitCommand; +import io.github.itzispyder.explosionscontrol.commands.CmdExHandler; +import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.utils.Text; +import io.github.itzispyder.explosionscontrol.utils.Timer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; + +import java.util.ArrayList; +import java.util.List; + +public class UpdateWorldsCommand implements BukkitCommand { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + try { + Timer timer = Timer.start(); + ExplosionConfig.updateAllWorlds(); + Timer.End end = timer.end(); + + sender.sendMessage(Text.ofAll("&eUpdated all world configs, took &7" + end.getStampPrecise())); + } + catch (Exception ex) { + CmdExHandler handler = new CmdExHandler(ex, command); + sender.sendMessage(handler.getHelp()); + } + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + return new ArrayList<>(); + } + + @Override + public String getName() { + return "updateworlds"; + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionGui.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionGui.java new file mode 100644 index 0000000..52238a3 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/ExplosionGui.java @@ -0,0 +1,75 @@ +package io.github.itzispyder.explosionscontrol.data; + +import io.github.itzispyder.explosionscontrol.utils.ItemPresets; +import io.github.itzispyder.explosionscontrol.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import static io.github.itzispyder.explosionscontrol.ExplosionsControl.starter; + +public class ExplosionGui { + + public final ExplosionConfig config; + + public ExplosionGui(ExplosionConfig config) { + this.config = config; + } + + public Inventory loadGui() { + String title = Text.color(starter + config.getWorld().getName()); + Inventory inv = Bukkit.createInventory(null, 54, title); + ItemStack x = ItemPresets.GUI_BLANK; + ItemStack o = ItemPresets.GUI_BORDER; + ItemStack f = ItemPresets.GUI_FLOOR; + + ItemStack minecartMode = ItemBuilder.create() + .material(Material.TNT_MINECART) + .name(config.getMinecartMode().getDisplay()) + .build(); + ItemStack tntMode = ItemBuilder.create() + .material(Material.TNT) + .name(config.getTntMode().getDisplay()) + .build(); + ItemStack crystalMode = ItemBuilder.create() + .material(Material.END_CRYSTAL) + .name(config.getCrystalMode().getDisplay()) + .build(); + ItemStack creeperMode = ItemBuilder.create() + .material(Material.CREEPER_HEAD) + .name(config.getCreeperMode().getDisplay()) + .build(); + ItemStack witherMode = ItemBuilder.create() + .material(Material.WITHER_SKELETON_SKULL) + .name(config.getWitherMode().getDisplay()) + .build(); + ItemStack fireballMode = ItemBuilder.create() + .material(Material.FIRE_CHARGE) + .name(config.getFireballMode().getDisplay()) + .build(); + ItemStack blockMode = ItemBuilder.create() + .material(Material.RESPAWN_ANCHOR) + .name(config.getBlockMode().getDisplay()) + .build(); + + inv.setContents(new ItemStack[]{ + o,o,o,o,o,o,o,o,o, + o,x,x,x,x,x,x,x,o, + o,minecartMode,x,tntMode,x,witherMode,x,fireballMode,o, + o,x,creeperMode,x,crystalMode,x,blockMode,x,o, + o,x,x,x,x,x,x,x,o, + f,f,f,f,f,f,f,f,f + }); + + return inv; + } + + @EventHandler + private void onInventoryClick(InventoryClickEvent e) { + Inventory inv = e.getClickedInventory(); + + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/ItemBuilder.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/ItemBuilder.java new file mode 100644 index 0000000..20148e1 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/ItemBuilder.java @@ -0,0 +1,103 @@ +package io.github.itzispyder.explosionscontrol.data; + +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public class ItemBuilder { + + private ItemStack stack; + private ItemMeta meta; + + public ItemBuilder() { + this(new ItemStack(Material.STONE)); + } + + public ItemBuilder(ItemStack stack) { + this.stack = stack; + this.meta = this.stack.getItemMeta(); + } + + public ItemBuilder material(Material m) { + stack.setType(m); + return this; + } + + public ItemBuilder name(String s) { + meta.setDisplayName(s); + return this; + } + + public ItemBuilder lore(String s) { + List lore = meta.hasLore() ? meta.getLore() : new ArrayList<>(); + lore.add(s); + meta.setLore(lore); + return this; + } + + public ItemBuilder lore(Iterable s) { + s.forEach(this::lore); + return this; + } + + public ItemBuilder count(int c) { + stack.setAmount(c); + return this; + } + + public ItemBuilder enchant(Enchantment e, int level) { + meta.addEnchant(e,level,true); + return this; + } + + public ItemBuilder flag(ItemFlag... f) { + meta.addItemFlags(f); + return this; + } + + public ItemBuilder attribute(Attribute a, AttributeModifier am) { + meta.addAttributeModifier(a,am); + return this; + } + + public ItemBuilder unbreakable(boolean b) { + meta.setUnbreakable(b); + return this; + } + + public ItemBuilder customModelData(int d) { + meta.setCustomModelData(d); + return this; + } + + public ItemBuilder runTaskItem(Function task) { + this.stack = task.apply(build()); + return this; + } + + public ItemBuilder runTaskMeta(Function task) { + this.meta = task.apply(meta); + return this; + } + + public ItemStack build() { + stack.setItemMeta(meta); + return stack; + } + + public static ItemBuilder create() { + return new ItemBuilder(); + } + + public static ItemBuilder create(ItemStack item) { + return new ItemBuilder(item); + } +} \ No newline at end of file diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java index d518482..2a3099a 100644 --- a/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java @@ -1,10 +1,52 @@ package io.github.itzispyder.explosionscontrol.data; +import io.github.itzispyder.explosionscontrol.utils.StringUtils; +import io.github.itzispyder.explosionscontrol.utils.Text; + +import java.util.Arrays; + public enum Mode { - ENABLED, - DISABLED, - NONE, - DYNAMIC + ENABLED("✔", 0), + DISABLED("✘", 1), + NONE("◯", 2), + DYNAMIC("☀", 3); + private final String name; + private final int id; + + Mode(String name, int id) { + this.name = name; + this.id = id; + } + + public Mode next() { + int i = id + 1; + i = i >= values().length ? 0 : i; + return fromId(i); + } + + public static Mode fromId(int id) { + return Arrays.stream(values()).filter(m -> m.id == id).toList().get(0); + } + + public String getName() { + return name; + } + + public String getDisplay() { + String pre; + switch (this) { + case NONE -> pre = "&7"; + case DYNAMIC -> pre = "&6"; + case DISABLED -> pre = "&c"; + case ENABLED -> pre = "&a"; + default -> pre = "&8"; + } + return Text.color("&f" + StringUtils.capitalize(name()) + " " + pre + name); + } + + public int getId() { + return id; + } } diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java b/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java new file mode 100644 index 0000000..9bfc9e0 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java @@ -0,0 +1,87 @@ +package io.github.itzispyder.explosionscontrol.events; + +import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.data.ExplosionGui; +import io.github.itzispyder.explosionscontrol.utils.Text; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import static io.github.itzispyder.explosionscontrol.ExplosionsControl.starter; + +public class InventoryListener implements Listener { + + @EventHandler + private void onInvClick(InventoryClickEvent e) { + try { + this.handleConfigGui(e); + } + catch (Exception ignore) { + ignore.printStackTrace(); + } + } + + private void handleConfigGui(InventoryClickEvent e) { + String title = e.getView().getTitle(); + ItemStack item = e.getCurrentItem(); + Player p = (Player)e.getWhoClicked(); + + if (title.contains(starter) && item != null) { + e.setCancelled(true); + String name = title.split(" ")[title.split(" ").length - 1]; + World world = Bukkit.getWorld(name); + + if (world == null) { + p.closeInventory(); + p.sendMessage("matching worlds: " + p.getWorld().getName().equals(name)); + p.sendMessage(Text.ofAll("&cWorld &7\"" + name + "&7\" &cis not found!")); + return; + } + + ExplosionConfig config = ExplosionConfig.load(world); + ExplosionGui gui = new ExplosionGui(config); + + switch (item.getType()) { + case END_CRYSTAL -> { + config.setCrystalMode(config.getCrystalMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case TNT_MINECART -> { + config.setMinecartMode(config.getMinecartMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case TNT -> { + config.setTntMode(config.getTntMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case FIRE_CHARGE -> { + config.setFireballMode(config.getFireballMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case WITHER_SKELETON_SKULL -> { + config.setWitherMode(config.getWitherMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case CREEPER_HEAD -> { + config.setCreeperMode(config.getCreeperMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + case RESPAWN_ANCHOR -> { + config.setBlockMode(config.getBlockMode().next()); + config.save(); + p.openInventory(gui.loadGui()); + } + } + } + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/ArrayUtils.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/ArrayUtils.java new file mode 100644 index 0000000..9e26e33 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/ArrayUtils.java @@ -0,0 +1,41 @@ +package io.github.itzispyder.explosionscontrol.utils; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +public final class ArrayUtils { + + /** + * Transforms an array to another one + * @param e iterable list + * @param a action + * @return new transformed list + * @param input + * @param output + */ + public static List toNewList(Iterable e, Function a) { + List list = new ArrayList<>(); + e.forEach(i -> list.add(a.apply(i))); + return list; + } + + public static String list2string(List list) { + return Text.color("&7[&e" + String.join("&7, &e", ArrayUtils.toNewList(list, Object::toString)) + "&7]"); + } + + public static List bind(Iterable tList, T... ts) { + List list = Arrays.asList(ts); + tList.forEach(list::add); + return list; + } + + public static class Constants { + public static final List MATERIAL_NAMES = toNewList(Arrays.stream(Material.values()).toList(),m -> m.name().toLowerCase()); + public static final List ENTITY_NAMES = toNewList(Arrays.stream(EntityType.values()).toList(),e -> e.name().toLowerCase()); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/ItemPresets.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/ItemPresets.java new file mode 100644 index 0000000..348da6a --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/ItemPresets.java @@ -0,0 +1,39 @@ +package io.github.itzispyder.explosionscontrol.utils; + +import io.github.itzispyder.explosionscontrol.data.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public final class ItemPresets { + + public static final ItemStack GUI_BLANK = ItemBuilder.create() + .material(Material.GRAY_STAINED_GLASS_PANE) + .name(" ") + .build(); + + public static final ItemStack GUI_BORDER = ItemBuilder.create() + .material(Material.YELLOW_STAINED_GLASS_PANE) + .name(" ") + .build(); + + public static final ItemStack GUI_FILL = ItemBuilder.create() + .material(Material.BLACK_STAINED_GLASS_PANE) + .name(" ") + .build(); + + public static final ItemStack GUI_FLOOR = ItemBuilder.create() + .material(Material.ORANGE_STAINED_GLASS_PANE) + .name(" ") + .build(); + + public static final ItemStack GUI_RESET = ItemBuilder.create() + .material(Material.COMPASS) + .name(Text.color("&bReset")) + .lore(Text.color("&7- Click to reset")) + .build(); + + public static final ItemStack AIR = ItemBuilder.create() + .material(Material.AIR) + .build(); + +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/StringUtils.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/StringUtils.java new file mode 100644 index 0000000..ba6a6d0 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/StringUtils.java @@ -0,0 +1,18 @@ +package io.github.itzispyder.explosionscontrol.utils; + +public final class StringUtils { + + public static String capitalize(String s) { + if (s.length() == 1) return s.toUpperCase(); + s = s.toLowerCase(); + return String.valueOf(s.charAt(0)).toUpperCase() + s.substring(1); + } + + public static String capitalizeWords(String s) { + s = s.replaceAll("[_-]"," "); + String[] sArray = s.split(" "); + StringBuilder sb = new StringBuilder(); + for (String str : sArray) sb.append(capitalize(str)).append(" "); + return sb.toString().trim(); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/utils/Timer.java b/src/main/java/io/github/itzispyder/explosionscontrol/utils/Timer.java new file mode 100644 index 0000000..bb84dcc --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/utils/Timer.java @@ -0,0 +1,89 @@ +package io.github.itzispyder.explosionscontrol.utils; + +public class Timer { + + public static final long MILLIS_IN_SECOND = 1000L; + public static final long MILLIS_IN_MINUTE = MILLIS_IN_SECOND * 60L; + public static final long MILLIS_IN_HOUR = MILLIS_IN_MINUTE * 60L; + public static final long MILLIS_IN_DAY = MILLIS_IN_HOUR * 24L; + private long start; + + private Timer() { + this.start = System.currentTimeMillis(); + } + + public static Timer start() { + return new Timer(); + } + + public static End zero() { + return new End(0); + } + + public End end() { + return new End(start); + } + + + public static class End { + + private final long start; + private final long end; + + private End(long start) { + this.end = System.currentTimeMillis(); + this.start = start; + } + + public long timePassed() { + return end - start; + } + + public String getStamp(boolean day, boolean hr, boolean min, boolean sec, boolean ms) { + long time = timePassed(); + String stamp = ""; + + if (day) { + long l = (long)Math.floor((double)time / (double)MILLIS_IN_DAY); + time -= l * MILLIS_IN_DAY; + if (l > 0L) stamp += l + "d"; + } + if (hr) { + long l = (long)Math.floor((double)time / (double)MILLIS_IN_HOUR); + time -= l * MILLIS_IN_HOUR; + if (l > 0L) stamp += " " + l + "hr"; + } + if (min) { + long l = (long)Math.floor((double)time / (double)MILLIS_IN_MINUTE); + time -= l * MILLIS_IN_MINUTE; + if (l > 0L) stamp += " " + l + "min"; + } + if (sec) { + long l = (long)Math.floor((double)time / (double)MILLIS_IN_SECOND); + time -= l * MILLIS_IN_SECOND; + if (l > 0L) stamp += " " + l + "sec"; + } + if (ms) { + if (time > 0L) stamp += " " + time + "ms"; + } + + return stamp.trim(); + } + + public String getStampStandard() { + return getStamp(false, true, true, false, false); + } + + public String getStampLogger() { + return getStamp(false, true, true, true, false); + } + + public String getStampPrecise() { + return getStamp(false, false, true, true, true); + } + + public String getStampFull() { + return getStamp(true, true, true, true, true); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cef9f88..a8a7b56 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,3 +5,20 @@ api-version: 1.17 authors: [ ImproperIssues ] description: Manager server explosions with just a few simple clicks! website: github.com/ItziSpyder +permissions: + exc.commands.updateworlds: + description: Command access + default: op + exc.commands.configworlds: + description: Command access + default: op +commands: + updateworlds: + description: Update all world explosion configs + usage: /updateworlds + permission: exc.commands.updateworlds + configworld: + description: Config world explosion configs + usage: /configworld + permission: exc.commands.configworld +