World of Warcraft file formats
- Mr.Mouse
- Site Admin
- Posts: 4051
- Joined: Wed Jan 15, 2003 6:45 pm
- Location: Dungeons of Doom
- Has thanked: 421 times
- Been thanked: 575 times
- Contact:
Yes, I would love to support theMPQ format, but it will be something for a plug-in, and Rahly and I are working on implementing a new Pluginmanager (which Rahly has completed). If that is all up and running, we can go create plugins for it. A plugin will enable us to work with more sophisticated archives, such as MPQ.
-
nicoli_s
- advanced
- Posts: 77
- Joined: Fri Jan 07, 2005 7:47 am
- Has thanked: 1 time
- Been thanked: 3 times
wow! someone else who is interested in the wow formats. I have a little more than you on the m2 done, and all the blp2 done as well as another model format, the wmo, email me sometime at warbeta3@hotmail.com if youd like to get together and compare notes
MPQ is not a problem, although, unfortunately, the StormLib has change with the different games SC,Diablo,Diablo2, Warcraft III, WoW. Its also good to note that the MPQs for Diablo+ can also be encrypted. This means you need to know the right password to DECRYPT it. Unfortunately, MPQ do NOT store file names. You are expected to know the filename before you access it. You might be saying "WHAT?". The MPQ stores data in a large hashing table. when you say "open this file in the mpq" the stormlib hashes the file name 4 times. once to find its entry in the hash table, and 3 other hash to verify entry.
"By nature men are alike. Through practice they have become far apart." Confucius (Analect 17:2)
-
nicoli_s
- advanced
- Posts: 77
- Joined: Fri Jan 07, 2005 7:47 am
- Has thanked: 1 time
- Been thanked: 3 times
wmo data:
here is the WMO header
REVM
long Nbytes;
long Version;
DHOM
long Nbytes;
long numtextures;
long numsubfiles;
long ???;
long ???;
long num mdxs;
long ???;
long num SDOMs;
(11 unknown longs)
XTOM
long Nbytes;
struct {
string TexturePath; // There appears to be no real method to how many null bytes follow the texture filenames
} Texturepath[numtextures];
TMOM
long Nbytes;
???
NGOM
long Nbytes;
short ???; // (0)
struct {
string SubName; // Null terminated with one byte
} SubName[numsubfiles];
IGOM
long Nbytes;
struct {
long ???;
float minx;
float miny;
float minz;
float maxx;
float maxy;
float maxz;
float ???;
} BoundsInfo[numsubfiles];
VPOM
long Nbytes;
???
TPOM
long Nbytes;
???
RPOM
long Nbytes;
???
SDOM
long Nbytes;
string ???; // Null terminated with one byte, have no idea what it means
NDOM
long Nbytes;
???
DDOM long Nbytes;
???
GOFM
long Nbytes;
???
Here is the actual model files, they are referenced by the name of the wmo file with _### at the end
REVM
long Nbytes;
long Version;
PGOM
??? //Contains no Nbytes, but is always 72 bytes in size
YPOM
long Nbytes;
struct {
byte flags;
byte TextureId;
} VertTextData[Nbytes/2]
IVOM
long Nbytes;
struct {
short x;
short y;
short z;
} FaceData[Nbytes/6]
TVOM
long Nbytes;
struct {
float x;
float y;
float z;
} VertData[Nbytes/12]
RNOM
long Nbytes;
struct {
float x;
float y;
float z;
} NormalData[Nbytes/12]
VTOM
long Nbytes;
struct {
float x;
float y;
} TexVertData[Nbytes/8]
ABOM
long Nbytes;
???
NBOM
long Nbytes;
???
RBOM
long Nbytes;
???
and last but not least, the m2 specs
Header:
MD20
Long Version;
Long Name Length; // includes null termination
Long Name Offset;
Long ???;
Long ???;
Long ???;
Long nanims;
Long Anim Offset;
...
Long nverts; // offset 68
Long Vert Offset;
Long Primitive Type;
Long Face Offset;
...
Long ntexs; // offset 92
Long Tex Offset;
...
Float minx; // offset 180
Float miny;
Float minz;
Float maxx;
Float maxy;
Float maxz;
...
String name[Name Length]; // offset 336
//Null bytes till a multiple of 16 is reached
struct { // found at Anim Offset
Long animid; // found in animationdata.dbc
Long inststart;
Long intend;
Long movespeed;
Long nonlooping; // (0:loop; 1:no loop)
Long ???;
Long ???;
Long ???;
Long BlendTime;
Float minx, miny, minz;
Float maxx, maxy, maxz;
Long ???;
Long ???;
} sequences[nanims] // (68 bytes long)
Long ???;
Long ???;
...
struct {
Float x;
Float y;
Float z;
...
} pivots[npivots] // (108 bytes long)
struct {
float x;
float y;
float z;
Byte b1w; // these 4 bytes add up to 255
Byte b2w;
Byte b3w;
Byte b4w;
Byte b1i;
Byte b2i;
Byte b3i;
Byte b4i;
float nx;
float ny;
float nz;
float u;
float v;
Long ???;
Long ???;
} verts[nverts]
Long nverts;
Long foffsetstart;
Long NumFaces;
Long foffsetend;
...
struct { // starts at foffsetend
short x;
short y;
short z;
} faces[NumFaces]
struct { // starts at Tex Offset
Long ;
Long ???;
Long texlength;
Long pathoffset;
} texinfo[ntexs]
struct {
string[texlength];
Null bytes until a multiple of 16 is reached
} texpath[ntexs]
Long ???; // (0)
Short ???; // FFFF
Long ???; // (0)
Long ???; // (0)
Long ???; // (1)
Long unkoff1;
Long ???; // (1)
Long unkoff2;
Long ???; // (0)
Long ???; // at unkoff1 (0)
Long ???; // (0)
Long ???; // (0)
Long ???; // (0)
Long ???; // at unkoff1 (0xFF7F)
here is the WMO header
REVM
long Nbytes;
long Version;
DHOM
long Nbytes;
long numtextures;
long numsubfiles;
long ???;
long ???;
long num mdxs;
long ???;
long num SDOMs;
(11 unknown longs)
XTOM
long Nbytes;
struct {
string TexturePath; // There appears to be no real method to how many null bytes follow the texture filenames
} Texturepath[numtextures];
TMOM
long Nbytes;
???
NGOM
long Nbytes;
short ???; // (0)
struct {
string SubName; // Null terminated with one byte
} SubName[numsubfiles];
IGOM
long Nbytes;
struct {
long ???;
float minx;
float miny;
float minz;
float maxx;
float maxy;
float maxz;
float ???;
} BoundsInfo[numsubfiles];
VPOM
long Nbytes;
???
TPOM
long Nbytes;
???
RPOM
long Nbytes;
???
SDOM
long Nbytes;
string ???; // Null terminated with one byte, have no idea what it means
NDOM
long Nbytes;
???
DDOM long Nbytes;
???
GOFM
long Nbytes;
???
Here is the actual model files, they are referenced by the name of the wmo file with _### at the end
REVM
long Nbytes;
long Version;
PGOM
??? //Contains no Nbytes, but is always 72 bytes in size
YPOM
long Nbytes;
struct {
byte flags;
byte TextureId;
} VertTextData[Nbytes/2]
IVOM
long Nbytes;
struct {
short x;
short y;
short z;
} FaceData[Nbytes/6]
TVOM
long Nbytes;
struct {
float x;
float y;
float z;
} VertData[Nbytes/12]
RNOM
long Nbytes;
struct {
float x;
float y;
float z;
} NormalData[Nbytes/12]
VTOM
long Nbytes;
struct {
float x;
float y;
} TexVertData[Nbytes/8]
ABOM
long Nbytes;
???
NBOM
long Nbytes;
???
RBOM
long Nbytes;
???
and last but not least, the m2 specs
Header:
MD20
Long Version;
Long Name Length; // includes null termination
Long Name Offset;
Long ???;
Long ???;
Long ???;
Long nanims;
Long Anim Offset;
...
Long nverts; // offset 68
Long Vert Offset;
Long Primitive Type;
Long Face Offset;
...
Long ntexs; // offset 92
Long Tex Offset;
...
Float minx; // offset 180
Float miny;
Float minz;
Float maxx;
Float maxy;
Float maxz;
...
String name[Name Length]; // offset 336
//Null bytes till a multiple of 16 is reached
struct { // found at Anim Offset
Long animid; // found in animationdata.dbc
Long inststart;
Long intend;
Long movespeed;
Long nonlooping; // (0:loop; 1:no loop)
Long ???;
Long ???;
Long ???;
Long BlendTime;
Float minx, miny, minz;
Float maxx, maxy, maxz;
Long ???;
Long ???;
} sequences[nanims] // (68 bytes long)
Long ???;
Long ???;
...
struct {
Float x;
Float y;
Float z;
...
} pivots[npivots] // (108 bytes long)
struct {
float x;
float y;
float z;
Byte b1w; // these 4 bytes add up to 255
Byte b2w;
Byte b3w;
Byte b4w;
Byte b1i;
Byte b2i;
Byte b3i;
Byte b4i;
float nx;
float ny;
float nz;
float u;
float v;
Long ???;
Long ???;
} verts[nverts]
Long nverts;
Long foffsetstart;
Long NumFaces;
Long foffsetend;
...
struct { // starts at foffsetend
short x;
short y;
short z;
} faces[NumFaces]
struct { // starts at Tex Offset
Long ;
Long ???;
Long texlength;
Long pathoffset;
} texinfo[ntexs]
struct {
string[texlength];
Null bytes until a multiple of 16 is reached
} texpath[ntexs]
Long ???; // (0)
Short ???; // FFFF
Long ???; // (0)
Long ???; // (0)
Long ???; // (1)
Long unkoff1;
Long ???; // (1)
Long unkoff2;
Long ???; // (0)
Long ???; // at unkoff1 (0)
Long ???; // (0)
Long ???; // (0)
Long ???; // (0)
Long ???; // at unkoff1 (0xFF7F)
-
nicoli_s
- advanced
- Posts: 77
- Joined: Fri Jan 07, 2005 7:47 am
- Has thanked: 1 time
- Been thanked: 3 times
well for the extra chunks in the WMO, i know at least one of the mhas to be collission data, which is what i think the MOBA is though im not entirely sure. what im stuck with atm is on the m2, i cant figure out how multi textured geosets work. there is so much more to the face section i dont understand



