5 using namespace Internal;
32 if constexpr (std::is_same_v<T, TagEnd>)
36 else if constexpr (std::is_same_v<T, TagByte>)
40 else if constexpr (std::is_same_v<T, TagShort>)
44 else if constexpr (std::is_same_v<T, TagInt>)
48 else if constexpr (std::is_same_v<T, TagLong>)
52 else if constexpr (std::is_same_v<T, TagFloat>)
56 else if constexpr (std::is_same_v<T, TagDouble>)
60 else if constexpr (std::is_same_v<T, TagByteArray>)
62 return "TagByteArray";
64 else if constexpr (std::is_same_v<T, TagString>)
68 else if constexpr (std::is_same_v<T, TagList>)
72 else if constexpr (std::is_same_v<T, TagCompound>)
76 else if constexpr (std::is_same_v<T, TagIntArray>)
80 else if constexpr (std::is_same_v<T, TagLongArray>)
82 return "TagLongArray";
96 const TagType type =
static_cast<TagType>(ReadData<char>(iter, length));
104#if PROTOCOL_VERSION < 764
116 val = ReadData<char>(iter, length);
119 val = ReadData<short>(iter, length);
122 val = ReadData<int>(iter, length);
125 val = ReadData<long long int>(iter, length);
128 val = ReadData<float>(iter, length);
131 val = ReadData<double>(iter, length);
135 val = ReadData<Vector<char, int>>(iter, length);
141 val = ReadData<TagList>(iter, length);
144 val = ReadData<TagCompound>(iter, length);
148 val = ReadData<Vector<int, int>>(iter, length);
152 val = ReadData<Vector<long long int, int>>(iter, length);
161 WriteData<char>(
static_cast<char>(
val.index()), container);
163 if (std::holds_alternative<TagEnd>(
val))
168#if PROTOCOL_VERSION < 764
173 std::visit([&](
auto&& arg)
175 using T = std::decay_t<
decltype(arg)>;
177 if constexpr (std::is_same_v<T, TagEnd>)
181 else if constexpr (std::is_same_v<T, TagByteArray>)
184 WriteData<Vector<char, int>>(arg, container);
186 else if constexpr (std::is_same_v<T, TagString>)
190 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagList>>)
192 WriteData<TagList>(arg.get(), container);
194 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagCompound>>)
196 WriteData<TagCompound>(arg.get(), container);
198 else if constexpr (std::is_same_v<T, TagIntArray>)
201 WriteData<Vector<int, int>>(arg, container);
203 else if constexpr (std::is_same_v<T, TagLongArray>)
206 WriteData<Vector<long long int, int>>(arg, container);
210 WriteData<T>(arg, container);
217 const TagType type =
static_cast<TagType>(ReadData<char>(iter, length));
233 val = ReadData<char>(iter, length);
236 val = ReadData<short>(iter, length);
239 val = ReadData<int>(iter, length);
242 val = ReadData<long long int>(iter, length);
245 val = ReadData<float>(iter, length);
248 val = ReadData<double>(iter, length);
252 val = ReadData<Vector<char, int>>(iter, length);
258 val = ReadData<TagList>(iter, length);
261 val = ReadData<TagCompound>(iter, length);
265 val = ReadData<Vector<int, int>>(iter, length);
269 val = ReadData<Vector<long long int, int>>(iter, length);
278 WriteData<char>(
static_cast<char>(
val.index()), container);
280 if (std::holds_alternative<TagEnd>(
val))
287 std::visit([&](
auto&& arg)
289 using T = std::decay_t<
decltype(arg)>;
291 if constexpr (std::is_same_v<T, TagEnd>)
295 else if constexpr (std::is_same_v<T, TagByteArray>)
298 WriteData<Vector<char, int>>(arg, container);
300 else if constexpr (std::is_same_v<T, TagString>)
304 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagList>>)
306 WriteData<TagList>(arg.get(), container);
308 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagCompound>>)
310 WriteData<TagCompound>(arg.get(), container);
312 else if constexpr (std::is_same_v<T, TagIntArray>)
315 WriteData<Vector<int, int>>(arg, container);
317 else if constexpr (std::is_same_v<T, TagLongArray>)
320 WriteData<Vector<long long int, int>>(arg, container);
324 WriteData<T>(arg, container);
333 std::visit([&](
auto&& arg)
335 using T = std::decay_t<
decltype(arg)>;
337 if constexpr (std::is_same_v<T, TagEnd>)
339 output[
"type"] = GetTagName<T>();
341 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagList>>)
343 output[
"type"] = GetTagName<TagList>();
344 output[
"content"] = arg.
get();
347 else if constexpr (std::is_same_v<T, RecursiveWrapper<TagCompound>>)
349 output[
"type"] = GetTagName<TagCompound>();
350 output[
"content"] = arg.
get();
355 output[
"type"] = GetTagName<T>();
356 output[
"content"] = arg;
368 throw std::runtime_error(
"NBT::Tag is not a TagCompound");
371 return get<TagCompound>().at(s);
378 std::visit([&](
auto&& arg)
380 using T = std::decay_t<
decltype(arg)>;
382 if constexpr (std::is_same_v<T, RecursiveWrapper<TagList>> ||
383 std::is_same_v<T, RecursiveWrapper<TagCompound>>)
385 output = arg.get().size();
388 std::is_same_v<T, TagByteArray> ||
389 std::is_same_v<T, TagIntArray> ||
390 std::is_same_v<T, TagLongArray>
397 throw std::runtime_error(
"NBT::Tag is not a container, no size() method implemented");
406 return is<TagCompound>() && get<TagCompound>().count(s);
412 const TagType tags_type =
static_cast<TagType>(ReadData<char>(iter, length));
418 const int vector_size = ReadData<int>(iter, length);
419 vals = std::vector<TagEnd>(vector_size);
424 vals = ReadData<Vector<char, int>>(iter, length);
428 vals = ReadData<Vector<short, int>>(iter, length);
432 vals = ReadData<Vector<int, int>>(iter, length);
436 vals = ReadData<Vector<long long int, int>>(iter, length);
440 vals = ReadData<Vector<float, int>>(iter, length);
444 vals = ReadData<Vector<double, int>>(iter, length);
448 vals = ReadData<Vector<Vector<char, int>,
int>>(iter, length);
452 std::vector<std::string> values = std::vector<std::string>(ReadData<int>(iter, length));
453 for (
size_t i = 0; i < values.size(); ++i)
462 vals = ReadData<Vector<TagList, int>>(iter, length);
466 vals = ReadData<Vector<TagCompound, int>>(iter, length);
470 vals = ReadData<Vector<Vector<int, int>,
int>>(iter, length);
474 vals = ReadData<Vector<Vector<long long int, int>,
int>>(iter, length);
483 WriteData<char>(
static_cast<char>(
vals.index()), container);
485 std::visit([&](
auto&& arg)
487 using T = std::decay_t<
decltype(arg)>;
489 if constexpr (std::is_same_v<T, std::vector<TagEnd>>)
491 WriteData<int>(
static_cast<int>(arg.size()), container);
493 else if constexpr (std::is_same_v<T, std::vector<TagByteArray>>)
496 WriteData<Vector<Vector<char, int>,
int>>(arg, container);
498 else if constexpr (std::is_same_v<T, std::vector<TagString>>)
500 WriteData<int>(
static_cast<int>(arg.size()), container);
501 for (
size_t i = 0; i < arg.size(); ++i)
506 else if constexpr (std::is_same_v<T, std::vector<TagIntArray>>)
509 WriteData<Vector<Vector<int, int>,
int>>(arg, container);
511 else if constexpr (std::is_same_v<T, std::vector<TagLongArray>>)
514 WriteData<Vector<Vector<long long int, int>,
int>>(arg, container);
519 WriteData<Vector<typename T::value_type, int>>(arg, container);
528 std::visit([&](
auto&& arg)
530 using T = std::decay_t<
decltype(arg)>;
532 if constexpr (std::is_same_v<T, std::vector<TagEnd>>)
535 for (
size_t i = 0; i < arg.size(); ++i)
553 std::visit([&](
auto&& arg)
576 const Tag tag = ReadData<Tag>(iter, length);
585 insert({ tag.
GetName(), tag });
592 for (
const auto& p : *
this)
594 WriteData<Tag>(p.second, container);
605 return *
static_cast<const std::map<std::string, Tag>*
>(
this);
611 const unsigned short size = ReadData<unsigned short>(iter, length);
618 WriteData<unsigned short>(
static_cast<unsigned short>(s.size()), container);
Template magic to have a full type instead of an incomplete one as required for example by std::varia...
Real class declaration, just a derived class of std::vector<Value>
Main class, basically a JsonVariant with extra utility functions it doesn't inherit JsonVariant direc...
void push_back(const Value &value)
virtual Json::Value SerializeImpl() const override
virtual void WriteImpl(WriteContainer &container) const override
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
bool contains(const std::string &s) const
const Tag & operator[](const std::string &s) const
virtual Json::Value SerializeImpl() const override
virtual void WriteImpl(WriteContainer &container) const override
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
Internal::TagListVariant vals
bool contains(const std::string &s) const
void WriteUnnamedImpl(WriteContainer &container) const
virtual void WriteImpl(WriteContainer &container) const override
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
const std::string & GetName() const
virtual Json::Value SerializeImpl() const override
void ReadUnnamedImpl(ReadIterator &iter, size_t &length)
const Tag & operator[](const std::string &s) const
std::variant< TagEnd, TagByte, TagShort, TagInt, TagLong, TagFloat, TagDouble, TagByteArray, TagString, ProtocolCraft::Internal::RecursiveWrapper< TagList >, ProtocolCraft::Internal::RecursiveWrapper< TagCompound >, TagIntArray, TagLongArray > TagVariant
constexpr std::string_view GetTagName()
std::vector< long long int > TagLongArray
std::string ReadNBTString(ReadIterator &iter, size_t &length)
void WriteNBTString(const std::string &s, WriteContainer &container)
std::vector< int > TagIntArray
std::vector< char > TagByteArray
std::string ReadRawString(ReadIterator &iter, size_t &length, const size_t size)
void WriteRawString(const std::string &s, WriteContainer &container)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator