Selbstprogramiertes Plugin auf lokalen Server funktioniert nicht?
Ich habe ein Minecraft Plugin selbst programmiert aber jetzt wird diese Fehlermeldung angezeigt:
[08:53:05] [Server thread/ERROR]: Could not load 'plugins\EasyConvert+1.0.0.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Cannot find main class `easytrade.thepixel3261.easytrade.EasyTrade'
at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:69) ~[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:?]
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 net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:219) ~[spigot-1.20.1-R0.1-SNAPSHOT.jar:3871-Spigot-d2eba2c-3f9263b]
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:972) ~[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.ClassNotFoundException: easytrade.thepixel3261.easytrade.EasyTrade
at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:147) ~[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:?]
... 8 more
Als Server Software benutze ich Spigot. 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.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin {
@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;
}
ItemStack toItem = new ItemStack(toMaterial, amount);
// 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;
}
}
2 Antworten
Gesucht wird laut Fehlermeldung eine Klasse namens
easytrade.thepixel3261.easytrade.EasyTrade
Deine Klasse heißt aber offensichtlich
easytrade.thepixel3261.easytrade.Main
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.
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
Danke, hat geklappt aber der Command funktioniert nicht
inwiefern denn? erzielt er nicht das gewünschte Ergebnis oder kann er erst gar nicht ausgeführt werden?
Er kann erst gar nicht ausgeführt werden
Der Command wird nicht als gültiger command angezeigt
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]
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 {
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
Zur Autovervollständigung kannst du dir zum Beispiel das Video angucken: https://youtu.be/SNDjK5HKCmc
Du hast zuerst amount verdoppelt, und danach die Emeralds abgezogen. Du musst also bei fromItem amount/2 angeben.
Wenn ich das machen würde würde doch das gleiche auch andersherum sein, da ich keine andere Variable habe ob Kupfer oder Emerald?
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;
}
Ich meine hier:
ItemStack fromItem = new ItemStack(fromMaterial, amount);
Da machst du dann amount/2 bzw. amount*2
so?:
if toMaterial == Material.EMERALD
ItemStack toItem = new ItemStack(toMaterial, amount/2);
if toMaterial == Material.COPPER_INGOT
ItemStack toItem = new ItemStack(toMaterial, amount*2);
Ich habe das mit der Autovervollständigung genau so gemacht aber:
this.getCommand("convert").setTabCompleter(new Tab());
wird rot Unterstrichen
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);
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;
}
}
Du toItem innerhalb des if deklariert. Um das zu beheben, würde ich
ItemStack toItem = null;
vor die letzten beiden Bedingungen schreiben.
Du solltest den Command in einer extra Klasse anlegen und diesen dann nur in der Main Klasse beim Startup registrieren
Ja, das habe ich auch schon gesehen aber ich habe easytrade.thepixel3261.easytrade.EasyTrade nirgends angegeben