# game-server GUI erstellen



## Chloroplast (11. Jul 2011)

ich habe vor eine GUI für ein game-server (Minecraft, kennt vielleicht jemand  ) zu erstellen. ich habe nur keine Ahnung wie ein applet, oder frame mit dem programm kommuniezieren soll. bitte um möglichst unkompliezierte Lösung. (hab bei google und co schon geguckt. entweder da gibts nichts, oder ich bin einfach zu blöd :rtfm


----------



## HoaX (11. Jul 2011)

Unkomplizierteste Lösung: Lass es sein und fang mit was kleinerem an, dem du auch gewachsen bist.


----------



## ARadauer (12. Jul 2011)

Bietet Minecraft eine API zum Steuern an? 
Ich würde mich eher an ein Minecraft Forum wenden...


----------



## Chloroplast (12. Jul 2011)

> Bietet Minecraft eine API zum Steuern an?


glaub schon,  

API ist doch das hier:


----------



## Kr0e (12. Jul 2011)

Was genau meisnt du mit GUI ? Minecraft - Server hat ja bereits ne GUI, bzw ein Fenster wo Konsole drin und mit Speicherverbracuh etc... 

Willste dann quasi eine GUI machen, mit Buttons und allem drum und dran ?


----------



## ARadauer (12. Jul 2011)

mit der Runtime Klasse kannst du Przesse starten, davon lesen und kommandos hinschicken. schau dir das mal an... ist aber nicht einfach...


----------



## GladstoneGander (13. Jul 2011)

Ich habe soetwas für Minecraft auch mal gemacht. Bin dabei den von ARadauer beschriebenen Weg gegangen: Einen Prozess aus meiner Java-Anwendung gestartet (sozusagen den Minecraft Serverstart gewrapt), per Inputstream Befehle gesendet und den Outputstream ausgewertet.

Ich wollte damals eine Chatfunktion per Website mit Minecraft entwickeln. Aufgefallen war mir, dass nicht alles auf dem Outputstream ankommt was ich haben wollte, sondern viel Output auch auf dem Errorstream landet (nur als Hinweis). Im Endeffekt habe ich die Entwicklung eingestellt, weil die Möglichkeiten nur über Konsole bezüglich Serversteuerung halt sehr begrenzt sind.

Was für dich interessant sein könnte ist Craftbukkit. Einfach mal googlen. Damit kannst du Plugins in Java für Minecraft schreiben.


----------



## Tomate_Salat (13. Jul 2011)

Wenn du Befehle per InputStream gesendet hast, wundert es mich nicht, dass das ganze nicht funktioniert hat ;-).


----------



## ARadauer (13. Jul 2011)

> per Inputstream Befehle gesendet und den Outputstream ausgewertet.


Du musst dich als eigene Gegenstelle sehen. Input ist das was bei dir rein kommt, und output ist das was bei dir raus geht.
Befehle output, input auswerten...


----------



## TheDarkRose (13. Jul 2011)

ARadauer hat gesagt.:


> Du musst dich als eigene Gegenstelle sehen. Input ist das was bei dir rein kommt, und output ist das was bei dir raus geht
> Befehle output, input auswerten...



Ja, wenn man sich als gegenstelle sieht. Aber wenn man sich die Stream vom Process holt, dann bleibt der InputStream der Input in den man die Befehle schiebt und der OutputStream und ErrorStream sind die Ausgaben vom Process


----------



## Tomate_Salat (13. Jul 2011)

Zeig mir mal, wie du Befehle in einen InputStream schreibst. Und ein Konstrukt wie:

```
public class MyInputStream extends OutputStream {
```
zählt nicht ;-).


----------



## GladstoneGander (13. Jul 2011)

leute leute, ich habe da oben etwas durcheinander gebracht. befehle werden natürlich an den outputstream geschrieben. der errorstream ist ja auch ein inputstream...

für den thread-ersteller mal meine damaligen experimente. läuft auch mit dem aktuellen mc-server (1.7.3). vielleicht hilft das ja weiter:


```
package de.meijr.minecraftservletwrapper;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;

public class Main {

    public static void main(final String[] args) {
        MinecraftWrapper wrapper = null;
        try {
            wrapper = new MinecraftWrapper();
            final HttpServer server = HttpServer.create(
                    new InetSocketAddress(8080), 10);
            server.createContext("/info", wrapper);
            server.setExecutor(null); // creates a default executor
            server.start();
        } catch (final IOException ex) {
            ex.printStackTrace();
            wrapper.shutdown();
        }
    }
}
```


