Seite 1 von 1

Mit Bukkit alle Spieler von BungeeCord abfragen?

BeitragVerfasst: Sa 28. Mai 2016, 11:07
von Chriis
Hallöchen!

Ich bin derzeit an einem Lobbysystem und bin nun auf folgendes Problem gestoßen.
Ich möchte, dass auf dem Scoreboard die Spieler stehen die auf dem Netzwerk online sind (Alle die auf BungeeCord connecten).
Nun müsste ich gerne wie ich das genau machen sollte.

Ich könnte von jedem Server die Spieler abfangen (writeUTF) und diese dann addieren, das wäre aber bei mehr als 30 Servern ein wenig Arbeit und deshalb frage ich hier ob es denn nicht einfacher geht :D

Für weitere Fragen bin ich gerne offen!

LG
Chriis

Re: Mit Bukkit alle Spieler von BungeeCord abfragen?

BeitragVerfasst: Sa 28. Mai 2016, 13:02
von monst12
Hey,

das lässt sich sehr einfach mit den Plugin Messages zwischen eben einem Server und dem BungeeCord lösen. Dafür bräuchtest du einfach in deinem Lobby-System einen Listener, der auf ankommende Nachrichten vom BungeeCord wartet.
So aber auch andersherum ein BungeeCord Plugin, das fähig ist auf eine eigene Abfrage eine Antwort zu schicken. Hier wird ebenfalls ein Listener im BC-Plugin eingesetzt, der auf Nachrichten aus der Lobby wartet und bei ankommender Anfrage diese bearbeitet und ggf. eine Antwort sendet. Dazu gibt es hier ein gutes Tutorial.
Dann kannst du in dem BungeeCord Listener mittels der ProxiedPlayer-Liste alle auf dem Proxy verbundenen Spieler ermitteln und die Zahl als Antwort zurücksenden.
Zudem empfehle ich noch dich mit der Frage zu befassen, wann letztendlich ein Update der Spielerzahlen nötig ist. (Beim Join, Beim Leave, Alle X Sekunden, .?.)

Re: Mit Bukkit alle Spieler von BungeeCord abfragen?

BeitragVerfasst: Di 12. Jul 2016, 09:02
von DevToLearn
Verwende einfach diese Methode um die maximalen Server-Slots zu bekommen:
Code: Alles auswählen
  1. @SuppressWarnings("resource")
  2.    public static int getMaxServerSlots(String IP, int port) {
  3.       int maxPlayers = -1;
  4.       try {
  5.          Socket sock = new Socket(IP, port);
  6.          
  7.          DataOutputStream out = new DataOutputStream(sock.getOutputStream());
  8.          DataInputStream in = new DataInputStream(sock.getInputStream());
  9.          
  10.          out.write(0xFE);
  11.          
  12.          int b;
  13.          StringBuffer str = new StringBuffer();
  14.          while ((b = in.read()) != -1) {
  15.             if (b != 0 && b > 16 && b != 255 && b != 23 && b != 24) {
  16.                str.append((char) b);            
  17.             }
  18.          }
  19.          String[] data = str.toString().split("§");
  20.          
  21.          maxPlayers = Integer.parseInt(data[2]);
  22.       } catch (UnknownHostException e) {
  23.          return -1;
  24.       } catch (IOException e1) {
  25.          return -1;
  26.       }
  27.       return maxPlayers;
  28.    }


Und diese Methode um der online Spieler zu bekommen:
Code: Alles auswählen
  1.    @SuppressWarnings("resource")
  2.    public static int getOnlinePlayers(String IP, int port) {
  3.       int onlinePlayers = -1;
  4.       try {
  5.          Socket sock = new Socket(IP, port);
  6.          
  7.          DataOutputStream out = new DataOutputStream(sock.getOutputStream());
  8.          DataInputStream in = new DataInputStream(sock.getInputStream());
  9.          
  10.          out.write(0xFE);
  11.          
  12.          int b;
  13.          StringBuffer str = new StringBuffer();
  14.          while ((b = in.read()) != -1) {
  15.             if (b != 0 && b > 16 && b != 255 && b != 23 && b != 24) {
  16.                str.append((char) b);
  17.             }
  18.          }
  19.          
  20.          String[] data = str.toString().split("§");         
  21.          
  22.          onlinePlayers = Integer.parseInt(data[1]);
  23.       } catch (UnknownHostException e) {
  24.          return -1;
  25.       } catch (IOException e1) {
  26.          return -1;
  27.       }
  28.       
  29.       return onlinePlayers;
  30.    }