diff options
author | QAston <none@none> | 2010-01-31 17:24:13 +0100 |
---|---|---|
committer | QAston <none@none> | 2010-01-31 17:24:13 +0100 |
commit | ac388e6f214ff02c504c5ea8af7c1c468bf07406 (patch) | |
tree | 5c40909de90de1296f73c4d98d940c8879ce7c98 /src/game/ObjectMgr.cpp | |
parent | d435366bceaf6f04dfe226e0838c2893519db5be (diff) |
*Add support for spells in npc_trainer table with multiple SPELL_EFFECT_LEARN_SPELL, this fixes problems with learning such spells from trainers.
--HG--
branch : trunk
Diffstat (limited to 'src/game/ObjectMgr.cpp')
-rw-r--r-- | src/game/ObjectMgr.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index ccac86f9202..4f9f2b1faa2 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -8015,20 +8015,33 @@ void ObjectMgr::LoadTrainerSpell() trainerSpell.reqLevel = spellinfo->spellLevel; // calculate learned spell for profession case when stored cast-spell - trainerSpell.learnedSpell = spell; - for (uint8 i = 0; i <3; ++i) + trainerSpell.learnedSpell[0] = spell; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if(spellinfo->Effect[i] != SPELL_EFFECT_LEARN_SPELL) continue; - if(SpellMgr::IsProfessionOrRidingSpell(spellinfo->EffectTriggerSpell[i])) + // player must be able to cast spell on himself + if (spellinfo->EffectImplicitTargetA[i] != 0 && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ALLY && spellinfo->EffectImplicitTargetA[i] != TARGET_UNIT_TARGET_ANY) { - trainerSpell.learnedSpell = spellinfo->EffectTriggerSpell[i]; - break; + sLog.outErrorDb("Table `npc_trainer` has spell %u for trainer entry %u with learn effect which has incorrect target type, ignoring learn effect!", spell, entry); + continue; } + if (trainerSpell.learnedSpell[0] == spell) + trainerSpell.learnedSpell[0] = 0; + + trainerSpell.learnedSpell[i] = spellinfo->EffectTriggerSpell[i]; } - if(SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell)) - data.trainerType = 2; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + if (!trainerSpell.learnedSpell[i]) + continue; + if(SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell[i])) + { + data.trainerType = 2; + break; + } + } ++count; |