From a656bc36fa8a16e27da0593d75baf7c50b0b81c0 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 28 Jun 2009 02:09:35 +0400 Subject: [PATCH] [8084] Correctly show spell icon disabled state at relogin for spells with cooldown delayed until expire. --- src/game/Player.cpp | 27 +++++++++++++++------------ src/game/Player.h | 2 ++ src/shared/revision_nr.h | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a8181b509..e689cd828 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2537,7 +2537,7 @@ void Player::InitStatsForLevel(bool reapplyMods) void Player::SendInitialSpells() { time_t curTime = time(NULL); - time_t infTime = curTime + MONTH/2; + time_t infTime = curTime + infinityCooldownDelayCheck; uint16 spellCount = 0; @@ -2571,18 +2571,21 @@ void Player::SendInitialSpells() if(!sEntry) continue; - // not send infinity cooldown - if(itr->second.end > infTime) - continue; - data << uint32(itr->first); - time_t cooldown = 0; - if(itr->second.end > curTime) - cooldown = (itr->second.end-curTime)*IN_MILISECONDS; - data << uint16(itr->second.itemid); // cast item id data << uint16(sEntry->Category); // spell category + + // send infinity cooldown in special format + if(itr->second.end >= infTime) + { + data << uint32(1); // cooldown + data << uint32(0x80000000); // category cooldown + continue; + } + + time_t cooldown = itr->second.end > curTime ? (itr->second.end-curTime)*IN_MILISECONDS : 0; + if(sEntry->Category) // may be wrong, but anyway better than nothing... { data << uint32(0); // cooldown @@ -3349,7 +3352,7 @@ void Player::_SaveSpellCooldowns() CharacterDatabase.PExecute("DELETE FROM character_spell_cooldown WHERE guid = '%u'", GetGUIDLow()); time_t curTime = time(NULL); - time_t infTime = curTime + MONTH/2; + time_t infTime = curTime + infinityCooldownDelayCheck; // remove outdated and save active for(SpellCooldowns::iterator itr = m_spellCooldowns.begin();itr != m_spellCooldowns.end();) @@ -17396,8 +17399,8 @@ void Player::AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 it { // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped) // but not allow ignore until reset or re-login - catrecTime = catrec > 0 ? curTime+MONTH : 0; - recTime = rec > 0 ? curTime+MONTH : catrecTime; + catrecTime = catrec > 0 ? curTime+infinityCooldownDelay : 0; + recTime = rec > 0 ? curTime+infinityCooldownDelay : catrecTime; } else { diff --git a/src/game/Player.h b/src/game/Player.h index 53a30efef..4a27c934c 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1462,6 +1462,8 @@ class MANGOS_DLL_SPEC Player : public Unit template T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL); void RemoveSpellMods(Spell const* spell); + static uint32 const infinityCooldownDelay = MONTH; // used for set "infinity cooldowns" for spells and check + static uint32 const infinityCooldownDelayCheck = MONTH/2; bool HasSpellCooldown(uint32 spell_id) const { SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6a6b80c99..a6b012d69 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 "8083" + #define REVISION_NR "8084" #endif // __REVISION_NR_H__