forked from mmbednarek/minecpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBlockState.schema.cpp
More file actions
61 lines (55 loc) · 2.13 KB
/
BlockState.schema.cpp
File metadata and controls
61 lines (55 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <minecpp/nbt/block/BlockState.schema.h>
#include <minecpp/nbt/Exception.h>
namespace minecpp::nbt::block {
void BlockState::serialize_no_header(minecpp::nbt::Writer &w) const {
w.write_header(minecpp::nbt::TagId::Byte, "BlocksMovement");
w.write_byte_content(static_cast<std::uint8_t>(blocks_movement));
w.write_header(minecpp::nbt::TagId::Int, "Luminance");
w.write_int_content(luminance);
w.write_header(minecpp::nbt::TagId::Int, "Opacity");
w.write_int_content(opacity);
w.write_header(minecpp::nbt::TagId::Compound, "SolidFaces");
solid_faces.serialize_no_header(w);
w.end_compound();
}
void BlockState::serialize(std::ostream &out_stream, std::string_view in_compound_name) const {
minecpp::nbt::Writer w(out_stream);
w.begin_compound(in_compound_name);
this->serialize_no_header(w);
}
BlockState BlockState::deserialize_no_header(minecpp::nbt::Reader &r) {
BlockState result;
for (const auto &[tagid, in_field_name] : r.iterate_compound()) {
if (in_field_name == "BlocksMovement") {
::minecpp::nbt::verify_tag("BlockState", in_field_name, minecpp::nbt::TagId::Byte, tagid);
result.blocks_movement = r.read_byte();
continue;
}
if (in_field_name == "Luminance") {
::minecpp::nbt::verify_tag("BlockState", in_field_name, minecpp::nbt::TagId::Int, tagid);
result.luminance = r.read_int();
continue;
}
if (in_field_name == "Opacity") {
::minecpp::nbt::verify_tag("BlockState", in_field_name, minecpp::nbt::TagId::Int, tagid);
result.opacity = r.read_int();
continue;
}
if (in_field_name == "SolidFaces") {
::minecpp::nbt::verify_tag("BlockState", in_field_name, minecpp::nbt::TagId::Compound, tagid);
result.solid_faces = common::FaceMask::deserialize_no_header(r);
continue;
}
r.skip_payload(tagid);
}
return result;
}
BlockState BlockState::deserialize(std::istream &in) {
minecpp::nbt::Reader r(in);
auto peek = r.peek_tag();
if (peek.id != minecpp::nbt::TagId::Compound) {
return {};
}
return BlockState::deserialize_no_header(r);
}
}