18 #ifndef SpellHistory_h__ 19 #define SpellHistory_h__ 28 #include <unordered_map> 49 using Clock = std::chrono::system_clock;
55 Clock::time_point CooldownEnd = Clock::time_point::min();
58 Clock::time_point CategoryEnd = Clock::time_point::min();
65 ChargeEntry(Clock::time_point startTime,
Duration rechargeTime) : RechargeStart(startTime), RechargeEnd(startTime + rechargeTime) { }
66 ChargeEntry(Clock::time_point startTime, Clock::time_point endTime) : RechargeStart(startTime), RechargeEnd(endTime) { }
87 template<
class OwnerType>
90 template<
class OwnerType>
95 void HandleCooldowns(
SpellInfo const* spellInfo,
Item const* item,
Spell* spell =
nullptr);
96 void HandleCooldowns(
SpellInfo const* spellInfo, uint32 itemId,
Spell* spell =
nullptr);
97 bool IsReady(
SpellInfo const* spellInfo, uint32 itemId = 0)
const;
98 template<
class PacketType>
99 void WritePacket(PacketType* packet)
const;
105 void SendCooldownEvent(
SpellInfo const* spellInfo, uint32 itemId = 0,
Spell* spell =
nullptr,
bool startCooldown =
true);
109 Clock::time_point now = GameTime::GetTime<Clock>();
110 AddCooldown(spellId, itemId, now + cooldownDuration, 0, now);
113 void AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, uint32 categoryId, Clock::time_point categoryEnd,
bool onHold =
false);
114 void ModifyCooldown(uint32 spellId,
Duration cooldownMod,
bool withoutCategoryCooldown =
false);
115 void ModifyCooldown(
SpellInfo const* spellInfo,
Duration cooldownMod,
bool withoutCategoryCooldown =
false);
116 void ResetCooldown(uint32 spellId,
bool update =
false);
117 void ResetCooldown(CooldownStorageType::iterator& itr,
bool update =
false);
118 template<
typename Predicate>
121 std::vector<int32> resetCooldowns;
122 resetCooldowns.reserve(_spellCooldowns.size());
123 for (
auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end();)
127 resetCooldowns.push_back(
int32(itr->first));
128 ResetCooldown(itr,
false);
134 if (update && !resetCooldowns.empty())
135 SendClearCooldowns(resetCooldowns);
138 void ResetAllCooldowns();
139 bool HasCooldown(
SpellInfo const* spellInfo, uint32 itemId = 0)
const;
140 bool HasCooldown(uint32 spellId, uint32 itemId = 0)
const;
142 Duration GetRemainingCategoryCooldown(uint32 categoryId)
const;
150 bool ConsumeCharge(uint32 chargeCategoryId);
151 void ModifyChargeRecoveryTime(uint32 chargeCategoryId,
Duration cooldownMod);
152 void RestoreCharge(uint32 chargeCategoryId);
153 void ResetCharges(uint32 chargeCategoryId);
154 void ResetAllCharges();
155 bool HasCharge(uint32 chargeCategoryId)
const;
156 int32 GetMaxCharges(uint32 chargeCategoryId)
const;
157 int32 GetChargeRecoveryTime(uint32 chargeCategoryId)
const;
160 bool HasGlobalCooldown(
SpellInfo const* spellInfo)
const;
162 void CancelGlobalCooldown(
SpellInfo const* spellInfo);
164 void SaveCooldownStateBeforeDuel();
165 void RestoreCooldownStateAfterDuel();
168 Player* GetPlayerOwner()
const;
169 void ModifySpellCooldown(uint32 spellId,
Duration cooldownMod,
bool withoutCategoryCooldown =
false);
170 void SendClearCooldowns(std::vector<int32>
const& cooldowns)
const;
171 CooldownStorageType::iterator
EraseCooldown(CooldownStorageType::iterator itr)
173 _categoryCooldowns.erase(itr->second.CategoryId);
174 return _spellCooldowns.erase(itr);
177 void SendSetSpellCharges(uint32 chargeCategoryId, ChargeEntryCollection
const& chargeCollection);
179 static void GetCooldownDurations(
SpellInfo const* spellInfo, uint32 itemId,
Duration* cooldown, uint32* categoryId,
Duration* categoryCooldown);
193 #endif // SpellHistory_h__ ChargeEntry(Clock::time_point startTime, Clock::time_point endTime)
Definition: SpellHistory.h:66
Definition: SpellHistory.h:190
std::chrono::system_clock Clock
Definition: SpellHistory.h:49
std::unordered_map< uint32, ChargeEntryCollection > ChargeStorageType
Definition: SpellHistory.h:75
ChargeStorageType _categoryCharges
Definition: SpellHistory.h:186
Unit * _owner
Definition: SpellHistory.h:181
Definition: SpellHistory.h:62
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:48
Definition: SpellInfo.h:342
CategoryCooldownStorageType _categoryCooldowns
Definition: SpellHistory.h:184
std::unordered_map< uint32, CooldownEntry * > CategoryCooldownStorageType
Definition: SpellHistory.h:74
std::unordered_map< uint32, Clock::time_point > GlobalCooldownStorageType
Definition: SpellHistory.h:76
GlobalCooldownStorageType _globalCooldowns
Definition: SpellHistory.h:187
void AddCooldown(uint32 spellId, uint32 itemId, Duration cooldownDuration)
Definition: SpellHistory.h:107
std::deque< ChargeEntry > ChargeEntryCollection
Definition: SpellHistory.h:72
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:24
Definition: SpellHistory.h:52
SpellSchoolMask
Definition: SharedDefines.h:310
Shows interrupt cooldown in loss of control ui.
Definition: SpellHistory.h:42
Clock::time_point RechargeEnd
Definition: SpellHistory.h:69
Definition: SpellHistory.h:46
Definition: SharedDefines.h:307
Clock::time_point RechargeStart
Definition: SpellHistory.h:68
std::unordered_map< uint32, CooldownEntry > CooldownStorageType
Definition: SpellHistory.h:73
int32_t int32
Definition: Define.h:139
Milliseconds Duration
Definition: SpellHistory.h:50
SpellCooldownFlags
Spell cooldown flags sent in SMSG_SPELL_COOLDOWN.
Definition: SpellHistory.h:37
uint32_t uint32
Definition: Define.h:143
Starts GCD for spells that should start their cooldown on events, requires SPELL_COOLDOWN_FLAG_INCLUD...
Definition: SpellHistory.h:41
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
Definition: QuestPools.cpp:50
Definition: SpellHistory.h:39
Starts GCD in addition to normal cooldown specified in the packet.
Definition: SpellHistory.h:40
CooldownStorageType _spellCooldowns
Definition: SpellHistory.h:182
CooldownStorageType _spellCooldownsBeforeDuel
Definition: SpellHistory.h:183
ChargeEntry(Clock::time_point startTime, Duration rechargeTime)
Definition: SpellHistory.h:65
static Duration const InfinityCooldownDelay
Definition: SpellHistory.h:102
#define TC_GAME_API
Definition: Define.h:124
Forces cooldown to behave as if SpellInfo::IsCooldownStartedOnEvent was true.
Definition: SpellHistory.h:43
void ResetCooldowns(Predicate predicate, bool update=false)
Definition: SpellHistory.h:119
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
Definition: Player.h:1131
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:72
CooldownStorageType::iterator EraseCooldown(CooldownStorageType::iterator itr)
Definition: SpellHistory.h:171