diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 3aaad92..0000000 --- a/build.gradle +++ /dev/null @@ -1,72 +0,0 @@ -//file:noinspection GrDeprecatedAPIUsage -//file:noinspection GrUnresolvedAccess -//file:noinspection GroovyAssignabilityCheck -import org.apache.tools.ant.filters.ReplaceTokens - -plugins { - id 'java' - id 'com.github.johnrengelman.shadow' version '8.1.1' - id 'maven-publish' -} - -compileJava { - options.encoding = 'UTF-8' -} - -// VirtualFurnace version -version = '1.1.1' -def oldestJava = 17 - -repositories { - mavenCentral() - mavenLocal() - - // Paper - maven { url 'https://repo.papermc.io/repository/maven-public/' } -} - -dependencies { - // Paper - compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") - - // bStats - implementation(group: 'org.bstats', name: 'bstats-bukkit', version: '3.0.2') -} - -tasks.withType(JavaCompile).configureEach { - options.compilerArgs += ['-source', '' + oldestJava, '-target', '' + oldestJava] -} - -build { - tasks.withType(JavaCompile).tap { - configureEach { - options.compilerArgs.add("-Xlint:unchecked") - //options.compilerArgs.add("-Xlint:deprecation") - } - } -} - -processResources { - filter ReplaceTokens, tokens: ["version": project.version] -} - -publishing { - publications { - maven(MavenPublication) { - groupId 'com.shanebeestudios' - artifactId 'VirtualFurnace' - version project.version - artifact jar - } - } -} - -javadoc { - destinationDir = file("${buildDir}/javadoc") - options { - links('https://hub.spigotmc.org/javadocs/spigot/') - links('https://jd.advntr.dev/api/4.14.0/') - } - options.addStringOption('Xdoclint:none', '-quiet') - exclude("com/shanebeestudios/vf/**.java", "com/shanebeestudios/vf/command", "com/shanebeestudios/vf/debug") -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..ed44b7e --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,73 @@ +plugins { + id("java") + id("com.gradleup.shadow") version "9.2.0" + id("maven-publish") +} + +// VirtualFurnace version +version = "1.1.1" +group = "com.github.ShaneBeeStudios" +val apiVersion = "1.13" + +java.sourceCompatibility = JavaVersion.VERSION_21 + +repositories { + mavenCentral() + mavenLocal() + + // Paper + maven("https://repo.papermc.io/repository/maven-public/") +} +dependencies { + // Paper + compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + + // bStats + implementation("org.bstats:bstats-bukkit:3.1.0") +} + +tasks { + javadoc { + title = "VirtualFurnace API " + project.version + options.encoding = Charsets.UTF_8.name() + exclude("com/shanebeestudios/vf/**.java", "com/shanebeestudios/vf/command", "com/shanebeestudios/vf/debug") + (options as StandardJavadocDocletOptions).links( + "https://javadoc.io/doc/org.jetbrains/annotations/latest/", + "https://jd.papermc.io/paper/1.21.11/", + "https://jd.advntr.dev/api/4.25.0/", + ) + } + processResources { + expand("version" to version, "apiversion" to apiVersion) + } + compileJava { + options.release = 21 + options.compilerArgs.add("-Xlint:unchecked") + options.compilerArgs.add("-Xlint:deprecation") + } + shadowJar { + archiveFileName = project.name + "-" + project.version + ".jar" + relocate("org.bstats", "com.shanebeestudios.vf.metrics") + exclude("META-INF/**", "LICENSE") + } +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + // Create a publication named 'shadow' (or any name you prefer) + create("shadow") { + // Use the component generated by the Shadow plugin + from(components["java"]) + } + } + // Define the repository where you want to publish the JAR + repositories { + // To publish to your local Maven repository (~/.m2) + mavenLocal() + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f86..cea7a79 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/com/shanebeestudios/vf/api/Metrics.java b/src/main/java/com/shanebeestudios/vf/api/Metrics.java deleted file mode 100644 index d045780..0000000 --- a/src/main/java/com/shanebeestudios/vf/api/Metrics.java +++ /dev/null @@ -1,722 +0,0 @@ -package com.shanebeestudios.vf.api; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.ServicePriority; - -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - *

