• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Bukkit Runable Fehler

SchnellfeuerXD

Kuhfänger
Registriert
8 Februar 2020
Beiträge
56
Diamanten
300
Hallo ich habe einen komischen Fehler bei einem Startkick Plugin. Ich glaube es liegt irgendwie am runnable.


package de.grafplaiz.startkick.commands;

import de.grafplaiz.startkick.Startkick;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.ArrayList;


public class startkick implements CommandExecutor {

public static boolean aktiv = false;
public static int ja = 0;
public static int nein = 0;

public static int COUNTDOWN_TIME = 30;

public static ArrayList<Player> alreadyvoted = new ArrayList<>();

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
if(sender instanceof Player) {
if(command.getName().equalsIgnoreCase("startkick")) {
if(player.hasPermission("grafplaiz.startkick")) {
if(args.length == 0) {
player.sendMessage("Bitte Verwende /startkick [Spieler] [Grund]");
}else if(args.length == 1) {
Player target = Bukkit.getPlayerExact(args[0]);
if(target == null) {
player.sendMessage("Der Spieler "+args[0]+" ist nicht online.");
} else {
player.sendMessage("Bitte Verwende /startkick [Spieler] [Grund]");
}
}else if (args.length == 2) {
Player target = Bukkit.getPlayerExact(args[0]);
String grund = args[1];
if(target == null) {
player.sendMessage("Der Spieler "+args[0]+" ist nicht online.");
} else if (grund == null) {
player.sendMessage("Du musst einen Grund angeben.");
} else {
Bukkit.broadcastMessage("Soll der Spieler "+target.getName()+" für den Grund "+grund+" vom " +
"Server gekickt werden? Du hast 30 Sekunden zeit um abzustimmen!");
aktiv = true;

new BukkitRunnable() {

@Override
public void run() {

if(ja > nein) {
target.kickPlayer("§c§lDu wurdest gekickt!");
Bukkit.broadcastMessage("Der Spieler wurde erfolgreich gekick!");
Bukkit.broadcastMessage("Es haben "+ja+" Spieler für Ja und "+nein+" Spieler für nein gestimmt.");
} else if (ja < nein) {
Bukkit.broadcastMessage("Der Spieler wurde NICHT gekick!");
Bukkit.broadcastMessage("Es haben "+ja+" Spieler für Ja und "+nein+" Spieler für nein gestimmt.");
} else {
Bukkit.broadcastMessage("Der Spieler wurde NICHT gekick!");
Bukkit.broadcastMessage("Es haben "+ja+" Spieler für Ja und "+nein+" Spieler für nein gestimmt.");
}

aktiv = false;
ja = 0;
nein = 0;
alreadyvoted.clear();

}
}.runTaskLater(Startkick.getInstance(), 20*COUNTDOWN_TIME);
}
}
} else {
player.sendMessage("Dazu hast du keine Rechte!");
}
} else if (command.getName().equalsIgnoreCase("ja")) {
if(aktiv) {
if(!alreadyvoted.contains(player)) {
ja++;
player.sendMessage("Du hast für ja gevotet.");
alreadyvoted.add(player);
} else {
player.sendMessage("§cDu hast bereits gevotet.");
}
} else {
player.sendMessage("§cDerzeit findet kein StartKick statt.");
}
} else if (command.getName().equalsIgnoreCase("nein")) {
if(aktiv) {
if(!alreadyvoted.contains(player)) {
nein++;
player.sendMessage("Du hast für nein gevotet.");
alreadyvoted.add(player);
} else {
player.sendMessage("§cDu hast bereits gevotet.");
}
} else {
player.sendMessage("§cDerzeit findet kein StartKick statt.");
}
}
}
return false;
}
}

package de.grafplaiz.startkick;

import de.grafplaiz.startkick.commands.startkick;
import org.bukkit.plugin.java.JavaPlugin;

public final class Startkick extends JavaPlugin {

public static Startkick Instance;

public static Startkick getInstance() {
return Instance;
}

@Override
public void onEnable() {
getCommand("startkick").setExecutor(new startkick());
getCommand("ja").setExecutor(new startkick());
getCommand("nein").setExecutor(new startkick());
}

@Override
public void onDisable() {
// Plugin shutdown logic
}
}

Der Fehler:

org.bukkit.command.CommandException: Unhandled exception executing command 'startkick' in plugin Startkick v1.0-SNAPSHOT
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:711) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1657) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1497) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(SourceFile:144) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(SourceFile:118) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:918) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:911) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:895) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:828) [spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.IllegalArgumentException: Plugin cannot be null
at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftScheduler.validate(CraftScheduler.java:443) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftScheduler.runTaskTimer(CraftScheduler.java:176) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftScheduler.runTaskTimer(CraftScheduler.java:167) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftScheduler.runTaskLater(CraftScheduler.java:131) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at org.bukkit.scheduler.BukkitRunnable.runTaskLater(BukkitRunnable.java:79) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
at de.grafplaiz.startkick.commands.startkick.onCommand(startkick.java:74) ~[?:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[spigot-1.15.2.jar:git-Spigot-800b93f-8160e29]
... 17 more
 

Luki_xx

Schafhirte
Registriert
12 Juni 2019
Beiträge
107
Diamanten
378
Minecraft
Luki_xx
Nein hast du nicht. Das eine ist eine Variablen-Deklaration und mit der Methode gibst du die Variable zurück. Allerdings ist die Variable "Instance" die ganze Zeit über null.

Versuche es mal im OnEnable mit Instance= this zu setzen. Kann allerdings grade gar nicht sagen ob das tatsächlich so funktioniert.
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
public static Main getInstance() {
Woher kommt denn da der Klassenname "Main"?

Ich finde es gut, dass du hier anderen helfen möchtest, aber ich glaube nicht, dass deine Code-Schnipsel wirklich hilfreich sind. Zum einen scheint es mir, dass du selbst nicht sonderlich erfahren bist und somit einzelne unschöne Anfängerfehler mit in deine Lösungen einbringst. Zum anderen helfen fertige Lösungen dem Fragesteller nicht, weil es normalerweise um Verständnisfragen geht. Das Präsentieren von Lösungen führt doch nur dazu, dass der Fragesteller Copy-Pasted und beim nächsten Problem wieder hier auf der Matte steht und nichts gelernt hat.
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
1. Der Code-Schnipsel ist alles was er braucht um das in seine Mainklasse anzugeben
Für diesen Fall stimmt das vielleicht. Wenn aber der Fragensteller dann ein anderes Problem hat, kann er eben genau diese Lösung nicht kopieren und muss uns wieder fragen. Sinn von solchen Hilfen hier ist doch gerade nicht, dass man für den anderen das Plugin fertig schreibt, sondern dass der andere versteht, was passiert.
2. Der Code-Schnipsel ist von meinem Plugin copy and past but geändert, da kann man dann eben mal was vergessen.
Da stimm ich dir zu. Ich werfe dir das auch nicht vor, das kann jeden mal passieren.
3. Wenn jemand fragt warum das nicht klappt aber auch keine Lösung hat und nur Kommentare wie dein scheiß da, muss man wohl doch zur Lösung im schriftlichen teil gehen wa?
Die Lösung wurde von @LapisMC schon nahezu perfekt beschrieben. Dabei hat @LapisMC genau das gemacht, was für ein Lernprozess wichtig ist: Die Ursache des Problems erklärt und dem Fragesteller Hintergrundinformationen geliefert, womit er das Problem selbstständig lösen kann. Eine fertige Lösung bringt wie oben erwähnt beim Lernprozess wenig.
4. Du hast keine Ahnung wie ich drauf bin und was mein Wissenstand ist aber kannst ja trotzdem jemanden schlecht reden und selber keine Lösung bieten.
Ich möchte dich nicht schlecht reden. Es ist ja sehr schön, dass du anderen Personen helfen möchtest, diese Antworten sollten dann aber auch mehr als nur Code-Schnippsel sein. Du scheinst bei den Code-Schnippsel zudem nicht unbedingt wissen, was du tust.
zum Beispiel ist "public static StartKick instance" public, obwohl es private sein sollte. Den Getter kannst du dir sonst auch schenken, da du ohne getter auf die Variable zugreifen kannst.

Auch wenn du das ungerne zu hören scheinst, Halbwissen weiter verbreiten bringt hier niemanden etwas.
Ich empfehle dir zudem diesen Wiki-Artikel, der passt irgendwie.
5. Das Geben einer Lösung ist das eine, was der gegenüber damit anfängt ist dann was anderes oder!
Die Frage ist nicht, ob man eine Lösung gibt, sondern wie man diese präsentiert, damit der andere auch versteht, was sein Problem war.
 
Oben