fix(Core/Spells): triggering potion cooldowns (from TC) (#6016)
This commit is contained in:
@@ -23137,18 +23137,30 @@ void Player::SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId /*= 0*/
|
|||||||
SendDirectMessage(&data);
|
SendDirectMessage(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::UpdatePotionCooldown()
|
void Player::UpdatePotionCooldown(Spell* spell)
|
||||||
{
|
{
|
||||||
// no potion used i combat or still in combat
|
// no potion used i combat or still in combat
|
||||||
if (!GetLastPotionId() || IsInCombat())
|
if (!GetLastPotionId() || IsInCombat())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// spell/item pair let set proper cooldown (except not existed charged spell cooldown spellmods for potions)
|
// Call not from spell cast, send cooldown event for item spells if no in combat
|
||||||
if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(GetLastPotionId()))
|
if (!spell)
|
||||||
for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
|
{
|
||||||
if (proto->Spells[idx].SpellId && proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
|
// spell/item pair let set proper cooldown (except not existed charged spell cooldown spellmods for potions)
|
||||||
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
|
if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(GetLastPotionId()))
|
||||||
SendCooldownEvent(spellInfo, GetLastPotionId());
|
for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
|
||||||
|
if (proto->Spells[idx].SpellId && proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
|
||||||
|
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
|
||||||
|
SendCooldownEvent(spellInfo, GetLastPotionId());
|
||||||
|
}
|
||||||
|
// from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (spell->IsIgnoringCooldowns())
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
SendCooldownEvent(spell->m_spellInfo, m_lastPotionId, spell);
|
||||||
|
}
|
||||||
|
|
||||||
SetLastPotionId(0);
|
SetLastPotionId(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1803,7 +1803,7 @@ public:
|
|||||||
void _SaveSpellCooldowns(SQLTransaction& trans, bool logout);
|
void _SaveSpellCooldowns(SQLTransaction& trans, bool logout);
|
||||||
uint32 GetLastPotionId() { return m_lastPotionId; }
|
uint32 GetLastPotionId() { return m_lastPotionId; }
|
||||||
void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
|
void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
|
||||||
void UpdatePotionCooldown();
|
void UpdatePotionCooldown(Spell* spell = nullptr);
|
||||||
|
|
||||||
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
|
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4101,9 +4101,9 @@ void Spell::finish(bool ok)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// xinef: potions disabled by client, send event "not in combat" if need
|
// potions disabled by client, send event "not in combat" if need
|
||||||
if (m_caster->GetTypeId() == TYPEID_PLAYER && !IsTriggered())
|
if (m_caster->GetTypeId() == TYPEID_PLAYER && !m_triggeredByAuraSpell)
|
||||||
m_caster->ToPlayer()->UpdatePotionCooldown();
|
m_caster->ToPlayer()->UpdatePotionCooldown(this);
|
||||||
|
|
||||||
// Take mods after trigger spell (needed for 14177 to affect 48664)
|
// Take mods after trigger spell (needed for 14177 to affect 48664)
|
||||||
// mods are taken only on succesfull cast and independantly from targets of the spell
|
// mods are taken only on succesfull cast and independantly from targets of the spell
|
||||||
@@ -7380,6 +7380,11 @@ bool Spell::IsNextMeleeSwingSpell() const
|
|||||||
return m_spellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE);
|
return m_spellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Spell::IsIgnoringCooldowns() const
|
||||||
|
{
|
||||||
|
return (_triggeredCastFlags & TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool Spell::IsAutoActionResetSpell() const
|
bool Spell::IsAutoActionResetSpell() const
|
||||||
{
|
{
|
||||||
/// @todo changed SPELL_INTERRUPT_FLAG_AUTOATTACK -> SPELL_INTERRUPT_FLAG_INTERRUPT to fix compile - is this check correct at all?
|
/// @todo changed SPELL_INTERRUPT_FLAG_AUTOATTACK -> SPELL_INTERRUPT_FLAG_INTERRUPT to fix compile - is this check correct at all?
|
||||||
|
|||||||
@@ -509,6 +509,7 @@ public:
|
|||||||
bool IsTriggered() const { return _triggeredCastFlags & TRIGGERED_FULL_MASK; };
|
bool IsTriggered() const { return _triggeredCastFlags & TRIGGERED_FULL_MASK; };
|
||||||
bool IsChannelActive() const { return m_caster->GetUInt32Value(UNIT_CHANNEL_SPELL) != 0; }
|
bool IsChannelActive() const { return m_caster->GetUInt32Value(UNIT_CHANNEL_SPELL) != 0; }
|
||||||
bool IsAutoActionResetSpell() const;
|
bool IsAutoActionResetSpell() const;
|
||||||
|
bool IsIgnoringCooldowns() const;
|
||||||
|
|
||||||
bool IsDeletable() const { return !m_referencedFromCurrentSpell && !m_executedCurrently; }
|
bool IsDeletable() const { return !m_referencedFromCurrentSpell && !m_executedCurrently; }
|
||||||
void SetReferencedFromCurrent(bool yes) { m_referencedFromCurrentSpell = yes; }
|
void SetReferencedFromCurrent(bool yes) { m_referencedFromCurrentSpell = yes; }
|
||||||
|
|||||||
Reference in New Issue
Block a user