Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
serialization.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "irrlichttypes.h"
8#include <iostream>
9#include <string_view>
10
11/*
12 Map format serialization version
13 --------------------------------
14
15 For map data (blocks, nodes, sectors).
16
17 NOTE: The goal is to increment this so that saved maps will be
18 loadable by any version. Other compatibility is not
19 maintained.
20
21 0: original networked test with 1-byte nodes
22 1: update with 2-byte nodes
23 2: lighting is transmitted in param
24 3: optional fetching of far blocks
25 4: block compression
26 5: sector objects NOTE: block compression was left accidentally out
27 6: failed attempt at switching block compression on again
28 7: block compression switched on again
29 8: server-initiated block transfers and all kinds of stuff
30 9: block objects
31 10: water pressure
32 11: zlib'd blocks, block flags
33 12: UnlimitedHeightmap now uses interpolated areas
34 13: Mapgen v2
35 14: NodeMetadata
36 15: StaticObjects
37 16: larger maximum size of node metadata, and compression
38 17: MapBlocks contain timestamp
39 18: new generator (not really necessary, but it's there)
40 19: new content type handling
41 20: many existing content types translated to extended ones
42 21: dynamic content type allocation
43 22: minerals removed, facedir & wallmounted changed
44 23: new node metadata format
45 24: 16-bit node ids and node timers (never released as stable)
46 25: Improved node timer format
47 26: Never written; read the same as 25
48 27: Added light spreading flags to blocks
49 28: Added "private" flag to NodeMetadata
50 29: Switched compression to zstd, a bit of reorganization
51*/
52
53// This represents an uninitialized or invalid format
54constexpr u8 SER_FMT_VER_INVALID = 255;
55// Highest supported serialization version
56constexpr u8 SER_FMT_VER_HIGHEST_READ = 29;
57// Saved on disk version
58constexpr u8 SER_FMT_VER_HIGHEST_WRITE = 29;
59// Lowest supported serialization version
60constexpr u8 SER_FMT_VER_LOWEST_READ = 0;
61// Lowest serialization version for writing
62// Can't do < 24 anymore; we have 16-bit dynamically allocated node IDs
63// in memory; conversion just won't work in this direction.
64constexpr u8 SER_FMT_VER_LOWEST_WRITE = 24;
65
66inline bool ser_ver_supported_read(s32 v)
67{
69}
70
71inline bool ser_ver_supported_write(s32 v)
72{
74}
75
76/*
77 Compression functions
78*/
79
80void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level = -1);
81inline void compressZlib(std::string_view data, std::ostream &os, int level = -1)
82{
83 compressZlib(reinterpret_cast<const u8*>(data.data()), data.size(), os, level);
84}
85void decompressZlib(std::istream &is, std::ostream &os, size_t limit = 0);
86
87void compressZstd(const u8 *data, size_t data_size, std::ostream &os, int level = 0);
88inline void compressZstd(std::string_view data, std::ostream &os, int level = 0)
89{
90 compressZstd(reinterpret_cast<const u8*>(data.data()), data.size(), os, level);
91}
92void decompressZstd(std::istream &is, std::ostream &os);
93
94// These choose between zstd, zlib and a self-made one according to version
95void compress(const u8 *data, u32 size, std::ostream &os, u8 version, int level = -1);
96inline void compress(std::string_view data, std::ostream &os, u8 version, int level = -1)
97{
98 compress(reinterpret_cast<const u8*>(data.data()), data.size(), os, version, level);
99}
100void decompress(std::istream &is, std::ostream &os, u8 version);
void compress(const u8 *data, u32 size, std::ostream &os, u8 version, int level=-1)
Definition serialization.cpp:275
bool ser_ver_supported_read(s32 v)
Definition serialization.h:66
bool ser_ver_supported_write(s32 v)
Definition serialization.h:71
void decompressZlib(std::istream &is, std::ostream &os, size_t limit=0)
Definition serialization.cpp:95
constexpr u8 SER_FMT_VER_HIGHEST_WRITE
Definition serialization.h:58
void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level=-1)
Definition serialization.cpp:52
void compressZstd(const u8 *data, size_t data_size, std::ostream &os, int level=0)
Definition serialization.cpp:189
void decompressZstd(std::istream &is, std::ostream &os)
Definition serialization.cpp:230
constexpr u8 SER_FMT_VER_LOWEST_WRITE
Definition serialization.h:64
constexpr u8 SER_FMT_VER_INVALID
Definition serialization.h:54
constexpr u8 SER_FMT_VER_HIGHEST_READ
Definition serialization.h:56
void decompress(std::istream &is, std::ostream &os, u8 version)
Definition serialization.cpp:325
constexpr u8 SER_FMT_VER_LOWEST_READ
Definition serialization.h:60