diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 9 |
3 files changed, 17 insertions, 6 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 0eac7fd444e..b00d0ad6aa3 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -603,6 +603,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; + if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_RECOMMENDED) + _defaultChrSpecializationsByClass[chrSpec->ClassID] = chrSpec; } for (CurvePointEntry const* curvePoint : sCurvePointStore) @@ -1061,6 +1063,15 @@ ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 cla return _chrSpecializationsByIndex[class_][index]; } +ChrSpecializationEntry const* DB2Manager::GetDefaultChrSpecializationForClass(uint32 class_) const +{ + auto itr = _defaultChrSpecializationsByClass.find(class_); + if (itr != _defaultChrSpecializationsByClass.end()) + return itr->second; + + return nullptr; +} + char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, uint32 locale) { if (!petfamily) diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index e435554be18..ba2191a2009 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -233,6 +233,7 @@ public: typedef std::unordered_multimap<uint32, CharSectionsEntry const*> CharSectionsContainer; typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer; typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; + typedef std::unordered_map<uint32, ChrSpecializationEntry const*> ChrSpecialzationByClassContainer; typedef std::unordered_map<uint32 /*curveID*/, std::vector<CurvePointEntry const*>> CurvePointsContainer; typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer; @@ -288,6 +289,7 @@ public: uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; + ChrSpecializationEntry const* GetDefaultChrSpecializationForClass(uint32 class_) const; static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); float GetCurveValueAt(uint32 curveId, float x) const; EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; @@ -348,6 +350,7 @@ private: CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; ChrSpecializationByIndexContainer _chrSpecializationsByIndex; + ChrSpecialzationByClassContainer _defaultChrSpecializationsByClass; CurvePointsContainer _curvePoints; EmotesTextSoundContainer _emoteTextSounds; FactionTeamContainer _factionTeams; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 68b7da8a8d3..7764938611e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -665,7 +665,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac } // all item positions resolved - if (ChrSpecializationEntry const* defaultSpec = sChrSpecializationStore.LookupEntry(cEntry->DefaultSpec)) + if (ChrSpecializationEntry const* defaultSpec = sDB2Manager.GetDefaultChrSpecializationForClass(getClass())) { SetActiveTalentGroup(defaultSpec->OrderIndex); SetPrimarySpecialization(defaultSpec->ID); @@ -25572,7 +25572,7 @@ void Player::ResetTalentSpecialization() RemoveSpecializationSpells(); - ChrSpecializationEntry const* defaultSpec = sChrSpecializationStore.LookupEntry(sChrClassesStore.AssertEntry(getClass())->DefaultSpec); + ChrSpecializationEntry const* defaultSpec = ASSERT_NOTNULL(sDB2Manager.GetDefaultChrSpecializationForClass(getClass())); SetPrimarySpecialization(defaultSpec->ID); SetActiveTalentGroup(defaultSpec->OrderIndex); SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, defaultSpec->ID); @@ -27159,10 +27159,7 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha uint32 Player::GetDefaultSpecId() const { - ChrClassesEntry const* entry = sChrClassesStore.LookupEntry(getClass()); - if (entry) - return entry->DefaultSpec; - return 0; + return ASSERT_NOTNULL(sDB2Manager.GetDefaultChrSpecializationForClass(getClass()))->ID; } void Player::SendSpellCategoryCooldowns() const |
