aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-08-06 21:40:10 +0200
committerShauren <shauren.trinity@gmail.com>2023-08-07 00:05:36 +0200
commit054723241eaf1abe7d45a96460e84b9ff113ffb2 (patch)
treeca21c9a69def2af64e68d66106a73f5c5553e262
parente71b2f62c1eac13d90840970b64a37b7cc40e915 (diff)
Core/Misc: Reduce number of player spec hardcoded checks
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.cpp57
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.h4
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp8
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp2
-rw-r--r--src/server/game/DataStores/DB2Structure.h3
-rw-r--r--src/server/game/DataStores/DBCEnums.h26
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp44
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp4
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp2
9 files changed, 42 insertions, 108 deletions
diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp
index 217d12fc2e0..d61f084431d 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;
}
-uint16 PlayerAI::GetSpec(Player const* who /*= nullptr*/) const
+uint32 PlayerAI::GetSpec(Player const* who /*= nullptr*/) const
{
return (!who || who == me) ? _selfSpec : who->GetPrimarySpecialization();
}
@@ -416,28 +416,8 @@ bool PlayerAI::IsPlayerHealer(Player const* who)
if (!who)
return false;
- switch (who->GetClass())
- {
- case CLASS_WARRIOR:
- case CLASS_HUNTER:
- case CLASS_ROGUE:
- case CLASS_DEATH_KNIGHT:
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- case CLASS_DEMON_HUNTER:
- default:
- return false;
- case CLASS_PALADIN:
- return who->GetPrimarySpecialization() == TALENT_SPEC_PALADIN_HOLY;
- case CLASS_PRIEST:
- return who->GetPrimarySpecialization() == TALENT_SPEC_PRIEST_DISCIPLINE || who->GetPrimarySpecialization() == TALENT_SPEC_PRIEST_HOLY;
- case CLASS_SHAMAN:
- return who->GetPrimarySpecialization() == TALENT_SPEC_SHAMAN_RESTORATION;
- case CLASS_MONK:
- return who->GetPrimarySpecialization() == TALENT_SPEC_MONK_MISTWEAVER;
- case CLASS_DRUID:
- return who->GetPrimarySpecialization() == TALENT_SPEC_DRUID_RESTORATION;
- }
+ return who->GetPrimarySpecialization()
+ && sChrSpecializationStore.AssertEntry(who->GetPrimarySpecialization())->GetRole() == ChrSpecializationRole::Healer;
}
bool PlayerAI::IsPlayerRangedAttacker(Player const* who)
@@ -445,33 +425,8 @@ bool PlayerAI::IsPlayerRangedAttacker(Player const* who)
if (!who)
return false;
- switch (who->GetClass())
- {
- case CLASS_WARRIOR:
- case CLASS_PALADIN:
- case CLASS_ROGUE:
- case CLASS_DEATH_KNIGHT:
- default:
- return false;
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- return true;
- case CLASS_HUNTER:
- {
- // check if we have a ranged weapon equipped
- Item const* rangedSlot = who->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED);
- if (ItemTemplate const* rangedTemplate = rangedSlot ? rangedSlot->GetTemplate() : nullptr)
- if ((1 << rangedTemplate->GetSubClass()) & ITEM_SUBCLASS_MASK_WEAPON_RANGED)
- return true;
- return false;
- }
- case CLASS_PRIEST:
- return who->GetPrimarySpecialization() == TALENT_SPEC_PRIEST_SHADOW;
- case CLASS_SHAMAN:
- return who->GetPrimarySpecialization() == TALENT_SPEC_SHAMAN_ELEMENTAL;
- case CLASS_DRUID:
- return who->GetPrimarySpecialization() == TALENT_SPEC_DRUID_BALANCE;
- }
+ return who->GetPrimarySpecialization()
+ && sChrSpecializationStore.AssertEntry(who->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
}
PlayerAI::TargetedSpell PlayerAI::VerifySpellCast(uint32 spellId, Unit* target)
@@ -642,7 +597,7 @@ void PlayerAI::DoAutoAttackIfReady()
void PlayerAI::CancelAllShapeshifts()
{
- std::list<AuraEffect*> const& shapeshiftAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT);
+ Unit::AuraEffectList const& shapeshiftAuras = me->GetAuraEffectsByType(SPELL_AURA_MOD_SHAPESHIFT);
std::set<Aura*> removableShapeshifts;
for (AuraEffect* auraEff : shapeshiftAuras)
{
diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h
index 1e129879bd6..a6c429b6308 100644
--- a/src/server/game/AI/PlayerAI/PlayerAI.h
+++ b/src/server/game/AI/PlayerAI/PlayerAI.h
@@ -31,7 +31,7 @@ class TC_GAME_API PlayerAI : public UnitAI
Creature* GetCharmer() const;
// helper functions to determine player info
- uint16 GetSpec(Player const* who = nullptr) const;
+ uint32 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 +85,7 @@ class TC_GAME_API PlayerAI : public UnitAI
void CancelAllShapeshifts();
private:
- uint16 const _selfSpec;
+ uint32 const _selfSpec;
bool const _isSelfHealer;
bool _isSelfRangedAttacker;
};
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index cdcb7e18527..a8f2deffa28 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -4017,16 +4017,16 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond
return otherUnit && unit->GetReactionTo(otherUnit) <= REP_HOSTILE;
case UnitConditionVariable::IsSpecMelee:
return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->Flags & CHR_SPECIALIZATION_FLAG_MELEE;
+ && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Melee);
case UnitConditionVariable::IsSpecTank:
return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->Role == 0;
+ && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetRole() == ChrSpecializationRole::Tank;
case UnitConditionVariable::IsSpecRanged:
return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->Flags & CHR_SPECIALIZATION_FLAG_RANGED;
+ && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->GetFlags().HasFlag(ChrSpecializationFlag::Ranged);
case UnitConditionVariable::IsSpecHealer:
return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecialization()
- && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->Role == 1;
+ && sChrSpecializationStore.AssertEntry(unit->ToPlayer()->GetPrimarySpecialization())->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 5f48fc65b4d..666d3e336b9 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -1183,7 +1183,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS);
uint32 storageIndex = chrSpec->ClassID;
- if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC)
+ if (chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::PetOverrideSpec))
{
ASSERT(!chrSpec->ClassID);
storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 426c7b7d033..8f7f43cdc91 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -848,6 +848,9 @@ struct ChrSpecializationEntry
int32 AnimReplacements;
std::array<int32, MAX_MASTERY_SPELLS> MasterySpellID;
+ EnumFlag<ChrSpecializationFlag> GetFlags() const { return static_cast<ChrSpecializationFlag>(Flags); }
+ ChrSpecializationRole GetRole() const { return static_cast<ChrSpecializationRole>(Role); }
+
bool IsPetSpecialization() const
{
return ClassID == 0;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 730f6635ce3..15cd4554cb7 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -280,15 +280,23 @@ enum class ChrRacesFlag : int32
DEFINE_ENUM_FLAG(ChrRacesFlag);
-enum ChrSpecializationFlag
-{
- CHR_SPECIALIZATION_FLAG_CASTER = 0x01,
- CHR_SPECIALIZATION_FLAG_RANGED = 0x02,
- CHR_SPECIALIZATION_FLAG_MELEE = 0x04,
- CHR_SPECIALIZATION_FLAG_UNKNOWN = 0x08,
- CHR_SPECIALIZATION_FLAG_DUAL_WIELD_TWO_HANDED = 0x10, // used for CUnitDisplay::SetSheatheInvertedForDualWield
- CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC = 0x20,
- CHR_SPECIALIZATION_FLAG_RECOMMENDED = 0x40,
+enum class ChrSpecializationFlag : uint32
+{
+ Caster = 0x01,
+ Ranged = 0x02,
+ Melee = 0x04,
+ DualWieldTwoHanded = 0x10, // used for CUnitDisplay::SetSheatheInvertedForDualWield
+ PetOverrideSpec = 0x20,
+ Recommended = 0x40,
+};
+
+DEFINE_ENUM_FLAG(ChrSpecializationFlag);
+
+enum class ChrSpecializationRole : int8
+{
+ Tank = 0,
+ Healer = 1,
+ Dps = 2
};
enum class ContentTuningCalcType : int32
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 4a7b9cd7a80..41bce531c60 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -419,50 +419,18 @@ struct npc_twisted_visage : public ScriptedAI
void AttackStart(Unit* who) override
{
- switch (_playerClass)
- {
- case CLASS_SHAMAN:
- switch (_playerSpec)
- {
- case TALENT_SPEC_SHAMAN_ELEMENTAL:
- case TALENT_SPEC_SHAMAN_RESTORATION:
- ScriptedAI::AttackStartCaster(who, 25.0f);
- break;
- default:
- break;
- }
- break;
- case CLASS_DRUID:
- switch (_playerSpec)
- {
- case TALENT_SPEC_DRUID_BALANCE:
- case TALENT_SPEC_DRUID_RESTORATION:
- ScriptedAI::AttackStartCaster(who, 25.0f);
- break;
- default:
- break;
- }
- break;
- case CLASS_PRIEST:
- case CLASS_HUNTER:
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- ScriptedAI::AttackStartCaster(who, 25.0f);
- break;
- case CLASS_ROGUE:
- ScriptedAI::AttackStart(who);
- break;
- default:
- ScriptedAI::AttackStart(who);
- break;
- }
+ ChrSpecializationEntry const* chrSpecialization = sChrSpecializationStore.LookupEntry(_playerSpec);
+ if (chrSpecialization && chrSpecialization->GetFlags().HasFlag(ChrSpecializationFlag::Ranged))
+ ScriptedAI::AttackStartCaster(who, 25.0f);
+ else
+ ScriptedAI::AttackStart(who);
}
void SetData(uint32 type, uint32 data) override
{
if (type == DATA_TWISTED_VISAGE_PLAYER_CLASS)
{
- if (data > CLASS_NONE && data <= CLASS_DRUID)
+ if (data > CLASS_NONE && data < MAX_CLASSES)
_playerClass = data;
}
else if (type == DATA_TWISTED_VISAGE_PLAYER_SPEC && _playerClass != CLASS_NONE)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index ce9f385e625..e4d74a47faa 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -1099,13 +1099,13 @@ class spell_sindragosa_unchained_magic : public SpellScript
continue;
ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(player->GetPrimarySpecialization());
- if (specialization->Role == 1)
+ if (specialization->GetRole() == ChrSpecializationRole::Healer)
{
healers.push_back(target);
continue;
}
- if (specialization->Flags & CHR_SPECIALIZATION_FLAG_CASTER)
+ if (specialization->GetFlags().HasFlag(ChrSpecializationFlag::Caster))
casters.push_back(target);
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index f7b4ed8ce79..28258e7d1a7 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -804,7 +804,7 @@ class spell_dru_innervate : public SpellScript
return SPELL_FAILED_BAD_TARGETS;
ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(target->GetPrimarySpecialization());
- if (!spec || spec->Role != 1)
+ if (!spec || spec->GetRole() != ChrSpecializationRole::Healer)
return SPELL_FAILED_BAD_TARGETS;
return SPELL_CAST_OK;