DB/LiquidType
Properties of water. Added (build: 5428) to account for the damage caused by the Slime in Naxxramas.
As of 8.x: "For MaterialID 1 or 3 (e.g. Water or Water2.0), the value of 'Diffuse Texture' must be: proceduralOceanDepthTex or proceduralRiverDepthTex or proceduralWmoWaterTex."
Build 5428 (Vanilla & BC), 1.12.1.5875
Originally, this was a very small record with only basic information. The type of the liquid was in LiquidType - these values were rewritten in Wrath, where they were reordered and Ocean got its own value.
The spellID points to a Spell record which is applied to any entity entering the liquid. Initially, only the Naxxramas entry had this set.
struct LiquidTypeRec { uint32_t m_ID; stringrefⁱ m_name; LiquidType m_LiquidType; foreign_keyⁱ<uint32_t, &SpellRec::m_ID> m_spellID; };
enum LiquidType : uint32_t { Magma = 0, Slime = 2, Water = 3, Ocean = Water };
Build 12340 and up
Note that type 8 is used for debugging, and invalid entries might fall back to that.
The floats and ints arrays usage is defined by material used by liquid. The liquid material used is determined by LiquidMaterialID, which links to DB/LiquidMaterial table. Do not make a mistake trying to use flags as a way to determine the actual material
Offset | Name | Type | Comment |
---|---|---|---|
0 | Id | int | |
cata | minDetail | int | |
cata | loDetailID | int | |
cata | hiDetailID | int | |
1 | Name | string | |
cata | flags | int | |
cata | soundBank | int | |
2 | flags | int | Water: 1, 2, 4, 8; Magma: 8, 16, 32, 64; Slime: 2, 64, 256; WMO Ocean: 1, 2, 4, 8, 512 |
3 | Type | int | 0: Water, 1: Ocean, 2: Magma, 3: Slime |
4 | SoundEntriesID | int | SoundEntries.dbc irefid |
5 | SpellID | int | Spell.dbc irefID |
6 | maxDarkenDepth | float | only for slime and magma |
7 | fogDarkenIntensity | float | 7,8,9: Only oceans got values here! |
8 | ambDarkenIntensity | float | |
9 | dirDarkenIntensity | float | |
10 | lightID | int | Only Slime (6) and Magma (7) |
11 | particleScale | float | 0: Slime, 1: Water / Ocean, 4: Magma |
12 | particleMovement | int | |
13 | particleTexSlots | int | |
14 | LiquidMaterialID | int | (LiquidMaterial.dbc irefid?) this defines the shaders used. (1: "*sLiquidWater", 2: "*sLiquidMagma", 3: "*sLiquidProcWater%s" where %s is an appendix that is currently always "") |
15-20 | texture | string[6] | these are passed into the texture[] of the shaders. |
21-22 | color | int[2] | |
23-40 | floats | float[18] | most likely these are attributes for the shaders. Water: (23, TextureTilesPerBlock),(24, Rotation) Magma: (23, AnimationX),(24, AnimationY) |
41-44 | ints | int[4] | if (!material.LVF & ~2) or material.LVF == 4), then [0]: 1 → ocean, 0 → river depth coord table; 1 for oceans, 0 or 1250. only set for water / ocean and only for the procedual in all 3 fields. else only the first. |
6.0.1.18179
struct LiquidTypeRec { uint32_t m_ID; stringrefⁱ m_name; uint32_t m_flags; // &4: IsLiquidWaterWalkable; &8: has water particulates; &0x10: particulate rendering related = -1 if not set uint32_t m_soundBank; foreign_keyⁱ<uint32_t, &SoundEntriesRec::m_ID> m_soundID; foreign_keyⁱ<uint32_t, &SpellRec::m_ID> m_spellID; float m_maxDarkenDepth; float m_fogDarkenIntensity; float m_ambDarkenIntensity; float m_dirDarkenIntensity; foreign_keyⁱ<uint32_t, &LightRec::m_ID> m_lightID; float m_particleScale; uint32_t m_particleMovement; uint32_t m_particleTexSlots; foreign_keyⁱ<uint32_t, &LiquidMaterialRec::m_ID> m_materialID; stringrefⁱ m_texture[6]; // implementation detail in Liquid::CMaterialSettings limits them to 128 bytes! uint32_t m_color[2]; float m_float[18]; uint32_t m_int[4]; };
For investigation purposes: Water related fragment shaders from 25632 build [1]
Particulate
The particleXxx fields are for water poop ("Textures/WaterPoop02.blp"). In the client, the Particulate:: functions relate.
Valid Movement types are 0, 1, or 2 (6.0.1.18179).
Scale is divided by 36 on initialisation before calling Particulate::SetScale.
As of (6.0.1.18179) there are 5 TexSlots, each referring to 8 sets of texture coordinates into the texture atlas. These are hardcoded (Particulate::s_tcSub, which then references Particulate::s_tc) in the client. The sets are
TexSlot | tiles |
---|---|
0 | 0, 1, 2, 3, 4, 5, 6, 7 |
1 | 8, 9, 10, 11 |
2 | 12 |
3 | 13, 14, 15, 16 |
4 | 17, 18, 19, 20, 21, 22, 23, 24 |
where the tiles are not just linear but manually placed as per
Note that since this is client side hardcoded, this assignment may/will/has changed.