diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-05-19 00:04:23 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-05-19 00:04:23 +0200 |
commit | 4acae3992bfecf85d68c0860007f7c538ca45a90 (patch) | |
tree | efc6fc10aa6932c2f6059d426be4ddea7262c83a | |
parent | 7a68001452f6eb83df3889a4ef90a7c317ec0eec (diff) |
Core/Players: Only restore spells learned as quest rewards if they have the right AcquireMethod in SkillLineAbility.db2
Closes #24645
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 |
3 files changed, 13 insertions, 9 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 65e0134a964..76375ae88fa 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -955,7 +955,8 @@ enum MapFlags enum AbilytyLearnType { SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE = 1, // Spell state will update depending on skill value - SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN = 2 // Spell will be learned/removed together with entire skill + SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN = 2, // Spell will be learned/removed together with entire skill + SKILL_LINE_ABILITY_REWARDED_FROM_QUEST = 4 // Learned as quest reward, also re-learned if missing }; enum GlyphSlotType diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cd60f5da86b..c2e5e8b02e1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24499,12 +24499,18 @@ void Player::LearnQuestRewardedSpells(Quest const* quest) uint32 learned_0 = effect->TriggerSpell; if (!HasSpell(learned_0)) { - SpellInfo const* learnedInfo = sSpellMgr->GetSpellInfo(learned_0); - if (!learnedInfo) - return; + found = false; + SkillLineAbilityMapBounds skills = sSpellMgr->GetSkillLineAbilityMapBounds(learned_0); + for (auto skillItr = skills.first; skillItr != skills.second; ++skillItr) + { + if (skillItr->second->AcquireMethod == SKILL_LINE_ABILITY_REWARDED_FROM_QUEST) + { + found = true; + break; + } + } - // profession specialization can be re-learned from npc - if (learnedInfo->GetEffect(EFFECT_0)->Effect == SPELL_EFFECT_TRADE_SKILL && learnedInfo->GetEffect(EFFECT_1)->Effect == 0 && !learnedInfo->SpellLevel) + if (!found) return; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 3f0fa402ac2..aa4454de7f9 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5169,9 +5169,6 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint } case SPELL_EFFECT_LEARN_SPELL: { - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return SPELL_FAILED_BAD_TARGETS; - if (effect->TargetA.GetTarget() != TARGET_UNIT_PET) break; |