DB/LiquidType

From wowdev
Jump to navigation Jump to search

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 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.