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

Bungeecord [Error: NullPointerException] Check for Player (PostLoginEvent) if the database is containing his UUID

D

deleted191575

Guest
Hallo Liebe MineCraft-Server.eu - Community,
ich habe heute wieder einmal ein Problem jedoch geht es heute nicht um Spigot / Bukkit, heute geht es einen Schritt weiter nämlich BUNGEECORD für mich ist BungeeCord nicht wirklich etwas neues aber ich habe eben noch nie mit BungeeCord programmiert. Mein Gedanke war: "Ich will heute ein Bann-System schreiben". Bis jetzt lief eigentlich alles rund aber (immer dieses ***** aber) JETZT ! wollte ich eigentlich mit dem Check bzw. der If Abfrage beginnen ob der Spieler (ProxiedPlayer pp) mit seiner UniqueID schon registiert (gebannt) ist. Übrigends ich arbeite hier mit MYSQL. Mein Abfrage + Code findet ihr dann im Anhang.

(Ban Command)
Java:
package net.brutalverzockt.proxy.cmds;

import java.sql.ResultSet;
import java.sql.SQLException;

import net.brutalverzockt.proxy.main.MySQL;
import net.brutalverzockt.proxy.main.Utils;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;

public class Ban_cmd extends Command {

    public Ban_cmd(String name) {
        super(name);
    }
    
    public boolean isBanned(String[] args) {
        ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
        ResultSet rs = MySQL.getResult("SELECT * FROM BannedPlayers WHERE BannedPlayer='" + target.getUniqueId().toString() + "'");
        try {
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    
    }

    @SuppressWarnings("deprecation")
    @Override
    public void execute(CommandSender sender, String[] args) {
        if(sender instanceof ProxiedPlayer) {
            ProxiedPlayer pp = (ProxiedPlayer) sender;
            if(pp.hasPermission("system.ban")) {
                if(args.length >= 2) {
                    ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
                    
                    String reason = "";
                    for(int i = 1 ; i < args.length ; i++) {
                        reason += (args[i]);
                    }
                    
                    MySQL.update("INSERT INTO BannedPlayers (BannedPlayer, BannedFrom ,Reason) VALUES ('" + target.getUniqueId().toString() + "','" + pp.getUniqueId().toString() + "','" + reason + "')");
                    target.disconnect(Utils.prefix + "Du wurdest von §6" + pp.getDisplayName() + " §7wegen ' §f" + reason + " §7' gebannt §4§l!");
                    pp.sendMessage(Utils.prefix + "Du hast §6" + target.getDisplayName() + " §aerfolgreich §7gebannt für den §cGrund§8§l: §7' §f" + reason + " §7'");
                    
                } else
                    pp.sendMessage(Utils.usage + "/ban §8<§6Spieler§8> <§cGrund§8>");
            } else
                pp.sendMessage(Utils.noperm);
        } else
            sender.sendMessage(Utils.noplayer);
    }
}

(PlayerJoinListener / PostLoginListener)
Java:
package net.brutalverzockt.proxy.listener;

import java.sql.ResultSet;
import java.sql.SQLException;

import net.brutalverzockt.proxy.main.MySQL;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;

public final class PlayerJoinListener implements Listener {

    
    @SuppressWarnings("deprecation")
    @EventHandler
    public void onPostLogin(PostLoginEvent e) {
        ProxiedPlayer pp = e.getPlayer();
        
        if(MySQL.getResult("SELECT * FROM BannedPlayers WHERE BannedPlayer='" + pp.getUniqueId().toString() + "'") != null) {
            pp.disconnect(getReason(pp.getUniqueId().toString()));
        }
    }
    
    public String getReason(String UUID) {
        ProxiedPlayer pp = ProxyServer.getInstance().getPlayer(UUID);
        ResultSet rs = MySQL.getResult("SELECT * FROM BannedPlayers WHERE BannedPlayer='" + pp.getUniqueId().toString() + "'");
        try {
            while(rs.next()) {
                return rs.getString("Reason");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return Utils.prefix + "Es ist ein §4Fehler §7aufgetreten §4!";
    }
    
}

Ich hoffe ihr könnt mir helfen, ich bedanke mich jetzt schon einmal im voraus für eure Beiträge.
 

PSandro

Kuhfänger
Registriert
7 November 2016
Beiträge
51
Diamanten
302
Hallo @BrutalVerzockt !

Aus deinem Satz lässt sich mir nicht schließen, was genau nicht funktioniert. Ist die Klasse denn als Listener registriert? Wenn ja, kannst du mal versuchen, in der if-Anweisung der onPostLogin Methode eine Debug Nachricht vor und nach dem Disconnect zu senden.

Folgenden Teil verstehe ich nicht. Warum übergibts du nicht gleich die UUID als Parameter?
Java:
public String getReason(String UUID) {
        ProxiedPlayer pp = ProxyServer.getInstance().getPlayer(UUID);
        ResultSet rs = MySQL.getResult("SELECT * FROM BannedPlayers WHERE BannedPlayer='" + pp.getUniqueId().toString() + "'");

Grundsätzlich wäre es doch auch effizienter, das Result aus der if-Anweisung der onPostLogin Methode gleich auch dazu zu verwenden, den "Reason" herauszufinden, anstatt einfach nochmal einen Anfrage an die DB zu schicken.

Zitat aus dem Chat:
❤️可愛い❤️ schrieb:
Ich hab aber auch geschrieben, dass du den Stacktrace reinpacken sollst

Besten Gruß,
Sandro

Edit: Ein Lob von mir für den final Operator der PlayerJoinListener Klasse. Man sieht nicht mehr viele final-Fans heutzutage... :3
 
Zuletzt bearbeitet:

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Bei einem BungeeCord-Befehl kann man die Permission direkt beim Aufruf des super-Konstruktors angeben. Spieler ohne die Permission können den Befehl dann erst gar nicht ausführen.

Ganz wichtig ist es, mit PreparedStatements zu arbeiten. Hierbei werden die Parameter getrennt angegeben und sind nicht direkt Teil der SQL-Abfrage. Dein Befehl verwendet Benutzereingaben. Auch wenn dieser nur von Admins aufgerufen wird, sollte man soetwas erst gar nicht angewöhnen.

Verwende besser das LoginEvent, das kannst du dann direkt abbrechen und die Kicknachricht mit event.setCancelReason() setzen.
 
Oben