diff --git a/CHANGELOG.md b/CHANGELOG.md index e7a3466b8..e61b77356 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ * Fixed #2647 * Fixed #2664 * Fixed #2655 +* Fixed /sf timings --verbose not working correctly ## Release Candidate 18 (03 Dec 2020) diff --git a/pom.xml b/pom.xml index 1edd43e87..0b0c8f43a 100644 --- a/pom.xml +++ b/pom.xml @@ -397,6 +397,13 @@ com.sk89q.worldguard worldguard-legacy + + + + + net.kyori + * + diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java index 649a0ea48..69a8a0d72 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java @@ -23,7 +23,6 @@ import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; import io.github.thebusybiscuit.cscorelib2.chat.ChatInput; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; -import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.api.events.WaypointCreateEvent; import io.github.thebusybiscuit.slimefun4.api.geo.GEOResource; import io.github.thebusybiscuit.slimefun4.api.geo.ResourceManager; @@ -34,6 +33,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.items.gps.GPSTransmitte import io.github.thebusybiscuit.slimefun4.implementation.items.gps.Teleporter; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; +import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; @@ -157,7 +157,7 @@ public class GPSNetwork { if (sfi instanceof GPSTransmitter) { int slot = inventory[index]; - menu.addItem(slot, new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS Transmitter", "&8\u21E8 &7World: &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &f" + ((GPSTransmitter) sfi).getMultiplier(l.getBlockY()), "&8\u21E8 &7Ping: &f" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); + menu.addItem(slot, new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS Transmitter", "&8\u21E8 &7World: &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &f" + ((GPSTransmitter) sfi).getMultiplier(l.getBlockY()), "&8\u21E8 &7Ping: &f" + NumberUtils.roundDecimalNumber(1000D / l.getY()) + "ms")); menu.addMenuClickHandler(slot, ChestMenuUtils.getEmptyClickHandler()); index++; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java index eb0ee827a..2d11263fa 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java @@ -20,11 +20,11 @@ import org.bukkit.potion.PotionEffectType; import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; -import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; +import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import io.papermc.lib.PaperLib; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; @@ -64,7 +64,7 @@ public final class TeleportationManager { int slot = teleporterInventory[index]; Location l = waypoint.getLocation(); - double time = DoubleHandler.fixDouble(0.5 * getTeleportationTime(complexity, source, l)); + double time = NumberUtils.reparseDouble(0.5 * getTeleportationTime(complexity, source, l)); String[] lore = { "", "&8\u21E8 &7" + SlimefunPlugin.getLocalization().getResourceString(p, "tooltips.world") + ": &f" + l.getWorld().getName(), "&8\u21E8 &7X: &f" + l.getX(), "&8\u21E8 &7Y: &f" + l.getY(), "&8\u21E8 &7Z: &f" + l.getZ(), "&8\u21E8 &7" + SlimefunPlugin.getLocalization().getMessage(p, "machines.TELEPORTER.gui.time") + ": &f" + time + "s", "", "&8\u21E8 &c" + SlimefunPlugin.getLocalization().getMessage(p, "machines.TELEPORTER.gui.tooltip") }; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/AbstractItemNetwork.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/AbstractItemNetwork.java index cb40d63f1..210125e80 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/AbstractItemNetwork.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/AbstractItemNetwork.java @@ -31,10 +31,10 @@ import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.cscorelib2.chat.ChatColors; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; -import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.api.network.Network; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; +import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import io.papermc.lib.PaperLib; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; @@ -365,7 +365,7 @@ abstract class AbstractItemNetwork extends Network { ItemMeta im = stack.getItemMeta(); List lore = new ArrayList<>(); lore.add(""); - lore.add(ChatColors.color("&7Stored Items: &f" + DoubleHandler.getFancyDouble(item.getInt()))); + lore.add(ChatColors.color("&7Stored Items: &f" + NumberUtils.getCompactDouble(item.getInt()))); if (stack.getMaxStackSize() > 1) { int amount = item.getInt() > stack.getMaxStackSize() ? stack.getMaxStackSize() : item.getInt(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java index f14fe320b..0e821047f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java @@ -23,10 +23,10 @@ import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.core.services.localization.Language; import io.github.thebusybiscuit.slimefun4.core.services.localization.SlimefunLocalization; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import me.mrCookieSlime.Slimefun.api.Slimefun; /** @@ -245,13 +245,15 @@ public class LocalizationService extends SlimefunLocalization { } } - return Math.min(DoubleHandler.fixDouble(100.0 * (matches / (double) defaultKeys.size())), 100.0); + return Math.min(NumberUtils.reparseDouble(100.0 * (matches / (double) defaultKeys.size())), 100.0); } + @Nonnull private Set getTotalKeys(@Nonnull Language lang) { return getKeys(lang.getFiles()); } + @Nonnull private Set getKeys(FileConfiguration... files) { Set keys = new HashSet<>(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java index 01057a966..b5ace61f8 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java @@ -152,7 +152,7 @@ class PerformanceSummary { builder.append(ChatColor.YELLOW); for (Map.Entry entry : results) { - if (!inspector.isVerbose() || (shownEntries < MAX_ITEMS && (shownEntries < MIN_ITEMS || entry.getValue() > VISIBILITY_THRESHOLD))) { + if (inspector.isVerbose() || (shownEntries < MAX_ITEMS && (shownEntries < MIN_ITEMS || entry.getValue() > VISIBILITY_THRESHOLD))) { builder.append("\n "); builder.append(ChatColor.stripColor(formatter.apply(entry))); shownEntries++; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java index 35f3c4d0c..f31c0d9b8 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/SlimefunPlugin.java @@ -333,8 +333,12 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { }), 0); - // Setting up the command /sf and all subcommands - command.register(); + // Setting up our commands + try { + command.register(); + } catch (Exception | LinkageError x) { + getLogger().log(Level.SEVERE, "An Exception occurred while registering the /slimefun command", x); + } // Armor Update Task if (config.getBoolean("options.enable-armor-effects")) { @@ -353,6 +357,16 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { getLogger().log(Level.INFO, "Slimefun has finished loading in {0}", getStartupTime(timestamp)); } + @Override + public JavaPlugin getJavaPlugin() { + return this; + } + + @Override + public String getBugTrackerURL() { + return "https://github.com/Slimefun/Slimefun4/issues"; + } + /** * This method gets called when the {@link Plugin} gets disabled. * Most often it is called when the {@link Server} is shutting down or reloading. @@ -656,6 +670,19 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { } } + /** + * This private static method allows us to throw a proper {@link Exception} + * whenever someone tries to access a static method while the instance is null. + * This happens when the method is invoked before {@link #onEnable()} or after {@link #onDisable()}. + *

