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 
Beitragsersteller
 04.11.2023, 09:27

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

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.

thepixel3261 
Beitragsersteller
 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

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 
Beitragsersteller
 04.11.2023, 09:50

Danke, hat geklappt aber der Command funktioniert nicht

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?

thepixel3261 
Beitragsersteller
 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]

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 {
thepixel3261 
Beitragsersteller
 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

thepixel3261 
Beitragsersteller
 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?

thepixel3261 
Beitragsersteller
 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;
}
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

thepixel3261 
Beitragsersteller
 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);
thepixel3261 
Beitragsersteller
 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

thepixel3261 
Beitragsersteller
 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);
thepixel3261 
Beitragsersteller
 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;
    }
}
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.

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