DB/LiquidType
Properties of water. Added (build: 5428) to account for the damage caused by the Slime in Naxxramas.
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.
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]; };
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.