Selbstprogramiertes Plugin auf lokalen Server funktioniert nicht?

2 Antworten

Gesucht wird laut Fehlermeldung eine Klasse namens

easytrade.thepixel3261.easytrade.EasyTrade

Deine Klasse heißt aber offensichtlich

easytrade.thepixel3261.easytrade.Main
thepixel3261 
Fragesteller
 04.11.2023, 09:27

Ja, das habe ich auch schon gesehen aber ich habe easytrade.thepixel3261.easytrade.EasyTrade nirgends angegeben

0
jo135  04.11.2023, 09:29
@thepixel3261

Dann gibt es vielleicht eine Konvention, nach der der gesuchte Name bestimmt wird, wenn nicht explizit konfiguriert. Finde das raus, oder benenn die Klasse einfach um.

0
thepixel3261 
Fragesteller
 04.11.2023, 09:41
@jo135

Ich habe die Klasse jetzt zu EasyTrade umbenannt aber jetzt kommt folgende Fehlermeldung:

[09:39:37] [Server thread/ERROR]: Could not load 'plugins\EasyConvert 1.0.1.jar' in folder 'plugins'

org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: easytrade/thepixel3261/easytrade/EasyTrade (wrong name: easytrade/thepixel3261/easytrade/Main)

    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:149) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:394) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:301) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.craftbukkit.v1_20_R1.CraftServer.loadPlugins(CraftServer.java:435) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at org.bukkit.craftbukkit.v1_20_R1.CraftServer.reload(CraftServer.java:966) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at org.bukkit.Bukkit.reload(Bukkit.java:833) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:27) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchCommand(CraftServer.java:877) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchServerCommand(CraftServer.java:862) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at net.minecraft.server.dedicated.DedicatedServer.bf(DedicatedServer.java:412) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:388) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1197) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1014) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:303) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]

    at java.lang.Thread.run(Thread.java:1583) ~[?:?]

Caused by: java.lang.NoClassDefFoundError: easytrade/thepixel3261/easytrade/EasyTrade (wrong name: easytrade/thepixel3261/easytrade/Main)

    at java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]

    at java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[?:?]

    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[?:?]

    at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:193) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at java.lang.ClassLoader.loadClass(ClassLoader.java:593) ~[?:?]

    at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:104) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:99) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]

    at java.lang.Class.forName0(Native Method) ~[?:?]

    at java.lang.Class.forName(Class.java:534) ~[?:?]

    at java.lang.Class.forName(Class.java:513) ~[?:?]

    at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:67) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:145) ~[spigot-api-1.20.1-R0.1-SNAPSHOT.jar:?]

    ... 15 more

0

Deine Main-Klasse heißt Main, in der plugin.yml hast du aber als Main-Klasse anscheinend

easytrade.thepixel3261.easytrade.EasyTrade

angegeben. Wenn du das zu Main änderst sollte das Problem behoben sein.

VG

Woher ich das weiß:eigene Erfahrung – Ich spiele Minecraft seit 2019.
thepixel3261 
Fragesteller
 04.11.2023, 09:50

Danke, hat geklappt aber der Command funktioniert nicht

0
finnian657  04.11.2023, 10:06
@thepixel3261

inwiefern denn? erzielt er nicht das gewünschte Ergebnis oder kann er erst gar nicht ausgeführt werden?

0
thepixel3261 
Fragesteller
 04.11.2023, 10:13
@thepixel3261

Wenn ich das eingebe: /convert copper 4 was mir eigentlich 2 Emeralds geben sollte

wird das angezeigt: Unknown or incomplete command, see below for error

convert copper 4<--[HERE]

0
finnian657  04.11.2023, 10:15
@thepixel3261

Du musst ihn in der plugin.yml angeben:

commands:
   convert:      
      description: "Konvertiert Items"

und ihn in der Main-Klasse registrieren:

getCommand("convert").setExecutor(new Main());

(am besten in der onEnable()-Methode)

Dazu muss deine Main aber auch noch das CommandExecutor Interface implementiert werden:

