@@ -6,13 +6,47 @@ namespace Amulet {
66
77// BlockEntityComponentData
88
9- void BlockEntityComponentData::serialise (BinaryWriter&) const
9+ void BlockEntityComponentData::serialise (BinaryWriter& writer ) const
1010{
11- throw std::runtime_error (" NotImplementedError" );
11+ writer.write_numeric <std::uint8_t >(1 );
12+ get_version_range ().serialise (writer);
13+ writer.write_numeric <std::uint16_t >(get_x_size ());
14+ writer.write_numeric <std::uint16_t >(get_z_size ());
15+
16+ writer.write_numeric <std::uint64_t >(get_block_entities ().size ());
17+ for (const auto & [coord, block_entity] : get_block_entities ()) {
18+ writer.write_numeric <std::uint16_t >(std::get<0 >(coord));
19+ writer.write_numeric <std::int64_t >(std::get<1 >(coord));
20+ writer.write_numeric <std::uint16_t >(std::get<2 >(coord));
21+ block_entity->serialise (writer);
22+ }
1223}
13- BlockEntityComponentData BlockEntityComponentData::deserialise (BinaryReader&)
24+ BlockEntityComponentData BlockEntityComponentData::deserialise (BinaryReader& reader )
1425{
15- throw std::runtime_error (" NotImplementedError" );
26+ auto version_number = reader.read_numeric <std::uint8_t >();
27+ switch (version_number) {
28+ case 1 : {
29+ auto version_range = VersionRange::deserialise (reader);
30+ auto x_size = reader.read_numeric <std::uint16_t >();
31+ auto z_size = reader.read_numeric <std::uint16_t >();
32+ BlockEntityComponentData block_entities {
33+ std::move (version_range),
34+ x_size,
35+ z_size
36+ };
37+ auto block_entity_count = reader.read_numeric <std::uint64_t >();
38+ for (std::uint16_t i = 0 ; i < block_entity_count; i++) {
39+ auto dx = reader.read_numeric <std::uint16_t >();
40+ auto y = reader.read_numeric <std::int64_t >();
41+ auto dz = reader.read_numeric <std::uint16_t >();
42+ auto block_entity = std::make_shared<BlockEntity>(BlockEntity::deserialise (reader));
43+ block_entities.set ({ dx, y, dz }, std::move (block_entity));
44+ }
45+ return block_entities;
46+ }
47+ default :
48+ throw std::invalid_argument (" Unsupported BlockEntityComponentData version " + std::to_string (version_number));
49+ }
1650}
1751
1852// BlockEntityComponent
0 commit comments