Difference between revisions of "ClassicWorld file format"
Line 69: | Line 69: | ||
TAG_Compound("(Group)") { | TAG_Compound("(Group)") { | ||
(implementation-specific contents) | (implementation-specific contents) | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ===Metadata implementation notes=== | ||
+ | ====Sparse metadata for some blocks/coordinates==== | ||
+ | For metadata that refers to several specific blocks/coordinates, ClassicWorld format suggests the following format. | ||
+ | TAG_Compound("(SomeSoftware)") { | ||
+ | TAG_Compound("(SomeGroup)") { | ||
+ | TAG_Int_Array("BlockIndices") | ||
+ | TAG_List("BlockMetadata") {} | ||
+ | } | ||
+ | } | ||
+ | :*'''BlockIndices''' is an array of block indices, each referring to a position in the BlockArray. | ||
+ | :*'''BlockMetadata''' is a list of unnamed tags, of the same length and order as BlockIndices. Each tag in BlockMetadata refers to a coordinate in BlockIndices. | ||
+ | |||
+ | ====Data for every block/coordinate==== | ||
+ | In the common case of 1 byte or 1 integer being attached to every block/coordinate on the map, simply use a ByteArray/IntArray tag of the same length and order as BlockArray. | ||
+ | |||
+ | When more fixed-length data is needed, use one or more List tags, each of the same length and order as BlockArray. | ||
+ | |||
+ | When a variable amount of information is needed to be stored for every block/coordinate, use a List of Compound tags. Again, same length and order as BlockArray should be used. | ||
+ | TAG_Compound("(SomeSoftware)") { | ||
+ | TAG_Compound("(SomeGroup)") { | ||
+ | TAG_Byte_Array("OneByteForEveryBlock") | ||
+ | TAG_Int_Array("OneIntForEveryBlock") | ||
+ | TAG_List("CustomDataForEveryBlock") | ||
} | } | ||
} | } | ||
Line 74: | Line 100: | ||
==Classic Protocol Extension metadata== | ==Classic Protocol Extension metadata== | ||
Metadata name "<code>CPE</code>" is reserved for [[Classic Protocol Extension]] data, and has standardized contents. Any or all of the below sections may be present, each corresponding to a CPE extension. Each group contains an Int tag named ''ExtensionVersion''. | Metadata name "<code>CPE</code>" is reserved for [[Classic Protocol Extension]] data, and has standardized contents. Any or all of the below sections may be present, each corresponding to a CPE extension. Each group contains an Int tag named ''ExtensionVersion''. | ||
+ | |||
===ClickDistance=== | ===ClickDistance=== | ||
TAG_Compound("ClickDistance"): 2 entries { | TAG_Compound("ClickDistance"): 2 entries { | ||
Line 127: | Line 154: | ||
} | } | ||
− | == Support == | + | ==Support== |
These custom servers plan to add support for CW World Format: [http://github.com/tyteen4a03/cloudBox cloudBox], [http://www.fcraft.net/ fCraft] | These custom servers plan to add support for CW World Format: [http://github.com/tyteen4a03/cloudBox cloudBox], [http://www.fcraft.net/ fCraft] |
Revision as of 03:52, 4 October 2013
ClassicWorld is a level format devised by tyteen4a03 with input from fragmer for use by custom Minecraft Classic servers. Originally designed for cloudBox, it is extensible enough to be used by any server. Metadata allows to attach software-specific data, and to easily share Classic Protocol Extension settings.
Specification
Basic structure
TAG_Compound("ClassicWorld"): 14 entries { TAG_Byte("LevelVersion") TAG_String("Name") TAG_Byte_Array("UUID") TAG_Short("X") TAG_Short("Y") TAG_Short("Z") TAG_Compound("CreatedBy"): 2 entries { TAG_String("Service") TAG_String("Username") } TAG_Compound("MapGenerator"): 2 entries { TAG_String("Software") TAG_String("MapGeneratorName") } TAG_Long("TimeCreated") TAG_Long("LastAccessed") TAG_Long("LastModified") TAG_Compound("Spawn"): 5 entries { TAG_Short("X") TAG_Short("Y") TAG_Short("Z") TAG_Byte("H") TAG_Byte("P") } TAG_Byte_Array("BlockArray") TAG_Compound("Metadata") {} }
Notes
- LevelVersion is a constant, currently at
1
- Name should be limited to 64 characters in length, and contain only characters that can be displayed in Minecraft.
- UUID is a unique 128-bit identifier for this map (for example a GUID), saved as a 16-byte array. Must be set when the map is originally generated, and must be preserved intact when loading/saving worlds. UUID stands for Universally Unique Identifier.
- X is the width (first horizontal dimension) of the map.
- Y is the height (vertical dimension) of the map.
- Z is the length (second horizontal dimension) of the map.
- CreatedBy identifies the creator of this map. Optional.
- Username is the name of a player.
- Service can be "Minecraft" (for Minecraft.net usernames) or "ClassiCube" (for ClassiCube.net usernames).
- MapGenerator contains information related to map generation. Optional.
- Software is the name of software that originally generated this map (e.g. "cloudBox" or "fCraft").
- MapGeneratorName is the name of a specific generation method used by the software (e.g. "Realistic" or "Flat").
- TimeCreated is a UTC Unix timestamp that's set when the map is originally generated. Optional.
- LastModified is a UTC Unix timestamp that's set when the map's blocks are modified. Changes to spawn point or metadata should not affect this date. Optional.
- LastAccessed is a UTC Unix timestamp that's set when the map is accessed by any player. Optional.
- Spawn compound tag defines the point where players spawn on the map. All coordinates are in player-position units (32 units per block).
- X is the first horizontal component of player's position.
- Y is the vertical component of player's position.
- Z is the second horizontal component of player's position.
- H is the heading (yew) component of player's orientation.
- P is the pitch component of player's orientation.
- BlockArray contains the actual block data, 1 byte per block. Same packing order as in LevelDataChunk packets.
- Metadata contains all kinds of software- and plugin-specific data.
Metadata structure
The Metadata compound tag must contain zero or more named compound tags, each named after a specific software that produced them. Each of those compound tags should contain zero or more named compound tags, one for each logical grouping (e.g. for each plugin or subsystem).
TAG_Compound("(SomeSoftware)") { TAG_Compound("(OneGroup)") { (implementation-specific contents) } TAG_Compound("(AnotherGroup)") { (implementation-specific contents) } } TAG_Compound("(OtherSoftware)") { TAG_Compound("(Group)") { (implementation-specific contents) } }
Metadata implementation notes
Sparse metadata for some blocks/coordinates
For metadata that refers to several specific blocks/coordinates, ClassicWorld format suggests the following format.
TAG_Compound("(SomeSoftware)") { TAG_Compound("(SomeGroup)") { TAG_Int_Array("BlockIndices") TAG_List("BlockMetadata") {} } }
- BlockIndices is an array of block indices, each referring to a position in the BlockArray.
- BlockMetadata is a list of unnamed tags, of the same length and order as BlockIndices. Each tag in BlockMetadata refers to a coordinate in BlockIndices.
Data for every block/coordinate
In the common case of 1 byte or 1 integer being attached to every block/coordinate on the map, simply use a ByteArray/IntArray tag of the same length and order as BlockArray.
When more fixed-length data is needed, use one or more List tags, each of the same length and order as BlockArray.
When a variable amount of information is needed to be stored for every block/coordinate, use a List of Compound tags. Again, same length and order as BlockArray should be used.
TAG_Compound("(SomeSoftware)") { TAG_Compound("(SomeGroup)") { TAG_Byte_Array("OneByteForEveryBlock") TAG_Int_Array("OneIntForEveryBlock") TAG_List("CustomDataForEveryBlock") } }
Classic Protocol Extension metadata
Metadata name "CPE
" is reserved for Classic Protocol Extension data, and has standardized contents. Any or all of the below sections may be present, each corresponding to a CPE extension. Each group contains an Int tag named ExtensionVersion.
ClickDistance
TAG_Compound("ClickDistance"): 2 entries { TAG_Int("ExtensionVersion") TAG_Short("Distance") }
CustomBlocks
TAG_Compound("CustomBlocks"): 3 entries { TAG_Int("ExtensionVersion") TAG_Short("SupportLevel") TAG_Byte_Array("Fallback"): [256 bytes] }
The purpose of the Fallback array is to allow servers with lower SupportLevel to load maps created by servers with higher SupportLevel. In such cases, any unsupported block IDs can be substituted using Fallback mapping. For instance, when a [hypothetical] block ID 200
is encountered, loading software should substitute it with the value of Fallback[200].
EnvColors
TAG_Compound("EnvColors"): 6 entries { TAG_Int("ExtensionVersion") TAG_Compound("Sky"): 3 entries { TAG_Short("R") TAG_Short("G") TAG_Short("B") } TAG_Compound("Cloud"): 3 entries { TAG_Short("R") TAG_Short("G") TAG_Short("B") } TAG_Compound("Fog"): 3 entries { TAG_Short("R") TAG_Short("G") TAG_Short("B") } TAG_Compound("Ambient"): 3 entries { TAG_Short("R") TAG_Short("G") TAG_Short("B") } TAG_Compound("Sunlight"): 3 entries { TAG_Short("R") TAG_Short("G") TAG_Short("B") } }
EnvMapAppearance
TAG_Compound("EnvMapAppearance"): 5 entries { TAG_Int("ExtensionVersion") TAG_String("TextureURL") TAG_Byte("SideBlock") TAG_Byte("EdgeBlock") TAG_Short("SideLevel") }
Support
These custom servers plan to add support for CW World Format: cloudBox, fCraft