From 4181b8f28b17c533f6be033a353d34210e82e1b3 Mon Sep 17 00:00:00 2001 From: TOM_RUS Date: Tue, 10 May 2011 16:10:32 +0400 Subject: [PATCH] Added spell cast flags research. --- src/game/DBCEnums.h | 2 +- src/game/DBCStructure.h | 2 +- src/game/SharedDefines.h | 2 +- src/game/Spell.cpp | 64 ++++++++++++++++++++++++---------------- src/game/Spell.h | 48 +++++++++++++++--------------- 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/src/game/DBCEnums.h b/src/game/DBCEnums.h index e5833cf4c..cc9014575 100644 --- a/src/game/DBCEnums.h +++ b/src/game/DBCEnums.h @@ -420,7 +420,7 @@ enum SpellCastTargetFlags TARGET_FLAG_UNK2 = 0x00010000, // pguid, not used in any spells as of 3.0.3 (can be set dynamically) TARGET_FLAG_GLYPH = 0x00020000, // used in glyph spells TARGET_FLAG_UNK3 = 0x00040000, // - TARGET_FLAG_UNK4 = 0x00080000 // uint32, loop { vec3, guid -> if guid == 0 break } + TARGET_FLAG_VISUAL_CHAIN = 0x00080000 // uint32, loop { vec3, guid -> if guid == 0 break } }; enum SpellEffectIndex diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index bd71cb008..4f496e47b 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1510,7 +1510,7 @@ struct SpellEntry uint32 Category; // 1 m_category uint32 Dispel; // 2 m_dispelType uint32 Mechanic; // 3 m_mechanic - uint32 Attributes; // 4 m_attribute + uint32 Attributes; // 4 m_attributes uint32 AttributesEx; // 5 m_attributesEx uint32 AttributesEx2; // 6 m_attributesExB uint32 AttributesEx3; // 7 m_attributesExC diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 8b23914dd..5db7aa673 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -253,7 +253,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_LEVEL_DAMAGE_CALCULATION 0x00080000 // 19 spelldamage depends on caster level #define SPELL_ATTR_STOP_ATTACK_TARGET 0x00100000 // 20 Stop attack after use this spell (and not begin attack if use) #define SPELL_ATTR_IMPOSSIBLE_DODGE_PARRY_BLOCK 0x00200000 // 21 Cannot be dodged/parried/blocked -#define SPELL_ATTR_UNK22 0x00400000 // 22 +#define SPELL_ATTR_SET_TRACKING_TARGET 0x00400000 // 22 SetTrackingTarget #define SPELL_ATTR_UNK23 0x00800000 // 23 castable while dead? #define SPELL_ATTR_CASTABLE_WHILE_MOUNTED 0x01000000 // 24 castable while mounted #define SPELL_ATTR_DISABLED_WHILE_ACTIVE 0x02000000 // 25 Activate and start cooldown after aura fade or remove summoned creature or go diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 207a85d5c..b90911135 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3588,12 +3588,12 @@ void Spell::SendSpellStart() DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); - uint32 castFlags = CAST_FLAG_UNKNOWN1; + uint32 castFlags = CAST_FLAG_UNKNOWN2; if (IsRangedSpell()) castFlags |= CAST_FLAG_AMMO; if (m_spellInfo->runeCostID) - castFlags |= CAST_FLAG_UNKNOWN10; + castFlags |= CAST_FLAG_UNKNOWN19; WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2)); if (m_CastItem) @@ -3602,16 +3602,17 @@ void Spell::SendSpellStart() data << m_caster->GetPackGUID(); data << m_caster->GetPackGUID(); - data << uint8(m_cast_count); // pending spell cast? + data << uint8(m_cast_count); // pending spell cast data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags data << uint32(m_timer); // delay? + data << m_targets; - if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power? + if (castFlags & CAST_FLAG_PREDICTED_POWER) // predicted power data << uint32(0); - if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list + if (castFlags & CAST_FLAG_PREDICTED_RUNES) // predicted runes { uint8 v1 = 0;//m_runesState; uint8 v2 = 0;//((Player*)m_caster)->GetRunesState(); @@ -3626,13 +3627,13 @@ void Spell::SendSpellStart() } } - if ( castFlags & CAST_FLAG_AMMO ) + if (castFlags & CAST_FLAG_AMMO) // projectile info WriteAmmoToPacket(&data); - if ( castFlags & CAST_FLAG_UNKNOWN21 ) + if (castFlags & CAST_FLAG_IMMUNITY) // cast immunity { - data << uint32(0); - data << uint32(0); + data << uint32(0); // used for SetCastSchoolImmunities + data << uint32(0); // used for SetCastImmunities } m_caster->SendMessageToSet(&data, true); @@ -3641,25 +3642,25 @@ void Spell::SendSpellStart() void Spell::SendSpellGo() { // not send invisible spell casting - if(!IsNeedSendToClient()) + if (!IsNeedSendToClient()) return; DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "Sending SMSG_SPELL_GO id=%u", m_spellInfo->Id); - uint32 castFlags = CAST_FLAG_UNKNOWN3; - if(IsRangedSpell()) + uint32 castFlags = CAST_FLAG_UNKNOWN9; + if (IsRangedSpell()) castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual - if((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) && m_spellInfo->runeCostID) + if ((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) && m_spellInfo->runeCostID) { - castFlags |= CAST_FLAG_UNKNOWN10; // same as in SMSG_SPELL_START - castFlags |= CAST_FLAG_UNKNOWN6; // makes cooldowns visible - castFlags |= CAST_FLAG_UNKNOWN7; // rune cooldowns list + castFlags |= CAST_FLAG_UNKNOWN19; // same as in SMSG_SPELL_START + castFlags |= CAST_FLAG_PREDICTED_POWER; // makes cooldowns visible + castFlags |= CAST_FLAG_PREDICTED_RUNES; // rune cooldowns list } WorldPacket data(SMSG_SPELL_GO, 50); // guess size - if(m_CastItem) + if (m_CastItem) data << m_CastItem->GetPackGUID(); else data << m_caster->GetPackGUID(); @@ -3668,16 +3669,16 @@ void Spell::SendSpellGo() data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags - data << uint32(WorldTimer::getMSTime()); // timestamp + data << uint32(WorldTimer::getMSTime()); // timestamp WriteSpellGoTargets(&data); data << m_targets; - if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power? + if (castFlags & CAST_FLAG_PREDICTED_POWER) // predicted power data << uint32(0); - if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list + if (castFlags & CAST_FLAG_PREDICTED_RUNES) // predicted runes { uint8 v1 = m_runesState; uint8 v2 = m_caster->getClass() == CLASS_DEATH_KNIGHT ? ((Player*)m_caster)->GetRunesState() : 0; @@ -3692,26 +3693,37 @@ void Spell::SendSpellGo() } } - if ( castFlags & CAST_FLAG_UNKNOWN4 ) // unknown wotlk + if (castFlags & CAST_FLAG_ADJUST_MISSILE) // adjust missile trajectory duration { data << float(0); data << uint32(0); } - if ( castFlags & CAST_FLAG_AMMO ) + if (castFlags & CAST_FLAG_AMMO) // projectile info WriteAmmoToPacket(&data); - if ( castFlags & CAST_FLAG_UNKNOWN5 ) // unknown wotlk + if (castFlags & CAST_FLAG_VISUAL_CHAIN) // spell visual chain effect { - data << uint32(0); - data << uint32(0); + data << uint32(0); // SpellVisual.dbc id? + data << uint32(0); // overrides previous field if > 0 and violencelevel client cvar < 2 } - if ( m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION ) + if (m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION) { data << uint8(0); // The value increase for each time, can remind of a cast count for the spell } + if (m_targets.m_targetMask & TARGET_FLAG_VISUAL_CHAIN) // probably used (or can be used) with CAST_FLAG_VISUAL_CHAIN flag + { + data << uint32(0); // count + + //for(int = 0; i < count; ++i) + //{ + // // position and guid? + // data << float(0) << float(0) << float(0) << uint64(0); + //} + } + m_caster->SendMessageToSet(&data, true); } diff --git a/src/game/Spell.h b/src/game/Spell.h index 83aa10015..923bd26f0 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -38,30 +38,30 @@ class Aura; enum SpellCastFlags { - CAST_FLAG_NONE = 0x00000000, - CAST_FLAG_UNKNOWN0 = 0x00000001, // may be pending spell cast - CAST_FLAG_UNKNOWN1 = 0x00000002, - CAST_FLAG_UNKNOWN11 = 0x00000004, - CAST_FLAG_UNKNOWN12 = 0x00000008, - CAST_FLAG_UNKNOWN2 = 0x00000010, - CAST_FLAG_AMMO = 0x00000020, // Projectiles visual - CAST_FLAG_UNKNOWN8 = 0x00000040, - CAST_FLAG_UNKNOWN9 = 0x00000080, - CAST_FLAG_UNKNOWN3 = 0x00000100, - CAST_FLAG_UNKNOWN13 = 0x00000200, - CAST_FLAG_UNKNOWN14 = 0x00000400, - CAST_FLAG_UNKNOWN6 = 0x00000800, // wotlk, trigger rune cooldown - CAST_FLAG_UNKNOWN15 = 0x00001000, - CAST_FLAG_UNKNOWN16 = 0x00002000, - CAST_FLAG_UNKNOWN17 = 0x00004000, - CAST_FLAG_UNKNOWN18 = 0x00008000, - CAST_FLAG_UNKNOWN19 = 0x00010000, - CAST_FLAG_UNKNOWN4 = 0x00020000, // wotlk - CAST_FLAG_UNKNOWN10 = 0x00040000, - CAST_FLAG_UNKNOWN5 = 0x00080000, // wotlk - CAST_FLAG_UNKNOWN20 = 0x00100000, - CAST_FLAG_UNKNOWN7 = 0x00200000, // wotlk, rune cooldown list - CAST_FLAG_UNKNOWN21 = 0x04000000 + CAST_FLAG_NONE = 0x00000000, + CAST_FLAG_HIDDEN_COMBATLOG = 0x00000001, // hide in combat log? + CAST_FLAG_UNKNOWN2 = 0x00000002, + CAST_FLAG_UNKNOWN3 = 0x00000004, + CAST_FLAG_UNKNOWN4 = 0x00000008, + CAST_FLAG_UNKNOWN5 = 0x00000010, + CAST_FLAG_AMMO = 0x00000020, // Projectiles visual + CAST_FLAG_UNKNOWN7 = 0x00000040, // !0x41 mask used to call CGTradeSkillInfo::DoRecast + CAST_FLAG_UNKNOWN8 = 0x00000080, + CAST_FLAG_UNKNOWN9 = 0x00000100, + CAST_FLAG_UNKNOWN10 = 0x00000200, + CAST_FLAG_UNKNOWN11 = 0x00000400, + CAST_FLAG_PREDICTED_POWER = 0x00000800, // wotlk, trigger rune cooldown + CAST_FLAG_UNKNOWN13 = 0x00001000, + CAST_FLAG_UNKNOWN14 = 0x00002000, + CAST_FLAG_UNKNOWN15 = 0x00004000, + CAST_FLAG_UNKNOWN16 = 0x00008000, + CAST_FLAG_UNKNOWN17 = 0x00010000, + CAST_FLAG_ADJUST_MISSILE = 0x00020000, // wotlk + CAST_FLAG_UNKNOWN19 = 0x00040000, // spell cooldown related (may be category cooldown) + CAST_FLAG_VISUAL_CHAIN = 0x00080000, // wotlk + CAST_FLAG_UNKNOWN21 = 0x00100000, + CAST_FLAG_PREDICTED_RUNES = 0x00200000, // wotlk, rune cooldown list + CAST_FLAG_IMMUNITY = 0x04000000 // spell cast school imminity info }; enum SpellNotifyPushType