Minecraft 1.18.2 spigot economy plugin coding

27 Views Asked by At

I get the error:

Caused by: java.lang.NoClassDefFoundError: net/milkbowl/vault/metrics/bukkit/Metrics$CustomChart

and its causing my plugin to fail to decompile.

full error code

Could not load 'plugins\EvadedEconomy-v1.2.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: net/milkbowl/vault/metrics/bukkit/Metrics$CustomChart
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:149) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:394) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:301) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.loadPlugins(CraftServer.java:407) ~[spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
        at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:232) ~[spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1007) ~[spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
        at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304) ~[spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
        at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.NoClassDefFoundError: net/milkbowl/vault/metrics/bukkit/Metrics$CustomChart
        at java.lang.Class.forName0(Native Method) ~[?:?]
        at java.lang.Class.forName(Class.java:488) ~[?:?]
        at java.lang.Class.forName(Class.java:467) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:67) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:145) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        ... 7 more
Caused by: java.lang.ClassNotFoundException: net.milkbowl.vault.metrics.bukkit.Metrics$CustomChart
        at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:147) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:99) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
        at java.lang.Class.forName0(Native Method) ~[?:?]
        at java.lang.Class.forName(Class.java:488) ~[?:?]
        at java.lang.Class.forName(Class.java:467) ~[?:?]
        at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:67) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:145) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        ... 7 more

Main class

package main.java.me.lmaoloq.evadedeco;

import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;

import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import main.java.me.lmaoloq.evadedeco.command.CommandManager;
import main.java.me.lmaoloq.evadedeco.model.BankAccount;
import main.java.me.lmaoloq.evadedeco.storage.BankStorage;
import main.java.me.lmaoloq.evadedeco.storage.FileStorage;
import main.java.me.lmaoloq.evadedeco.storage.sql.MySqlStorage;
import main.java.me.lmaoloq.evadedeco.storage.sql.SqLiteStorage;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.metrics.bukkit.Metrics;
import net.milkbowl.vault.metrics.bukkit.Metrics.SimplePie;

public class EvadedEco extends JavaPlugin {
    private BankStorage storage;

    private CompletableFuture<Void> checkUpdate() {
        CompletableFuture<Void> future = new CompletableFuture<>();
        getServer().getScheduler().runTaskAsynchronously(this, () -> {
            try {
                getLogger().info("Checking for updates...");

                URL url = new URL("https://api.spiget.org/v2/resources/81941/versions?size=1&page=1&sort=-releaseDate");
                URLConnection conn = url.openConnection();
                conn.setRequestProperty("User-Agent", "EvadedEco/UpdateChecker");

                InputStreamReader reader = new InputStreamReader(conn.getInputStream());
                JsonElement element = JSONParser.parseReader(reader);

                if (element.isJsonArray()) {
                    JsonObject result = element.getAsJsonArray().get(0).getAsJsonObject();
                    String version = result.get("name").getAsString();
                    
                    if (!version.equals(getDescription().getVersion())) {
                        getLogger().warning("Version " + version + " of EvadedEco is available. You are running version " + getDescription().getVersion());
                        getLogger().warning("Download here: " + getDescription().getWebsite());
                    } else {
                        getLogger().info("You are running the latest version (" + getDescription().getVersion() + ")");
                    }
                } else {
                    getLogger().severe("Failed to check for updates: Unexpected Result: " + element.toString());
                }
            } catch (Exception ex) {
                getLogger().log(Level.SEVERE, "Failed to check for updates", ex);
            } finally {
                future.complete(null);
            }
        });
        return future;
    }

    @Override
    public void onLoad() {
        saveDefaultConfig();

        String storageType = getConfig().getString("storage-type");
        switch (storageType.toLowerCase()) {
            case "sqlite":
                storage = new SqLiteStorage(this);
                break;
            case "mysql":
                storage = new MySqlStorage(this);
                break;
            case "flatfile":
                storage = new FileStorage(this);
                break;
            default:
                getLogger().warning("Invalid storage type: " + storageType);
                getLogger().warning("Using flatfile storage as fallback");
                storage = new FileStorage(this);
        }

        storage.getAccounts()
            .thenAccept(getBankManager()::loadAccounts)
            .exceptionally(ex -> {
                getLogger().log(Level.SEVERE, "Failed to load bank accounts", ex);
                getLogger().log(Level.SEVERE, "Plugin will be disabled");
                getServer().getPluginManager().disablePlugin(this);
                return null;
            });
    }

    @Override
    public void onEnable() {
        if (getServer().getPluginManager().isPluginEnabled("Vault")) {
            Economy economy = new VaultEconomy(this);
            getServer().getServicesManager().register(Economy.class, economy, this, ServicePriority.Normal);
        }

        CommandManager command = new CommandManager(this);
        getCommand("money").setExecutor(command);
        getCommand("money").setTabCompleter(command);

        Metrics metrics = new Metrics(this);
        metrics.addCustomChart(new SimplePie("storage_type", () -> getStorage().getTypeName()));
        metrics.addCustomChart(new SimplePie("multi_world", () ->
                getConfig().getBoolean("multi-world") ? "Enabled" : "Disabled"));

        checkUpdate();
    }

    public BankManager getBankManager() {
        return BankManager.get(this);
    }

    public String format(double balance) {
        int decimalPlaces = getConfig().getInt("formatting.decimal-places");
        String value = String.format("%,." + decimalPlaces + "f", balance);
        String format =  getConfig().getString("formatting.format");
        return format.replace("{value}", value).replace("{sign}", getConfig().getString("formatting.sign"));
    }

    public BankStorage getStorage() {
        return storage;
    }
}

I have tried changing from import org.json.simple.parser.ParseException; to import com.google.gson.JSONParser and that didn't fix the issue for me.

I need help with fixing the error. From what I can see the issue is to do with parseReader(InputStreamReader) not being defined in JSONParser but I'm not sure how to fix it. I have spent about 30 minutes trying to search around for a fix but can't seem to find one.

0

There are 0 best solutions below