- * Check out https://bStats.org/ to learn more about bStats! - */ -@SuppressWarnings({"WeakerAccess", "unused"}) -class Metrics { - - static { - // You can use the property to disable the check in your test environment - if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D - final String defaultPackage = new String( - new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); - final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - // We want to make sure nobody just copy & pastes the example and use the wrong package names - if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) { - throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); - } - } - } - - // The version of this bStats class - public static final int B_STATS_VERSION = 1; - - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/bukkit"; - - // Is bStats enabled on this server? - private boolean enabled; - - // Should failed requests be logged? - private static boolean logFailedRequests; - - // Should the sent data be logged? - private static boolean logSentData; - - // Should the response text be logged? - private static boolean logResponseStatusText; - - // The uuid of the server - private static String serverUUID; - - // The plugin - private final Plugin plugin; - private final VirtualFurnaceAPI virtualFurnaceAPI; - - // The plugin id - private final int pluginId; - - // A list with all custom charts - private final List charts = new ArrayList<>(); - - /** - * Class constructor. - * - * @param plugin The plugin which stats should be submitted. - * @param pluginId The id of the plugin. - * It can be found at What is my plugin id? - */ - public Metrics(Plugin plugin, int pluginId, VirtualFurnaceAPI virtualFurnaceAPI) { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null!"); - } - this.plugin = plugin; - this.virtualFurnaceAPI = virtualFurnaceAPI; - this.pluginId = pluginId; - - // Get the config file - File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); - File configFile = new File(bStatsFolder, "config.yml"); - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Check if the config file exists - if (!config.isSet("serverUuid")) { - - // Add default values - config.addDefault("enabled", true); - // Every server gets it's unique random id. - config.addDefault("serverUuid", UUID.randomUUID().toString()); - // Should failed request be logged? - config.addDefault("logFailedRequests", false); - // Should the sent data be logged? - config.addDefault("logSentData", false); - // Should the response text be logged? - config.addDefault("logResponseStatusText", false); - - // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); - try { - config.save(configFile); - } catch (IOException ignored) { } - } - - // Load the data - enabled = config.getBoolean("enabled", true); - serverUUID = config.getString("serverUuid"); - logFailedRequests = config.getBoolean("logFailedRequests", false); - logSentData = config.getBoolean("logSentData", false); - logResponseStatusText = config.getBoolean("logResponseStatusText", false); - - if (enabled) { - boolean found = false; - // Search for all other bStats Metrics classes to see if we are the first one - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - found = true; // We aren't the first - break; - } catch (NoSuchFieldException ignored) { } - } - // Register our service - Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); - if (!found) { - // We are the first! - startSubmitting(); - } - } - } - - /** - * Checks if bStats is enabled. - * - * @return Whether bStats is enabled or not. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(CustomChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Chart cannot be null!"); - } - charts.add(chart); - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (!plugin.isEnabled()) { // Plugin was disabled - timer.cancel(); - return; - } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, () -> submitData()); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! - // WARNING: Just don't do it! - } - - /** - * Gets the plugin specific data. - * This method is called using Reflection. - * - * @return The plugin specific data. - */ - public JsonObject getPluginData() { - JsonObject data = new JsonObject(); - - String pluginName = "VirtualFurnaceAPI"; - String pluginVersion = virtualFurnaceAPI.getAPIVersion(); - - data.addProperty("pluginName", pluginName); // Append the name of the plugin - data.addProperty("id", pluginId); // Append the id of the plugin - data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin - JsonArray customCharts = new JsonArray(); - for (CustomChart customChart : charts) { - // Add the data of the custom charts - JsonObject chart = customChart.getRequestJsonObject(); - if (chart == null) { // If the chart is null, we skip it - continue; - } - customCharts.add(chart); - } - data.add("customCharts", customCharts); - - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JsonObject getServerData() { - // Minecraft specific data - int playerAmount; - try { - // Around MC 1.8 the return type was changed to a collection from an array, - // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (Exception e) { - playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed - } - int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; - String bukkitVersion = Bukkit.getVersion(); - String bukkitName = Bukkit.getName(); - - // OS/Java specific data - String javaVersion = System.getProperty("java.version"); - String osName = System.getProperty("os.name"); - String osArch = System.getProperty("os.arch"); - String osVersion = System.getProperty("os.version"); - int coreCount = Runtime.getRuntime().availableProcessors(); - - JsonObject data = new JsonObject(); - - data.addProperty("serverUUID", serverUUID); - - data.addProperty("playerAmount", playerAmount); - data.addProperty("onlineMode", onlineMode); - data.addProperty("bukkitVersion", bukkitVersion); - data.addProperty("bukkitName", bukkitName); - - data.addProperty("javaVersion", javaVersion); - data.addProperty("osName", osName); - data.addProperty("osArch", osArch); - data.addProperty("osVersion", osVersion); - data.addProperty("coreCount", coreCount); - - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JsonObject data = getServerData(); - - JsonArray pluginData = new JsonArray(); - // Search for all other bStats Metrics classes to get their plugin data - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - - for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { - try { - Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider()); - if (plugin instanceof JsonObject) { - pluginData.add((JsonObject) plugin); - } else { // old bstats version compatibility - try { - Class jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject"); - if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) { - Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString"); - jsonStringGetter.setAccessible(true); - String jsonString = (String) jsonStringGetter.invoke(plugin); - JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject(); - pluginData.add(object); - } - } catch (ClassNotFoundException e) { - // minecraft version 1.14+ - if (logFailedRequests) { - this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e); - } - } - } - } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { } - } - } catch (NoSuchFieldException ignored) { } - } - - data.add("plugins", pluginData); - - // Create a new thread for the connection to the bStats server - new Thread(() -> { - try { - // Send the data - sendData(plugin, data); - } catch (Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } - } - }).start(); - } - - /** - * Sends the data to the bStats server. - * - * @param plugin Any plugin. It's just used to get a logger instance. - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(Plugin plugin, JsonObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - if (logSentData) { - plugin.getLogger().info("Sending data to bStats: " + data); - } - HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { - outputStream.write(compressedData); - } - - StringBuilder builder = new StringBuilder(); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - } - - if (logResponseStatusText) { - plugin.getLogger().info("Sent data to bStats and received response: " + builder); - } - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - } - return outputStream.toByteArray(); - } - - /** - * Represents a custom chart. - */ - public static abstract class CustomChart { - - // The id of the chart - final String chartId; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - */ - CustomChart(String chartId) { - if (chartId == null || chartId.isEmpty()) { - throw new IllegalArgumentException("ChartId cannot be null or empty!"); - } - this.chartId = chartId; - } - - private JsonObject getRequestJsonObject() { - JsonObject chart = new JsonObject(); - chart.addProperty("chartId", chartId); - try { - JsonObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - chart.add("data", data); - } catch (Throwable t) { - if (logFailedRequests) { - Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); - } - return null; - } - return chart; - } - - protected abstract JsonObject getChartData() throws Exception; - - } - - /** - * Represents a custom simple pie. - */ - public static class SimplePie extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimplePie(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - } - - /** - * Represents a custom advanced pie. - */ - public static class AdvancedPie extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedPie(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom drilldown pie. - */ - public static class DrilldownPie extends CustomChart { - - private final Callable>> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public DrilldownPie(String chartId, Callable>> callable) { - super(chartId); - this.callable = callable; - } - - @Override - public JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (Map.Entry> entryValues : map.entrySet()) { - JsonObject value = new JsonObject(); - boolean allSkipped = true; - for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - value.addProperty(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - values.add(entryValues.getKey(), value); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom single line chart. - */ - public static class SingleLineChart extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SingleLineChart(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - - } - - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - JsonArray categoryValues = new JsonArray(); - categoryValues.add(new JsonPrimitive(entry.getValue())); - values.add(entry.getKey(), categoryValues); - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - JsonArray categoryValues = new JsonArray(); - for (int categoryValue : entry.getValue()) { - categoryValues.add(new JsonPrimitive(categoryValue)); - } - values.add(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - -} diff --git a/src/main/java/com/shanebeestudios/vf/api/VirtualFurnaceAPI.java b/src/main/java/com/shanebeestudios/vf/api/VirtualFurnaceAPI.java index b7a84fa..671e502 100644 --- a/src/main/java/com/shanebeestudios/vf/api/VirtualFurnaceAPI.java +++ b/src/main/java/com/shanebeestudios/vf/api/VirtualFurnaceAPI.java @@ -6,6 +6,7 @@ import com.shanebeestudios.vf.api.task.TileTick; import com.shanebeestudios.vf.api.tile.FurnaceTile; import com.shanebeestudios.vf.api.util.Util; +import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.plugin.Plugin; @@ -70,7 +71,7 @@ public VirtualFurnaceAPI(@NotNull JavaPlugin javaPlugin, boolean disableMetrics) return; } if (!disableMetrics) { - new Metrics(javaPlugin, 7021, this); + new Metrics(javaPlugin, 7021); } this.recipeManager = new RecipeManager(); this.furnaceManager = new FurnaceManager(this); diff --git a/src/main/java/com/shanebeestudios/vf/api/machine/Furnace.java b/src/main/java/com/shanebeestudios/vf/api/machine/Furnace.java index 48c41e1..e15682c 100644 --- a/src/main/java/com/shanebeestudios/vf/api/machine/Furnace.java +++ b/src/main/java/com/shanebeestudios/vf/api/machine/Furnace.java @@ -12,6 +12,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; @@ -29,11 +30,12 @@ * Virtual furnace object */ @SuppressWarnings("unused") +@SerializableAs("furnace") public class Furnace extends Machine implements PropertyHolder, ConfigurationSerializable { private final FurnaceProperties furnaceProperties; private final RecipeManager recipeManager; - private ItemStack fuel; + private ItemStack fuelItemStack; private ItemStack input; private ItemStack output; private int cookTime; @@ -72,7 +74,7 @@ public Furnace(String name, FurnaceProperties furnaceProperties) { this.cookTimeTotal = 0; this.fuelTime = 0; this.fuelTimeTotal = 0; - this.fuel = null; + this.fuelItemStack = null; this.input = null; this.output = null; this.inventory = Bukkit.createInventory(this, InventoryType.FURNACE, Util.getColString(name)); @@ -82,12 +84,12 @@ public Furnace(String name, FurnaceProperties furnaceProperties) { // Used for deserializer @SuppressWarnings("deprecation") // Paper deprecation for AdventureAPI - private Furnace(String name, UUID uuid, int cookTime, int fuelTime, float xp, ItemStack fuel, ItemStack input, ItemStack output, FurnaceProperties furnaceProperties) { + private Furnace(String name, UUID uuid, int cookTime, int fuelTime, float xp, ItemStack fuelItemStack, ItemStack input, ItemStack output, FurnaceProperties furnaceProperties) { super(uuid, name); this.recipeManager = VirtualFurnaceAPI.getInstance().getRecipeManager(); this.cookTime = cookTime; this.fuelTime = fuelTime; - this.fuel = fuel; + this.fuelItemStack = fuelItemStack; this.input = input; this.output = output; this.furnaceProperties = furnaceProperties; @@ -98,7 +100,7 @@ private Furnace(String name, UUID uuid, int cookTime, int fuelTime, float xp, It } else { this.cookTimeTotal = 0; } - Fuel fuelF = recipeManager.getFuelByMaterial(fuel != null ? fuel.getType() : null); + Fuel fuelF = recipeManager.getFuelByMaterial(fuelItemStack != null ? fuelItemStack.getType() : null); if (fuelF != null) { this.fuelTimeTotal = fuelF.getBurnTime(); } else { @@ -153,7 +155,7 @@ public FurnaceProperties getProperties() { * @return Current fuel */ public ItemStack getFuel() { - return fuel; + return fuelItemStack; } /** @@ -162,7 +164,7 @@ public ItemStack getFuel() { * @param fuel Fuel to set */ public void setFuel(ItemStack fuel) { - this.fuel = fuel; + this.fuelItemStack = fuel; } /** @@ -217,7 +219,7 @@ public void openInventory(Player player) { private void updateInventory() { this.inventory.setItem(0, this.input); - this.inventory.setItem(1, this.fuel); + this.inventory.setItem(1, this.fuelItemStack); this.inventory.setItem(2, this.output); } @@ -227,8 +229,8 @@ private void updateInventoryView() { this.input = input; } ItemStack fuel = this.inventory.getItem(1); - if (this.fuel != fuel) { - this.fuel = fuel; + if (this.fuelItemStack != fuel) { + this.fuelItemStack = fuel; } ItemStack output = this.inventory.getItem(2); if (this.output != output) { @@ -274,23 +276,23 @@ public void tick() { } private boolean canBurn() { - if (this.fuel == null) return false; - return this.recipeManager.getFuelByMaterial(this.fuel.getType()) != null; + if (this.fuelItemStack == null) return false; + return this.recipeManager.getFuelByMaterial(this.fuelItemStack.getType()) != null; } private void processBurn() { - Fuel fuel = this.recipeManager.getFuelByMaterial(this.fuel.getType()); + Fuel fuel = this.recipeManager.getFuelByMaterial(this.fuelItemStack.getType()); if (fuel == null) return; - FurnaceFuelBurnEvent event = new FurnaceFuelBurnEvent(this, this.fuel, fuel, fuel.getBurnTime()); + FurnaceFuelBurnEvent event = new FurnaceFuelBurnEvent(this, this.fuelItemStack, fuel, fuel.getBurnTime()); event.callEvent(); if (event.isCancelled()) { return; } - int fuelAmount = this.fuel.getAmount(); + int fuelAmount = this.fuelItemStack.getAmount(); if (fuelAmount > 1) { - this.fuel.setAmount(fuelAmount - 1); + this.fuelItemStack.setAmount(fuelAmount - 1); } else { - this.fuel = null; + this.fuelItemStack = null; } int burn = (int) (event.getBurnTime() / furnaceProperties.getFuelMultiplier()); this.fuelTime = burn; @@ -347,13 +349,13 @@ public boolean equals(Object o) { return cookTime == furnace.cookTime && cookTimeTotal == furnace.cookTimeTotal && fuelTime == furnace.fuelTime && fuelTimeTotal == furnace.fuelTimeTotal && Objects.equals(furnaceProperties, furnace.furnaceProperties) && Objects.equals(recipeManager, furnace.recipeManager) && - Objects.equals(fuel, furnace.fuel) && Objects.equals(input, furnace.input) && + Objects.equals(fuelItemStack, furnace.fuelItemStack) && Objects.equals(input, furnace.input) && Objects.equals(output, furnace.output) && Objects.equals(inventory, furnace.inventory); } @Override public int hashCode() { - return Objects.hash(furnaceProperties, recipeManager, fuel, input, output, cookTime, cookTimeTotal, fuelTime, fuelTimeTotal, inventory); + return Objects.hash(furnaceProperties, recipeManager, fuelItemStack, input, output, cookTime, cookTimeTotal, fuelTime, fuelTimeTotal, inventory); } @Override @@ -362,7 +364,7 @@ public String toString() { "name='" + getName() + '\'' + ", uuid=" + getUniqueID() + ", properties=" + furnaceProperties + - ", fuel=" + fuel + + ", fuel=" + fuelItemStack + ", input=" + input + ", output=" + output + ", cookTime=" + cookTime + @@ -386,7 +388,7 @@ public String toString() { result.put("cookTime", this.cookTime); result.put("fuelTime", this.fuelTime); result.put("xp", this.experience); - result.put("fuel", this.fuel); + result.put("fuel", this.fuelItemStack); result.put("input", this.input); result.put("output", this.output); return result; diff --git a/src/main/java/com/shanebeestudios/vf/api/property/FurnaceProperties.java b/src/main/java/com/shanebeestudios/vf/api/property/FurnaceProperties.java index 238c0ea..39d85f1 100644 --- a/src/main/java/com/shanebeestudios/vf/api/property/FurnaceProperties.java +++ b/src/main/java/com/shanebeestudios/vf/api/property/FurnaceProperties.java @@ -5,6 +5,7 @@ import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.configuration.serialization.SerializableAs; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; @@ -16,6 +17,7 @@ *

