mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[7365] Implement potion in combat delay proper work.
Original patch provided by miranda.conrado.
This commit is contained in:
parent
2b10d8fd71
commit
de51363151
5 changed files with 45 additions and 1 deletions
|
|
@ -420,6 +420,8 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
|
||||||
m_InstanceValid = true;
|
m_InstanceValid = true;
|
||||||
m_dungeonDifficulty = DIFFICULTY_NORMAL;
|
m_dungeonDifficulty = DIFFICULTY_NORMAL;
|
||||||
|
|
||||||
|
m_lastPotionId = 0;
|
||||||
|
|
||||||
for (int i = 0; i < BASEMOD_END; i++)
|
for (int i = 0; i < BASEMOD_END; i++)
|
||||||
{
|
{
|
||||||
m_auraBaseMod[i][FLAT_MOD] = 0.0f;
|
m_auraBaseMod[i][FLAT_MOD] = 0.0f;
|
||||||
|
|
@ -17750,6 +17752,30 @@ void Player::SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId, Spell
|
||||||
data << GetGUID();
|
data << GetGUID();
|
||||||
SendDirectMessage(&data);
|
SendDirectMessage(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::UpdatePotionCooldown(Spell* spell)
|
||||||
|
{
|
||||||
|
// no potion used i combat or still in combat
|
||||||
|
if(!m_lastPotionId || isInCombat())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Call not from spell cast, send cooldown event for item spells if no in combat
|
||||||
|
if(!spell)
|
||||||
|
{
|
||||||
|
// spell/item pair let set proper cooldown (except not existed charged spell cooldown spellmods for potions)
|
||||||
|
if(ItemPrototype const* proto = ObjectMgr::GetItemPrototype(m_lastPotionId))
|
||||||
|
for(int idx = 0; idx < 5; ++idx)
|
||||||
|
if(proto->Spells[idx].SpellId && proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
|
||||||
|
if(SpellEntry const* spellInfo = sSpellStore.LookupEntry(proto->Spells[idx].SpellId))
|
||||||
|
SendCooldownEvent(spellInfo,m_lastPotionId);
|
||||||
|
}
|
||||||
|
// from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
|
||||||
|
else
|
||||||
|
SendCooldownEvent(spell->m_spellInfo,m_lastPotionId,spell);
|
||||||
|
|
||||||
|
m_lastPotionId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//slot to be excluded while counting
|
//slot to be excluded while counting
|
||||||
bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
|
bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1500,6 +1500,8 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
void RemoveAllSpellCooldown();
|
void RemoveAllSpellCooldown();
|
||||||
void _LoadSpellCooldowns(QueryResult *result);
|
void _LoadSpellCooldowns(QueryResult *result);
|
||||||
void _SaveSpellCooldowns();
|
void _SaveSpellCooldowns();
|
||||||
|
void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
|
||||||
|
void UpdatePotionCooldown(Spell* spell = NULL);
|
||||||
|
|
||||||
void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
|
void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
|
||||||
{
|
{
|
||||||
|
|
@ -2276,6 +2278,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
PlayerMails m_mail;
|
PlayerMails m_mail;
|
||||||
PlayerSpellMap m_spells;
|
PlayerSpellMap m_spells;
|
||||||
SpellCooldowns m_spellCooldowns;
|
SpellCooldowns m_spellCooldowns;
|
||||||
|
uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
|
||||||
|
|
||||||
ActionButtonList m_actionButtons;
|
ActionButtonList m_actionButtons;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2521,6 +2521,15 @@ void Spell::SendSpellCooldown()
|
||||||
|
|
||||||
Player* _player = (Player*)m_caster;
|
Player* _player = (Player*)m_caster;
|
||||||
|
|
||||||
|
// mana/health potions, disabled by client
|
||||||
|
if (m_spellInfo->Category==SPELLCATEGORY_HEALTH_MANA_POTIONS)
|
||||||
|
{
|
||||||
|
// need in some way provided data for Spell::finish SendCooldownEvent
|
||||||
|
if(m_CastItem)
|
||||||
|
_player->SetLastPotionId(m_CastItem->GetEntry());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// have infinity cooldown but set at aura apply
|
// have infinity cooldown but set at aura apply
|
||||||
if(m_spellInfo->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE)
|
if(m_spellInfo->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE)
|
||||||
return;
|
return;
|
||||||
|
|
@ -2716,6 +2725,10 @@ void Spell::finish(bool ok)
|
||||||
((Player*)m_caster)->ClearComboPoints();
|
((Player*)m_caster)->ClearComboPoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mana/health potions, disabled by client, send event "not in combat"
|
||||||
|
if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->Category == SPELLCATEGORY_HEALTH_MANA_POTIONS)
|
||||||
|
((Player*)m_caster)->UpdatePotionCooldown(this);
|
||||||
|
|
||||||
// call triggered spell only at successful cast (after clear combo points -> for add some if need)
|
// call triggered spell only at successful cast (after clear combo points -> for add some if need)
|
||||||
if(!m_TriggerSpells.empty())
|
if(!m_TriggerSpells.empty())
|
||||||
TriggerSpell();
|
TriggerSpell();
|
||||||
|
|
|
||||||
|
|
@ -8597,6 +8597,8 @@ void Unit::ClearInCombat()
|
||||||
// Player's state will be cleared in Player::UpdateContestedPvP
|
// Player's state will be cleared in Player::UpdateContestedPvP
|
||||||
if(GetTypeId()!=TYPEID_PLAYER)
|
if(GetTypeId()!=TYPEID_PLAYER)
|
||||||
clearUnitState(UNIT_STAT_ATTACK_PLAYER);
|
clearUnitState(UNIT_STAT_ATTACK_PLAYER);
|
||||||
|
else
|
||||||
|
((Player*)this)->UpdatePotionCooldown();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Unit::isTargetableForAttack() const
|
bool Unit::isTargetableForAttack() const
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7364"
|
#define REVISION_NR "7365"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue