diff options
Diffstat (limited to 'src/game/SpellMgr.cpp')
| -rw-r--r-- | src/game/SpellMgr.cpp | 266 | 
1 files changed, 255 insertions, 11 deletions
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 9e0b69d0777..dfa25cef538 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -889,17 +889,6 @@ bool IsSingleTargetSpells(SpellEntry const *spellInfo1, SpellEntry const *spellI      return false;  } -bool IsAuraAddedBySpell(uint32 auraType, uint32 spellId) -{ -    SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId); -    if (!spellproto) return false; - -    for (int i = 0; i < 3; ++i) -        if (spellproto->EffectApplyAuraName[i] == auraType) -            return true; -    return false; -} -  SpellCastResult GetErrorAtShapeshiftedCast (SpellEntry const *spellInfo, uint32 form)  {      // talents that learn spells can have stance requirements that need ignore @@ -2593,6 +2582,261 @@ void SpellMgr::LoadSkillLineAbilityMap()      sLog.outString(">> Loaded %u SkillLineAbility MultiMap Data", count);  } +void SpellMgr::CheckUsedSpells(char const* table) +{ +    uint32 countSpells = 0; +    uint32 countMasks = 0; + +    //                                                 0       1               2                3                4         5           6             7          8          9         10   11 +    QueryResult *result = WorldDatabase.PQuery("SELECT spellid,SpellFamilyName,SpellFamilyMaskA,SpellFamilyMaskB,SpellIcon,SpellVisual,SpellCategory,EffectType,EffectAura,EffectIdx,Name,Code FROM %s",table); + +    if( !result ) +    { +        barGoLink bar( 1 ); + +        bar.step(); + +        sLog.outString(); +        sLog.outErrorDb("`%s` table is empty!",table); +        return; +    } + +    barGoLink bar( result->GetRowCount() ); + +    do +    { +        Field *fields = result->Fetch(); + +        bar.step(); + +        uint32 spell       = fields[0].GetUInt32(); +        int32  family      = fields[1].GetInt32(); +        uint64 familyMaskA = fields[2].GetUInt64(); +        uint32 familyMaskB = fields[3].GetUInt32(); +        flag96 familyMask(familyMaskA, familyMaskB); +        int32  spellIcon   = fields[4].GetInt32(); +        int32  spellVisual = fields[5].GetInt32(); +        int32  category    = fields[6].GetInt32(); +        int32  effectType  = fields[7].GetInt32(); +        int32  auraType    = fields[8].GetInt32(); +        int32  effectIdx   = fields[9].GetInt32(); +        std::string name   = fields[10].GetCppString(); +        std::string code   = fields[11].GetCppString(); + +        // checks of correctness requirements itself + +        if (family < -1 || family > SPELLFAMILY_PET) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellFamily value(%u), skipped.",table,spell,family); +            continue; +        } + +        // TODO: spellIcon check need dbc loading +        if (spellIcon < -1) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellIcon value(%u), skipped.",table,spell,spellIcon); +            continue; +        } + +        // TODO: spellVisual check need dbc loading +        if (spellVisual < -1) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellVisual value(%u), skipped.",table,spell,spellVisual); +            continue; +        } + +        // TODO: for spellCategory better check need dbc loading +        if (category < -1 || category >=0 && sSpellCategoryStore.find(category) == sSpellCategoryStore.end()) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellCategory value(%u), skipped.",table,spell,category); +            continue; +        } + +        if (effectType < -1 || effectType >= TOTAL_SPELL_EFFECTS) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellEffect type value(%u), skipped.",table,spell,effectType); +            continue; +        } + +        if (auraType < -1 || auraType >= TOTAL_AURAS) +        { +            sLog.outError("Table '%s' for spell %u have wrong SpellAura type value(%u), skipped.",table,spell,auraType); +            continue; +        } + +        if (effectIdx < -1 || effectIdx >= 3) +        { +            sLog.outError("Table '%s' for spell %u have wrong EffectIdx value(%u), skipped.",table,spell,effectIdx); +            continue; +        } + +        // now checks of requirements + +        if(spell) +        { +            ++countSpells; + +            SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell); +            if(!spellEntry) +            { +                sLog.outError("Spell %u '%s' not exist but used in %s.",spell,name.c_str(),code.c_str()); +                continue; +            } + +            if(family >= 0 && spellEntry->SpellFamilyName != family) +            { +                sLog.outError("Spell %u '%s' family(%u) <> %u but used in %s.",spell,name.c_str(),spellEntry->SpellFamilyName,family,code.c_str()); +                continue; +            } + +            if(familyMaskA != UI64LIT(0xFFFFFFFFFFFFFFFF) || familyMaskB != 0xFFFFFFFF) +            { +                if(familyMaskA == UI64LIT(0x0000000000000000) && familyMaskB == 0x00000000) +                { +                    if(spellEntry->SpellFamilyFlags) +                    { +                        sLog.outError("Spell %u '%s' not fit to (" I64FMT "," I32FMT ") but used in %s.",spell,name.c_str(),familyMaskA,familyMaskB,code.c_str()); +                        continue; +                    } + +                } +                else +                { +                    if(!(spellEntry->SpellFamilyFlags & familyMask)) +                    { +                        sLog.outError("Spell %u '%s' not fit to (" I64FMT "," I32FMT ") but used in %s.",spell,name.c_str(),familyMaskA,familyMaskB,code.c_str()); +                        continue; +                    } + +                } +            } + +            if(spellIcon >= 0 && spellEntry->SpellIconID != spellIcon) +            { +                sLog.outError("Spell %u '%s' icon(%u) <> %u but used in %s.",spell,name.c_str(),spellEntry->SpellIconID,spellIcon,code.c_str()); +                continue; +            } + +            if(spellVisual >= 0 && spellEntry->SpellVisual[0] != spellVisual) +            { +                sLog.outError("Spell %u '%s' visual(%u) <> %u but used in %s.",spell,name.c_str(),spellEntry->SpellVisual[0],spellVisual,code.c_str()); +                continue; +            } + +            if(category >= 0 && spellEntry->Category != category) +            { +                sLog.outError("Spell %u '%s' category(%u) <> %u but used in %s.",spell,name.c_str(),spellEntry->Category,category,code.c_str()); +                continue; +            } + +            if(effectIdx >= 0) +            { +                if(effectType >= 0 && spellEntry->Effect[effectIdx] != effectType) +                { +                    sLog.outError("Spell %u '%s' effect%d <> %u but used in %s.",spell,name.c_str(),effectIdx+1,effectType,code.c_str()); +                    continue; +                } + +                if(auraType >= 0 && spellEntry->EffectApplyAuraName[effectIdx] != auraType) +                { +                    sLog.outError("Spell %u '%s' aura%d <> %u but used in %s.",spell,name.c_str(),effectIdx+1,auraType,code.c_str()); +                    continue; +                } + +            } +            else +            { +                if(effectType >= 0 && !IsSpellHaveEffect(spellEntry,SpellEffects(effectType))) +                { +                    sLog.outError("Spell %u '%s' not have effect %u but used in %s.",spell,name.c_str(),effectType,code.c_str()); +                    continue; +                } + +                if(auraType >= 0 && !IsSpellHaveAura(spellEntry,AuraType(auraType))) +                { +                    sLog.outError("Spell %u '%s' not have aura %u but used in %s.",spell,name.c_str(),auraType,code.c_str()); +                    continue; +                } +            } +        } +        else +        { +            ++countMasks; + +            bool found = false; +            for(uint32 spellId = 1; spellId < sSpellStore.GetNumRows(); ++spellId) +            { +                SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellId); +                if(!spellEntry) +                    continue; + +                if(family >=0 && spellEntry->SpellFamilyName != family) +                    continue; + +                if(familyMaskA != UI64LIT(0xFFFFFFFFFFFFFFFF) || familyMaskB != 0xFFFFFFFF) +                { +                    if(familyMaskA == UI64LIT(0x0000000000000000) && familyMaskB == 0x00000000) +                    { +                        if(spellEntry->SpellFamilyFlags) +                            continue; +                    } +                    else +                    { +                        if(!(spellEntry->SpellFamilyFlags & familyMask)) +                            continue; +                    } +                } + +                if(spellIcon >= 0 && spellEntry->SpellIconID != spellIcon) +                    continue; + +                if(spellVisual >= 0 && spellEntry->SpellVisual[0] != spellVisual) +                    continue; + +                if(category >= 0 && spellEntry->Category != category) +                    continue; + +                if(effectIdx >= 0) +                { +                    if(effectType >=0 && spellEntry->Effect[effectIdx] != effectType) +                        continue; + +                    if(auraType >=0 && spellEntry->EffectApplyAuraName[effectIdx] != auraType) +                        continue; +                } +                else +                { +                    if(effectType >=0 && !IsSpellHaveEffect(spellEntry,SpellEffects(effectType))) +                        continue; + +                    if(auraType >=0 && !IsSpellHaveAura(spellEntry,AuraType(auraType))) +                        continue; +                } + +                found = true; +                break; +            } + +            if(!found) +            { +                if(effectIdx >= 0) +                    sLog.outError("Spells '%s' not found for family %i (" I64FMT "," I32FMT ") icon(%i) visual(%i) category(%i) effect%d(%i) aura%d(%i) but used in %s", +                        name.c_str(),family,familyMaskA,familyMaskB,spellIcon,spellVisual,category,effectIdx+1,effectType,effectIdx+1,auraType,code.c_str()); +                else +                    sLog.outError("Spells '%s' not found for family %i (" I64FMT "," I32FMT ") icon(%i) visual(%i) category(%i) effect(%i) aura(%i) but used in %s", +                        name.c_str(),family,familyMaskA,familyMaskB,spellIcon,spellVisual,category,effectType,auraType,code.c_str()); +                continue; +            } +        } + +    } while( result->NextRow() ); + +    delete result; + +    sLog.outString(); +    sLog.outString( ">> Checked %u spells and %u spell masks", countSpells, countMasks ); +} +  DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered)  {      // Explicit Diminishing Groups  | 
