aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Player.cpp114
1 files changed, 51 insertions, 63 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index c50c8721cb1..58749dc877d 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -3396,7 +3396,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
removeSpell(node->next,disabled);
}
//unlearn spells dependent from recently removed spells
- SpellsRequiringSpellMap const& reqMap = spellmgr.GetSpellsRequiringSpell();
+ SpellsRequiringSpellMap const &reqMap = spellmgr.GetSpellsRequiringSpell();
SpellsRequiringSpellMap::const_iterator itr2 = reqMap.find(spell_id);
for (uint32 i = reqMap.count(spell_id); i > 0; --i, ++itr2)
removeSpell(itr2->second,disabled,false);
@@ -3430,12 +3430,12 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
// remove pet auras
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- if (PetAura const* petSpell = spellmgr.GetPetAura(spell_id, i))
+ if (PetAura const *petSpell = spellmgr.GetPetAura(spell_id, i))
RemovePetAura(petSpell);
// free talent points
uint32 talentCosts = GetTalentSpellCost(spell_id);
- if(talentCosts > 0)
+ if (talentCosts > 0)
{
if (talentCosts < m_usedTalentCount)
m_usedTalentCount -= talentCosts;
@@ -3452,7 +3452,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
}
// remove dependent skill
- SpellLearnSkillNode const* spellLearnSkill = spellmgr.GetSpellLearnSkill(spell_id);
+ SpellLearnSkillNode const *spellLearnSkill = spellmgr.GetSpellLearnSkill(spell_id);
if (spellLearnSkill)
{
uint32 prev_spell = spellmgr.GetPrevSpellInChain(spell_id);
@@ -3461,7 +3461,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
else
{
// search prev. skill setting by spell ranks chain
- SpellLearnSkillNode const* prevSkill = spellmgr.GetSpellLearnSkill(prev_spell);
+ SpellLearnSkillNode const *prevSkill = spellmgr.GetSpellLearnSkill(prev_spell);
while (!prevSkill && prev_spell)
{
prev_spell = spellmgr.GetPrevSpellInChain(prev_spell);
@@ -3481,7 +3481,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
if (skill_max_value > new_skill_max_value)
- skill_max_value = new_skill_max_value;
+ skill_max_value = new_skill_max_value;
SetSkill(prevSkill->skill,skill_value,skill_max_value);
}
@@ -3791,9 +3791,10 @@ bool Player::resetTalents(bool no_cost)
}
*/
- for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
+ PlayerTalentMap::iterator plrTalent = m_talents[m_activeSpec]->find(talentInfo->TalentID);
+ if (plrTalent != m_talents[m_activeSpec]->end())
{
- if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], m_activeSpec))
+ for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
{
for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
{
@@ -3820,8 +3821,7 @@ bool Player::resetTalents(bool no_cost)
else
++itr;
}
- //removeSpell(talentInfo->RankID[rank], false, false);
- m_talents[m_activeSpec]->find(talentInfo->RankID[rank])->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
+ plrTalent->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
}
}
}
@@ -21998,64 +21998,55 @@ void Player::ActivateSpec(uint8 spec)
//RemoveAllAuras(this->GetGUID(), NULL, false, true); // removes too many auras
//ExitVehicle(); // should be impossible to switch specs from inside a vehicle..
- // Remove all talents and talent-learned spells under this spec.
- for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
- {
- TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
-
- if (!talentInfo)
- continue;
-
- TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
-
- if (!talentTabInfo)
- continue;
+ // find class talent tabs (all players have 3 talent tabs)
+ uint32 const *talentTabIds = GetTalentTabPages(getClass());
- // unlearn only talents for character class
- // some spell learned by one class as normal spells or know at creation but another class learn it as talent,
- // to prevent unexpected lost normal learned spell skip another class talents
- if ((getClassMask() & talentTabInfo->ClassMask) == 0)
- continue;
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ uint32 talentTabId = talentTabIds[i];
- /*
- for (PlayerTalentMap::iterator itr = m_talents[m_activeSpec]->begin(); itr != m_talents[m_activeSpec]->end(); ++itr)
+ for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
- removeSpell(itr->first, !IsPassiveSpell(itr->first), false);
- itr->second->state = PLAYERSPELL_REMOVED;
- }
- */
+ TalentEntry const *talentInfo = sTalentStore.LookupEntry(talentId);
+ if (!talentInfo)
+ continue;
- for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
- {
- if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], m_activeSpec))
+ // skip another tab talents
+ if (talentInfo->TalentTab != talentTabId)
+ continue;
+
+ PlayerTalentMap::iterator plrTalent = m_talents[m_activeSpec]->find(talentInfo->TalentID);
+ if (plrTalent != m_talents[m_activeSpec]->end())
{
- for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
+ for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
{
- // remove learned spells (all ranks)
- uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
-
- // unlearn if first rank is talent or learned by talent
- if (itrFirstId == talentInfo->RankID[rank])
- {
- itr->second->disabled = false;
- itr->second->state = PLAYERSPELL_NEW;
- removeSpell(itr->first, false, false);
- itr = GetSpellMap().begin();
- continue;
- }
- else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
+ for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
{
- itr->second->disabled = false;
- itr->second->state = PLAYERSPELL_NEW;
- removeSpell(itr->first, false, true);
- itr = GetSpellMap().begin();
- continue;
+ // remove learned spells (all ranks)
+ uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
+
+ // unlearn if first rank is talent or learned by talent
+ if (itrFirstId == talentInfo->RankID[rank])
+ {
+ itr->second->disabled = false;
+ itr->second->state = PLAYERSPELL_NEW;
+ removeSpell(itr->first, false, false);
+ itr = GetSpellMap().begin();
+ continue;
+ }
+ else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
+ {
+ itr->second->disabled = false;
+ itr->second->state = PLAYERSPELL_NEW;
+ removeSpell(itr->first, false, true);
+ itr = GetSpellMap().begin();
+ continue;
+ }
+ else
+ ++itr;
}
- else
- ++itr;
+ plrTalent->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
}
- //removeSpell(talentInfo->RankID[rank], false, false);
- //m_talents[m_activeSpec]->find(talentInfo->RankID[rank])->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
}
}
}
@@ -22070,16 +22061,13 @@ void Player::ActivateSpec(uint8 spec)
SetActiveSpec(spec);
uint32 spentTalents = 0;
- // find class talent tabs (all players have 3 talent tabs)
- uint32 const *talentTabIds = GetTalentTabPages(getClass());
-
for (uint8 i = 0; i < 3; ++i)
{
uint32 talentTabId = talentTabIds[i];
for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
- TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
+ TalentEntry const *talentInfo = sTalentStore.LookupEntry(talentId);
if (!talentInfo)
continue;