HundiZockt
Minecrafter
Hey ich wollte ein eigenes report Plugin schreiben doch jedes mal wenn ich /report eigebe kommt ein internal Error hoffe ihr könnt mir helfen...
Caused by: java.lang.IndexOutOfBound***ception:0
// (Fehler)
at .... (ReportCommand.java:15)
// (.Java-Datei:Zeile)Danke für deine Hilfe aber ich hab es jetzt mal nach der Perm abfrage für notify gemacht funkt leider immer noch nicht...Bukkit.GetPlayer (Zeile 15) erwartet die Eingabe einer UUID oder eines Namens, es darf nicht 0/null sein. Da du keinen Spieler angegeben hast, sondern nur /report, entsteht dieser Fehler.
Eventuell kannst du es beheben in dem du target erst später setzt (nachdem du festgestellt hast, das ein Spieler angegeben wurde).
Das lässt sich auch aus der Fehlermeldung gut herauslesen:
Caused by: java.lang.IndexOutOfBound***ception:0
// (Fehler)
at .... (ReportCommand.java:15)
// (.Java-Datei:Zeile)
Guten Tag,
wie sieht dein Code denn jetzt aus? Einfach kurz als Code hier einfügen, dann erkennt man das Ganze auch besser als auf einem Bild. Kommt immernoch die gleiche Fehlermeldung? Das Problem ist ja nicht, dass du bei Bukkit.getPlayer(String name) null übergibst, sondern dass das Command-Agument args[0] garnicht existiert. Das heißt, dass du zuerst abfragen musst, ob args übergeben wurden und dann damit arbeitest.
Freundliche Grüße
BloodSKreaper
package de.hundizockt.report.commands;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ReportCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(sender instanceof Player) {
Player p = (Player) sender;
Player notify = (Player) Bukkit.getOnlinePlayers();
if(args.length == 1) {
p.sendMessage("§2§lDu hast erfolgreich den Spieler §6" + args[0] + " §2§lreportet!");
if(notify.hasPermission("report.notify")) {
Player target = Bukkit.getPlayer(args[0]);
notify.sendMessage("§8===========================");
notify.sendMessage("§8Reporter: §6" + p.getName());
notify.sendMessage("§8Reportet: §6" + args[0]);
notify.sendMessage("§8===========================");
}
} else {
p.sendMessage("§7Bitte benutze §6/report <Spieler>§7!");
}
}
return false;
}
}
Player notify = (Player) Bukkit.getOnlinePlayers();
Ja ein beispiel wäre sehr nett... ich programmiere noch nicht so langeGuten Tag,
wo genau kommt deine Fehlermeldung? Einfach nochmal die aktuelle hier rein kopieren bitte.
Was mir an deinem Code noch auffällt ist das hier:
Das kannst du so nicht machen. Du castest hier einfach eine Collection (siehe JavaDocs) zu einem Player, was offensichtlich nicht dasselbe ist. Du musst Bukkit.getOnlinePlayers() als Collection behandeln. Das heißt, dass du durch die Collection iterierst und für jeden Eintrag deine gewünschte Abfrage durchführen musst.Java:Player notify = (Player) Bukkit.getOnlinePlayers();
Wenn du willst kann ich dir den Code schnell als Beispiel schreiben.
Freundliche Grüße
BloodSKreaper
package de.hundizockt.report.commands;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ReportCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player))
return false; // Return false if command sender is no Player
Player p = (Player) sender;
if (args.length != 1) { // Return false if not exactly 1 argument is given
p.sendMessage("§7Bitte benutze §6/report <Spieler>§7!");
return false;
}
/*
* Wenn nur Spieler reportet werden sollen, die zum Zeitpunkt des Reports online sind, dann so
* wie unten
*/
// Player target = Bukkit.getPlayer(args[0]);
// if(target == null) { //Prüft, ob der Spieler mit dem gegebenen Namen existiert und online
// ist. Wenn nicht, dann "return false"
// p.sendMessage("Der Spieler "+args[0]+" existiert nicht!");
// return false;
// }
/*
* Wenn auch Spieler reported werden sollen, die möglicherweise offline sind, dann so wie unten:
* BEACHTE: Hiermit können auch Spieler reported werden, die noch nie online waren, oder
* garnicht existieren.
*/
OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);//
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (onlinePlayer.hasPermission("report.notify")) {
onlinePlayer.sendMessage("§8===========================");
onlinePlayer.sendMessage("§8Reporter: §6" + p.getName());
onlinePlayer.sendMessage("§8Reportet: §6" + target.getName());
onlinePlayer.sendMessage("§8===========================");
}
}
p.sendMessage("§2§lDu hast erfolgreich den Spieler §6" + args[0] + " §2§lreportet!");
return true;
}
}
OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);
Danke dafür werde es morgen sofort ausprobierenJava:package me.bloodskreaper.chat; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class ReportCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (!(sender instanceof Player)) return false; // Return false if command sender is no Player Player p = (Player) sender; if (args.length != 1) { // Return false if not exactly 1 argument is given p.sendMessage("§7Bitte benutze §6/report <Spieler>§7!"); return false; } /* * Wenn nur Spieler reportet werden sollen, die zum Zeitpunkt des Reports online sind, dann so * wie unten */ // Player target = Bukkit.getPlayer(args[0]); // if(target == null) { //Prüft, ob der Spieler mit dem gegebenen Namen existiert und online // ist. Wenn nicht, dann "return false" // p.sendMessage("Der Spieler "+args[0]+" existiert nicht!"); // return false; // } /* * Wenn auch Spieler reported werden sollen, die möglicherweise offline sind, dann so wie unten: * BEACHTE: Hiermit können auch Spieler reported werden, die noch nie online waren, oder * garnicht existieren. */ OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);// for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { if (onlinePlayer.hasPermission("report.notify")) { onlinePlayer.sendMessage("§8==========================="); onlinePlayer.sendMessage("§8Reporter: §6" + p.getName()); onlinePlayer.sendMessage("§8Reportet: §6" + target.getName()); onlinePlayer.sendMessage("§8==========================="); } } p.sendMessage("§2§lDu hast erfolgreich den Spieler §6" + args[0] + " §2§lreportet!"); return true; } }
Wenn du willst, dass nur Spieler reported werden können, die zum Zeitpunkt des Reports online sind, dann einfach bei den entsprechenden Linien die Schrägstriche entfernen und
löschen.Code:OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);
Solltest du Fragen haben, so zögere nicht diese zu stellen
Freundliche Grüße
BloodSKreaper
Hey BloodSKreaper wie kann ich den machen das man noch einen Grund hinzufügt?Java:package de.hundizockt.report.commands; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class ReportCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (!(sender instanceof Player)) return false; // Return false if command sender is no Player Player p = (Player) sender; if (args.length != 1) { // Return false if not exactly 1 argument is given p.sendMessage("§7Bitte benutze §6/report <Spieler>§7!"); return false; } /* * Wenn nur Spieler reportet werden sollen, die zum Zeitpunkt des Reports online sind, dann so * wie unten */ // Player target = Bukkit.getPlayer(args[0]); // if(target == null) { //Prüft, ob der Spieler mit dem gegebenen Namen existiert und online // ist. Wenn nicht, dann "return false" // p.sendMessage("Der Spieler "+args[0]+" existiert nicht!"); // return false; // } /* * Wenn auch Spieler reported werden sollen, die möglicherweise offline sind, dann so wie unten: * BEACHTE: Hiermit können auch Spieler reported werden, die noch nie online waren, oder * garnicht existieren. */ OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);// for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { if (onlinePlayer.hasPermission("report.notify")) { onlinePlayer.sendMessage("§8==========================="); onlinePlayer.sendMessage("§8Reporter: §6" + p.getName()); onlinePlayer.sendMessage("§8Reportet: §6" + target.getName()); onlinePlayer.sendMessage("§8==========================="); } } p.sendMessage("§2§lDu hast erfolgreich den Spieler §6" + args[0] + " §2§lreportet!"); return true; } }
Wenn du willst, dass nur Spieler reported werden können, die zum Zeitpunkt des Reports online sind, dann einfach bei den entsprechenden Linien die Schrägstriche entfernen und
löschen.Code:OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);
Solltest du Fragen haben, so zögere nicht diese zu stellen
Freundliche Grüße
BloodSKreaper
/report <SPIELERNAME> <GRUND MIT LEERZEICHEN>
package me.bloodskreaper.chat;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ReportCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player))
return false; // Return false if command executor is no Player
Player p = (Player) sender;
if (args.length < 2) { // Return false if fewer than 2 arguments are given
p.sendMessage("§7Bitte benutze §6/report <Spieler> <Grund>§7!");
return false;
}
/*
* Wenn nur Spieler reportet werden sollen, die zum Zeitpunkt des Reports online sind, dann so
* wie unten
*/
Player target = Bukkit.getPlayer(args[0]);
if (target == null) { // Prüft, ob der Spieler mit dem gegebenen Namen existiert und online ist.
// Wenn nicht, dann "return false"
p.sendMessage("Der Spieler " + args[0] + " ist nicht online!");
return false;
}
/*Code von SirYwell übernommen*/
String reason = args[1];
for (int i = 2; i < args.length; i++) {
reason += " " + args[i];
}
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (onlinePlayer.hasPermission("report.notify")) {
onlinePlayer.sendMessage("§8===========================");
onlinePlayer.sendMessage("§8Reporter: §6" + p.getName());
onlinePlayer.sendMessage("§8Reportet: §6" + target.getName());
onlinePlayer.sendMessage("§8Grund: §6" + reason);
onlinePlayer.sendMessage("§8===========================");
}
}
p.sendMessage("§2§lDu hast erfolgreich den Spieler §6" + args[0] + " §2§lfür '$6"+reason+"§2§l' reportet!");
return true;
}
}
Diese Stelle kann man noch ein wenig optimieren. Wir wissen ja bereits, dass mindestens ein Wort in dem Array enthalten ist, das unseren Grund darstellt. Also können wir auch sagen:Java:String reason = ""; for (int i = 1; i < args.length; i++) { reason = reason + " " + args[i]; } reason.trim(); //Das Leerzeichen am Satzanfang entfernen
String reason = args[1];
for (int i = 2; i < args.length; i++) {
reason += " " + args[i];
}
reason = reason.trim() stehen).