summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-02-02 18:33:21 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-02-02 18:33:21 +0100
commit34857eabbcaea2344fe7912f96fbd7f854c37e1b (patch)
tree9603f90b3cba412b2d0de321b7cbc8e6c4012fd4
parentdb59b7385621a271684c3be5f20618d74e631dda (diff)
downloadMinedMap-34857eabbcaea2344fe7912f96fbd7f854c37e1b.tar
MinedMap-34857eabbcaea2344fe7912f96fbd7f854c37e1b.zip
Add spawn coordinates
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/GZip.cpp65
-rw-r--r--src/GZip.hpp37
-rw-r--r--src/Info.cpp6
-rw-r--r--src/Info.hpp9
-rw-r--r--src/MinedMap.cpp10
-rw-r--r--src/World/Level.cpp58
-rw-r--r--src/World/Level.hpp49
8 files changed, 231 insertions, 5 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d6492d9..6241e27 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,12 +3,14 @@ link_directories(${ZLIB_LIBRARY_DIRS} ${LIBPNG_LIBRARY_DIRS})
add_executable(MinedMap
MinedMap.cpp
+ GZip.cpp
Info.cpp
NBT/Tag.cpp
Resource/Biome.cpp
Resource/BlockType.cpp
World/Block.cpp
World/Chunk.cpp
+ World/Level.cpp
World/Region.cpp
)
set_target_properties(MinedMap PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall ${ZLIB_CFLAGS_OTHER} ${LIBPNG_CFLAGS_OTHER}")
diff --git a/src/GZip.cpp b/src/GZip.cpp
new file mode 100644
index 0000000..626ef81
--- /dev/null
+++ b/src/GZip.cpp
@@ -0,0 +1,65 @@
+/*
+ Copyright (c) 2015, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "GZip.hpp"
+
+#include <system_error>
+#include <stdexcept>
+#include <zlib.h>
+
+
+namespace MinedMap {
+
+std::vector<uint8_t> readGZip(const char *filename) {
+ std::vector<uint8_t> buffer;
+ size_t len = 0;
+
+ gzFile f = gzopen(filename, "rb");
+ if (!f)
+ throw std::system_error(errno, std::generic_category(), "unable to open GZip file");
+
+ while (true) {
+ if ((buffer.size() - len) < 4096)
+ buffer.resize(buffer.size() + 4096);
+
+ int r = gzread(f, buffer.data()+len, buffer.size()-len);
+ if (r < 0)
+ throw std::system_error(errno, std::generic_category(), "error reading GZip file");
+
+ if (!r)
+ break;
+
+ len += r;
+ }
+
+ gzclose_r(f);
+
+ buffer.resize(len);
+
+ return std::move(buffer);
+}
+
+}
diff --git a/src/GZip.hpp b/src/GZip.hpp
new file mode 100644
index 0000000..8505039
--- /dev/null
+++ b/src/GZip.hpp
@@ -0,0 +1,37 @@
+/*
+ Copyright (c) 2015, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#pragma once
+
+#include <cstdint>
+#include <vector>
+
+
+namespace MinedMap {
+
+std::vector<uint8_t> readGZip(const char *filename);
+
+}
diff --git a/src/Info.cpp b/src/Info.cpp
index 7b411f7..530d6b2 100644
--- a/src/Info.cpp
+++ b/src/Info.cpp
@@ -68,7 +68,11 @@ void Info::writeJSON(const char *filename) {
fprintf(f, "]\n");
}
- fprintf(f, " ]\n");
+ fprintf(f, " ],\n");
+ fprintf(f, " \"spawn\" : {\n");
+ fprintf(f, " \"x\" : %li,\n", (long)spawnX);
+ fprintf(f, " \"z\" : %li\n", (long)spawnZ);
+ fprintf(f, " }\n");
fprintf(f, "}\n");
fclose(f);
diff --git a/src/Info.hpp b/src/Info.hpp
index 6f69c56..478e858 100644
--- a/src/Info.hpp
+++ b/src/Info.hpp
@@ -29,6 +29,7 @@
#include <climits>
#include <cstdint>
#include <set>
+#include <tuple>
#include <utility>
@@ -39,8 +40,10 @@ private:
std::set<std::pair<int, int>> regions;
int minX, maxX, minZ, maxZ;
+ int32_t spawnX, spawnZ;
+
public:
- Info() : minX(INT_MAX), maxX(INT_MIN), minZ(INT_MAX), maxZ(INT_MIN) {}
+ Info() : minX(INT_MAX), maxX(INT_MIN), minZ(INT_MAX), maxZ(INT_MIN), spawnX(0), spawnZ(0) {}
void addRegion(int x, int z) {
regions.insert(std::make_pair(x, z));
@@ -51,6 +54,10 @@ public:
if (z > maxZ) maxZ = z;
}
+ void setSpawn(const std::pair<int32_t, int32_t> &v) {
+ std::tie(spawnX, spawnZ) = v;
+ }
+
void writeJSON(const char *filename);
};
diff --git a/src/MinedMap.cpp b/src/MinedMap.cpp
index 8997104..3374637 100644
--- a/src/MinedMap.cpp
+++ b/src/MinedMap.cpp
@@ -25,6 +25,7 @@
#include "Info.hpp"
+#include "World/Level.hpp"
#include "World/Region.hpp"
#include <cerrno>
@@ -160,11 +161,11 @@ int main(int argc, char *argv[]) {
}
std::string inputdir(argv[1]);
- inputdir += "/region";
+ std::string regiondir = inputdir + "/region";
std::string outputdir(argv[2]);
- DIR *dir = opendir(inputdir.c_str());
+ DIR *dir = opendir(regiondir.c_str());
if (!dir) {
std::fprintf(stderr, "Unable to read input directory: %s\n", std::strerror(errno));
return 1;
@@ -181,11 +182,14 @@ int main(int argc, char *argv[]) {
info.addRegion(x, z);
std::string name(entry->d_name);
- doRegion(inputdir + "/" + name, outputdir + "/" + name.substr(0, name.length()-3) + "png");
+ doRegion(regiondir + "/" + name, outputdir + "/" + name.substr(0, name.length()-3) + "png");
}
closedir(dir);
+ World::Level level((inputdir + "/level.dat").c_str());
+ info.setSpawn(level.getSpawn());
+
info.writeJSON((outputdir + "/info.json").c_str());
return 0;
diff --git a/src/World/Level.cpp b/src/World/Level.cpp
new file mode 100644
index 0000000..8cd396e
--- /dev/null
+++ b/src/World/Level.cpp
@@ -0,0 +1,58 @@
+/*
+ Copyright (c) 2015, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include "Level.hpp"
+#include "../GZip.hpp"
+#include "../Util.hpp"
+#include "../NBT/IntTag.hpp"
+
+#include <iostream>
+
+
+namespace MinedMap {
+namespace World {
+
+Level::Level(const char *filename) {
+ std::vector<uint8_t> buffer = readGZip(filename);
+
+ Buffer nbt(buffer.data(), buffer.size());
+ std::pair<std::string, std::shared_ptr<const NBT::Tag>> tag = NBT::Tag::readNamedTag(&nbt);
+ if (tag.first != "")
+ throw std::invalid_argument("invalid root tag");
+
+ root = assertValue(std::dynamic_pointer_cast<const NBT::CompoundTag>(tag.second));
+ data = assertValue(root->get<NBT::CompoundTag>("Data"));
+}
+
+std::pair<int32_t, int32_t> Level::getSpawn() const {
+ int32_t x = assertValue(data->get<NBT::IntTag>("SpawnX"))->getValue();
+ int32_t z = assertValue(data->get<NBT::IntTag>("SpawnZ"))->getValue();
+
+ return std::make_pair(x, z);
+}
+
+}
+}
diff --git a/src/World/Level.hpp b/src/World/Level.hpp
new file mode 100644
index 0000000..6cdfc4e
--- /dev/null
+++ b/src/World/Level.hpp
@@ -0,0 +1,49 @@
+/*
+ Copyright (c) 2015, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#pragma once
+
+#include "../NBT/CompoundTag.hpp"
+
+#include <cstdint>
+
+
+namespace MinedMap {
+namespace World {
+
+class Level {
+private:
+ std::shared_ptr<const NBT::CompoundTag> root;
+ std::shared_ptr<const NBT::CompoundTag> data;
+
+public:
+ Level(const char *filename);
+
+ std::pair<int32_t, int32_t> getSpawn() const;
+};
+
+}
+}