mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-25 14:46: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:
@@ -553,7 +553,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
|
||||
SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
|
||||
|
||||
// set starting level
|
||||
uint32 start_level = getClass() != CLASS_DEATH_KNIGHT
|
||||
uint32 start_level = !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT)
|
||||
? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
|
||||
: sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
|
||||
|
||||
@@ -568,7 +568,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
|
||||
|
||||
InitRunes();
|
||||
|
||||
SetUInt32Value(PLAYER_FIELD_COINAGE, getClass() != CLASS_DEATH_KNIGHT
|
||||
SetUInt32Value(PLAYER_FIELD_COINAGE, !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT)
|
||||
? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
|
||||
: sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_MONEY));
|
||||
SetHonorPoints(sWorld->getIntConfig(CONFIG_START_HONOR_POINTS));
|
||||
@@ -633,7 +633,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
|
||||
switch (iProto->Spells[0].SpellCategory)
|
||||
{
|
||||
case SPELL_CATEGORY_FOOD: // food
|
||||
count = getClass() == CLASS_DEATH_KNIGHT ? 10 : 4;
|
||||
count = IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT) ? 10 : 4;
|
||||
break;
|
||||
case SPELL_CATEGORY_DRINK: // drink
|
||||
count = 2;
|
||||
@@ -1269,6 +1269,15 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Player::IsClass(Classes unitClass, ClassContext context) const
|
||||
{
|
||||
Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
|
||||
if (scriptResult != std::nullopt)
|
||||
return *scriptResult;
|
||||
else
|
||||
return (getClass() == unitClass);
|
||||
}
|
||||
|
||||
void Player::ToggleAFK()
|
||||
{
|
||||
ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK);
|
||||
@@ -1460,7 +1469,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
|
||||
}
|
||||
else
|
||||
{
|
||||
if (getClass() == CLASS_DEATH_KNIGHT && GetMapId() == 609 && !IsGameMaster() && !HasSpell(50977))
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && GetMapId() == 609 && !IsGameMaster() && !HasSpell(50977))
|
||||
{
|
||||
SendTransferAborted(mapid, TRANSFER_ABORT_UNIQUE_MESSAGE, 1);
|
||||
return false;
|
||||
@@ -1745,7 +1754,7 @@ void Player::RegenerateAll()
|
||||
Regenerate(POWER_MANA);
|
||||
|
||||
// Runes act as cooldowns, and they don't need to send any data
|
||||
if (getClass() == CLASS_DEATH_KNIGHT)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
for (uint8 i = 0; i < MAX_RUNES; ++i)
|
||||
{
|
||||
// xinef: implement grace
|
||||
@@ -1775,7 +1784,7 @@ void Player::RegenerateAll()
|
||||
}
|
||||
|
||||
Regenerate(POWER_RAGE);
|
||||
if (getClass() == CLASS_DEATH_KNIGHT)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
Regenerate(POWER_RUNIC_POWER);
|
||||
|
||||
m_regenTimerCount -= 2000;
|
||||
@@ -2106,7 +2115,7 @@ Creature* Player::GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
|
||||
|
||||
// pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
|
||||
// pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
|
||||
if (npcflagmask & (UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_TRAINER_CLASS) && creature->GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS && getClass() != creature->GetCreatureTemplate()->trainer_class)
|
||||
if (npcflagmask & (UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_TRAINER_CLASS) && creature->GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS && !IsClass((Classes)creature->GetCreatureTemplate()->trainer_class, CLASS_CONTEXT_CLASS_TRAINER))
|
||||
return nullptr;
|
||||
|
||||
return creature;
|
||||
@@ -6393,7 +6402,7 @@ void Player::DuelComplete(DuelCompleteType type)
|
||||
opponent->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, 1);
|
||||
|
||||
// Credit for quest Death's Challenge
|
||||
if (getClass() == CLASS_DEATH_KNIGHT && opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_QUEST) && opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
opponent->CastSpell(opponent, 52994, true);
|
||||
}
|
||||
@@ -6789,7 +6798,7 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply
|
||||
}
|
||||
|
||||
// Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
|
||||
if (getClass() == CLASS_DRUID)
|
||||
if (IsClass(CLASS_DRUID, CLASS_CONTEXT_STATS))
|
||||
{
|
||||
int32 dpsMod = 0;
|
||||
int32 feral_bonus = 0;
|
||||
@@ -9846,7 +9855,7 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply)
|
||||
if (apply)
|
||||
{
|
||||
m_spellMods[mod->op].push_back(mod);
|
||||
if (getClass() == CLASS_MAGE)
|
||||
if (IsClass(CLASS_MAGE, CLASS_CONTEXT_ABILITY))
|
||||
m_spellMods[mod->op].sort(MageSpellModPred());
|
||||
else
|
||||
m_spellMods[mod->op].sort(SpellModPred());
|
||||
@@ -10280,7 +10289,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc
|
||||
// only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
|
||||
// change but I couldn't find a suitable alternative. OK to use class because only DK
|
||||
// can use this taxi.
|
||||
uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT));
|
||||
uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
|
||||
|
||||
// in spell case allow 0 model
|
||||
if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
|
||||
@@ -11329,7 +11338,7 @@ WorldLocation Player::GetStartPosition() const
|
||||
{
|
||||
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
|
||||
uint32 mapId = info->mapId;
|
||||
if (getClass() == CLASS_DEATH_KNIGHT && HasSpell(50977))
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_INIT) && HasSpell(50977))
|
||||
return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
|
||||
return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
|
||||
}
|
||||
@@ -11823,7 +11832,7 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank)
|
||||
{
|
||||
skillValue = maxValue;
|
||||
}
|
||||
else if (getClass() == CLASS_DEATH_KNIGHT)
|
||||
else if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_SKILL))
|
||||
{
|
||||
skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
|
||||
}
|
||||
@@ -11856,7 +11865,7 @@ void Player::LearnDefaultSkill(uint32 skillId, uint16 rank)
|
||||
{
|
||||
skillValue = maxValue;
|
||||
}
|
||||
else if (getClass() == CLASS_DEATH_KNIGHT)
|
||||
else if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_SKILL))
|
||||
{
|
||||
skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
|
||||
}
|
||||
@@ -13381,7 +13390,7 @@ static RuneType runeSlotTypes[MAX_RUNES] =
|
||||
|
||||
void Player::InitRunes()
|
||||
{
|
||||
if (getClass() != CLASS_DEATH_KNIGHT)
|
||||
if (!IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
|
||||
return;
|
||||
|
||||
m_runes = new Runes;
|
||||
@@ -13547,7 +13556,7 @@ uint32 Player::CalculateTalentsPoints() const
|
||||
uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
|
||||
|
||||
uint32 talentPointsForLevel = 0;
|
||||
if (getClass() != CLASS_DEATH_KNIGHT || GetMapId() != 609)
|
||||
if (!IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TALENT_POINT_CALC) || GetMapId() != 609)
|
||||
{
|
||||
talentPointsForLevel = base_talent;
|
||||
}
|
||||
@@ -14179,19 +14188,21 @@ void Player::ResummonPetTemporaryUnSummonedIfAny()
|
||||
|
||||
bool Player::CanResummonPet(uint32 spellid)
|
||||
{
|
||||
if (getClass() == CLASS_DEATH_KNIGHT)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_PET))
|
||||
{
|
||||
if (CanSeeDKPet())
|
||||
return true;
|
||||
else if (spellid == 52150) // Raise Dead
|
||||
return false;
|
||||
}
|
||||
else if (getClass() == CLASS_MAGE)
|
||||
|
||||
if (IsClass(CLASS_MAGE, CLASS_CONTEXT_PET))
|
||||
{
|
||||
if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
|
||||
return true;
|
||||
}
|
||||
else if (getClass() == CLASS_HUNTER)
|
||||
|
||||
if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -15176,7 +15187,7 @@ void Player::ActivateSpec(uint8 spec)
|
||||
AutoUnequipOffhandIfNeed();
|
||||
|
||||
// Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
|
||||
if (getClass() == CLASS_PALADIN)
|
||||
if (IsClass(CLASS_PALADIN, CLASS_CONTEXT_ABILITY))
|
||||
RemoveAurasDueToSpell(25780);
|
||||
|
||||
// Xinef: Remove talented single target auras at other targets
|
||||
|
||||
@@ -1112,6 +1112,8 @@ public:
|
||||
|
||||
static bool BuildEnumData(PreparedQueryResult result, WorldPacket* data);
|
||||
|
||||
[[nodiscard]] bool IsClass(Classes playerClass, ClassContext context = CLASS_CONTEXT_NONE) const override;
|
||||
|
||||
void SetInWater(bool apply);
|
||||
|
||||
[[nodiscard]] bool IsInWater() const override { return m_isInWater; }
|
||||
|
||||
@@ -109,7 +109,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool
|
||||
canTalk = false;
|
||||
break;
|
||||
case GOSSIP_OPTION_STABLEPET:
|
||||
if (getClass() != CLASS_HUNTER)
|
||||
if (!IsClass(CLASS_HUNTER, CLASS_CONTEXT_PET))
|
||||
canTalk = false;
|
||||
break;
|
||||
case GOSSIP_OPTION_QUESTGIVER:
|
||||
|
||||
@@ -133,8 +133,6 @@ void Player::SetSheath(SheathState sheathed)
|
||||
|
||||
uint8 Player::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const
|
||||
{
|
||||
uint8 playerClass = getClass();
|
||||
|
||||
uint8 slots[4];
|
||||
slots[0] = NULL_SLOT;
|
||||
slots[1] = NULL_SLOT;
|
||||
@@ -246,23 +244,23 @@ uint8 Player::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) c
|
||||
switch (proto->SubClass)
|
||||
{
|
||||
case ITEM_SUBCLASS_ARMOR_LIBRAM:
|
||||
if (playerClass == CLASS_PALADIN)
|
||||
if (IsClass(CLASS_PALADIN, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
slots[0] = EQUIPMENT_SLOT_RANGED;
|
||||
break;
|
||||
case ITEM_SUBCLASS_ARMOR_IDOL:
|
||||
if (playerClass == CLASS_DRUID)
|
||||
if (IsClass(CLASS_DRUID, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
slots[0] = EQUIPMENT_SLOT_RANGED;
|
||||
break;
|
||||
case ITEM_SUBCLASS_ARMOR_TOTEM:
|
||||
if (playerClass == CLASS_SHAMAN)
|
||||
if (IsClass(CLASS_SHAMAN, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
slots[0] = EQUIPMENT_SLOT_RANGED;
|
||||
break;
|
||||
case ITEM_SUBCLASS_ARMOR_MISC:
|
||||
if (playerClass == CLASS_WARLOCK)
|
||||
if (IsClass(CLASS_WARLOCK, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
slots[0] = EQUIPMENT_SLOT_RANGED;
|
||||
break;
|
||||
case ITEM_SUBCLASS_ARMOR_SIGIL:
|
||||
if (playerClass == CLASS_DEATH_KNIGHT)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
slots[0] = EQUIPMENT_SLOT_RANGED;
|
||||
break;
|
||||
}
|
||||
@@ -2270,16 +2268,13 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const
|
||||
// In fact it's a visual bug, everything works properly... I need sniffs of operations with
|
||||
// binded to account items from off server.
|
||||
|
||||
switch (getClass())
|
||||
if (IsClass(CLASS_PALADIN, CLASS_CONTEXT_EQUIP_ARMOR_CLASS) || IsClass(CLASS_WARRIOR, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
case CLASS_HUNTER:
|
||||
case CLASS_SHAMAN:
|
||||
allowEquip = (itemSkill == SKILL_MAIL);
|
||||
break;
|
||||
case CLASS_PALADIN:
|
||||
case CLASS_WARRIOR:
|
||||
allowEquip = (itemSkill == SKILL_PLATE_MAIL);
|
||||
break;
|
||||
allowEquip = (itemSkill == SKILL_PLATE_MAIL);
|
||||
}
|
||||
else if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_EQUIP_ARMOR_CLASS) || IsClass(CLASS_SHAMAN, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
allowEquip = (itemSkill == SKILL_MAIL);
|
||||
}
|
||||
}
|
||||
if (!allowEquip && GetSkillValue(itemSkill) == 0)
|
||||
@@ -2394,39 +2389,40 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje
|
||||
return EQUIP_ERR_CANT_EQUIP_SKILL;
|
||||
}
|
||||
|
||||
uint8 _class = getClass();
|
||||
|
||||
if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
|
||||
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
|
||||
|
||||
if (proto->Class == ITEM_CLASS_ARMOR)
|
||||
{
|
||||
// Check for shields
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(_class == CLASS_PALADIN || _class == CLASS_WARRIOR || _class == CLASS_SHAMAN))
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
|
||||
IsClass(CLASS_PALADIN, CLASS_CONTEXT_EQUIP_SHIELDS)
|
||||
|| IsClass(CLASS_WARRIOR, CLASS_CONTEXT_EQUIP_SHIELDS)
|
||||
|| IsClass(CLASS_SHAMAN, CLASS_CONTEXT_EQUIP_SHIELDS)))
|
||||
{
|
||||
return EQUIP_ERR_NO_REQUIRED_PROFICIENCY;
|
||||
}
|
||||
|
||||
// Check for librams.
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_LIBRAM && _class != CLASS_PALADIN)
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_LIBRAM && !IsClass(CLASS_PALADIN, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
{
|
||||
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
|
||||
}
|
||||
|
||||
// CHeck for idols.
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_IDOL && _class != CLASS_DRUID)
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_IDOL && !IsClass(CLASS_DRUID, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
{
|
||||
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
|
||||
}
|
||||
|
||||
// Check for totems.
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_TOTEM && _class != CLASS_SHAMAN)
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_TOTEM && !IsClass(CLASS_SHAMAN, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
{
|
||||
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
|
||||
}
|
||||
|
||||
// Check for sigils.
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SIGIL && _class != CLASS_DEATH_KNIGHT)
|
||||
if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SIGIL && !IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_EQUIP_RELIC))
|
||||
{
|
||||
return EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM;
|
||||
}
|
||||
@@ -2436,33 +2432,33 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje
|
||||
proto->InventoryType != INVTYPE_CLOAK)
|
||||
{
|
||||
uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
|
||||
switch (_class)
|
||||
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_EQUIP_ARMOR_CLASS) || IsClass(CLASS_PALADIN, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
case CLASS_WARRIOR:
|
||||
if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
|
||||
{
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
[[fallthrough]];
|
||||
case CLASS_DEATH_KNIGHT:
|
||||
case CLASS_PALADIN:
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
|
||||
break;
|
||||
case CLASS_HUNTER:
|
||||
case CLASS_SHAMAN:
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
|
||||
break;
|
||||
case CLASS_ROGUE:
|
||||
if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
|
||||
{
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
[[fallthrough]];
|
||||
case CLASS_DRUID:
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
|
||||
}
|
||||
else if (IsClass(CLASS_WARRIOR, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
|
||||
{
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
|
||||
}
|
||||
else if (IsClass(CLASS_HUNTER, CLASS_CONTEXT_EQUIP_ARMOR_CLASS) || IsClass(CLASS_SHAMAN, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
|
||||
}
|
||||
else if (IsClass(CLASS_DRUID, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
|
||||
}
|
||||
else if (IsClass(CLASS_ROGUE, CLASS_CONTEXT_EQUIP_ARMOR_CLASS))
|
||||
{
|
||||
if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
|
||||
{
|
||||
return EQUIP_ERR_CANT_DO_RIGHT_NOW;
|
||||
}
|
||||
subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
|
||||
}
|
||||
|
||||
if (proto->SubClass > subclassToCompare)
|
||||
@@ -2772,7 +2768,7 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update)
|
||||
|
||||
if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
|
||||
{
|
||||
uint32 cooldownSpell = getClass() == CLASS_ROGUE ? 6123 : 6119;
|
||||
uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
|
||||
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
|
||||
|
||||
if (!spellProto)
|
||||
@@ -4645,7 +4641,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
|
||||
}
|
||||
case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
|
||||
{
|
||||
if (getClass() == CLASS_SHAMAN)
|
||||
if (IsClass(CLASS_SHAMAN, CLASS_CONTEXT_ABILITY))
|
||||
{
|
||||
float addValue = 0.0f;
|
||||
if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
|
||||
|
||||
Reference in New Issue
Block a user