public class Main extends JavaPlugin implements
CommandExecutor {
0
thepixel3261 
Fragesteller
 04.11.2023, 10:26
@finnian657

Es funktioniert zwar allerdings wird als Auto-Vervollständigung nur mein Name angezeigt und 1 Kupfer entspricht nur einem Emerald und wenn ich /convert EMERALD 2 angebe werden mir 4 Emeralds abgezogen und 4 Kupfer hinzugefügt

0
thepixel3261 
Fragesteller
 04.11.2023, 10:46
@finnian657

Wenn ich das machen würde würde doch das gleiche auch andersherum sein, da ich keine andere Variable habe ob Kupfer oder Emerald?

0
thepixel3261 
Fragesteller
 04.11.2023, 10:57
@finnian657

Aber das habe ich doch hier angegeben:

if (fromMaterial == Material.COPPER_INGOT && amount >= 2) {
    toMaterial = Material.EMERALD;
    amount /= 2;
} else if (fromMaterial == Material.EMERALD && amount >= 1) {
    toMaterial = Material.COPPER_INGOT;
    amount *= 2;
} else {
    player.sendMessage("Invalid material specified or not enough items.");
    return true;
}
0
finnian657  04.11.2023, 10:58
@thepixel3261

Ich meine hier:

 ItemStack fromItem = new ItemStack(fromMaterial, amount);

Da machst du dann amount/2 bzw. amount*2

0
thepixel3261 
Fragesteller
 04.11.2023, 11:17
@finnian657

so?:

if toMaterial == Material.EMERALD
    ItemStack toItem = new ItemStack(toMaterial, amount/2);
if toMaterial == Material.COPPER_INGOT
ItemStack toItem = new ItemStack(toMaterial, amount*2);
0
thepixel3261 
Fragesteller
 04.11.2023, 12:02
@finnian657

Ich habe das mit der Autovervollständigung genau so gemacht aber:

this.getCommand("convert").setTabCompleter(new Tab());

wird rot Unterstrichen

0
thepixel3261 
Fragesteller
 04.11.2023, 12:24
@thepixel3261

Das ist der Code der Main.java Datei:

package easytrade.thepixel3261.easytrade;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements CommandExecutor {


    @Override
    public void onEnable() {
        getLogger().info("Plugin enabled!");
    }
    this.getCommand("convert")setTabCompleter(new Tab());

    @Override
    public void onDisable() {
        getLogger().info("Plugin disabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("convert")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage("Only players can use this command.");
                return true;
            }

            Player player = (Player) sender;

            if (args.length != 2) {
                player.sendMessage("Usage: /convert <material> <amount>");
                return true;
            }

            Material fromMaterial = Material.getMaterial(args[0].toUpperCase());
            int amount = Integer.parseInt(args[1]);

            if (fromMaterial == null) {
                player.sendMessage("Invalid material specified.");
                return true;
            }

            Material toMaterial = null;

            if (fromMaterial == Material.COPPER_INGOT && amount >= 2) {
                toMaterial = Material.EMERALD;
                amount /= 2;
            } else if (fromMaterial == Material.EMERALD && amount >= 1) {
                toMaterial = Material.COPPER_INGOT;
                amount *= 2;
            } else {
                player.sendMessage("Invalid material specified or not enough items.");
                return true;
            }

            ItemStack fromItem = new ItemStack(fromMaterial, amount);

            if (!player.getInventory().containsAtLeast(fromItem, amount)) {
                player.sendMessage("You do not have enough " + fromMaterial.toString().toLowerCase() + "s in your inventory.");
                return true;
            }

            if toMaterial == Material.EMERALD
                ItemStack toItem = new ItemStack(toMaterial, amount/2);
            if toMaterial == Material.COPPER_INGOT
            ItemStack toItem = new ItemStack(toMaterial, amount*2);

            // Remove the specified number of items from the player's inventory
            player.getInventory().removeItem(fromItem);

            // Add the converted items to the player's inventory
            player.getInventory().addItem(toItem);

            player.sendMessage("Successfully converted " + amount + " " + fromMaterial.toString().toLowerCase() + "s to " + amount + " " + toMaterial.toString().toLowerCase() + "s.");

            return true;
        }

        return false;
    }
}

Das sind die Stellen die rot Unterstrichen werden:

this.getCommand("convert")setTabCompleter(new Tab());

Hier nur

toMaterial == Material.EMERALD
if toMaterial == Material.COPPER_INGOT

und das 2.

toItem

von

if toMaterial == Material.EMERALD
    ItemStack toItem = new ItemStack(toMaterial, amount/2);
if toMaterial == Material.COPPER_INGOT
ItemStack toItem = new ItemStack(toMaterial, amount*2);
0
thepixel3261 
Fragesteller
 04.11.2023, 12:36
@thepixel3261

Ich habe es hinbekommen die Fehler zu entfernen, aber jetzt kommt die Fehlermeldung: "Symbol nicht gefunden :78" bei dem letzten toItem

das ist der Code:

package easytrade.thepixel3261.easytrade;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements CommandExecutor {


    @Override
    public void onEnable() {
        getLogger().info("Plugin enabled!");
    }

    @Override
    public void onDisable() {
        getLogger().info("Plugin disabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("convert")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage("Only players can use this command.");
                return true;
            }

            Player player = (Player) sender;

            if (args.length != 2) {
                player.sendMessage("Usage: /convert <material> <amount>");
                return true;
            }

            Material fromMaterial = Material.getMaterial(args[0].toUpperCase());
            int amount = Integer.parseInt(args[1]);

            if (fromMaterial == null) {
                player.sendMessage("Invalid material specified.");
                return true;
            }

            Material toMaterial = null;

            if (fromMaterial == Material.COPPER_INGOT && amount >= 2) {
                toMaterial = Material.EMERALD;
                amount /= 2;
            } else if (fromMaterial == Material.EMERALD && amount >= 1) {
                toMaterial = Material.COPPER_INGOT;
                amount *= 2;
            } else {
                player.sendMessage("Invalid material specified or not enough items.");
                return true;
            }

            ItemStack fromItem = new ItemStack(fromMaterial, amount);

            if (!player.getInventory().containsAtLeast(fromItem, amount)) {
                player.sendMessage("You do not have enough " + fromMaterial.toString().toLowerCase() + "s in your inventory.");
                return true;
            }

            if(toMaterial == Material.EMERALD) {
                ItemStack toItem = new ItemStack(toMaterial, amount/2);
            }
            if(toMaterial == Material.COPPER_INGOT) {
                ItemStack toItem = new ItemStack(toMaterial, amount*2);
            }

            // Remove the specified number of items from the player's inventory
            player.getInventory().removeItem(fromItem);

            // Add the converted items to the player's inventory
            player.getInventory().addItem(toItem);

            player.sendMessage("Successfully converted " + amount + " " + fromMaterial.toString().toLowerCase() + "s to " + amount + " " + toMaterial.toString().toLowerCase() + "s.");

            return true;
        }

        return false;
    }
}
0
finnian657  04.11.2023, 13:38
@thepixel3261

Du toItem innerhalb des if deklariert. Um das zu beheben, würde ich

ItemStack toItem = null;

vor die letzten beiden Bedingungen schreiben.

0
MeteryX  28.11.2023, 20:51
@thepixel3261

Du solltest den Command in einer extra Klasse anlegen und diesen dann nur in der Main Klasse beim Startup registrieren

0