The players' positions are saved on the server in the directory /world/players/<name>.dat and will be refreshed every 45 seconds. This is not very much but ok for a coarse map.
To read the .dat files, I use the library "LibNbt", https://github.com/aphistic/libnbt, because of the files being saved in binary format and not as plain text. After the download, simply extract everything and include the LibNbp projct into the own C# project and add a reference.
The code to read the position is the following:
DirectoryInfo d = new DirectoryInfo(@"world\players\");var file = new NbtFile();//A file in which the positions are savedStreamWriter outFile = new StreamWriter("positions.dat");string lines = "";//run through all playersforeach (var file1 in d.GetFiles("*.dat")){ //load player file file.LoadFile(d + file1.Name); NbtCompound root = file.RootTag; int i = 0; //run through all tags until the Pos tag is found foreach (NbtTag tag in root.Tags) { if (tag.Name.Equals("Pos")) { NbtList posList = ((NbtList)root[i]);
//save as string
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();To show everything on a map, I used the program "AMIDST" for making a screenshot of my world (from -4096, -3072 to 4096, 3072). After that I calculate the players' positions in pixel and paint them on the map with another program which is only used for displaying.
No comments:
Post a Comment