aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-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
6 files changed, 33 insertions, 67 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