+ * Use it whenever a null check is needed to avoid a non-descriptive {@link NullPointerException}. + */ + private static void validateInstance() { + if (instance == null) { + throw new IllegalStateException("Cannot invoke static method, Slimefun instance is null."); + } + } + /** * This returns the global instance of {@link SlimefunPlugin}. * This may return null if the {@link Plugin} was disabled. @@ -667,69 +694,97 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { return instance; } - public static Config getCfg() { - return instance.config; - } - - public static Config getResearchCfg() { - return instance.researches; - } - - public static Config getItemCfg() { - return instance.items; - } - - public static GPSNetwork getGPSNetwork() { - return instance.gpsNetwork; - } - - public static TickerTask getTickerTask() { - return instance.ticker; - } - /** * This returns the version of Slimefun that is currently installed. * * @return The currently installed version of Slimefun */ + @Nonnull public static String getVersion() { + validateInstance(); return instance.getDescription().getVersion(); } + @Nonnull + public static Config getCfg() { + validateInstance(); + return instance.config; + } + + @Nonnull + public static Config getResearchCfg() { + validateInstance(); + return instance.researches; + } + + @Nonnull + public static Config getItemCfg() { + validateInstance(); + return instance.items; + } + + @Nonnull + public static GPSNetwork getGPSNetwork() { + validateInstance(); + return instance.gpsNetwork; + } + + @Nonnull + public static TickerTask getTickerTask() { + validateInstance(); + return instance.ticker; + } + /** * This returns the {@link LocalizationService} of Slimefun. * * @return The {@link LocalizationService} of Slimefun */ + @Nonnull public static LocalizationService getLocalization() { + validateInstance(); return instance.local; } + @Nonnull public static ProtectionManager getProtectionManager() { + validateInstance(); return instance.protections; } + @Nonnull public static MinecraftRecipeService getMinecraftRecipeService() { + validateInstance(); return instance.recipeService; } + @Nonnull public static CustomItemDataService getItemDataService() { + validateInstance(); return instance.itemDataService; } + @Nonnull public static CustomTextureService getItemTextureService() { + validateInstance(); return instance.textureService; } + @Nonnull public static PermissionsService getPermissionsService() { + validateInstance(); return instance.permissionsService; } + @Nonnull public static BlockDataService getBlockDataService() { + validateInstance(); return instance.blockDataService; } + @Nonnull public static PerWorldSettingsService getWorldSettingsService() { + validateInstance(); return instance.worldSettingsService; } @@ -753,6 +808,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { */ @Nonnull public static IntegrationsManager getIntegrations() { + validateInstance(); return instance.integrations; } @@ -762,7 +818,9 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { * * @return The {@link UpdaterService} for Slimefun */ + @Nonnull public static UpdaterService getUpdater() { + validateInstance(); return instance.updaterService; } @@ -772,7 +830,9 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { * * @return The {@link MetricsService} for Slimefun */ + @Nonnull public static MetricsService getMetricsService() { + validateInstance(); return instance.metricsService; } @@ -782,30 +842,99 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { * * @return The {@link GitHubService} for Slimefun */ + @Nonnull public static GitHubService getGitHubService() { + validateInstance(); return instance.gitHubService; } + @Nonnull public static SlimefunRegistry getRegistry() { + validateInstance(); return instance.registry; } + @Nonnull public static NetworkManager getNetworkManager() { + validateInstance(); return instance.networkManager; } + @Nonnull public static GrapplingHookListener getGrapplingHookListener() { + validateInstance(); return instance.grapplingHookListener; } + @Nonnull public static BackpackListener getBackpackListener() { + validateInstance(); return instance.backpackListener; } + @Nonnull public static SlimefunBowListener getBowListener() { + validateInstance(); return instance.bowListener; } + /** + * The {@link Command} that was added by Slimefun. + * + * @return Slimefun's command + */ + @Nonnull + public static SlimefunCommand getCommand() { + validateInstance(); + return instance.command; + } + + /** + * This returns our instance of the {@link SlimefunProfiler}, a tool that is used + * to analyse performance and lag. + * + * @return The {@link SlimefunProfiler} + */ + @Nonnull + public static SlimefunProfiler getProfiler() { + validateInstance(); + return instance.profiler; + } + + /** + * This returns the currently installed version of Minecraft. + * + * @return The current version of Minecraft + */ + @Nonnull + public static MinecraftVersion getMinecraftVersion() { + validateInstance(); + return instance.minecraftVersion; + } + + /** + * This method returns whether this version of Slimefun was newly installed. + * It will return true if this {@link Server} uses Slimefun for the very first time. + * + * @return Whether this is a new installation of Slimefun + */ + public static boolean isNewlyInstalled() { + validateInstance(); + return instance.isNewlyInstalled; + } + + @Nonnull + public static String getCSCoreLibVersion() { + validateInstance(); + Plugin cscorelib = instance.getServer().getPluginManager().getPlugin("CS-CoreLib"); + + if (cscorelib == null) { + throw new IllegalStateException("CS-CoreLib is not installed."); + } else { + return cscorelib.getDescription().getVersion(); + } + } + /** * This method returns a {@link Set} of every {@link Plugin} that lists Slimefun * as a required or optional dependency. @@ -816,6 +945,8 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { */ @Nonnull public static Set getInstalledAddons() { + validateInstance(); + String pluginName = instance.getName(); // @formatter:off @@ -827,65 +958,6 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { // @formatter:on } - /** - * The {@link Command} that was added by Slimefun. - * - * @return Slimefun's command - */ - public static SlimefunCommand getCommand() { - return instance.command; - } - - /** - * This returns our instance of the {@link SlimefunProfiler}, a tool that is used - * to analyse performance and lag. - * - * @return The {@link SlimefunProfiler} - */ - public static SlimefunProfiler getProfiler() { - return instance.profiler; - } - - /** - * This returns the currently installed version of Minecraft. - * - * @return The current version of Minecraft - */ - public static MinecraftVersion getMinecraftVersion() { - return instance.minecraftVersion; - } - - /** - * This method returns whether this version of Slimefun was newly installed. - * It will return true if this {@link Server} uses Slimefun for the very first time. - * - * @return Whether this is a new installation of Slimefun - */ - public static boolean isNewlyInstalled() { - return instance.isNewlyInstalled; - } - - @Nonnull - public static String getCSCoreLibVersion() { - Plugin cscorelib = instance.getServer().getPluginManager().getPlugin("CS-CoreLib"); - - if (cscorelib == null) { - throw new IllegalStateException("CS-CoreLib is not installed."); - } else { - return cscorelib.getDescription().getVersion(); - } - } - - @Override - public JavaPlugin getJavaPlugin() { - return this; - } - - @Override - public String getBugTrackerURL() { - return "https://github.com/Slimefun/Slimefun4/issues"; - } - /** * This method schedules a delayed synchronous task for Slimefun. * For Slimefun only, not for addons. @@ -945,4 +1017,4 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { return instance.getServer().getScheduler().runTask(instance, runnable); } -} +} \ No newline at end of file diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java index 90887bfef..b16a05922 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java @@ -228,6 +228,10 @@ public final class NumberUtils { return DECIMAL_FORMAT.format(number); } + public static double reparseDouble(double number) { + return Double.valueOf(roundDecimalNumber(number)); + } + public static long getLong(@Nullable Long value, long defaultValue) { return value == null ? defaultValue : value; } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java index ef0817484..f0e950303 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -32,8 +32,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.stream.JsonWriter; -import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import io.github.thebusybiscuit.slimefun4.utils.PatternUtils; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; @@ -168,7 +168,7 @@ public class BlockStorage { Slimefun.getLogger().log(Level.INFO, "Loaded a total of {0} Blocks for World \"{1}\"", new Object[] { totalBlocks, world.getName() }); if (totalBlocks > 0) { - Slimefun.getLogger().log(Level.INFO, "Avg: {0}ms/Block", DoubleHandler.fixDouble((double) time / (double) totalBlocks, 3)); + Slimefun.getLogger().log(Level.INFO, "Avg: {0}ms/Block", NumberUtils.roundDecimalNumber((double) time / (double) totalBlocks)); } } }