diff options
author | xinef1 <w.szyszko2@gmail.com> | 2017-01-27 20:49:08 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-01-27 20:49:08 +0100 |
commit | 587786ce6661fb4741ff623458b3c6c590f642fe (patch) | |
tree | 1099217b8436db2ea78d0975ac3fe5fdbb46b48e /src | |
parent | 684a5fd3f1895703a52cff7e7f762883c74c5aba (diff) |
Core/Spells: Properly send autorepeat cancel packet to self and fix some problems with autoshot (#18918)
Closes #13595
Closes #14460
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 21 |
2 files changed, 15 insertions, 8 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 798328be431..0718f193d97 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20221,7 +20221,7 @@ void Player::SendAutoRepeatCancel(Unit* target) { WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, target->GetPackGUID().size()); data << target->GetPackGUID(); // may be it's target guid - SendMessageToSet(&data, false); + SendMessageToSet(&data, true); } void Player::SendExplorationExperience(uint32 Area, uint32 Experience) const diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2af8d3dcc79..f38e3070579 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3068,18 +3068,20 @@ void Unit::_UpdateSpells(uint32 time) void Unit::_UpdateAutoRepeatSpell() { + const SpellInfo* autoRepeatSpellInfo = m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo; + // check "realtime" interrupts - if ((GetTypeId() == TYPEID_PLAYER && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == 75)) + if ((GetTypeId() == TYPEID_PLAYER && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, autoRepeatSpellInfo->Id == 75)) { // cancel wand shoot - if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) + if (autoRepeatSpellInfo->Id != 75) InterruptSpell(CURRENT_AUTOREPEAT_SPELL); m_AutoRepeatFirstCast = true; return; } // apply delay (Auto Shot (spellID 75) not affected) - if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) + if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && autoRepeatSpellInfo->Id != 75) setAttackTimer(RANGED_ATTACK, 500); m_AutoRepeatFirstCast = false; @@ -3087,14 +3089,19 @@ void Unit::_UpdateAutoRepeatSpell() if (isAttackReady(RANGED_ATTACK)) { // Check if able to cast - if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->CheckCast(true) != SPELL_CAST_OK) + SpellCastResult result = m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->CheckCast(true); + if (result != SPELL_CAST_OK) { - InterruptSpell(CURRENT_AUTOREPEAT_SPELL); + if (autoRepeatSpellInfo->Id != 75) + InterruptSpell(CURRENT_AUTOREPEAT_SPELL); + else if (GetTypeId() == TYPEID_PLAYER) + Spell::SendCastResult(ToPlayer(), autoRepeatSpellInfo, 1, result); + return; } // we want to shoot - Spell* spell = new Spell(this, m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo, TRIGGERED_FULL_MASK); + Spell* spell = new Spell(this, autoRepeatSpellInfo, TRIGGERED_FULL_MASK); spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets)); // all went good, reset attack @@ -3184,7 +3191,7 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi Spell* spell = m_currentSpells[spellType]; if (spell && (withDelayed || spell->getState() != SPELL_STATE_DELAYED) - && (withInstant || spell->GetCastTime() > 0)) + && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) { // for example, do not let self-stun aura interrupt itself if (!spell->IsInterruptable()) |