DB/SpellChainEffects

From wowdev
Jump to navigation Jump to search

0.5.3.3368, 1.12.1.5875

struct SpellChainEffectsRec {
  uint32_t m_ID;
  float m_AvgSegLen;
  float m_Width;
  float m_NoiseScale;
  float m_TexCoordScale;
  uint32_t m_SegDuration;
  uint32_t m_SegDelay;
  stringref m_Texture;
};

3.3.5a.12340, 4.3.4.15595

struct SpellChainEffectsEntry // sizeof(0xB4)
{
   m_ID; // +0x0, size 0x4, type 0
   m_AvgSegLen; // +0x4, size 0x4, type 3
   m_Width; // +0x8, size 0x4, type 3
   m_NoiseScale; // +0xC, size 0x4, type 3
   m_TexCoordScale; // +0x10, size 0x4, type 3
   m_SegDuration; // +0x14, size 0x4, type 0
   m_SegDelay; // +0x18, size 0x4, type 0
   m_Texture; // +0x1C, size 0x4, type 2
   m_Flags; // +0x20, size 0x4, type 0
   m_JointCount; // +0x24, size 0x4, type 0
   m_JointOffsetRadius; // +0x28, size 0x4, type 3
   m_JointsPerMinorJoint; // +0x2C, size 0x4, type 0
   m_MinorJointsPerMajorJoint; // +0x30, size 0x4, type 0
   m_MinorJointScale; // +0x34, size 0x4, type 3
   m_MajorJointScale; // +0x38, size 0x4, type 3
   m_JointMoveSpeed; // +0x3C, size 0x4, type 3
   m_JointSmoothness; // +0x40, size 0x4, type 3
   m_MinDurationBetweenJointJumps; // +0x44, size 0x4, type 3
   m_MaxDurationBetweenJointJumps; // +0x48, size 0x4, type 3
   m_WaveHeight; // +0x4C, size 0x4, type 3
   m_WaveFreq; // +0x50, size 0x4, type 3
   m_WaveSpeed; // +0x54, size 0x4, type 3
   m_MinWaveAngle; // +0x58, size 0x4, type 3
   m_MaxWaveAngle; // +0x5C, size 0x4, type 3
   m_MinWaveSpin; // +0x60, size 0x4, type 3
   m_MaxWaveSpin; // +0x64, size 0x4, type 3
   m_ArcHeight; // +0x68, size 0x4, type 3
   m_MinArcAngle; // +0x6C, size 0x4, type 3
   m_MaxArcAngle; // +0x70, size 0x4, type 3
   m_MinArcSpin; // +0x74, size 0x4, type 3
   m_MaxArcSpin; // +0x78, size 0x4, type 3
   m_DelayBetweenEffects; // +0x7C, size 0x4, type 3
   m_MinFlickerOnDuration; // +0x80, size 0x4, type 3
   m_MaxFlickerOnDuration; // +0x84, size 0x4, type 3
   m_MinFlickerOffDuration; // +0x88, size 0x4, type 3
   m_MaxFlickerOffDuration; // +0x8C, size 0x4, type 3
   m_PulseSpeed; // +0x90, size 0x4, type 3
   m_PulseOnLength; // +0x94, size 0x4, type 3
   m_PulseFadeLength; // +0x98, size 0x4, type 3
   m_Alpha; // +0x9C, size 0x1, type 0
   m_Red; // +0x9D, size 0x1, type 0
   m_Green; // +0x9E, size 0x1, type 0
   m_Blue; // +0x9F, size 0x1, type 0
   m_BlendMode; // +0xA0, size 0x1, type 0
// there is three bytes of padding here!
   m_Combo; // +0xA4, size 0x4, type 2
   m_RenderLayer; // +0xA8, size 0x4, type 0
   m_TextureLength; // +0xAC, size 0x4, type 3
   m_WavePhase; // +0xB0, size 0x4, type 3
};

m_Combo

m_Combo is an encoded uint32_t array containing SpellChainEffectsRec::IDs, it is the predecessor of m_SpellChainEffectID. This is stored in the DB as the byte representation of this array converted to a string.

The client parses this data by reading, decoding (CLightning::DecodeChainEffectsID) and validating each uint32_t one at a time. Reading will cease if one of the following conditions occurs:

  1. All field data is read
  2. An invalid SpellChainEffectsRec::ID is found
  3. 12 SpellChainEffectsRec::IDs have been read (additional data is simply ignored)

Note: It appears any referenced records without a valid and accessible m_Texture will be skipped

uint32_t CLightning::DecodeChainEffectsID(uint32_t value) {
   return (
      ( value & 0xFEFEFEFE)        | 
      ((value & 0x08000000) >> 04) | 
      ((value & 0x04000000) >> 11) | 
      ((value & 0x40000000) >> 14) | 
      ((value & 0x02000000) >> 18) | 
      ((value & 0x20000000) >> 21) | 
      ((value & 0x10000000) >> 28)
   ) & 0xFFFFFF;
}

6.0.1.18179

struct SpellChainEffectsRec {
  uint32_t m_ID;
  float m_AvgSegLen;
  float m_Width;
  float m_NoiseScale;
  float m_TexCoordScale;
  uint32_t m_SegDuration;
  uint32_t m_SegDelay;
  uint32_t m_Flags;  // &0x20: CHAINFXFLAG_PULSING_ENABLED
  uint32_t m_JointCount;
  float m_JointOffsetRadius;
  uint32_t m_JointsPerMinorJoint;
  uint32_t m_MinorJointsPerMajorJoint;
  float m_MinorJointScale;
  float m_MajorJointScale;
  float m_JointMoveSpeed;
  float m_JointSmoothness;
  float m_MinDurationBetweenJointJumps;
  float m_MaxDurationBetweenJointJumps;
  float m_WaveHeight;
  float m_WaveFreq;
  float m_WaveSpeed;
  float m_MinWaveAngle;
  float m_MaxWaveAngle;
  float m_MinWaveSpin;
  float m_MaxWaveSpin;
  float m_ArcHeight;
  float m_MinArcAngle;
  float m_MaxArcAngle;
  float m_MinArcSpin;
  float m_MaxArcSpin;
  float m_DelayBetweenEffects;
  float m_MinFlickerOnDuration;
  float m_MaxFlickerOnDuration;
  float m_MinFlickerOffDuration;
  float m_MaxFlickerOffDuration;
  float m_PulseSpeed;
  float m_PulseOnLength;
  float m_PulseFadeLength;
  uint8_t m_Alpha;
  uint8_t m_Red;
  uint8_t m_Green;
  uint8_t m_Blue;
  uint8_t m_BlendMode;
  uint8_t padding_0[3];
  uint32_t m_RenderLayer;
  float m_TextureLength;
  float m_WavePhase;
  uint32_t m_SpellChainEffectID[11];
  stringref m_Texture;
};