mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-22 05:06:24 +00:00
feat(Core/Unit): New helper IsClass and script hook OnPlayerIsClass (#18243)
* Class Comparison Logic Encapsulation - Parity * Add Context to IsClass * Add Unit IsClass script hook * Replace additional getClass with IsClass * Update CanUseItem to replace getClass with IsClass * Add separate context for pet vs ability * Change Create to Init since not all referenced contexts are creation * Align spacing in ClassContext * Drop context on LFGManager max power * Update IsClass context that wraps around Missle Barrage * Rename context for swapping weapons * Be more specific than CLASS_CONTEXT_TALENT * Remove duplicate context * Moved IsClass Hook to Player * Removed unused parameter in virtual base function * Added maybe_unused to IsClass virtual in order to compile To match the override signature, the virtual base needs to include the parameter in question, so using [maybe_unused] to signal to the compiler to allow it * Remove extra blank line * Add ABILITY_REACTIVE context * Add context for PET_CHARM * Remove explicit nullopt check per review * Code Readability - Change if to if else in pet Due to the return pattern, this doesn't change functionality in any way * Add OnPlayer to disambiguate --------- Co-authored-by: NathanHandley <nathanhandley@protonmail.com>
This commit is contained in:
@@ -346,134 +346,127 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
|
||||
index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MODS;
|
||||
index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER;
|
||||
|
||||
switch (getClass())
|
||||
if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
case CLASS_HUNTER:
|
||||
val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
|
||||
break;
|
||||
case CLASS_ROGUE:
|
||||
case CLASS_WARRIOR:
|
||||
val2 = level + GetStat(STAT_AGILITY) - 10.0f;
|
||||
break;
|
||||
case CLASS_DRUID:
|
||||
switch (GetShapeshiftForm())
|
||||
{
|
||||
case FORM_CAT:
|
||||
case FORM_BEAR:
|
||||
case FORM_DIREBEAR:
|
||||
val2 = 0.0f;
|
||||
break;
|
||||
default:
|
||||
val2 = GetStat(STAT_AGILITY) - 10.0f;
|
||||
break;
|
||||
}
|
||||
val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
|
||||
}
|
||||
else if (IsClass(CLASS_ROGUE, CLASS_CONTEXT_STATS) || IsClass(CLASS_WARRIOR, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
val2 = level + GetStat(STAT_AGILITY) - 10.0f;
|
||||
}
|
||||
else if (IsClass(CLASS_DRUID, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
switch (GetShapeshiftForm())
|
||||
{
|
||||
case FORM_CAT:
|
||||
case FORM_BEAR:
|
||||
case FORM_DIREBEAR:
|
||||
val2 = 0.0f;
|
||||
break;
|
||||
default:
|
||||
val2 = GetStat(STAT_AGILITY) - 10.0f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
val2 = GetStat(STAT_AGILITY) - 10.0f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (getClass())
|
||||
if (IsClass(CLASS_PALADIN, CLASS_CONTEXT_STATS) || IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_STATS) || IsClass(CLASS_WARRIOR, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
case CLASS_PALADIN:
|
||||
case CLASS_DEATH_KNIGHT:
|
||||
case CLASS_WARRIOR:
|
||||
val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
|
||||
break;
|
||||
case CLASS_HUNTER:
|
||||
case CLASS_SHAMAN:
|
||||
case CLASS_ROGUE:
|
||||
val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
|
||||
break;
|
||||
case CLASS_DRUID:
|
||||
val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
|
||||
}
|
||||
else if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_STATS) || IsClass(CLASS_SHAMAN, CLASS_CONTEXT_STATS) || IsClass(CLASS_ROGUE, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
|
||||
}
|
||||
else if (IsClass(CLASS_DRUID, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
// Check if Predatory Strikes is skilled
|
||||
float mLevelMult = 0.0f;
|
||||
float weapon_bonus = 0.0f;
|
||||
if (IsInFeralForm())
|
||||
{
|
||||
Unit::AuraEffectList const& mDummy = GetAuraEffectsByType(SPELL_AURA_DUMMY);
|
||||
for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
|
||||
{
|
||||
// Check if Predatory Strikes is skilled
|
||||
float mLevelMult = 0.0f;
|
||||
float weapon_bonus = 0.0f;
|
||||
if (IsInFeralForm())
|
||||
AuraEffect* aurEff = *itr;
|
||||
if (aurEff->GetSpellInfo()->SpellIconID == 1563)
|
||||
{
|
||||
Unit::AuraEffectList const& mDummy = GetAuraEffectsByType(SPELL_AURA_DUMMY);
|
||||
for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
|
||||
switch (aurEff->GetEffIndex())
|
||||
{
|
||||
AuraEffect* aurEff = *itr;
|
||||
if (aurEff->GetSpellInfo()->SpellIconID == 1563)
|
||||
case 0: // Predatory Strikes (effect 0)
|
||||
mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
|
||||
break;
|
||||
case 1: // Predatory Strikes (effect 1)
|
||||
if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
|
||||
{
|
||||
switch (aurEff->GetEffIndex())
|
||||
// also gains % attack power from equipped weapon
|
||||
ItemTemplate const* proto = mainHand->GetTemplate();
|
||||
if (!proto)
|
||||
continue;
|
||||
|
||||
uint32 ap = proto->getFeralBonus();
|
||||
// Get AP Bonuses from weapon
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
|
||||
{
|
||||
case 0: // Predatory Strikes (effect 0)
|
||||
mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
|
||||
if (i >= proto->StatsCount)
|
||||
break;
|
||||
case 1: // Predatory Strikes (effect 1)
|
||||
if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
|
||||
{
|
||||
// also gains % attack power from equipped weapon
|
||||
ItemTemplate const* proto = mainHand->GetTemplate();
|
||||
if (!proto)
|
||||
continue;
|
||||
|
||||
uint32 ap = proto->getFeralBonus();
|
||||
// Get AP Bonuses from weapon
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
|
||||
{
|
||||
if (i >= proto->StatsCount)
|
||||
break;
|
||||
|
||||
if (proto->ItemStat[i].ItemStatType == ITEM_MOD_ATTACK_POWER)
|
||||
ap += proto->ItemStat[i].ItemStatValue;
|
||||
}
|
||||
|
||||
// Get AP Bonuses from weapon spells
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
{
|
||||
// no spell
|
||||
if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
|
||||
continue;
|
||||
|
||||
// check if it is valid spell
|
||||
SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
|
||||
if (!spellproto)
|
||||
continue;
|
||||
|
||||
for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
|
||||
if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
|
||||
ap += spellproto->Effects[j].CalcValue();
|
||||
}
|
||||
|
||||
weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (proto->ItemStat[i].ItemStatType == ITEM_MOD_ATTACK_POWER)
|
||||
ap += proto->ItemStat[i].ItemStatValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (GetShapeshiftForm())
|
||||
{
|
||||
case FORM_CAT:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
|
||||
break;
|
||||
case FORM_BEAR:
|
||||
case FORM_DIREBEAR:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
|
||||
break;
|
||||
case FORM_MOONKIN:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
|
||||
// Get AP Bonuses from weapon spells
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
{
|
||||
// no spell
|
||||
if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
|
||||
continue;
|
||||
|
||||
// check if it is valid spell
|
||||
SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
|
||||
if (!spellproto)
|
||||
continue;
|
||||
|
||||
for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
|
||||
if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
|
||||
ap += spellproto->Effects[j].CalcValue();
|
||||
}
|
||||
|
||||
weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLASS_MAGE:
|
||||
case CLASS_PRIEST:
|
||||
case CLASS_WARLOCK:
|
||||
val2 = GetStat(STAT_STRENGTH) - 10.0f;
|
||||
}
|
||||
|
||||
switch (GetShapeshiftForm())
|
||||
{
|
||||
case FORM_CAT:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
|
||||
break;
|
||||
case FORM_BEAR:
|
||||
case FORM_DIREBEAR:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
|
||||
break;
|
||||
case FORM_MOONKIN:
|
||||
val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
|
||||
break;
|
||||
default:
|
||||
val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (IsClass(CLASS_MAGE, CLASS_CONTEXT_STATS) || IsClass(CLASS_PRIEST, CLASS_CONTEXT_STATS) || IsClass(CLASS_WARLOCK, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
val2 = GetStat(STAT_STRENGTH) - 10.0f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -521,7 +514,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
|
||||
UpdateDamagePhysical(BASE_ATTACK);
|
||||
if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
|
||||
UpdateDamagePhysical(OFF_ATTACK);
|
||||
if (getClass() == CLASS_SHAMAN || getClass() == CLASS_PALADIN) // mental quickness
|
||||
if (IsClass(CLASS_SHAMAN, CLASS_CONTEXT_STATS) || IsClass(CLASS_PALADIN, CLASS_CONTEXT_STATS)) // mental quickness
|
||||
UpdateSpellDamageAndHealingBonus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8834,7 +8834,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
|
||||
// Convert recently used Blood Rune to Death Rune
|
||||
if (Player* player = ToPlayer())
|
||||
{
|
||||
if (player->getClass() != CLASS_DEATH_KNIGHT)
|
||||
if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
return false;
|
||||
|
||||
// xinef: not true
|
||||
@@ -9565,7 +9565,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
|
||||
// Item - Death Knight T10 Melee 4P Bonus
|
||||
if (auraSpellInfo->Id == 70656)
|
||||
{
|
||||
if (GetTypeId() != TYPEID_PLAYER || getClass() != CLASS_DEATH_KNIGHT)
|
||||
if (GetTypeId() != TYPEID_PLAYER || !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
return false;
|
||||
|
||||
for (uint8 i = 0; i < MAX_RUNES; ++i)
|
||||
@@ -9576,7 +9576,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
|
||||
else if (auraSpellInfo->SpellIconID == 85)
|
||||
{
|
||||
Player* plr = ToPlayer();
|
||||
if (!plr || plr->getClass() != CLASS_DEATH_KNIGHT || !procSpell)
|
||||
if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
|
||||
return false;
|
||||
|
||||
if (!plr->IsBaseRuneSlotsOnCooldown(RUNE_BLOOD))
|
||||
@@ -13823,7 +13823,7 @@ void Unit::ClearInCombat()
|
||||
else if (Player* player = ToPlayer())
|
||||
{
|
||||
player->UpdatePotionCooldown();
|
||||
if (player->getClass() == CLASS_DEATH_KNIGHT)
|
||||
if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
for (uint8 i = 0; i < MAX_RUNES; ++i)
|
||||
player->SetGracePeriod(i, 0);
|
||||
}
|
||||
@@ -16361,7 +16361,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
if (procExtra & PROC_EX_DODGE)
|
||||
{
|
||||
// Update AURA_STATE on dodge
|
||||
if (getClass() != CLASS_ROGUE) // skip Rogue Riposte
|
||||
if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
|
||||
{
|
||||
ModifyAuraState(AURA_STATE_DEFENSE, true);
|
||||
StartReactiveTimer(REACTIVE_DEFENSE);
|
||||
@@ -16371,7 +16371,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
if (procExtra & PROC_EX_PARRY)
|
||||
{
|
||||
// For Hunters only Counterattack (skip Mongoose bite)
|
||||
if (getClass() == CLASS_HUNTER)
|
||||
if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_ABILITY_REACTIVE))
|
||||
{
|
||||
ModifyAuraState(AURA_STATE_HUNTER_PARRY, true);
|
||||
StartReactiveTimer(REACTIVE_HUNTER_PARRY);
|
||||
@@ -16394,7 +16394,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
|
||||
// Overpower on victim dodge
|
||||
if (procExtra & PROC_EX_DODGE)
|
||||
{
|
||||
if (getClass() == CLASS_WARRIOR)
|
||||
if (IsClass(CLASS_WARRIOR, CLASS_CONTEXT_ABILITY_REACTIVE))
|
||||
{
|
||||
AddComboPoints(target, 1);
|
||||
StartReactiveTimer(REACTIVE_OVERPOWER);
|
||||
@@ -17201,9 +17201,9 @@ void Unit::ClearAllReactives()
|
||||
|
||||
if (HasAuraState(AURA_STATE_DEFENSE))
|
||||
ModifyAuraState(AURA_STATE_DEFENSE, false);
|
||||
if (getClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_PARRY))
|
||||
if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_ABILITY_REACTIVE) && HasAuraState(AURA_STATE_HUNTER_PARRY))
|
||||
ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);
|
||||
if (getClass() == CLASS_WARRIOR && GetTypeId() == TYPEID_PLAYER)
|
||||
if (IsClass(CLASS_WARRIOR, CLASS_CONTEXT_ABILITY_REACTIVE) && GetTypeId() == TYPEID_PLAYER)
|
||||
ClearComboPoints();
|
||||
}
|
||||
|
||||
@@ -17227,11 +17227,11 @@ void Unit::UpdateReactives(uint32 p_time)
|
||||
ModifyAuraState(AURA_STATE_DEFENSE, false);
|
||||
break;
|
||||
case REACTIVE_HUNTER_PARRY:
|
||||
if (getClass() == CLASS_HUNTER && HasAuraState(AURA_STATE_HUNTER_PARRY))
|
||||
if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_ABILITY_REACTIVE) && HasAuraState(AURA_STATE_HUNTER_PARRY))
|
||||
ModifyAuraState(AURA_STATE_HUNTER_PARRY, false);
|
||||
break;
|
||||
case REACTIVE_OVERPOWER:
|
||||
if (getClass() == CLASS_WARRIOR)
|
||||
if (IsClass(CLASS_WARRIOR, CLASS_CONTEXT_ABILITY_REACTIVE))
|
||||
{
|
||||
ClearComboPoints();
|
||||
}
|
||||
@@ -18096,7 +18096,7 @@ void Unit::Kill(Unit* killer, Unit* victim, bool durabilityLoss, WeaponAttackTyp
|
||||
// Spirit of Redemption
|
||||
// if talent known but not triggered (check priest class for speedup check)
|
||||
bool spiritOfRedemption = false;
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && victim->getClass() == CLASS_PRIEST && !victim->ToPlayer()->HasPlayerFlag(PLAYER_FLAGS_IS_OUT_OF_BOUNDS))
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && victim->IsClass(CLASS_PRIEST, CLASS_CONTEXT_ABILITY) && !victim->ToPlayer()->HasPlayerFlag(PLAYER_FLAGS_IS_OUT_OF_BOUNDS))
|
||||
{
|
||||
if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
|
||||
{
|
||||
@@ -18704,7 +18704,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
|
||||
GetMotionMaster()->MoveIdle();
|
||||
StopMoving();
|
||||
|
||||
if (charmer->GetTypeId() == TYPEID_PLAYER && charmer->getClass() == CLASS_WARLOCK && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
|
||||
if (charmer->GetTypeId() == TYPEID_PLAYER && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
|
||||
{
|
||||
// Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
|
||||
Creature* charmed = ToCreature();
|
||||
@@ -18770,7 +18770,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
|
||||
playerCharmer->PossessSpellInitialize();
|
||||
break;
|
||||
case CHARM_TYPE_CHARM:
|
||||
if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK)
|
||||
if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM))
|
||||
{
|
||||
CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate();
|
||||
if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
|
||||
@@ -18892,7 +18892,7 @@ void Unit::RemoveCharmedBy(Unit* charmer)
|
||||
ClearUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
|
||||
break;
|
||||
case CHARM_TYPE_CHARM:
|
||||
if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK)
|
||||
if (GetTypeId() == TYPEID_UNIT && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM))
|
||||
{
|
||||
CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate();
|
||||
if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
|
||||
|
||||
@@ -440,6 +440,29 @@ enum DamageEffectType : uint8
|
||||
SELF_DAMAGE = 5
|
||||
};
|
||||
|
||||
// Used for IsClass hook
|
||||
enum ClassContext : uint8
|
||||
{
|
||||
CLASS_CONTEXT_NONE = 0, // Default
|
||||
CLASS_CONTEXT_INIT = 1,
|
||||
CLASS_CONTEXT_TELEPORT = 2,
|
||||
CLASS_CONTEXT_QUEST = 3,
|
||||
CLASS_CONTEXT_STATS = 4,
|
||||
CLASS_CONTEXT_TAXI = 5,
|
||||
CLASS_CONTEXT_SKILL = 6,
|
||||
CLASS_CONTEXT_TALENT_POINT_CALC = 7,
|
||||
CLASS_CONTEXT_ABILITY = 8,
|
||||
CLASS_CONTEXT_ABILITY_REACTIVE = 9,
|
||||
CLASS_CONTEXT_PET = 10,
|
||||
CLASS_CONTEXT_PET_CHARM = 11,
|
||||
CLASS_CONTEXT_EQUIP_RELIC = 12,
|
||||
CLASS_CONTEXT_EQUIP_SHIELDS = 13,
|
||||
CLASS_CONTEXT_EQUIP_ARMOR_CLASS = 14,
|
||||
CLASS_CONTEXT_WEAPON_SWAP = 15,
|
||||
CLASS_CONTEXT_GRAVEYARD = 16,
|
||||
CLASS_CONTEXT_CLASS_TRAINER = 17
|
||||
};
|
||||
|
||||
// Value masks for UNIT_FIELD_FLAGS
|
||||
// EnumUtils: DESCRIBE THIS
|
||||
enum UnitFlags : uint32
|
||||
@@ -1436,6 +1459,7 @@ public:
|
||||
void setRace(uint8 race);
|
||||
[[nodiscard]] uint32 getRaceMask() const { return 1 << (getRace(true) - 1); }
|
||||
[[nodiscard]] uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
|
||||
[[nodiscard]] virtual bool IsClass(Classes unitClass, [[maybe_unused]] ClassContext context = CLASS_CONTEXT_NONE) const { return (getClass() == unitClass); }
|
||||
[[nodiscard]] uint32 getClassMask() const { return 1 << (getClass() - 1); }
|
||||
[[nodiscard]] uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); }
|
||||
[[nodiscard]] DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const;
|
||||
|
||||
Reference in New Issue
Block a user