Core/Spells: Fixed totem summoning behavior (summoning new totem while old is still active will not prevent new one from spawning) and fixed totem cooldowns
Closes #1609 Closes #1615
This commit is contained in:
@@ -20574,9 +20574,10 @@ void Player::AddSpellCooldown(uint32 spellid, uint32 itemid, time_t end_time)
|
|||||||
m_spellCooldowns[spellid] = sc;
|
m_spellCooldowns[spellid] = sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId, Spell* spell)
|
void Player::SendCooldownEvent(SpellEntry const* spellInfo, uint32 itemId /*= 0*/, Spell* spell /*= NULL*/, bool setCooldown /*= true*/)
|
||||||
{
|
{
|
||||||
// start cooldowns at server side, if any
|
// start cooldowns at server side, if any
|
||||||
|
if (setCooldown)
|
||||||
AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
|
AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
|
||||||
|
|
||||||
// Send activate cooldown timer (possible 0) at client side
|
// Send activate cooldown timer (possible 0) at client side
|
||||||
|
|||||||
@@ -1676,7 +1676,7 @@ class Player : public Unit, public GridObject<Player>
|
|||||||
}
|
}
|
||||||
void AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 itemId, Spell* spell = NULL, bool infinityCooldown = false);
|
void AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 itemId, Spell* spell = NULL, bool infinityCooldown = false);
|
||||||
void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
|
void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
|
||||||
void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL);
|
void SendCooldownEvent(SpellEntry const* spellInfo, uint32 itemId = 0, Spell* spell = NULL, bool setCooldown = true);
|
||||||
void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs);
|
void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs);
|
||||||
void RemoveSpellCooldown(uint32 spell_id, bool update = false);
|
void RemoveSpellCooldown(uint32 spell_id, bool update = false);
|
||||||
void RemoveSpellCategoryCooldown(uint32 cat, bool update = false);
|
void RemoveSpellCategoryCooldown(uint32 cat, bool update = false);
|
||||||
|
|||||||
@@ -52,6 +52,19 @@ void Totem::Update(uint32 time)
|
|||||||
|
|
||||||
void Totem::InitStats(uint32 duration)
|
void Totem::InitStats(uint32 duration)
|
||||||
{
|
{
|
||||||
|
// client requires SMSG_TOTEM_CREATED to be sent before adding to world and before removing old totem
|
||||||
|
if (m_owner->GetTypeId() == TYPEID_PLAYER
|
||||||
|
&& m_Properties->Slot >= SUMMON_SLOT_TOTEM
|
||||||
|
&& m_Properties->Slot < MAX_TOTEM_SLOT)
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4);
|
||||||
|
data << uint8(m_Properties->Slot - 1);
|
||||||
|
data << uint64(GetGUID());
|
||||||
|
data << uint32(duration);
|
||||||
|
data << uint32(GetUInt32Value(UNIT_CREATED_BY_SPELL));
|
||||||
|
m_owner->ToPlayer()->SendDirectMessage(&data);
|
||||||
|
}
|
||||||
|
|
||||||
Minion::InitStats(duration);
|
Minion::InitStats(duration);
|
||||||
|
|
||||||
// set display id depending on caster's race
|
// set display id depending on caster's race
|
||||||
@@ -69,19 +82,6 @@ void Totem::InitStats(uint32 duration)
|
|||||||
m_duration = duration;
|
m_duration = duration;
|
||||||
|
|
||||||
SetLevel(m_owner->getLevel());
|
SetLevel(m_owner->getLevel());
|
||||||
|
|
||||||
// client requires SMSG_TOTEM_CREATED to be sent before adding to world
|
|
||||||
if (m_owner->GetTypeId() == TYPEID_PLAYER
|
|
||||||
&& m_Properties->Slot >= SUMMON_SLOT_TOTEM
|
|
||||||
&& m_Properties->Slot < MAX_TOTEM_SLOT)
|
|
||||||
{
|
|
||||||
WorldPacket data(SMSG_TOTEM_CREATED, 1 + 8 + 4 + 4);
|
|
||||||
data << uint8(m_Properties->Slot - 1);
|
|
||||||
data << uint64(GetGUID());
|
|
||||||
data << uint32(duration);
|
|
||||||
data << uint32(GetUInt32Value(UNIT_CREATED_BY_SPELL));
|
|
||||||
m_owner->ToPlayer()->SendDirectMessage(&data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Totem::InitSummon()
|
void Totem::InitSummon()
|
||||||
@@ -117,7 +117,7 @@ void Totem::UnSummon()
|
|||||||
owner->SendAutoRepeatCancel(this);
|
owner->SendAutoRepeatCancel(this);
|
||||||
|
|
||||||
if (SpellEntry const* spell = sSpellStore.LookupEntry(GetUInt32Value(UNIT_CREATED_BY_SPELL)))
|
if (SpellEntry const* spell = sSpellStore.LookupEntry(GetUInt32Value(UNIT_CREATED_BY_SPELL)))
|
||||||
owner->SendCooldownEvent(spell);
|
owner->SendCooldownEvent(spell, 0, NULL, false);
|
||||||
|
|
||||||
if (Group* group = owner->GetGroup())
|
if (Group* group = owner->GetGroup())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user