WLW: Difference between revisions

From wowdev
Jump to navigation Jump to search
m (→‎Header: updated structure)
Line 16: Line 16:
  {
  {
   char magic[4];      // LIQ*
   char magic[4];      // LIQ*
   uint16_t flags;     // & 1: ?
   uint16_t version;   // 0, 1, 2
   uint32_t version     // always 0x10004 - version 1.4 of format
   uint16_t unk_06;     // always 1
   uint16_t pad;       // always 0
  uint16_t liquidType; // version 1 {{Template:Unverified|some enum similar to SMChunkFlags}}, version 2 = [[DB/LiquidType]] ID
   uint16_t padding;   // more likely that liquidType is a uint32_t
   uint32_t count; 
   uint32_t count; 
   Block blocks[count];
   Block blocks[count];
Line 30: Line 31:
   }[count_2];
   }[count_2];
    
    
   #if flags & 1
   #if version ≥ 1
   char unknown;      // mostly 1
   char unknown;      // mostly 1
   #endif
   #endif
  }
  }
Note: version 1.0 (<tt>Programmer Isle - Chow test still.wlw</tt>) and 1.8 (<tt>Programmer Isle - Chow test fast.wlw</tt>) also exist in the Alpha files however are the only ones of these versions.


==Data==
==Data==

Revision as of 16:20, 6 April 2019

These files are used for all of World of Warcraft's water. For each contained body of water in the game (except for the oceans) there exists one of these files. There is also a WLQ file located at the exact same file and pathname as the .wlw files. Little else is known about this file format...

Header

Type		Name			Description
char[4]		Identifier		"*QIL"
int16		Used			1 if data is in the file.
int32		Version			always 01000400
int16		Unknown			always 0
int32		nCount			how many liquids are in this chunk
int32?		Unknown			?

Below is a struct based on the known information of this file. This may not be correct.

struct Header
{
 char magic[4];       // LIQ*
 uint16_t version;    // 0, 1, 2
 uint16_t unk_06;     // always 1
 uint16_t liquidType; // version ≤ 1 some enum similar to SMChunkFlags, version 2 = DB/LiquidType ID
 uint16_t padding;    // more likely that liquidType is a uint32_t
 uint32_t count;  	
 Block blocks[count];
 
 uint32_t count_2;    // only seen in 'world/maps/azeroth/test.wlm'
 struct block_2 
 {
   C3Vector _unk00;
   C2Vector _unk0C;
   char _unk14[0x38]; // 4 floats then 0 filled in the above
 }[count_2];
 
 #if version ≥ 1
  char unknown;       // mostly 1
 #endif
}

Data

  • nCount blocks of 0x168 bytes.
Type		Name			Description
float[16][3]	heights			a height map for this section of the water
uint16[54]?	unk			?
struct Block {
 C3Vector vertices[0x10];
 C2Vector coord;   // internal coords
 uint16_t data[0x50]; 
}

Height Map

The first 0xC0 bytes are made of 48 float's that make up 16 vertices ( z-up ) arranged in a grid that starts in the lower right corner.

15	14	13	12

11	10	9	8

7	6	5	4

3	2	1	0

When all the chunks are combined, they form a height map of the water, similar to those in the ADT's

Unknown

The rest of the block seems to be made of 2 floats ( always integers ) and 40 uint32's.

--Riraito 03:00, 25 July 2008 (CDT)