diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/SkillHandler.cpp | 4 | 
3 files changed, 21 insertions, 8 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 781934a88ed..3ea08d0787e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17367,7 +17367,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol      UpdateDisplayPower();      _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENT_GROUPS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));      _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS)); -    SetActiveTalentGroup(HasTalentGroupUnlocked(fields.activeTalentGroup) ? fields.activeTalentGroup : 0, false); +    SetActiveTalentGroup(HasTalentGroupUnlocked(fields.activeTalentGroup) ? fields.activeTalentGroup : 0, false, true);      _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELL_FAVORITES));      GetSession()->GetCollectionMgr()->LoadToys(); @@ -26447,7 +26447,9 @@ void Player::_LoadTalents(PreparedQueryResult talentGroupResult, PreparedQueryRe              TalentGroupInfo& talentGroup = _talentGroups.emplace_back();              uint32 talentTabId = fields[1].GetUInt32(); -            if (sTalentTabStore.HasRecord(talentTabId)) + +            TalentTabEntry const* talentTab = sTalentTabStore.LookupEntry(talentTabId); +            if (talentTab && (talentTab->RaceMask & GetRaceMask()))                  talentGroup.PrimaryTalentTabID = talentTabId;          } while (talentGroupResult->NextRow()); @@ -26469,11 +26471,18 @@ void Player::_LoadTalents(PreparedQueryResult talentGroupResult, PreparedQueryRe              uint32 talentId = fields[1].GetUInt32();              uint8 talentRank = fields[2].GetUInt8();              TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); -            if (!talentInfo || talentInfo->SpellRank.size() <= talentRank || !sSpellMgr->GetSpellInfo(talentInfo->SpellRank[talentRank], DIFFICULTY_NONE)) +            if (!talentInfo) +                continue; + +            if (talentRank >= talentInfo->SpellRank.size()) +                continue; + +            uint32 spellId = talentInfo->SpellRank[talentRank]; +            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE); +            if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, this, false))                  continue;              _talentGroups[talentGroupId].Talents.try_emplace(talentId, talentRank); -            LearnSpell(talentInfo->SpellRank[talentRank], true);          } while (talentResult->NextRow());      } @@ -28387,11 +28396,12 @@ void Player::SetTalentGroupCount(uint8 count)      SendTalentsInfoData();  } -void Player::SetActiveTalentGroup(uint8 group, bool withUpdate /*= true*/) +void Player::SetActiveTalentGroup(uint8 group, bool withUpdate /*= true*/, bool loading /*= false*/)  {      uint32 oldTalentTabId = _talentGroups[_activeTalentGroup].PrimaryTalentTabID;      uint32 newTalentTabId = _talentGroups[group].PrimaryTalentTabID; +    if (!loading)      {          // Perform cleanup actions on switching talent groups @@ -28467,6 +28477,9 @@ void Player::SetActiveTalentGroup(uint8 group, bool withUpdate /*= true*/)          // Perform post switch actions - resetting powers, loading action bars, updating shapeshifting auras          SetPrimaryTalentTree(newTalentTabId); +        for (auto const& talentPair : _talentGroups[_activeTalentGroup].Talents) +            LearnSpell(sTalentStore.AssertEntry(talentPair.first)->SpellRank[talentPair.second], true); +          uint8 glyphSlot = 0;          for (uint16 glyphId : _talentGroups[_activeTalentGroup].Glyphs)          { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1569b2f00f8..deacd1e8c5f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1857,7 +1857,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>          uint8 GetActiveTalentGroup() const { return _activeTalentGroup; }          bool HasTalentGroupUnlocked(uint8 group) const;          void SetTalentGroupCount(uint8 count); -        void SetActiveTalentGroup(uint8 group, bool withUpdate = true); +        void SetActiveTalentGroup(uint8 group, bool withUpdate = true, bool loading = false);          void SetPrimaryTalentTree(uint32 talentTabId, bool withUpdate = false);          uint32 GetPrimaryTalentTree() const;          bool LearnTalent(uint32 talentId, uint8 rank); diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 758bab9f1fd..bc1def97c6f 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -35,7 +35,7 @@ void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& pa  void WorldSession::HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& packet)  {      if (!_player->GetPrimaryTalentTree() && packet.TabIndex >= 0) -        if (TalentTabEntry const* talentTab = sDB2Manager.GetTalentTabByIndex(_player->GetClassMask(), packet.TabIndex)) +        if (TalentTabEntry const* talentTab = sDB2Manager.GetTalentTabByIndex(_player->GetClass(), packet.TabIndex))              _player->SetPrimaryTalentTree(talentTab->ID, true);      for (auto const& talentInfo : packet.Talents) @@ -50,7 +50,7 @@ void WorldSession::HandleSetPrimaryTalentTreeOpcode(WorldPackets::Talent::SetPri      if (_player->GetPrimaryTalentTree() != 0 || packet.TabIndex < 0)          return; -    if (TalentTabEntry const* talentTab = sDB2Manager.GetTalentTabByIndex(_player->GetClassMask(), packet.TabIndex)) +    if (TalentTabEntry const* talentTab = sDB2Manager.GetTalentTabByIndex(_player->GetClass(), packet.TabIndex))          _player->SetPrimaryTalentTree(talentTab->ID, true);  }  | 
