diff options
Diffstat (limited to 'src/game/Player.cpp')
-rw-r--r-- | src/game/Player.cpp | 100 |
1 files changed, 51 insertions, 49 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp index c97d6c8d69c..87396daba80 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2914,7 +2914,7 @@ bool Player::AddTalent(uint32 spell_id, uint8 spec, bool learning) return false; } - if(!SpellMgr::IsSpellValid(spellInfo,this,false)) + if (!SpellMgr::IsSpellValid(spellInfo,this,false)) { // do character spell book cleanup (all characters) if(!IsInWorld() && !learning) // spell load case @@ -2930,25 +2930,21 @@ bool Player::AddTalent(uint32 spell_id, uint8 spec, bool learning) PlayerTalentMap::iterator itr = m_talents[spec]->find(spell_id); if (itr != m_talents[spec]->end()) - { itr->second->state = PLAYERSPELL_UNCHANGED; - } - else if(TalentSpellPos const *talentPos = GetTalentSpellPos(spell_id)) + else if (TalentSpellPos const *talentPos = GetTalentSpellPos(spell_id)) { - if(TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentPos->talent_id )) + if (TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentPos->talent_id )) { for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank) { // skip learning spell and no rank spell case uint32 rankSpellId = talentInfo->RankID[rank]; - if(!rankSpellId || rankSpellId == spell_id) + if (!rankSpellId || rankSpellId == spell_id) continue; PlayerTalentMap::iterator itr = m_talents[spec]->find(rankSpellId); if (itr != m_talents[spec]->end()) - { itr->second->state = PLAYERSPELL_REMOVED; - } } } @@ -3745,8 +3741,8 @@ uint32 Player::resetTalentsCost() const bool Player::resetTalents(bool no_cost) { // not need after this call - if(HasAtLoginFlag(AT_LOGIN_RESET_TALENTS)) - RemoveAtLoginFlag(AT_LOGIN_RESET_TALENTS,true); + if (HasAtLoginFlag(AT_LOGIN_RESET_TALENTS)) + RemoveAtLoginFlag(AT_LOGIN_RESET_TALENTS, true); uint32 talentPointsForLevel = CalculateTalentsPoints(); @@ -3787,7 +3783,14 @@ bool Player::resetTalents(bool no_cost) if ((getClassMask() & talentTabInfo->ClassMask) == 0) continue; + PlayerTalentMap::const_iterator foundTalent = m_talents[m_activeSpec]->find(i); + if (foundTalent == m_talents[spec]->end() || foundTalent->second->state == PLAYERSPELL_REMOVED) + continue; + else + foundTalent->second->state = PLAYERSPELL_REMOVED; + removeSpell(i, !IsPassiveSpell(i), false); + /* for (PlayerTalentMap::iterator itr = m_talents[m_activeSpec]->begin(); itr != m_talents[m_activeSpec]->end(); ++itr) { @@ -3800,7 +3803,7 @@ bool Player::resetTalents(bool no_cost) { for (PlayerSpellMap::iterator itr = GetSpellMap().begin(); itr != GetSpellMap().end();) { - if(itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) + if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) { ++itr; continue; @@ -3856,37 +3859,28 @@ bool Player::resetTalents(bool no_cost) Mail* Player::GetMail(uint32 id) { for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) - { if ((*itr)->messageID == id) - { return (*itr); - } - } + return NULL; } void Player::_SetCreateBits(UpdateMask *updateMask, Player *target) const { if(target == this) - { Object::_SetCreateBits(updateMask, target); - } else { for (uint16 index = 0; index < m_valuesCount; index++) - { - if(GetUInt32Value(index) != 0 && updateVisualBits.GetBit(index)) + if (GetUInt32Value(index) != 0 && updateVisualBits.GetBit(index)) updateMask->SetBit(index); - } } } void Player::_SetUpdateBits(UpdateMask *updateMask, Player *target) const { if(target == this) - { Object::_SetUpdateBits(updateMask, target); - } else { Object::_SetUpdateBits(updateMask, target); @@ -3985,7 +3979,7 @@ void Player::InitVisibleBits() void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) const { - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++) + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) { if(m_items[i] == NULL) continue; @@ -3995,7 +3989,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) if(target == this) { - for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) + for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) { if(m_items[i] == NULL) continue; @@ -4018,7 +4012,7 @@ void Player::DestroyForPlayer( Player *target, bool anim ) const { Unit::DestroyForPlayer( target, anim ); - for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; i++) + for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i) { if(m_items[i] == NULL) continue; @@ -4028,7 +4022,7 @@ void Player::DestroyForPlayer( Player *target, bool anim ) const if(target == this) { - for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) + for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) { if(m_items[i] == NULL) continue; @@ -15174,7 +15168,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) // sanity check if (m_specsCount > MAX_TALENT_SPECS || m_activeSpec > MAX_TALENT_SPEC || - m_specsCount < MIN_TALENT_SPECS || m_activeSpec < MIN_TALENT_SPEC ) // if (m_specsCount < 2) is not logical + m_specsCount < MIN_TALENT_SPECS || m_activeSpec < MIN_TALENT_SPEC) { m_activeSpec = 0; sLog.outError("Player %s(GUID: %u) has SpecCount = %u and ActiveSpec = %u.", GetName(), GetGUIDLow(), m_specsCount, m_activeSpec); @@ -22012,34 +22006,42 @@ void Player::ActivateSpec(uint8 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) { + TalentEntry const *talentInfo = sTalentStore.LookupEntry(itr->first); + + if (!talentInfo) + continue; + removeSpell(itr->first, !IsPassiveSpell(itr->first), false); - uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first); - for (PlayerSpellMap::iterator itr2 = GetSpellMap().begin(); itr2 != GetSpellMap().end();) + + for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank) { - if (itr2->second->state == PLAYERSPELL_REMOVED || itr2->second->disabled) + for (PlayerSpellMap::iterator itr2 = GetSpellMap().begin(); itr2 != GetSpellMap().end();) { - ++itr2; - continue; - } + if (itr2->second->state == PLAYERSPELL_REMOVED || itr2->second->disabled) + { + ++itr2; + continue; + } - // remove learned spells (all ranks) - uint32 itr2FirstId = spellmgr.GetFirstSpellInChain(itr2->first); + // remove learned spells (all ranks) + uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr2->first); - // unlearn if first rank is talent or learned by talent - if (itrFirstId == itr2FirstId) - { - removeSpell(itr2->first, !IsPassiveSpell(itr2->first), false); - itr2 = GetSpellMap().begin(); - continue; - } - else if (spellmgr.IsSpellLearnToSpell(itr->first, itrFirstId)) - { - removeSpell(itr2->first, !IsPassiveSpell(itr2->first)); - itr2 = GetSpellMap().begin(); - continue; + // unlearn if first rank is talent or learned by talent + if (itrFirstId == talentInfo->RankID[rank]) + { + removeSpell(itr2->first, !IsPassiveSpell(itr2->first), false); + itr2 = GetSpellMap().begin(); + continue; + } + else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[rank], itrFirstId)) + { + removeSpell(itr2->first, !IsPassiveSpell(itr2->first)); + itr2 = GetSpellMap().begin(); + continue; + } + else + ++itr2; } - else - ++itr2; } } |