aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp11
-rw-r--r--src/server/game/DataStores/DB2Stores.h3
-rw-r--r--src/server/game/Entities/Player/Player.cpp9
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