DB/LiquidType

From wowdev
Jump to: navigation, search

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 WoD (6.0.1.18179).

Scale is divided by 36 on initialisation before calling Particulate::SetScale.

As of WoD (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

Waterpoop02.png

Note that since this is client side hardcoded, this assignment may/will/has changed.