AdSense

Montag, 10. Juni 2013

Minecraft Server - Spielerposition herausfinden mit C#

(English version) Ich habe einen kleinen (privaten) Minecraft-Server am laufen. Da es notwendig wurde, habe ich begonnen, einen Karte zu programmieren, welche alle Spieler an ihren Positionen anzeigt.

Die Positionen sind auf derm Server unter /world/players/<name>.dat abgespeichert und werden etwa alle 45 Sekunden aktualisiert. Das ist zwar nicht sehr häufig aber für eine grobe Karte reicht das.

Um die .dat Dateien zu lesen benutze ich Library "LibNbt", https://github.com/aphistic/libnbt, da die Dateien nicht im Klartext abgespeichert werden. Nach dem Download entpackt man das Ganze einfach, bindet das LibNbt Projekt in das eigene C# Projekt ein und macht eine Referenz drauf, mehr ist da nicht zu tun.

Um dann schließlich die Positionen auszulesen gehe ich folgendermaßen vor:

DirectoryInfo d = new DirectoryInfo(@"world\players\");
var file = new NbtFile();
//Eine Datei, in welche die Positionen gespeichert werden
StreamWriter outFile = new StreamWriter("positions.dat");
string lines = "";
//Alle Spieler durchlaufen
foreach (var file1 in d.GetFiles("*.dat"))
{
    //Spieler-Datei laden
    file.LoadFile(d + file1.Name);
    NbtCompound root = file.RootTag;
    int i = 0;
    //Alle Tags durchlaufen, bis das Positions-Tag gefunden wird
    foreach (NbtTag tag in root.Tags)
    {
        if (tag.Name.Equals("Pos"))
        {
            NbtList posList = ((NbtList)root[i]);
            //Als string abspeichern
            lines += file1.Name.Substring(0,file1.Name.Length-4)

                                  + "\t"
                  + ((NbtDouble)posList[0]).Value
                                  + "\t"
                  + ((NbtDouble)posList[2]).Value
                                  + "\r\n";
        }
        i++;
    }

}
outFile.WriteLine(lines);
outFile.Close();

Um das alles auf einer Karte anzuzeigen habe ich mit dem Programm "AMIDST" einen Screenshot meiner Welt gemacht (von -4096, -3072 bis 4096, 3072) und rechnte die Spielerpositionen dann in Pixel um und male dann mit einem anderen Programm, welches nur zum Anzeigen da ist, Kreuze und Namen drauf.

Keine Kommentare:

Kommentar veröffentlichen