*Fix the issue with Passive talents never being removed, thanks MetaphysicalDrama ;D Refs #371, #370, #367, #368, #326
--HG-- branch : trunk
This commit is contained in:
+35
-20
@@ -3797,32 +3797,30 @@ bool Player::resetTalents(bool no_cost)
|
|||||||
{
|
{
|
||||||
for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
|
for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
|
||||||
{
|
{
|
||||||
if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled)
|
|
||||||
{
|
|
||||||
++itr;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove learned spells (all ranks)
|
// remove learned spells (all ranks)
|
||||||
uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
|
uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
|
||||||
|
|
||||||
// unlearn if first rank is talent or learned by talent
|
// unlearn if first rank is talent or learned by talent
|
||||||
if (itrFirstId == talentInfo->RankID[rank])
|
if (itrFirstId == talentInfo->RankID[rank])
|
||||||
{
|
{
|
||||||
removeSpell(itr->first, !IsPassiveSpell(itr->first), false);
|
itr->second->disabled = false;
|
||||||
|
itr->second->state = PLAYERSPELL_NEW;
|
||||||
|
removeSpell(itr->first, false, false);
|
||||||
itr = GetSpellMap().begin();
|
itr = GetSpellMap().begin();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
|
else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
|
||||||
{
|
{
|
||||||
removeSpell(itr->first, !IsPassiveSpell(itr->first));
|
itr->second->disabled = false;
|
||||||
|
itr->second->state = PLAYERSPELL_NEW;
|
||||||
|
removeSpell(itr->first, false, true);
|
||||||
itr = GetSpellMap().begin();
|
itr = GetSpellMap().begin();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
removeSpell(talentInfo->TalentID, !IsPassiveSpell(talentInfo->TalentID), false);
|
//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
|
m_talents[m_activeSpec]->find(talentInfo->RankID[rank])->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22001,45 +21999,62 @@ void Player::ActivateSpec(uint8 spec)
|
|||||||
//ExitVehicle(); // should be impossible to switch specs from inside a vehicle..
|
//ExitVehicle(); // should be impossible to switch specs from inside a vehicle..
|
||||||
|
|
||||||
// Remove all talents and talent-learned spells under this spec.
|
// Remove all talents and talent-learned spells under this spec.
|
||||||
for (PlayerTalentMap::iterator itr = m_talents[m_activeSpec]->begin(); itr != m_talents[m_activeSpec]->end(); ++itr)
|
for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
|
||||||
{
|
{
|
||||||
TalentEntry const *talentInfo = sTalentStore.LookupEntry(itr->first);
|
TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
|
||||||
|
|
||||||
if (!talentInfo)
|
if (!talentInfo)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
|
||||||
|
|
||||||
|
if (!talentTabInfo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 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 (PlayerTalentMap::iterator itr = m_talents[m_activeSpec]->begin(); itr != m_talents[m_activeSpec]->end(); ++itr)
|
||||||
|
{
|
||||||
|
removeSpell(itr->first, !IsPassiveSpell(itr->first), false);
|
||||||
|
itr->second->state = PLAYERSPELL_REMOVED;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
|
for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank)
|
||||||
{
|
{
|
||||||
if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], m_activeSpec))
|
if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], m_activeSpec))
|
||||||
{
|
{
|
||||||
for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
|
for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();)
|
||||||
{
|
{
|
||||||
if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled)
|
|
||||||
{
|
|
||||||
++itr;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove learned spells (all ranks)
|
// remove learned spells (all ranks)
|
||||||
uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
|
uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first);
|
||||||
|
|
||||||
// unlearn if first rank is talent or learned by talent
|
// unlearn if first rank is talent or learned by talent
|
||||||
if (itrFirstId == talentInfo->RankID[rank])
|
if (itrFirstId == talentInfo->RankID[rank])
|
||||||
{
|
{
|
||||||
removeSpell(itr->first, !IsPassiveSpell(itr->first), false);
|
itr->second->disabled = false;
|
||||||
|
itr->second->state = PLAYERSPELL_NEW;
|
||||||
|
removeSpell(itr->first, false, false);
|
||||||
itr = GetSpellMap().begin();
|
itr = GetSpellMap().begin();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
|
else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId))
|
||||||
{
|
{
|
||||||
removeSpell(itr->first, !IsPassiveSpell(itr->first));
|
itr->second->disabled = false;
|
||||||
|
itr->second->state = PLAYERSPELL_NEW;
|
||||||
|
removeSpell(itr->first, false, true);
|
||||||
itr = GetSpellMap().begin();
|
itr = GetSpellMap().begin();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
++itr;
|
++itr;
|
||||||
}
|
}
|
||||||
removeSpell(talentInfo->TalentID, !IsPassiveSpell(talentInfo->TalentID), false);
|
//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
|
//m_talents[m_activeSpec]->find(talentInfo->RankID[rank])->second->state = PLAYERSPELL_REMOVED; // mark the talent in the talent map as removed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user