========================================= Minetest World Format ========================================= Format used as of 0.4.dev-120322 ================================== This applies to a world format carrying the serialization version 22 which is used at least in version 0.4.dev-120322. The serialization version used is 22. It does not fully specify every aspect of this format; if compliance with this format is to be checked, it needs to be done by detecting if the files and data indeed follows it. Legacy stuff: ------------- Data can, in theory, be contained in the flat file directory structure described below in Version 17, but it is not officially supported. Files: ------ Everything is contained in a directory, the name of which is freeform, but often serves as the name of the world. Currently the authentication and ban data is stored on a per-world basis. It can be copied over from an old world to a newly created world. World |-- auth.txt ----- Authentication data |-- env_meta.txt - Environment metadata |-- ipban.txt ---- Banned ips/users |-- map_meta.txt - Map metadata |-- map.sqlite --- Map data |-- players ------ Player directory | |-- player1 -- Player file | '-- player2 -- Player file `-- world.mt ----- World metadata auth.txt --------- Contains authentication data, player per line. : SHA1 base64>: Example lines: Player "celeron55", no password, privileges "interact" and "shout": celeron55::interact,shout Player "Foo", password "bar", privileges "interact" and "shout": foo:iEPX+SQWIR3p67lj/0zigSWTKHg:interact,shout env_meta.txt ------------- --- Example content --- game_time = 73471 time_of_day = 19118 EnvArgsEnd ----------------------- ipban.txt ---------- Format used as of 2011-05 or so ================================ Map data serialization format version 17. Directory structure: sectors/XXXXZZZZ or sectors2/XXX/ZZZ XXXX, ZZZZ, XXX and ZZZ being the hexadecimal X and Z coordinates. Under these, the block files are stored, called YYYY. There also exists files map_meta.txt and chunk_meta, that are used by the generator. If they are not found or invalid, the generator will currently behave quite strangely. The MapBlock file format (sectors2/XXX/ZZZ/YYYY): ------------------------------------------------- NOTE: Byte order is MSB first. u8 version - map format version number, this one is version 17 u8 flags - Flag bitmasks: - 0x01: is_underground: Should be set to 0 if there will be no light obstructions above the block. If/when sunlight of a block is updated and there is no block above it, this value is checked for determining whether sunlight comes from the top. - 0x02: day_night_differs: Whether the lighting of the block is different on day and night. Only blocks that have this bit set are updated when day transforms to night. - 0x04: lighting_expired: If true, lighting is invalid and should be updated. If you can't calculate lighting in your generator properly, you could try setting this 1 to everything and setting the uppermost block in every sector as is_underground=0. I am quite sure it doesn't work properly, though. zlib-compressed map data: - content: u8[4096]: content types u8[4096]: param1 values u8[4096]: param2 values zlib-compressed node metadata - content: u16 version (=1) u16 count of metadata foreach count: u16 position (= p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X) u16 type_id u16 content_size u8[content_size] misc. stuff contained in the metadata u16 mapblockobject_count - always write as 0. - if read != 0, just fail. foreach mapblockobject_count: - deprecated, should not be used. Length of this data can only be known by properly parsing it. Just hope not to run into any of this. u8 static object version: - currently 0 u16 static_object_count foreach static_object_count: u8 type (object type-id) s32 pos_x * 1000 s32 pos_y * 1000 s32 pos_z * 1000 u16 data_size u8[data_size] data u32 timestamp - Timestamp when last saved, as seconds from starting the game. - 0xffffffff = invalid/unknown timestamp, nothing will be done with the time difference when loaded (recommended) Node metadata format: --------------------- Sign metadata: u16 string_len u8[string_len] string Furnace metadata: TBD Chest metadata: TBD Locking Chest metadata: u16 string_len u8[string_len] string TBD // END