• 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!

Player target andersweitig abfragen.

Kraetzy

Redstoneengineer
Registriert
16 Dezember 2017
Beiträge
41
Alter
22
Diamanten
250
Minecraft
MinesuchtBOT
Hey,

Ich habe einen /me CMD programmiert, und muss für die Reichweite den Target abfragen nun bekomme ich allerdings ein Error, warum weiß ich, aber wie änder ich es?

Code:
@Override
    public boolean onCommand(CommandSender sender, Command arg1, String arg2, String[] args) {
       
        Player p = (Player) sender;
        Player t = Bukkit.getPlayer(args[0]);
        Location plocation = t.getLocation();
        int blockDistance = 20;
       
        if (args.length > 0) {
            if(p.getLocation().distance(plocation) <= blockDistance) {
               
                     String message = "";
                     for (int i = 0; i < args.length; i++) {
                         message += args[i] + " ";
                    }
    
                    for (Player near : Bukkit.getOnlinePlayers()) {
                        near.sendMessage("§7* " + p.getName() + "  §8» §c" + message);
    
                    }
                    }
                   
               
            }
       
       
        return false;
    }

Nun hatte ich die Idee "Player t = Bukkit.getPlayer(args[0]);" anders abzufragen, aber was kann ich statt args[0] nehmen?
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Wie @Figz schon erwähnte, solltest du einiges auf Richtigkeit überprüfen.
Wenn du nur /me eingibst, enthält dein args-Array keine Daten und es wird eine ArrayIndexOutOfBound***ception ausgelöst. mit <Array>.length kannst du die Länge eines Arrays abfragen. Damit args[0] existiert, muss also args.length >= 1 sein.

Des Weiteren musst du überprüfen, ob ein gültiger Spielername eingegeben wurde. Bukkit.getPlayer(string) gibt dir null zurück, falls kein Spieler mit diesem Namen gefunden wurde. Du solltest also vor einem Zugriff auf t überprüfen, ob t == null. Sonst wird bei t.getLocation() eine NullPointerException ausgelöst.

Beim Berechnen einer Distanz zweier Locations ist es außerdem wichtig, dass die Locations in der gleichen Welt sind. Auch hier kommt es sonst zur Ausnahme und dein Code wird nicht weiter asgeführt.

Falls ich deinen Code aber richtig interpretiere, möchtest du allen Spielern in einem bestimmten Radius eine Nachricht senden. Aktuell wird versucht, aus dem ersten (bzw nullten) Argument aus deinem Array der Spieler auszulesen. Wenn du in deiner Nachricht aber keinen Spieler als erstes Argument angibst, wird das nicht funktionieren. Falls man einen Spielernamen angibt, wird überprüft, ob dieser Spieler sich in einem bestimmten Radius zum CommandSender (auch der cast sollte erst überprüft werden) befindet. Wenn das der Fall ist, wird ALLEN Spielern die Nachricht gesendet, ansonsten KEINEM.

Was du also meiner Vermutung nach möchtest:

In der for-Schleife muss für jeden Spieler überprüft werden, ob er in der gleichen Welt wie der Sender ist und falls auch die Entfernung im möglichen Bereich liegt, wird ihm die Nachricht gesendet werden.

Andere Anmerkungen:

Die Location des Spielers t als plocation zu referenzieren ist äußerst ungeschickt, da man im weiteren Code eher vermuten würde, dass dies die Location des Spielers p ist. Bei Variablen sollte man sowieso nicht zu faul sein und lieber die Wörter ausschreiben, z.B. targetLocation.

Strings in einer for-Schleife über den "+"-Operator zu verbinden ist sehr ineffizient. Hier wäre die Anwendung eines StringBuilders eher angemessen.
 
Oben