Used to manipulate the speed properties of a furnace

*/ @SuppressWarnings({"unused", "SameParameterValue"}) +@SerializableAs("furnace_properties") public class FurnaceProperties extends Properties implements Keyed, ConfigurationSerializable { /** diff --git a/src/main/java/com/shanebeestudios/vf/api/tile/FurnaceTile.java b/src/main/java/com/shanebeestudios/vf/api/tile/FurnaceTile.java index 6890467..de66ce9 100644 --- a/src/main/java/com/shanebeestudios/vf/api/tile/FurnaceTile.java +++ b/src/main/java/com/shanebeestudios/vf/api/tile/FurnaceTile.java @@ -6,6 +6,7 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.ExperienceOrb; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; @@ -19,6 +20,7 @@ * Represents a {@link Tile} that connects a tickable {@link Furnace} to a {@link Block} */ @SuppressWarnings("unused") +@SerializableAs("tile") public class FurnaceTile extends Tile implements ConfigurationSerializable { // TODO javadocs that point to TileManager for creation diff --git a/src/main/resources/VirtualFurnace.properties b/src/main/resources/VirtualFurnace.properties index 632bec2..85ee561 100644 --- a/src/main/resources/VirtualFurnace.properties +++ b/src/main/resources/VirtualFurnace.properties @@ -1,2 +1,2 @@ # VirtualFurnaceAPI Properties -api-version='@version@' +api-version='$version' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 641a1aa..9b6b67e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ main: com.shanebeestudios.vf.VirtualFurnace name: VirtualFurnace -version: '${project.version}' -api-version: '1.13' +version: '$version' +api-version: '$apiversion' author: ShaneBee commands: