Improve node timer format (map format version 25) and update mapformat.txt

This commit is contained in:
Perttu Ahola 2012-07-24 14:56:32 +03:00
parent 717ae67995
commit 5c31445117
5 changed files with 98 additions and 41 deletions

View File

@ -1,11 +1,12 @@
============================= =============================
Minetest World Format 22...23 Minetest World Format 22...25
============================= =============================
This applies to a world format carrying the block serialization version This applies to a world format carrying the block serialization version
22...23, used at least in 22...25, used at least in
- 0.4.dev-20120322 ... 0.4.dev-20120606 - 0.4.dev-20120322 ... 0.4.dev-20120606 (22...23)
- 0.4.0. - 0.4.0 (23)
- 24 was never released as stable and existed for ~2 days
The block serialization version does not fully specify every aspect of this The block serialization version does not fully specify every aspect of this
format; if compliance with this format is to be checked, it needs to be format; if compliance with this format is to be checked, it needs to be
@ -262,17 +263,26 @@ u8 flags
u8 content_width u8 content_width
- Number of bytes in the content (param0) fields of nodes - Number of bytes in the content (param0) fields of nodes
- Always 1 if map format version <= 23:
- Always 1
if map format version >= 24:
- Always 2
u8 params_width u8 params_width
- Number of bytes used for parameters per node - Number of bytes used for parameters per node
- Always 2 - Always 2
zlib-compressed node data: zlib-compressed node data:
- content: if content_width == 1:
u8[4096]: param0 fields - content:
u8[4096]: param1 fields u8[4096]: param0 fields
u8[4096]: param2 fields u8[4096]: param1 fields
u8[4096]: param2 fields
if content_width == 2:
- content:
u16[4096]: param0 fields
u8[4096]: param1 fields
u8[4096]: param2 fields
- The location of a node in each of those arrays is (z*16*16 + y*16 + x). - The location of a node in each of those arrays is (z*16*16 + y*16 + x).
zlib-compressed node metadata list zlib-compressed node metadata list
@ -285,9 +295,19 @@ zlib-compressed node metadata list
u16 content_size u16 content_size
u8[content_size] (content of metadata) u8[content_size] (content of metadata)
- unused node timers (version will be 24 when they are actually used): - Node timers
if version == 23: if map format version == 23:
u8 unused version (always 0) u8 unused version (always 0)
if map format version == 24: (NOTE: Not released as stable)
u8 nodetimer_version
if nodetimer_version == 0:
(nothing else)
if nodetimer_version == 1:
u16 num_of_timers
foreach num_of_timers:
u16 timer position (z*16*16 + y*16 + x)
s32 timeout*1000
s32 elapsed*1000
u8 static object version: u8 static object version:
- Always 0 - Always 0
@ -317,17 +337,29 @@ foreach num_name_id_mappings
u16 name_len u16 name_len
u8[name_len] name u8[name_len] name
- Node timers
if map format version == 25:
u8 length of the data of a single timer (always 2+4+4=10)
u16 num_of_timers
foreach num_of_timers:
u16 timer position (z*16*16 + y*16 + x)
s32 timeout*1000
s32 elapsed*1000
EOF. EOF.
Format of nodes Format of nodes
---------------- ----------------
A node is composed of the u8 fields param0, param1 and param2. A node is composed of the u8 fields param0, param1 and param2.
The content id of a node is determined as so: if map format version <= 23:
- If param0 < 0x80, The content id of a node is determined as so:
content_id = param0 - If param0 < 0x80,
- Otherwise content_id = param0
content_id = (param0<<4) + (param2>>4) - Otherwise
content_id = (param0<<4) + (param2>>4)
if map format version >= 24:
The content id of a node is param0.
The purpose of param1 and param2 depend on the definition of the node. The purpose of param1 and param2 depend on the definition of the node.

View File

@ -612,8 +612,10 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
*/ */
if(disk) if(disk)
{ {
// Node timers if(version <= 24){
m_node_timers.serialize(os); // Node timers
m_node_timers.serialize(os, version);
}
// Static objects // Static objects
m_static_objects.serialize(os); m_static_objects.serialize(os);
@ -623,6 +625,11 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk)
// Write block-specific node definition id mapping // Write block-specific node definition id mapping
nimap.serialize(os); nimap.serialize(os);
if(version >= 25){
// Node timers
m_node_timers.serialize(os, version);
}
} }
} }
@ -696,10 +703,10 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
// Read unused zero // Read unused zero
readU8(is); readU8(is);
} }
else if(version >= 24){ if(version == 24){
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Node timers"<<std::endl); <<": Node timers (ver==24)"<<std::endl);
m_node_timers.deSerialize(is); m_node_timers.deSerialize(is, version);
} }
// Static objects // Static objects
@ -719,6 +726,12 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk)
NameIdMapping nimap; NameIdMapping nimap;
nimap.deSerialize(is); nimap.deSerialize(is);
correctBlockNodeIds(&nimap, data, m_gamedef); correctBlockNodeIds(&nimap, data, m_gamedef);
if(version >= 25){
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())
<<": Node timers (ver>=25)"<<std::endl);
m_node_timers.deSerialize(is, version);
}
} }
TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos())

View File

@ -42,19 +42,22 @@ void NodeTimer::deSerialize(std::istream &is)
NodeTimerList NodeTimerList
*/ */
void NodeTimerList::serialize(std::ostream &os) const void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const
{ {
/* if(map_format_version == 24){
Version 0 is a placeholder for "nothing to see here; go away." // Version 0 is a placeholder for "nothing to see here; go away."
*/ if(m_data.size() == 0){
writeU8(os, 0); // version
if(m_data.size() == 0){ return;
writeU8(os, 0); // version }
return; writeU8(os, 1); // version
writeU16(os, m_data.size());
} }
writeU8(os, 1); // version if(map_format_version >= 25){
writeU16(os, m_data.size()); writeU8(os, 2+4+4);
writeU16(os, m_data.size());
}
for(std::map<v3s16, NodeTimer>::const_iterator for(std::map<v3s16, NodeTimer>::const_iterator
i = m_data.begin(); i = m_data.begin();
@ -68,15 +71,23 @@ void NodeTimerList::serialize(std::ostream &os) const
} }
} }
void NodeTimerList::deSerialize(std::istream &is) void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
{ {
m_data.clear(); m_data.clear();
if(map_format_version == 24){
u8 timer_version = readU8(is);
if(timer_version == 0)
return;
if(timer_version != 1)
throw SerializationError("unsupported NodeTimerList version");
}
u8 version = readU8(is); if(map_format_version >= 25){
if(version == 0) u8 timer_data_len = readU8(is);
return; if(timer_data_len != 2+4+4)
if(version != 1) throw SerializationError("unsupported NodeTimer data length");
throw SerializationError("unsupported NodeTimerList version"); }
u16 count = readU16(is); u16 count = readU16(is);

View File

@ -57,8 +57,8 @@ public:
NodeTimerList() {} NodeTimerList() {}
~NodeTimerList() {} ~NodeTimerList() {}
void serialize(std::ostream &os) const; void serialize(std::ostream &os, u8 map_format_version) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is, u8 map_format_version);
// Get timer // Get timer
NodeTimer get(v3s16 p){ NodeTimer get(v3s16 p){

View File

@ -59,12 +59,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
21: dynamic content type allocation 21: dynamic content type allocation
22: minerals removed, facedir & wallmounted changed 22: minerals removed, facedir & wallmounted changed
23: new node metadata format 23: new node metadata format
24: 16-bit node ids and node timers 24: 16-bit node ids and node timers (never released as stable)
25: Improved node timer format
*/ */
// This represents an uninitialized or invalid format // This represents an uninitialized or invalid format
#define SER_FMT_VER_INVALID 255 #define SER_FMT_VER_INVALID 255
// Highest supported serialization version // Highest supported serialization version
#define SER_FMT_VER_HIGHEST 24 #define SER_FMT_VER_HIGHEST 25
// Lowest supported serialization version // Lowest supported serialization version
#define SER_FMT_VER_LOWEST 0 #define SER_FMT_VER_LOWEST 0