aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp39
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
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;