mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-17 02:50:29 +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:
@@ -140,7 +140,7 @@ public:
|
||||
uint8 oldLevel = playerTarget->GetLevel();
|
||||
|
||||
// set starting level
|
||||
uint32 startLevel = playerTarget->getClass() != CLASS_DEATH_KNIGHT
|
||||
uint32 startLevel = !playerTarget->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT)
|
||||
? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
|
||||
: sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
|
||||
|
||||
|
||||
@@ -1029,7 +1029,7 @@ class spell_class_call_handler : public SpellScript
|
||||
targets.remove_if([spellInfo](WorldObject const* target) -> bool
|
||||
{
|
||||
Player const* player = target->ToPlayer();
|
||||
if (!player || player->getClass() == CLASS_DEATH_KNIGHT) // ignore all death knights from whatever spell, for some reason the condition below is not working x.x
|
||||
if (!player || player->IsClass(CLASS_DEATH_KNIGHT)) // ignore all death knights from whatever spell, for some reason the condition below is not working x.x
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -447,9 +447,9 @@ public:
|
||||
PlayerAbility_Timer = urand(8000, 10000);
|
||||
PlayerClass = target->getClass() - 1;
|
||||
|
||||
if (PlayerClass == CLASS_DRUID - 1)
|
||||
if (target->IsClass(CLASS_DRUID))
|
||||
PlayerClass = CLASS_DRUID;
|
||||
else if (PlayerClass == CLASS_PRIEST - 1 && target->HasSpell(15473))
|
||||
else if (target->IsClass(CLASS_PRIEST) && target->HasSpell(15473))
|
||||
PlayerClass = CLASS_PRIEST; // shadow priest
|
||||
|
||||
SiphonSoul_Timer = 99999; // buff lasts 30 sec
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
CloseGossipMenuFor(player);
|
||||
if (player->getClass() == CLASS_DRUID && player->GetTeamId() == TEAM_HORDE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_TAXI) && player->GetTeamId() == TEAM_HORDE)
|
||||
player->ActivateTaxiPathTo(TAXI_PATH_ID_HORDE);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
@@ -80,29 +80,42 @@ public:
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (player->getClass() != CLASS_DRUID)
|
||||
if (player->GetTeamId() != TEAM_HORDE)
|
||||
{
|
||||
SendGossipMenuFor(player, 4916, creature->GetGUID());
|
||||
}
|
||||
else if (player->GetTeamId() != TEAM_HORDE)
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_QUEST) && player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
AddGossipItemFor(player, 4042, 2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
}
|
||||
|
||||
SendGossipMenuFor(player, 4917, creature->GetGUID());
|
||||
if (player->IsClass(CLASS_DRUID))
|
||||
{
|
||||
SendGossipMenuFor(player, 4917, creature->GetGUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
SendGossipMenuFor(player, 4916, creature->GetGUID());
|
||||
}
|
||||
}
|
||||
else if (player->getClass() == CLASS_DRUID && player->GetTeamId() == TEAM_HORDE)
|
||||
else if (player->GetTeamId() == TEAM_HORDE)
|
||||
{
|
||||
AddGossipItemFor(player, 4042, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_TAXI))
|
||||
{
|
||||
AddGossipItemFor(player, 4042, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
|
||||
if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_QUEST) && player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
AddGossipItemFor(player, 4042, 1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
}
|
||||
|
||||
SendGossipMenuFor(player, 4918, creature->GetGUID());
|
||||
if (player->IsClass(CLASS_DRUID))
|
||||
{
|
||||
SendGossipMenuFor(player, 4918, creature->GetGUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
SendGossipMenuFor(player, 4916, creature->GetGUID());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -176,7 +189,7 @@ public:
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
CloseGossipMenuFor(player);
|
||||
if (player->getClass() == CLASS_DRUID && player->GetTeamId() == TEAM_ALLIANCE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_TAXI) && player->GetTeamId() == TEAM_ALLIANCE)
|
||||
player->ActivateTaxiPathTo(TAXI_PATH_ID_ALLY);
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
@@ -191,29 +204,41 @@ public:
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (player->getClass() != CLASS_DRUID)
|
||||
if (player->GetTeamId() != TEAM_ALLIANCE)
|
||||
{
|
||||
SendGossipMenuFor(player, 4913, creature->GetGUID());
|
||||
}
|
||||
else if (player->GetTeamId() != TEAM_ALLIANCE)
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_QUEST) && player->GetQuestStatus(QUEST_SEA_LION_HORDE) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
AddGossipItemFor(player, 4041, 2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
}
|
||||
|
||||
SendGossipMenuFor(player, 4915, creature->GetGUID());
|
||||
if (player->IsClass(CLASS_DRUID))
|
||||
{
|
||||
SendGossipMenuFor(player, 4915, creature->GetGUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
SendGossipMenuFor(player, 4913, creature->GetGUID());
|
||||
}
|
||||
}
|
||||
else if (player->getClass() == CLASS_DRUID && player->GetTeamId() == TEAM_ALLIANCE)
|
||||
else if (player->GetTeamId() == TEAM_ALLIANCE)
|
||||
{
|
||||
AddGossipItemFor(player, 4041, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_TAXI))
|
||||
{
|
||||
AddGossipItemFor(player, 4041, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
}
|
||||
|
||||
if (player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE)
|
||||
if (player->IsClass(CLASS_DRUID, CLASS_CONTEXT_QUEST) && player->GetQuestStatus(QUEST_SEA_LION_ALLY) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
AddGossipItemFor(player, 4041, 1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
}
|
||||
|
||||
SendGossipMenuFor(player, 4914, creature->GetGUID());
|
||||
if (player->IsClass(CLASS_DRUID))
|
||||
{
|
||||
SendGossipMenuFor(player, 4914, creature->GetGUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
SendGossipMenuFor(player, 4913, creature->GetGUID());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -853,12 +853,12 @@ public:
|
||||
{
|
||||
if (p->getPowerType() != POWER_MANA)
|
||||
return true;
|
||||
if (p->getClass() == CLASS_HUNTER)
|
||||
if (p->IsClass(CLASS_HUNTER))
|
||||
return true;
|
||||
uint8 maxIndex = p->GetMostPointsTalentTree();
|
||||
if ((p->getClass() == CLASS_PALADIN && maxIndex >= 1) || (p->getClass() == CLASS_SHAMAN && maxIndex == 1) || (p->getClass() == CLASS_DRUID && maxIndex == 1))
|
||||
if ((p->IsClass(CLASS_PALADIN) && maxIndex >= 1) || (p->IsClass(CLASS_SHAMAN) && maxIndex == 1) || (p->IsClass(CLASS_DRUID) && maxIndex == 1))
|
||||
return true;
|
||||
if (_removeHealers == ((p->getClass() == CLASS_DRUID && maxIndex == 2) || (p->getClass() == CLASS_PALADIN && maxIndex == 0) || (p->getClass() == CLASS_PRIEST && maxIndex <= 1) || (p->getClass() == CLASS_SHAMAN && maxIndex == 2)))
|
||||
if (_removeHealers == ((p->IsClass(CLASS_DRUID) && maxIndex == 2) || (p->IsClass(CLASS_PALADIN) && maxIndex == 0) || (p->IsClass(CLASS_PRIEST) && maxIndex <= 1) || (p->IsClass(CLASS_SHAMAN) && maxIndex == 2)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
||||
@@ -2856,8 +2856,7 @@ public:
|
||||
{
|
||||
c->AI()->AttackStart(target);
|
||||
DoZoneInCombat(c);
|
||||
uint8 Class = target->getClass();
|
||||
if (Class != CLASS_DRUID)
|
||||
if (!target->IsClass(CLASS_DRUID))
|
||||
if (Player* p = target->ToPlayer())
|
||||
{
|
||||
if (Item* i = p->GetWeaponForAttack(BASE_ATTACK))
|
||||
@@ -2869,7 +2868,7 @@ public:
|
||||
|
||||
target->CastSpell(c, 60352, true); // Mirror Image, clone visual appearance
|
||||
}
|
||||
c->AI()->DoAction(Class);
|
||||
c->AI()->DoAction(target->getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1014,7 +1014,7 @@ class spell_dk_blood_boil : public SpellScript
|
||||
bool Load() override
|
||||
{
|
||||
_executed = false;
|
||||
return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT;
|
||||
return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY);
|
||||
}
|
||||
|
||||
void HandleAfterHit()
|
||||
@@ -1258,7 +1258,7 @@ class spell_dk_death_gate : public SpellScript
|
||||
|
||||
SpellCastResult CheckClass()
|
||||
{
|
||||
if (GetCaster()->getClass() != CLASS_DEATH_KNIGHT)
|
||||
if (!GetCaster()->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
{
|
||||
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT);
|
||||
return SPELL_FAILED_CUSTOM_ERROR;
|
||||
|
||||
@@ -446,7 +446,7 @@ class spell_pet_hit_expertise_scalling : public AuraScript
|
||||
{
|
||||
if (Player* modOwner = GetUnitOwner()->GetSpellModOwner())
|
||||
{
|
||||
if (modOwner->getClass() == CLASS_HUNTER)
|
||||
if (modOwner->IsClass(CLASS_HUNTER, CLASS_CONTEXT_STATS))
|
||||
amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 8.0f);
|
||||
else if (modOwner->getPowerType() == POWER_MANA)
|
||||
amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 8.0f);
|
||||
@@ -459,7 +459,7 @@ class spell_pet_hit_expertise_scalling : public AuraScript
|
||||
{
|
||||
if (Player* modOwner = GetUnitOwner()->GetSpellModOwner())
|
||||
{
|
||||
if (modOwner->getClass() == CLASS_HUNTER)
|
||||
if (modOwner->IsClass(CLASS_HUNTER, CLASS_CONTEXT_STATS))
|
||||
amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 17.0f);
|
||||
else if (modOwner->getPowerType() == POWER_MANA)
|
||||
amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 17.0f);
|
||||
@@ -472,7 +472,7 @@ class spell_pet_hit_expertise_scalling : public AuraScript
|
||||
{
|
||||
if (Player* modOwner = GetUnitOwner()->GetSpellModOwner())
|
||||
{
|
||||
if (modOwner->getClass() == CLASS_HUNTER)
|
||||
if (modOwner->IsClass(CLASS_HUNTER, CLASS_CONTEXT_STATS))
|
||||
amount = CalculatePercent(modOwner->m_modRangedHitChance, 8.0f, 26.0f);
|
||||
else if (modOwner->getPowerType() == POWER_MANA)
|
||||
amount = CalculatePercent(modOwner->m_modSpellHitChance, 17.0f, 26.0f);
|
||||
@@ -1673,7 +1673,7 @@ class spell_gen_pet_summoned : public SpellScript
|
||||
Player* player = GetCaster()->ToPlayer();
|
||||
if (player->GetLastPetNumber() && player->CanResummonPet(player->GetLastPetSpell()))
|
||||
{
|
||||
PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET;
|
||||
PetType newPetType = (player->IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET)) ? HUNTER_PET : SUMMON_PET;
|
||||
Pet* newPet = new Pet(player, newPetType);
|
||||
if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true, 100))
|
||||
{
|
||||
@@ -3545,11 +3545,11 @@ class spell_gen_on_tournament_mount : public AuraScript
|
||||
case NPC_ARGENT_WARHORSE:
|
||||
{
|
||||
if (player->HasAchieved(ACHIEVEMENT_CHAMPION_ALLIANCE) || player->HasAchieved(ACHIEVEMENT_CHAMPION_HORDE))
|
||||
return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_CHAMPION : SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION;
|
||||
return player->IsClass(CLASS_DEATH_KNIGHT) ? SPELL_PENNANT_EBON_BLADE_CHAMPION : SPELL_PENNANT_ARGENT_CRUSADE_CHAMPION;
|
||||
else if (player->HasAchieved(ACHIEVEMENT_ARGENT_VALOR))
|
||||
return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_VALIANT : SPELL_PENNANT_ARGENT_CRUSADE_VALIANT;
|
||||
return player->IsClass(CLASS_DEATH_KNIGHT) ? SPELL_PENNANT_EBON_BLADE_VALIANT : SPELL_PENNANT_ARGENT_CRUSADE_VALIANT;
|
||||
else
|
||||
return player->getClass() == CLASS_DEATH_KNIGHT ? SPELL_PENNANT_EBON_BLADE_ASPIRANT : SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT;
|
||||
return player->IsClass(CLASS_DEATH_KNIGHT) ? SPELL_PENNANT_EBON_BLADE_ASPIRANT : SPELL_PENNANT_ARGENT_CRUSADE_ASPIRANT;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
|
||||
@@ -3469,7 +3469,7 @@ class spell_item_refocus : public SpellScript
|
||||
{
|
||||
Player* caster = GetCaster()->ToPlayer();
|
||||
|
||||
if (!caster || caster->getClass() != CLASS_HUNTER)
|
||||
if (!caster || !caster->IsClass(CLASS_HUNTER, CLASS_CONTEXT_ABILITY))
|
||||
return;
|
||||
|
||||
caster->RemoveCategoryCooldown(SPELL_CATEGORY_AIMED_MULTI);
|
||||
|
||||
Reference in New Issue
Block a user