diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-08-06 20:21:34 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-08-07 00:05:36 +0200 |
commit | 98007f859b7318570c0c923a00aa32fc485c8ec8 (patch) | |
tree | ef8405fa2d3740b6531a510673a0124dd0c2c957 | |
parent | d2784d4c65ec987fe587718d96b2feb885905e13 (diff) |
Core/Misc: Turn ChrSpecialization into enum class
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); |