DB/SpellChainEffects

From wowdev
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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;
};