diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 |
3 files changed, 24 insertions, 21 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0a95fed3138..46e455765d3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2935,6 +2935,7 @@ void Player::GiveLevel(uint8 level) SetLevel(level); UpdateSkillsForLevel(); + LearnSpecializationSpells(); // save base values (bonuses already included in stored stats for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) @@ -3046,6 +3047,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUInt32Value(UNIT_FIELD_AURASTATE, 0); UpdateSkillsForLevel(); + LearnSpecializationSpells(); // set default cast time multiplier SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); @@ -4141,12 +4143,6 @@ bool Player::ResetTalents(bool noCost) RemoveTalent(talentInfo); } - // Remove spec specific spells - RemoveSpecializationSpells(); - - SetSpecId(GetActiveTalentGroup(), 0); - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0); - SQLTransaction trans = CharacterDatabase.BeginTransaction(); _SaveTalents(trans); _SaveSpells(trans); @@ -27163,25 +27159,28 @@ Difficulty Player::CheckLoadedLegacyRaidDifficultyID(Difficulty difficulty) SpellInfo const* Player::GetCastSpellInfo(SpellInfo const* spellInfo) const { - auto range = m_overrideSpells.equal_range(spellInfo->Id); - for (auto itr = range.first; itr != range.second; ++itr) - if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(itr->second)) + auto overrides = m_overrideSpells.find(spellInfo->Id); + for (uint32 spellId : overrides->second) + if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(spellId)) return Unit::GetCastSpellInfo(newInfo); return Unit::GetCastSpellInfo(spellInfo); } +void Player::AddOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) +{ + m_overrideSpells[overridenSpellId].insert(newSpellId); +} + void Player::RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) { - auto range = m_overrideSpells.equal_range(overridenSpellId); - for (auto itr = range.first; itr != range.second; ++itr) - { - if (itr->second == newSpellId) - { - m_overrideSpells.erase(itr); - break; - } - } + auto overrides = m_overrideSpells.find(overridenSpellId); + if (overrides == m_overrideSpells.end()) + return; + + overrides->second.erase(newSpellId); + if (overrides->second.empty()) + m_overrideSpells.erase(overrides); } void Player::LearnSpecializationSpells() @@ -27191,6 +27190,10 @@ void Player::LearnSpecializationSpells() for (size_t j = 0; j < specSpells->size(); ++j) { SpecializationSpellsEntry const* specSpell = specSpells->at(j); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(specSpell->SpellID); + if (!spellInfo || spellInfo->SpellLevel > getLevel()) + continue; + LearnSpell(specSpell->SpellID, false); if (specSpell->OverridesSpellID) AddOverrideSpell(specSpell->OverridesSpellID, specSpell->SpellID); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 064fba79fb1..7366bde52d7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1837,7 +1837,7 @@ class Player : public Unit, public GridObject<Player> void LearnSpellHighestRank(uint32 spellid); void AddTemporarySpell(uint32 spellId); void RemoveTemporarySpell(uint32 spellId); - void AddOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) { m_overrideSpells.emplace(overridenSpellId, newSpellId); } + void AddOverrideSpell(uint32 overridenSpellId, uint32 newSpellId); void RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId); void LearnSpecializationSpells(); void RemoveSpecializationSpells(); @@ -2795,7 +2795,7 @@ class Player : public Unit, public GridObject<Player> PlayerMails m_mail; PlayerSpellMap m_spells; - std::unordered_multimap<uint32 /*overridenSpellId*/, uint32 /*newSpellId*/> m_overrideSpells; + std::unordered_map<uint32 /*overridenSpellId*/, std::unordered_set<uint32> /*newSpellId*/> m_overrideSpells; uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use GlobalCooldownMgr m_GlobalCooldownMgr; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 7c5ab810ce4..4e52adf9944 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5769,7 +5769,7 @@ void Spell::EffectCreateAreaTrigger(SpellEffIndex /*effIndex*/) delete areaTrigger; } -void Spell::EffectRemoveTalent(SpellEffIndex effIndex) +void Spell::EffectRemoveTalent(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; |