```
package de.meijr.minecraftservletwrapper;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class MinecraftWrapper implements HttpHandler {

    private final String sep = File.separator;
    private final String cmd = "java -jar %s nogui -Xms256M -Xmx512M";
    private final String serverDir = "e:" + sep + "minecraft" + sep;
    private final String serverJar = "minecraft_server.jar";
    private Process process = null;
    private volatile boolean receivePlayerList = false;
    private final List<String> dataList = new ArrayList<String>();

    public MinecraftWrapper() throws IOException {
        startServer();
    }

    public void startServer() throws IOException {
        process = Runtime.getRuntime().exec(
                String.format(cmd, serverJar));
        new StreamReaderThread(process.getErrorStream(),
                new ReaderListener() {

                    @Override
                    public void dataAvailable(final String data) {
                        System.out.println("ERR: " + data);
                        if (receivePlayerList) {
                            dataList.add(data);
                        }
                    }
                }).start();
        new StreamReaderThread(process.getInputStream(),
                new ReaderListener() {

                    @Override
                    public void dataAvailable(final String data) {
                        System.out.println("INP: " + data);
                        if (receivePlayerList) {
                            dataList.add(data);
                        }
                    }
                }).start();
    }

    public List<String> getPlayerList() {
        final List<String> playerList = new ArrayList<String>();
        if (process != null) {
            receivePlayerList = true;
            final BufferedOutputStream out =
                    (BufferedOutputStream) process.getOutputStream();
            try {
                final String command = "list\n";
                out.write(command.getBytes());
                out.flush();
            } catch (final IOException ex) {
                ex.printStackTrace();
            }

            // wait some time
            try {
                Thread.sleep(250);
            } catch (final InterruptedException ex) {
            }
            receivePlayerList = false;
            playerList.addAll(dataList);
            dataList.clear();
        }
        return playerList;
    }

    @Override
    public void handle(final HttpExchange t) throws IOException {
        final List<String> playerList = getPlayerList();
        final StringBuilder sb = new StringBuilder();
        sb.append("<html><title>Spielerliste</title>");
        if (playerList.isEmpty()) {
            sb.append("<body><center>Keine Spieler verbunden</center></body>");
        } else {
            sb.append("<body><lu>");
            for (final String player : playerList) {
                sb.append("<li>");
                sb.append(player);
            }
            sb.append("</lu></body>");
        }
        sb.append("</html>");

        t.sendResponseHeaders(200, sb.toString().length());
        OutputStream os = t.getResponseBody();
        os.write(sb.toString().getBytes());
        os.close();
    }

    public void shutdown() {
        process.destroy();
    }
}
```


```
package de.meijr.minecraftservletwrapper;

public interface ReaderListener {

    public void dataAvailable(final String data);
}
```


```
package de.meijr.minecraftservletwrapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamReaderThread extends Thread {

    private final ReaderListener listener;
    private final BufferedReader reader;

    public StreamReaderThread(final InputStream inputStream,
            final ReaderListener listener) {
        this.listener = listener;
        reader = new BufferedReader(new InputStreamReader(inputStream));
    }

    @Override
    public void run() {
        try {
            while (true) {
                try {
                    if (reader.ready()) {
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            listener.dataAvailable(line);
                        }
                    }
                } catch (final IOException ex) {
                    ex.printStackTrace();
                }
                sleep(250);
            }
        } catch (final InterruptedException ex) {
            closeStream();
        }
    }

    private void closeStream() {
        if (reader != null) {
            closeStream(reader);
        }
    }

    public static void closeStream(final BufferedReader reader) {
//        try {
//            reader.close();
//        } catch (final IOException ex) {
//            ex.printStackTrace();
//        }
    }
}
```

du musst natürlich in der MinecraftWrapper die "serverJar" mit pfad zum mc-server versehen. wenn der wrapper gestartet wurde, kannst du mit einem browser auf http://localhst:8080/info das ergebnis sehen (eine auflistung der gerade angemeldeten spieler).

sollte als anfang ja reichen. aber wie bereits im vorherigen post erwähnt: google mal nach craftbukkit.


----------



## Chloroplast (2. Sep 2012)

ok, ich seh jetzt (viel später) das hier dochnoch was gepostet wurde 

ok, ich präzisiere, es ist ein bukkitserver, und dieser hat nicht wie der normale, keine GUI. ich wollte diese (mit buttons etc) selber schreiben


----------



## Devil0s (2. Sep 2012)

Du kannst dich ja mal mit dem Programmierer von diesem Programm in Verbindung setzten.
Ich denke er hat so ziemlich das gemacht, was du machen willst.

The bukkit GUI project - Bukkit


----------

