From 7cbaf56df2fd1fb3fbdd4854b2d80db5a3103514 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 1 Mar 2009 10:30:24 +0300 Subject: [PATCH] [7365] Implement potion in combat delay proper work. Original patch provided by miranda.conrado. --- src/game/Player.cpp | 26 ++++++++++++++++++++++++++ src/game/Player.h | 3 +++ src/game/Spell.cpp | 13 +++++++++++++ src/game/Unit.cpp | 2 ++ src/shared/revision_nr.h | 2 +- 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index c50288a39..a548b102a 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -420,6 +420,8 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this) m_InstanceValid = true; m_dungeonDifficulty = DIFFICULTY_NORMAL; + m_lastPotionId = 0; + for (int i = 0; i < BASEMOD_END; i++) { m_auraBaseMod[i][FLAT_MOD] = 0.0f; @@ -17750,6 +17752,30 @@ void Player::SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId, Spell data << GetGUID(); 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 bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) { diff --git a/src/game/Player.h b/src/game/Player.h index 2b6966375..f1140df93 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1500,6 +1500,8 @@ class MANGOS_DLL_SPEC Player : public Unit void RemoveAllSpellCooldown(); void _LoadSpellCooldowns(QueryResult *result); 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) { @@ -2276,6 +2278,7 @@ class MANGOS_DLL_SPEC Player : public Unit PlayerMails m_mail; PlayerSpellMap m_spells; SpellCooldowns m_spellCooldowns; + uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use ActionButtonList m_actionButtons; diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index ac1fb932f..ab28d2cc5 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2521,6 +2521,15 @@ void Spell::SendSpellCooldown() 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 if(m_spellInfo->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE) return; @@ -2716,6 +2725,10 @@ void Spell::finish(bool ok) ((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) if(!m_TriggerSpells.empty()) TriggerSpell(); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index f736bda9f..b693a4cb8 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8597,6 +8597,8 @@ void Unit::ClearInCombat() // Player's state will be cleared in Player::UpdateContestedPvP if(GetTypeId()!=TYPEID_PLAYER) clearUnitState(UNIT_STAT_ATTACK_PLAYER); + else + ((Player*)this)->UpdatePotionCooldown(); } bool Unit::isTargetableForAttack() const diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 7e292898b..e09088eb3 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7364" + #define REVISION_NR "7365" #endif // __REVISION_NR_H__ -- 2.11.4.GIT