diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-02 18:33:21 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2015-02-02 18:33:21 +0100 |
commit | 34857eabbcaea2344fe7912f96fbd7f854c37e1b (patch) | |
tree | 9603f90b3cba412b2d0de321b7cbc8e6c4012fd4 /src | |
parent | db59b7385621a271684c3be5f20618d74e631dda (diff) | |
download | MinedMap-34857eabbcaea2344fe7912f96fbd7f854c37e1b.tar MinedMap-34857eabbcaea2344fe7912f96fbd7f854c37e1b.zip |
Add spawn coordinates
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/GZip.cpp | 65 | ||||
-rw-r--r-- | src/GZip.hpp | 37 | ||||
-rw-r--r-- | src/Info.cpp | 6 | ||||
-rw-r--r-- | src/Info.hpp | 9 | ||||
-rw-r--r-- | src/MinedMap.cpp | 10 | ||||
-rw-r--r-- | src/World/Level.cpp | 58 | ||||
-rw-r--r-- | src/World/Level.hpp | 49 |
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; +}; + +} +} |