mirror of
https://github.com/neocturne/MinedMap.git
synced 2025-03-04 17:23:33 +01:00
Add Tag print functions and nbtdump tool
This commit is contained in:
parent
64f81ff50c
commit
4b9bb2ab48
16 changed files with 186 additions and 1 deletions
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2015, Matthias Schiffer <mschiffer@universe-factory.net>
|
Copyright (c) 2015-2018, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -17,3 +17,11 @@ add_executable(MinedMap
|
||||||
)
|
)
|
||||||
set_target_properties(MinedMap PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall")
|
set_target_properties(MinedMap PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall")
|
||||||
target_link_libraries(MinedMap ${ZLIB_LIBRARIES} ${PNG_LIBRARIES})
|
target_link_libraries(MinedMap ${ZLIB_LIBRARIES} ${PNG_LIBRARIES})
|
||||||
|
|
||||||
|
add_executable(nbtdump
|
||||||
|
nbtdump.cpp
|
||||||
|
GZip.cpp
|
||||||
|
NBT/Tag.cpp
|
||||||
|
)
|
||||||
|
set_target_properties(nbtdump PROPERTIES COMPILE_FLAGS "-std=c++11 -Wall")
|
||||||
|
target_link_libraries(nbtdump ${ZLIB_LIBRARIES})
|
||||||
|
|
|
@ -51,6 +51,24 @@ public:
|
||||||
return Type::ByteArray;
|
return Type::ByteArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &indent) const {
|
||||||
|
os << "(" << len << ") [" << std::endl;
|
||||||
|
|
||||||
|
std::string inner = indent + " ";
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
uint8_t v = value[i];
|
||||||
|
|
||||||
|
os << inner
|
||||||
|
<< (unsigned)v << " / "
|
||||||
|
<< (int)(int8_t)v << " / "
|
||||||
|
<< std::hex << "0x" << (unsigned)v << std::dec
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << indent << "]";
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t getLength() const {
|
uint32_t getLength() const {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,12 @@ public:
|
||||||
return Type::Byte;
|
return Type::Byte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
os << (unsigned)getValue() << " / "
|
||||||
|
<< (int)(int8_t)getValue() << " / "
|
||||||
|
<< std::hex << "0x" << (unsigned)getValue() << std::dec;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t getValue() const {
|
uint8_t getValue() const {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,20 @@ public:
|
||||||
return Type::Compound;
|
return Type::Compound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &indent) const {
|
||||||
|
os << "{" << std::endl;
|
||||||
|
|
||||||
|
std::string inner = indent + " ";
|
||||||
|
|
||||||
|
for (const auto &item : *this) {
|
||||||
|
os << inner << item.first << ": " << item.second->getType() << " ";
|
||||||
|
item.second->print(os, inner);
|
||||||
|
os << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << indent << "}";
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T> std::shared_ptr<const T> get(const std::string &key) const {
|
template<typename T> std::shared_ptr<const T> get(const std::string &key) const {
|
||||||
auto it = find(key);
|
auto it = find(key);
|
||||||
if (it == end())
|
if (it == end())
|
||||||
|
|
|
@ -46,6 +46,16 @@ public:
|
||||||
virtual Type getType() const {
|
virtual Type getType() const {
|
||||||
return Type::Double;
|
return Type::Double;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
union {
|
||||||
|
uint64_t i;
|
||||||
|
double d;
|
||||||
|
};
|
||||||
|
|
||||||
|
i = Buffer::parse64(ptr);
|
||||||
|
os << d;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,9 @@ public:
|
||||||
virtual Type getType() const {
|
virtual Type getType() const {
|
||||||
return Type::End;
|
return Type::End;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream&, const std::string &) const {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,16 @@ public:
|
||||||
virtual Type getType() const {
|
virtual Type getType() const {
|
||||||
return Type::Float;
|
return Type::Float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
union {
|
||||||
|
uint32_t i;
|
||||||
|
float f;
|
||||||
|
};
|
||||||
|
|
||||||
|
i = Buffer::parse32(ptr);
|
||||||
|
os << f;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,24 @@ public:
|
||||||
virtual Type getType() const {
|
virtual Type getType() const {
|
||||||
return Type::IntArray;
|
return Type::IntArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &indent) const {
|
||||||
|
os << "(" << len << ") [" << std::endl;
|
||||||
|
|
||||||
|
std::string inner = indent + " ";
|
||||||
|
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
uint32_t v = Buffer::parse32(&ptr[4*i]);
|
||||||
|
|
||||||
|
os << inner
|
||||||
|
<< v << " / "
|
||||||
|
<< (int32_t)v << " / "
|
||||||
|
<< std::hex << "0x" << v << std::dec
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << indent << "]";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,12 @@ public:
|
||||||
return Type::Int;
|
return Type::Int;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
os << getValue() << " / "
|
||||||
|
<< (int32_t)getValue() << " / "
|
||||||
|
<< std::hex << "0x" << getValue() << std::dec;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t getValue() const {
|
uint32_t getValue() const {
|
||||||
return Buffer::parse32(ptr);
|
return Buffer::parse32(ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,20 @@ public:
|
||||||
virtual Type getSubtype() const {
|
virtual Type getSubtype() const {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &indent) const {
|
||||||
|
os << getSubtype() << " [" << std::endl;
|
||||||
|
|
||||||
|
std::string inner = indent + " ";
|
||||||
|
|
||||||
|
for (const auto &item : *this) {
|
||||||
|
os << inner;
|
||||||
|
item->print(os, inner);
|
||||||
|
os << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << indent << "]";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,12 @@ public:
|
||||||
return Type::Long;
|
return Type::Long;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
os << getValue() << " / "
|
||||||
|
<< (int64_t)getValue() << " / "
|
||||||
|
<< std::hex << "0x" << getValue() << std::dec;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t getValue() const {
|
uint64_t getValue() const {
|
||||||
return Buffer::parse64(ptr);
|
return Buffer::parse64(ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,12 @@ public:
|
||||||
return Type::Short;
|
return Type::Short;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
os << getValue() << " / "
|
||||||
|
<< (int16_t)getValue() << " / "
|
||||||
|
<< std::hex << "0x" << getValue() << std::dec;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t getValue() const {
|
uint16_t getValue() const {
|
||||||
return Buffer::parse16(ptr);
|
return Buffer::parse16(ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,10 @@ public:
|
||||||
virtual Type getType() const {
|
virtual Type getType() const {
|
||||||
return Type::String;
|
return Type::String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void print(std::ostream& os, const std::string &) const {
|
||||||
|
os << "\"" << std::string(reinterpret_cast<const char *>(ptr), len) << "\"";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,11 +60,18 @@ public:
|
||||||
static std::pair<std::string, std::shared_ptr<const Tag>> readNamedTag(Buffer *buffer);
|
static std::pair<std::string, std::shared_ptr<const Tag>> readNamedTag(Buffer *buffer);
|
||||||
|
|
||||||
virtual Type getType() const = 0;
|
virtual Type getType() const = 0;
|
||||||
|
virtual void print(std::ostream& os, const std::string &indent) const = 0;
|
||||||
|
|
||||||
virtual ~Tag() {}
|
virtual ~Tag() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, Tag::Type type);
|
std::ostream& operator<<(std::ostream& os, Tag::Type type);
|
||||||
|
|
||||||
|
static inline std::ostream& operator<<(std::ostream& os, const Tag &tag) {
|
||||||
|
os << tag.getType() << " ";
|
||||||
|
tag.print(os, "");
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
55
src/nbtdump.cpp
Normal file
55
src/nbtdump.cpp
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2018, 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 "Buffer.hpp"
|
||||||
|
#include "GZip.hpp"
|
||||||
|
#include "Util.hpp"
|
||||||
|
#include "NBT/Tag.hpp"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
using namespace MinedMap;
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
std::fprintf(stderr, "Usage: %s <nbtfile>\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t> buffer = readGZip(argv[1]);
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
||||||
|
std::cout << *tag.second << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue