summaryrefslogtreecommitdiff
path: root/leveldat.go
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2013-11-06 23:15:51 +0100
committerKevin Chabowski <kevin@kch42.de>2013-11-06 23:15:51 +0100
commit291506b5ed49ffbefd9046a9c9f5a297f3e198ab (patch)
tree63060f6cf67f8bb0d45acc995a95dd0f516609d5 /leveldat.go
parent8150778cbdf2e2f72d300a548c669b07b6e98d0c (diff)
downloadbiomed-291506b5ed49ffbefd9046a9c9f5a297f3e198ab.tar.gz
biomed-291506b5ed49ffbefd9046a9c9f5a297f3e198ab.tar.bz2
biomed-291506b5ed49ffbefd9046a9c9f5a297f3e198ab.zip
Worlds are now opened by their level.dat and are centered properly.
The world spawn will be read from the level.dat and the view will be centered to that position.
Diffstat (limited to 'leveldat.go')
-rw-r--r--leveldat.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/leveldat.go b/leveldat.go
new file mode 100644
index 0000000..51344a8
--- /dev/null
+++ b/leveldat.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "github.com/kch42/gonbt/nbt"
+ "io"
+)
+
+func invalidLevelDat(err error) error {
+ return fmt.Errorf("Invalid level.dat: %s", err)
+}
+
+func getMapCenter(leveldat io.Reader) (int, int, error) {
+ lvl, _, err := nbt.ReadGzipdNamedTag(leveldat)
+ if err != nil {
+ return 0, 0, err
+ }
+
+ if lvl.Type != nbt.TAG_Compound {
+ return 0, 0, invalidLevelDat(errors.New("Root tag has wrong type"))
+ }
+ root := lvl.Payload.(nbt.TagCompound)
+
+ data, err := root.GetCompound("Data")
+ if err != nil {
+ return 0, 0, invalidLevelDat(err)
+ }
+
+ x, err := data.GetInt("SpawnX")
+ if err != nil {
+ return 0, 0, invalidLevelDat(err)
+ }
+
+ z, err := data.GetInt("SpawnZ")
+ if err != nil {
+ return 0, 0, invalidLevelDat(err)
+ }
+
+ return int(x), int(z), nil
+}