Minecraft Spieleranzahl von Minecraft Server abfragen

Minecraft - Java Edition

Daaaaniel

Mitglied
Hallo,

ich würde gerne ein Java Programm schreiben, das von einem beliebigen Minecraft Server auslesen kann, ob der Server gerade online ist und wieviele Spieler gerade online sind.
Das Überprüfen ob der Server überhaupt online ist sollte nicht so schwierig sein, allerdings habe ich keine Ahnung wie das mit den Spielern funktionieren könnte.

Ich weiss aber, das es irgendwie möglich ist die Anzahl der Spieler auszulesen ohne auf dem Server zu spielen, weil dies in der Serverliste von Minecraft auch angezeigt wird.


Hat da jemand eine Idee oder hat schonmal so ein Programm geschrieben?
 
1. Gib den Thread-Namen bei Google ein
2. Nimm den zweiten Eintrag (da der erste hierhinführt)
3. Voila, du hast den benötigten Code in PHP - es sollte nicht weiter schwer sein, das nach Java zu portieren (falls wirklich nötig)
 
Mein letztes Plugin ist ne weile her, mit Bukkit sollte das aber ganz einfach sein:
http://wiki.bukkit.org/Plugin_Tutorial

Auf deiner implementierung von JavaPlugin .getServer aufrufen und auf dem Server dann z.B. getOnlinePlayers() aufrufen (liefert ein array mit allen Spielern zurück die Online sind - die Länge des Arrays ist dann logischerweise die Anzahl eingeloggter Spieler).

[EDIT]Lesen sollte man können - mit einem Bukkit-Plugin gehts logischerweise nur für den eigenen Server :rtfm:[/EDIT]

Gruß
 
Habe mal eine Klasse geschrieben!

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package minecrafttest;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author iDev!
 */
public class MinecraftServerInfo{
    
    private final String motd;
    private final int playersOnline;
    private final int maxPlayers;
    
    
    private MinecraftServerInfo(String motd, int playersOnline, int maxPlayers){
        this.motd = motd;
        this.playersOnline = playersOnline;
        this.maxPlayers = maxPlayers;
    }
    
    public static MinecraftServerInfo getServerInfo(String host, int port){
        try {
            Socket socket = new Socket(host, port); //Verbinden
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            
            out.write(0xFE); //Ping Anfrage
            
            byte[] answereBytes = new byte[256];
            in.read(answereBytes);
            
            byte[] newBytes = new byte[128];
            
            //Remove the other bytes
            int remove = 0;
            
            for(int i = 0; i < 128; i++){
                if((answereBytes[2*i] <= 0x1f && answereBytes[2*i] >= 0x00)){
                    remove++;
                }else{
                    newBytes[i-remove] = answereBytes[2*i];
                }
            }
            //End!
            
            String answere = new String(newBytes, "Cp1252");
            answere = answere.substring(1);
            
            if(answereBytes[0] == 0xFF) return null;
            
            String splitByte = String.valueOf((char)0xA7);
            String[] info = answere.split(splitByte);
            if(info.length != 3) return null;
            return new MinecraftServerInfo(info[0], new Integer(info[1].trim()), new Integer(info[2].trim()));
            
        } catch (UnknownHostException ex) {
            Logger.getLogger(MinecraftServerInfo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MinecraftServerInfo.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return null;
    }
    
    //GETTER!
    public String getMOTD(){
        return motd;
    }
    
    public Integer getOnlinePlayers(){
        return playersOnline;
    }
    
    public Integer getMaxPlayers(){
        return maxPlayers;
    }
    
    //ToString()-Override
    @Override
    public String toString(){
        return String.format("%s (%d/%d)", motd, playersOnline, maxPlayers);
    }
}

Sample-Usage:

Java:
MinecraftServerInfo info = MinecraftServerInfo.getServerInfo("MineTime.me",25565);
       if(info != null){
           System.out.println(info.toString());
       }else{
           System.out.println("ERROR!");
       }

Funktionen:

MinecraftServerInfo.getMOTD() => MOTD die ausgelesen wurde
MinecraftServerInfo.getOnlinePlayers() => Holt die Anzahl der derzeitigen Online-Spieler
MinecraftServerInfo.getMaxPlayers() => Holt die Anzahl der Spielerkapazität
MinecraftServerInfo.toString() => MOTD (onlinePlayer/maxPlayer)

MfG
 
hier zu fragen und auch zu updaten, wenn so wie gerade mit 4 Tage Abstand und nicht täglich, ist absolut legitim,
ich erlaube mir aber den Hinweis, dass du hier völlig an jedem Publikum vorbeiposten könntest,

wenn man mit einem Schraubenschlüssel XY Chrome 17™ an einem alten Ford Mustang schrauben möchte,
wäre es viel sinnvoller im Ford-Forum, als im Schraubenschlüssel- oder Werkzeug-Forum zu posten

hier wissen alle wie Schraubenschlüssel oder Java geht, wer aber nicht Ford oder Minecraft kennt wird kaum dessen Details extra untersuchen,

dagegen sollte in einem Minecraft-Forum Java als Standardtool ausreichend bekannt und dein Problem vielleicht alltäglich sein,
etwa
How to fix: Internal exception: java.net.SocketException: Connection reset - Minecraft Forum
(edit: wobei speziell dieser Thread vielleicht das Programm an sich betrifft, ganz ohne Programmierung,
wollte einen Thread herausziehen, als Forum-Bereich vielleicht eher
Modification Development - Minecraft Forum
usw.)
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben