aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-08-06 20:21:34 +0200
committerShauren <shauren.trinity@gmail.com>2023-08-07 00:05:36 +0200
commit98007f859b7318570c0c923a00aa32fc485c8ec8 (patch)
treeef8405fa2d3740b6531a510673a0124dd0c2c957
parentd2784d4c65ec987fe587718d96b2feb885905e13 (diff)
Core/Misc: Turn ChrSpecialization into enum class
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.cpp10
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.h5
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp4
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp3
-rw-r--r--src/server/game/Battlegrounds/Battleground.h1
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp18
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp6
-rw-r--r--src/server/game/DataStores/DB2Stores.h2
-rw-r--r--src/server/game/DataStores/DBCEnums.h6
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp14
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp33
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp4
-rw-r--r--src/server/game/Handlers/AzeriteHandler.cpp2
-rw-r--r--src/server/game/Handlers/TraitHandler.cpp2
-rw-r--r--src/server/game/Server/Packets/InspectPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp13
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp5
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp2
-rw-r--r--src/server/scripts/Spells/spell_item.cpp2
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp6
27 files changed, 85 insertions, 73 deletions
diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp
index d61f084431d..2f104c40eac 100644
--- a/src/server/game/AI/PlayerAI/PlayerAI.cpp
+++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp
@@ -406,7 +406,7 @@ Creature* PlayerAI::GetCharmer() const
return nullptr;
}
-uint32 PlayerAI::GetSpec(Player const* who /*= nullptr*/) const
+ChrSpecialization PlayerAI::GetSpec(Player const* who /*= nullptr*/) const
{
return (!who || who == me) ? _selfSpec : who->GetPrimarySpecialization();
}
@@ -416,8 +416,8 @@ bool PlayerAI::IsPlayerHealer(Player const* who)
if (!who)
return false;
- return who->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(who->GetPrimarySpecialization())->GetRole() == ChrSpecializationRole::Healer;
+ ChrSpecializationEntry const* chrSpec = who->GetPrimarySpecializationEntry();
+ return chrSpec && chrSpec->GetRole() == ChrSpecializationRole::Healer;
}
bool PlayerAI::IsPlayerRangedAttacker(Player const* who)
@@ -425,8 +425,8 @@ bool PlayerAI::IsPlayerRangedAttacker(Player const* who)
if (!who)
return false;
- return who->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(who->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
+ ChrSpecializationEntry const* chrSpec = who->GetPrimarySpecializationEntry();
+ return chrSpec && chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
}
PlayerAI::TargetedSpell PlayerAI::VerifySpellCast(uint32 spellId, Unit* target)
diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h
index a6c429b6308..39d53727303 100644
--- a/src/server/game/AI/PlayerAI/PlayerAI.h
+++ b/src/server/game/AI/PlayerAI/PlayerAI.h
@@ -22,6 +22,7 @@
class Creature;
class Spell;
+enum class ChrSpecialization : uint32;
class TC_GAME_API PlayerAI : public UnitAI
{
@@ -31,7 +32,7 @@ class TC_GAME_API PlayerAI : public UnitAI
Creature* GetCharmer() const;
// helper functions to determine player info
- uint32 GetSpec(Player const* who = nullptr) const;
+ ChrSpecialization GetSpec(Player const* who = nullptr) const;
static bool IsPlayerHealer(Player const* who);
bool IsHealer(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); }
static bool IsPlayerRangedAttacker(Player const* who);
@@ -85,7 +86,7 @@ class TC_GAME_API PlayerAI : public UnitAI
void CancelAllShapeshifts();
private:
- uint32 const _selfSpec;
+ ChrSpecialization const _selfSpec;
bool const _isSelfHealer;
bool _isSelfRangedAttacker;
};
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 9cee67b2058..2f10bc605fd 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -3418,7 +3418,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
break;
case ModifierTreeType::PlayerLootSpecializationMatchesRole: // 263
{
- ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(referencePlayer->GetPrimarySpecialization());
+ ChrSpecializationEntry const* spec = referencePlayer->GetPrimarySpecializationEntry();
if (!spec || spec->Role != int32(reqValue))
return false;
break;
@@ -3529,7 +3529,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
return false;
}
case ModifierTreeType::PlayerSpecialization: // 279
- if (referencePlayer->GetPrimarySpecialization() != reqValue)
+ if (referencePlayer->GetPrimarySpecialization() != ChrSpecialization(reqValue))
return false;
break;
case ModifierTreeType::PlayerMapOrCosmeticChildMap: // 280
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 06d0b381b4d..88128727181 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -995,7 +995,6 @@ void Battleground::AddPlayer(Player* player)
BattlegroundPlayer bp;
bp.OfflineRemoveTime = 0;
bp.Team = team;
- bp.ActiveSpec = player->GetPrimarySpecialization();
bp.Mercenary = player->IsMercenaryForBattlegroundQueueType(GetQueueId());
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
@@ -1284,7 +1283,7 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchSta
if (Player* player = ObjectAccessor::GetPlayer(GetBgMap(), playerData.PlayerGUID))
{
playerData.IsInWorld = true;
- playerData.PrimaryTalentTree = player->GetPrimarySpecialization();
+ playerData.PrimaryTalentTree = AsUnderlyingType(player->GetPrimarySpecialization());
playerData.Sex = player->GetGender();
playerData.Race = player->GetRace();
playerData.Class = player->GetClass();
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index d589c1e33d7..737e6662ac5 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -168,7 +168,6 @@ struct BattlegroundPlayer
{
time_t OfflineRemoveTime; // for tracking and removing offline players from queue after 5 minutes
uint32 Team; // Player's team
- int32 ActiveSpec; // Player's active spec
bool Mercenary;
};
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index a8f2deffa28..7e35dd31e03 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -3000,7 +3000,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
if (condition->ChrSpecializationIndex >= 0 || condition->ChrSpecializationRole >= 0)
{
- if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(player->GetPrimarySpecialization()))
+ if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(AsUnderlyingType(player->GetPrimarySpecialization())))
{
if (condition->ChrSpecializationIndex >= 0 && spec->OrderIndex != condition->ChrSpecializationIndex)
return false;
@@ -4016,17 +4016,17 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond
case UnitConditionVariable::IsEnemy:
return otherUnit && unit->GetReactionTo(otherUnit) <= REP_HOSTILE;
case UnitConditionVariable::IsSpecMelee:
- return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Melee);
+ return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry()
+ && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetFlags().HasFlag(ChrSpecializationFlag::Melee);
case UnitConditionVariable::IsSpecTank:
- return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetRole() == ChrSpecializationRole::Tank;
+ return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry()
+ && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetRole() == ChrSpecializationRole::Tank;
case UnitConditionVariable::IsSpecRanged:
- return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
+ return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry()
+ && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
case UnitConditionVariable::IsSpecHealer:
- return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetRole() == ChrSpecializationRole::Healer;
+ return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry()
+ && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetRole() == ChrSpecializationRole::Healer;
case UnitConditionVariable::IsPlayerControlledNPC:
return unit->IsCreature() && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
case UnitConditionVariable::IsDying:
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 666d3e336b9..de885dc7598 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -391,7 +391,7 @@ typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry c
typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer;
typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer;
typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<uint32>> GlyphBindableSpellsContainer;
-typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<uint32>> GlyphRequiredSpecsContainer;
+typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<ChrSpecialization>> GlyphRequiredSpecsContainer;
typedef std::unordered_map<uint32 /*itemId*/, ItemChildEquipmentEntry const*> ItemChildEquipmentContainer;
typedef std::array<ItemClassEntry const*, 20> ItemClassByOldEnumContainer;
typedef std::unordered_map<uint32, std::vector<ItemLimitCategoryConditionEntry const*>> ItemLimitCategoryConditionContainer;
@@ -1250,7 +1250,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
_glyphBindableSpells[glyphBindableSpell->GlyphPropertiesID].push_back(glyphBindableSpell->SpellID);
for (GlyphRequiredSpecEntry const* glyphRequiredSpec : sGlyphRequiredSpecStore)
- _glyphRequiredSpecs[glyphRequiredSpec->GlyphPropertiesID].push_back(glyphRequiredSpec->ChrSpecializationID);
+ _glyphRequiredSpecs[glyphRequiredSpec->GlyphPropertiesID].push_back(ChrSpecialization(glyphRequiredSpec->ChrSpecializationID));
for (ItemChildEquipmentEntry const* itemChildEquipment : sItemChildEquipmentStore)
{
@@ -2464,7 +2464,7 @@ std::vector<uint32> const* DB2Manager::GetGlyphBindableSpells(uint32 glyphProper
return Trinity::Containers::MapGetValuePtr(_glyphBindableSpells, glyphPropertiesId);
}
-std::vector<uint32> const* DB2Manager::GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const
+std::vector<ChrSpecialization> const* DB2Manager::GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const
{
return Trinity::Containers::MapGetValuePtr(_glyphRequiredSpecs, glyphPropertiesId);
}
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 973ecd2ce54..1748d31abdf 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -447,7 +447,7 @@ public:
FriendshipRepReactionSet const* GetFriendshipRepReactions(uint32 friendshipRepID) const;
uint32 GetGlobalCurveId(GlobalCurve globalCurveType) const;
std::vector<uint32> const* GetGlyphBindableSpells(uint32 glyphPropertiesId) const;
- std::vector<uint32> const* GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const;
+ std::vector<ChrSpecialization> const* GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const;
HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const;
ItemChildEquipmentEntry const* GetItemChildEquipment(uint32 itemId) const;
ItemClassEntry const* GetItemClassByOldEnum(uint32 itemClass) const;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 07857ce472c..95afccc8d13 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -299,8 +299,9 @@ enum class ChrSpecializationRole : int8
Dps = 2
};
-enum ChrSpecialization : uint32
+enum class ChrSpecialization : uint32
{
+ None = 0,
MageArcane = 62,
MageFire = 63,
MageFrost = 64,
@@ -338,7 +339,8 @@ enum ChrSpecialization : uint32
DemonHunterHavoc = 577,
DemonHunterVengeance = 581,
EvokerDevastation = 1467,
- EvokerPreservation = 1468
+ EvokerPreservation = 1468,
+ EvokerAugmentation = 1473
};
enum class ContentTuningCalcType : int32
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
index 95f14602f25..6f76852e93a 100644
--- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
+++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
@@ -18,8 +18,8 @@
#include "AzeriteItem.h"
#include "AzeritePackets.h"
#include "ConditionMgr.h"
-#include "DatabaseEnv.h"
#include "DB2Stores.h"
+#include "DatabaseEnv.h"
#include "GameObject.h"
#include "GameTime.h"
#include "Player.h"
@@ -172,13 +172,13 @@ void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azer
selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, i).SetValue(selectedEssenceData.AzeriteEssenceId[i]);
}
- if (owner && owner->GetPrimarySpecialization() == selectedEssenceData.SpecializationId)
- selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(1);
+ if (owner && owner->GetPrimarySpecialization() == ChrSpecialization(selectedEssenceData.SpecializationId))
+ selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
}
// add selected essences for current spec
if (owner && !GetSelectedAzeriteEssences())
- CreateSelectedAzeriteEssences(owner->GetPrimarySpecialization());
+ CreateSelectedAzeriteEssences(AsUnderlyingType(owner->GetPrimarySpecialization()));
if (needSave)
{
@@ -362,7 +362,7 @@ void AzeriteItem::SetSelectedAzeriteEssences(uint32 specializationId)
int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; });
if (index >= 0)
SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences, index)
- .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), 0);
+ .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), false);
index = m_azeriteItemData->SelectedEssences.FindIndexIf([specializationId](UF::SelectedAzeriteEssences const& essences)
{
@@ -371,7 +371,7 @@ void AzeriteItem::SetSelectedAzeriteEssences(uint32 specializationId)
if (index >= 0)
SetUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences, index)
- .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), 1);
+ .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), true);
else
CreateSelectedAzeriteEssences(specializationId);
}
@@ -380,7 +380,7 @@ void AzeriteItem::CreateSelectedAzeriteEssences(uint32 specializationId)
{
auto selectedEssences = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences));
selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId);
- selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(1);
+ selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
}
void AzeriteItem::SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId)
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 62cd2f12480..ae0ea9784fd 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -146,7 +146,7 @@ void AddItemsSetItem(Player* player, Item const* item)
eff->SetBonuses.insert(itemSetSpell);
// spell cast only if fit form requirement, in other case will cast at form change
- if (!itemSetSpell->ChrSpecID || itemSetSpell->ChrSpecID == player->GetPrimarySpecialization())
+ if (!itemSetSpell->ChrSpecID || ChrSpecialization(itemSetSpell->ChrSpecID) == player->GetPrimarySpecialization())
player->ApplyEquipSpell(spellInfo, nullptr, true);
}
}
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp
index 114998f8d07..7722087a304 100644
--- a/src/server/game/Entities/Item/ItemTemplate.cpp
+++ b/src/server/game/Entities/Item/ItemTemplate.cpp
@@ -271,7 +271,7 @@ bool ItemTemplate::IsUsableByLootSpecialization(Player const* player, bool alway
uint32 spec = player->GetLootSpecId();
if (!spec)
- spec = player->GetPrimarySpecialization();
+ spec = AsUnderlyingType(player->GetPrimarySpecialization());
if (!spec)
spec = player->GetDefaultSpecId();
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 059b3a88a84..d1967a2283c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8260,7 +8260,7 @@ void Player::ApplyItemEquipSpell(Item* item, bool apply, bool formChange /*= fal
if (!spellproto)
continue;
- if (effectData->ChrSpecializationID && effectData->ChrSpecializationID != GetPrimarySpecialization())
+ if (effectData->ChrSpecializationID && ChrSpecialization(effectData->ChrSpecializationID) != GetPrimarySpecialization())
continue;
ApplyEquipSpell(spellproto, item, apply, formChange);
@@ -8331,7 +8331,7 @@ void Player::UpdateItemSetAuras(bool formChange /*= false*/)
{
SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE);
- if (itemSetSpell->ChrSpecID && itemSetSpell->ChrSpecID != GetPrimarySpecialization())
+ if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != GetPrimarySpecialization())
ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec
else
{
@@ -8525,7 +8525,7 @@ void Player::ApplyAzeritePower(AzeriteEmpoweredItem* item, AzeritePowerEntry con
{
if (apply)
{
- if (!azeritePower->SpecSetID || sDB2Manager.IsSpecSetMember(azeritePower->SpecSetID, GetPrimarySpecialization()))
+ if (!azeritePower->SpecSetID || sDB2Manager.IsSpecSetMember(azeritePower->SpecSetID, AsUnderlyingType(GetPrimarySpecialization())))
CastSpell(this, azeritePower->SpellID, item);
}
else
@@ -11383,7 +11383,7 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto, bool skipRequiredL
return EQUIP_ERR_INTERNAL_BAG_ERROR;
if (ArtifactEntry const* artifact = sArtifactStore.LookupEntry(proto->GetArtifactID()))
- if (artifact->ChrSpecializationID != GetPrimarySpecialization())
+ if (ChrSpecialization(artifact->ChrSpecializationID) != GetPrimarySpecialization())
return EQUIP_ERR_CANT_USE_ITEM;
return EQUIP_ERR_OK;
@@ -17950,7 +17950,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
SetNumRespecs(fields.numRespecs);
SetPrimarySpecialization(fields.primarySpecialization);
SetActiveTalentGroup(fields.activeTalentGroup);
- ChrSpecializationEntry const* primarySpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization());
+ ChrSpecializationEntry const* primarySpec = GetPrimarySpecializationEntry();
if (!primarySpec || primarySpec->ClassID != GetClass() || GetActiveTalentGroup() >= MAX_SPECIALIZATIONS)
ResetTalentSpecialization();
@@ -19744,7 +19744,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
//save, but in tavern/city
stmt->setUInt32(index++, GetTalentResetCost());
stmt->setInt64(index++, GetTalentResetTime());
- stmt->setUInt32(index++, GetPrimarySpecialization());
+ stmt->setUInt32(index++, AsUnderlyingType(GetPrimarySpecialization()));
stmt->setUInt16(index++, (uint16)m_ExtraFlags);
stmt->setUInt32(index++, 0); // summonedPetNumber
stmt->setUInt16(index++, (uint16)m_atLoginFlags);
@@ -19877,7 +19877,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
stmt->setUInt32(index++, GetTalentResetCost());
stmt->setInt64(index++, GetTalentResetTime());
stmt->setUInt8(index++, GetNumRespecs());
- stmt->setUInt32(index++, GetPrimarySpecialization());
+ stmt->setUInt32(index++, AsUnderlyingType(GetPrimarySpecialization()));
stmt->setUInt16(index++, (uint16)m_ExtraFlags);
if (PetStable const* petStable = GetPetStable())
stmt->setUInt32(index++, petStable->GetCurrentPet() && petStable->GetCurrentPet()->Health > 0 ? petStable->GetCurrentPet()->PetNumber : 0); // summonedPetNumber
@@ -26340,14 +26340,14 @@ TalentLearnResult Player::LearnTalent(uint32 talentId, int32* spellOnCooldown)
if (isDead())
return TALENT_FAILED_CANT_DO_THAT_RIGHT_NOW;
- if (!GetPrimarySpecialization())
+ if (GetPrimarySpecialization() == ChrSpecialization::None)
return TALENT_FAILED_NO_PRIMARY_TREE_SELECTED;
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
if (!talentInfo)
return TALENT_FAILED_UNKNOWN;
- if (talentInfo->SpecID && talentInfo->SpecID != GetPrimarySpecialization())
+ if (talentInfo->SpecID && ChrSpecialization(talentInfo->SpecID) != GetPrimarySpecialization())
return TALENT_FAILED_UNKNOWN;
// prevent learn talent for different class (cheating)
@@ -26371,7 +26371,7 @@ TalentLearnResult Player::LearnTalent(uint32 talentId, int32* spellOnCooldown)
{
if (!talent->SpecID)
bestSlotMatch = talent;
- else if (talent->SpecID == GetPrimarySpecialization())
+ else if (ChrSpecialization(talent->SpecID) == GetPrimarySpecialization())
{
bestSlotMatch = talent;
break;
@@ -26723,7 +26723,7 @@ bool Player::CanSeeSpellClickOn(Creature const* c) const
void Player::SendTalentsInfoData()
{
WorldPackets::Talent::UpdateTalentData packet;
- packet.Info.PrimarySpecialization = GetPrimarySpecialization();
+ packet.Info.PrimarySpecialization = AsUnderlyingType(GetPrimarySpecialization());
for (uint8 i = 0; i < MAX_SPECIALIZATIONS; ++i)
{
@@ -28964,7 +28964,7 @@ Pet* Player::SummonPet(uint32 entry, Optional<PetSaveMode> slot, float x, float
bool Player::CanUseMastery() const
{
- if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()))
+ if (ChrSpecializationEntry const* chrSpec = GetPrimarySpecializationEntry())
return HasSpell(chrSpec->MasterySpellID[0]) || HasSpell(chrSpec->MasterySpellID[1]);
return false;
@@ -29157,7 +29157,7 @@ void Player::RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId)
void Player::LearnSpecializationSpells()
{
- if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(GetPrimarySpecialization()))
+ if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(AsUnderlyingType(GetPrimarySpecialization())))
{
for (size_t j = 0; j < specSpells->size(); ++j)
{
@@ -29258,6 +29258,11 @@ uint32 Player::GetDefaultSpecId() const
return ASSERT_NOTNULL(sDB2Manager.GetDefaultChrSpecializationForClass(GetClass()))->ID;
}
+ChrSpecializationEntry const* Player::GetPrimarySpecializationEntry() const
+{
+ return sChrSpecializationStore.LookupEntry(AsUnderlyingType(GetPrimarySpecialization()));
+}
+
void Player::SendRaidGroupOnlyMessage(RaidGroupReason reason, int32 delay) const
{
WorldPackets::Instance::RaidGroupOnly raidGroupOnly;
@@ -29646,5 +29651,5 @@ bool TraitMgr::PlayerDataAccessor::HasAchieved(int32 achievementId) const
uint32 TraitMgr::PlayerDataAccessor::GetPrimarySpecialization() const
{
- return _player->GetPrimarySpecialization();
+ return AsUnderlyingType(_player->GetPrimarySpecialization());
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 5e298ea8b06..2f85945aac3 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -93,6 +93,7 @@ class RestMgr;
class SpellCastTargets;
class TradeData;
+enum class ChrSpecialization : uint32;
enum GroupCategory : uint8;
enum class InstanceResetMethod : uint8;
enum class InstanceResetResult : uint8;
@@ -1823,11 +1824,12 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SetTalentResetCost(uint32 cost) { _specializationInfo.ResetTalentsCost = cost; }
time_t GetTalentResetTime() const { return _specializationInfo.ResetTalentsTime; }
void SetTalentResetTime(time_t time_) { _specializationInfo.ResetTalentsTime = time_; }
- uint32 GetPrimarySpecialization() const { return m_playerData->CurrentSpecID; }
+ ChrSpecialization GetPrimarySpecialization() const { return ChrSpecialization(*m_playerData->CurrentSpecID); }
void SetPrimarySpecialization(uint32 spec) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::CurrentSpecID), spec); }
uint8 GetActiveTalentGroup() const { return _specializationInfo.ActiveGroup; }
void SetActiveTalentGroup(uint8 group){ _specializationInfo.ActiveGroup = group; }
uint32 GetDefaultSpecId() const;
+ ChrSpecializationEntry const* GetPrimarySpecializationEntry() const;
bool ResetTalents(bool noCost = false);
void ResetPvpTalents();
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index b408ebe5403..3373462cba6 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -292,7 +292,7 @@ Stats Player::GetPrimaryStat() const
{
uint8 primaryStatPriority = [&]() -> uint8
{
- if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()))
+ if (ChrSpecializationEntry const* specialization = GetPrimarySpecializationEntry())
return specialization->PrimaryStatPriority;
return sChrClassesStore.AssertEntry(GetClass())->PrimaryStatPriority;
@@ -546,7 +546,7 @@ void Player::UpdateMastery()
value += GetRatingBonusValue(CR_MASTERY);
SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Mastery), value);
- ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization());
+ ChrSpecializationEntry const* chrSpec = GetPrimarySpecializationEntry();
if (!chrSpec)
return;
diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp
index a6d951b1a65..015ec05e570 100644
--- a/src/server/game/Handlers/AzeriteHandler.cpp
+++ b/src/server/game/Handlers/AzeriteHandler.cpp
@@ -161,7 +161,7 @@ void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::Az
}
}
else
- azeriteItem->CreateSelectedAzeriteEssences(_player->GetPrimarySpecialization());
+ azeriteItem->CreateSelectedAzeriteEssences(AsUnderlyingType(_player->GetPrimarySpecialization()));
azeriteItem->SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID);
diff --git a/src/server/game/Handlers/TraitHandler.cpp b/src/server/game/Handlers/TraitHandler.cpp
index 16882b134c6..1392ecf8ba9 100644
--- a/src/server/game/Handlers/TraitHandler.cpp
+++ b/src/server/game/Handlers/TraitHandler.cpp
@@ -171,7 +171,7 @@ void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::Clas
return index;
};
- classTalentsRequestNewConfig.Config.ChrSpecializationID = _player->GetPrimarySpecialization();
+ classTalentsRequestNewConfig.Config.ChrSpecializationID = AsUnderlyingType(_player->GetPrimarySpecialization());
classTalentsRequestNewConfig.Config.LocalIdentifier = findFreeLocalIdentifier();
for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(classTalentsRequestNewConfig.Config, _player))
diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp
index 71cd2daf6d9..cd2d25b80a1 100644
--- a/src/server/game/Server/Packets/InspectPackets.cpp
+++ b/src/server/game/Server/Packets/InspectPackets.cpp
@@ -77,7 +77,7 @@ ByteBuffer& operator<<(ByteBuffer& data, InspectItemData const& itemData)
void PlayerModelDisplayInfo::Initialize(Player const* player)
{
GUID = player->GetGUID();
- SpecializationID = player->GetPrimarySpecialization();
+ SpecializationID = AsUnderlyingType(player->GetPrimarySpecialization());
Name = player->GetName();
GenderID = player->GetNativeGender();
Race = player->GetRace();
diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp
index e0e03834e27..0f18a0069ce 100644
--- a/src/server/game/Server/Packets/PartyPackets.cpp
+++ b/src/server/game/Server/Packets/PartyPackets.cpp
@@ -599,7 +599,7 @@ void WorldPackets::Party::PartyMemberFullState::Initialize(Player const* player)
MemberStats.PositionY = int16(player->GetPositionY());
MemberStats.PositionZ = int16(player->GetPositionZ());
- MemberStats.SpecID = player->GetPrimarySpecialization();
+ MemberStats.SpecID = AsUnderlyingType(player->GetPrimarySpecialization());
MemberStats.PartyType[0] = player->m_playerData->PartyType & 0xF;
MemberStats.PartyType[1] = player->m_playerData->PartyType >> 4;
MemberStats.WmoGroupID = 0;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 2b70f1f87c3..59cde35ec96 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5961,9 +5961,9 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
if (std::find(glyphBindableSpells->begin(), glyphBindableSpells->end(), m_misc.SpellId) == glyphBindableSpells->end())
return SPELL_FAILED_INVALID_GLYPH;
- if (std::vector<uint32> const* glyphRequiredSpecs = sDB2Manager.GetGlyphRequiredSpecs(glyphId))
+ if (std::vector<ChrSpecialization> const* glyphRequiredSpecs = sDB2Manager.GetGlyphRequiredSpecs(glyphId))
{
- if (!caster->GetPrimarySpecialization())
+ if (caster->GetPrimarySpecialization() == ChrSpecialization::None)
return SPELL_FAILED_GLYPH_NO_SPEC;
if (std::find(glyphRequiredSpecs->begin(), glyphRequiredSpecs->end(), caster->GetPrimarySpecialization()) == glyphRequiredSpecs->end())
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 1c08ed30c7f..8c121dfc218 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -4285,7 +4285,7 @@ float SpellInfo::CalcProcPPM(Unit* caster, int32 itemLevel) const
case SPELL_PPM_MOD_SPEC:
{
if (Player* plrCaster = caster->ToPlayer())
- if (plrCaster->GetPrimarySpecialization() == uint32(mod->Param))
+ if (plrCaster->GetPrimarySpecialization() == ChrSpecialization(mod->Param))
ppm *= 1.0f + mod->Coeff;
break;
}
diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp
index d06cce75a78..2986bb3ce13 100644
--- a/src/server/scripts/Commands/cs_learn.cpp
+++ b/src/server/scripts/Commands/cs_learn.cpp
@@ -195,7 +195,7 @@ public:
if (playerClass != talentInfo->ClassID)
continue;
- if (talentInfo->SpecID && player->GetPrimarySpecialization() != talentInfo->SpecID)
+ if (talentInfo->SpecID && player->GetPrimarySpecialization() != ChrSpecialization(talentInfo->SpecID))
continue;
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(talentInfo->SpellID, DIFFICULTY_NONE);
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
index 6f66ed7d1fd..b2157756451 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -16,6 +16,7 @@
*/
#include "ahnkahet.h"
+#include "DB2Stores.h"
#include "InstanceScript.h"
#include "Map.h"
#include "ObjectAccessor.h"
@@ -241,7 +242,7 @@ struct boss_volazj : public BossAI
// clone
player->CastSpell(summon, SPELL_CLONE_PLAYER, true);
summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_CLASS, player->GetClass());
- summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_SPEC, player->GetPrimarySpecialization());
+ summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_SPEC, AsUnderlyingType(player->GetPrimarySpecialization()));
summon->SetReactState(REACT_AGGRESSIVE);
DoZoneInCombat(summon);
// set phase
@@ -441,7 +442,7 @@ struct npc_twisted_visage : public ScriptedAI
switch (_playerClass)
{
case CLASS_WARRIOR:
- switch (data)
+ switch (ChrSpecialization(data))
{
case ChrSpecialization::WarriorArms:
_scheduler.Schedule(3s, [this](TaskContext mortalStrike)
@@ -485,7 +486,7 @@ struct npc_twisted_visage : public ScriptedAI
}
break;
case CLASS_PALADIN:
- switch (data)
+ switch (ChrSpecialization(data))
{
case ChrSpecialization::PaladinProtection:
_scheduler.Schedule(5s, [this](TaskContext consecration)
@@ -544,7 +545,7 @@ struct npc_twisted_visage : public ScriptedAI
});
break;
case CLASS_PRIEST:
- switch (data)
+ switch (ChrSpecialization(data))
{
case ChrSpecialization::PriestShadow:
_scheduler.Schedule(5s, [this](TaskContext shadowWordPain)
@@ -597,7 +598,7 @@ struct npc_twisted_visage : public ScriptedAI
});
break;
case CLASS_SHAMAN:
- switch (data)
+ switch (ChrSpecialization(data))
{
default:
case ChrSpecialization::ShamanElemental:
@@ -664,7 +665,7 @@ struct npc_twisted_visage : public ScriptedAI
});
break;
case CLASS_DRUID:
- switch (data)
+ switch (ChrSpecialization(data))
{
case ChrSpecialization::DruidBalance:
_scheduler.Schedule(2s, [this](TaskContext moonfire)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index e4d74a47faa..9d7a7df5dbe 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -1098,7 +1098,10 @@ class spell_sindragosa_unchained_magic : public SpellScript
if (!player)
continue;
- ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(player->GetPrimarySpecialization());
+ ChrSpecializationEntry const* specialization = player->GetPrimarySpecializationEntry();
+ if (!specialization)
+ continue;
+
if (specialization->GetRole() == ChrSpecializationRole::Healer)
{
healers.push_back(target);
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 28258e7d1a7..70fe5014d81 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -803,7 +803,7 @@ class spell_dru_innervate : public SpellScript
if (!target)
return SPELL_FAILED_BAD_TARGETS;
- ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(target->GetPrimarySpecialization());
+ ChrSpecializationEntry const* spec = target->GetPrimarySpecializationEntry();
if (!spec || spec->GetRole() != ChrSpecializationRole::Healer)
return SPELL_FAILED_BAD_TARGETS;
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 0efa1ec332e..ce116529c4c 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -4344,7 +4344,7 @@ class spell_item_amalgams_seventh_spine : public AuraScript
auto updateAuraIfInCorrectSpec = [&](ChrSpecialization spec, AmalgamsSeventhSpine aura)
{
- if (target->GetPrimarySpecialization() != uint32(spec))
+ if (target->GetPrimarySpecialization() != spec)
target->RemoveAurasDueToSpell(aura);
else if (!target->HasAura(aura))
target->CastSpell(target, aura, aurEff);
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index a4a01575978..d810f044216 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -390,19 +390,19 @@ class spell_sha_deeply_rooted_elements : public AuraScript
void Register() override
{
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == TALENT_SPEC_SHAMAN_ELEMENTAL)
+ if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanElemental)
{
DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_LAVA_BURST>, EFFECT_1, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_ELEMENTAL>, EFFECT_1, SPELL_AURA_DUMMY);
}
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == TALENT_SPEC_SHAMAN_ENHANCEMENT)
+ if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanEnhancement)
{
DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_STORMSTRIKE>, EFFECT_2, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT>, EFFECT_2, SPELL_AURA_DUMMY);
}
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == TALENT_SPEC_SHAMAN_RESTORATION)
+ if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanRestoration)
{
DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_RIPTIDE>, EFFECT_3, SPELL_AURA_DUMMY);
OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_RESTORATION>, EFFECT_3, SPELL_AURA_DUMMY);