diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 15 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.h | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellScript.cpp | 2 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 3 | 
9 files changed, 43 insertions, 26 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 27e8453cfc3..4f98312f3d0 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2734,11 +2734,11 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)              if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL])              {                  // break autorepeat if not Auto Shot -                if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) +                if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->GetSpellInfo()->Id != 75)                      InterruptSpell(CURRENT_AUTOREPEAT_SPELL);                  m_AutoRepeatFirstCast = true;              } -            if (pSpell->m_spellInfo->CalcCastTime(this) > 0) +            if (pSpell->GetCastTime() > 0)                  AddUnitState(UNIT_STATE_CASTING);              break; @@ -2751,7 +2751,7 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)              // it also does break autorepeat if not Auto Shot              if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && -                m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75) +                m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->GetSpellInfo()->Id != 75)                  InterruptSpell(CURRENT_AUTOREPEAT_SPELL);              AddUnitState(UNIT_STATE_CASTING); @@ -2760,7 +2760,7 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)          case CURRENT_AUTOREPEAT_SPELL:          {              // only Auto Shoot does not break anything -            if (pSpell->m_spellInfo->Id != 75) +            if (pSpell->GetSpellInfo()->Id != 75)              {                  // generic autorepeats break generic non-delayed and channeled non-delayed spells                  InterruptSpell(CURRENT_GENERIC_SPELL, false); @@ -12332,11 +12332,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u          if (spellInfo->AttributesEx3 & SPELL_ATTR3_DISABLE_PROC)              SetCantProc(true); -        i->aura->CallScriptProcHandlers(aurApp, eventInfo); +        bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo); -        // This bool is needed till separate aura effect procs are still here -        bool handled = false; -        if (HandleAuraProc(target, damage, i->aura, procSpell, procFlag, procExtra, cooldown, &handled)) +        // "handled" is needed as long as proc can be handled in multiple places +        if (!handled && HandleAuraProc(target, damage, i->aura, procSpell, procFlag, procExtra, cooldown, &handled))          {              TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), Id);              takeCharges = true; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index f5d87a469de..1ca3e08a8b4 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2094,8 +2094,9 @@ bool Aura::CallScriptPrepareProcHandlers(AuraApplication const* aurApp, ProcEven      return prepare;  } -void Aura::CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo) +bool Aura::CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo)  { +    bool handled = false;      for (std::list<AuraScript*>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr)      {          (*scritr)->_PrepareScriptCall(AURA_SCRIPT_HOOK_PROC, aurApp); @@ -2103,8 +2104,11 @@ void Aura::CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo&          for (; hookItr != hookItrEnd; ++hookItr)              hookItr->Call(*scritr, eventInfo); +        handled |= (*scritr)->_IsDefaultActionPrevented();          (*scritr)->_FinishScriptCall();      } + +    return handled;  }  void Aura::CallScriptAfterProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo) diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index e865d415438..9e7d0cce82c 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -229,7 +229,7 @@ class Aura          // Spell Proc Hooks          bool CallScriptCheckProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);          bool CallScriptPrepareProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo); -        void CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo); +        bool CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);          void CallScriptAfterProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);          bool CallScriptEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);          void CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7b30c3e6634..66d930ebc74 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3051,18 +3051,20 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered      // Prepare data for triggers      prepareDataForTriggerSystem(triggeredByAura); -    if (m_caster->GetTypeId() == TYPEID_PLAYER) -        m_caster->ToPlayer()->SetSpellModTakingSpell(this, true); -    // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail) -    m_casttime = m_spellInfo->CalcCastTime(m_caster, this); -    if (m_caster->GetTypeId() == TYPEID_PLAYER) +    if (Player* player = m_caster->ToPlayer())      { -        m_caster->ToPlayer()->SetSpellModTakingSpell(this, false); - -        // Set casttime to 0 if .cheat casttime is enabled. -        if (m_caster->ToPlayer()->GetCommandStatus(CHEAT_CASTTIME)) -            m_casttime = 0; +        if (!m_caster->ToPlayer()->GetCommandStatus(CHEAT_CASTTIME)) +        { +            m_caster->ToPlayer()->SetSpellModTakingSpell(this, true); +            // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail) +            m_casttime = m_spellInfo->CalcCastTime(this); +            m_caster->ToPlayer()->SetSpellModTakingSpell(this, false); +        } +        else +            m_casttime = 0; // Set cast time to 0 if .cheat casttime is enabled.      } +    else +        m_casttime = m_spellInfo->CalcCastTime(this);      // don't allow channeled spells / spells with cast time to be casted while moving      // (even if they are interrupted on moving, spells with almost immediate effect get to have their effect processed before movement interrupter kicks in) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 52d4e5487ee..c48f6f8be20 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2238,7 +2238,7 @@ int32 SpellInfo::GetMaxDuration() const      return (DurationEntry->Duration[2] == -1) ? -1 : abs(DurationEntry->Duration[2]);  } -uint32 SpellInfo::CalcCastTime(Unit* caster, Spell* spell) const +uint32 SpellInfo::CalcCastTime(Spell* spell /*= NULL*/) const  {      int32 castTime = 0; @@ -2255,8 +2255,8 @@ uint32 SpellInfo::CalcCastTime(Unit* caster, Spell* spell) const      if (!castTime)          return 0; -    if (caster) -        caster->ModSpellCastTime(this, castTime, spell); +    if (spell) +        spell->GetCaster()->ModSpellCastTime(this, castTime, spell);      if (Attributes & SPELL_ATTR0_REQ_AMMO && (!IsAutoRepeatRangedSpell()) && !(AttributesEx9 & SPELL_ATTR9_AIMED_SHOT))          castTime += 500; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 0ee8571196f..bd2bd6cdb1f 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -495,7 +495,7 @@ public:      uint32 GetMaxTicks() const; -    uint32 CalcCastTime(Unit* caster = NULL, Spell* spell = NULL) const; +    uint32 CalcCastTime(Spell* spell = NULL) const;      uint32 GetRecoveryTime() const;      int32 CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index cf694ff3348..1d0c0e81317 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3173,6 +3173,17 @@ void SpellMgr::LoadSpellInfoCorrections()                  // Entries were not updated after spell effect change, we have to do that manually :/                  spellInfo->AttributesEx3 |= SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED;                  break; +            case 5308:  // Execute (Rank 1) +            case 20658: // Execute (Rank 2) +            case 20660: // Execute (Rank 3) +            case 20661: // Execute (Rank 4) +            case 20662: // Execute (Rank 5) +            case 25234: // Execute (Rank 6) +            case 25236: // Execute (Rank 7) +            case 47470: // Execute (Rank 8) +            case 47471: // Execute (Rank 9) +                spellInfo->AttributesEx3 |= SPELL_ATTR3_CANT_TRIGGER_PROC; +                break;              case 59725: // Improved Spell Reflection - aoe aura                  // Target entry seems to be wrong for this spell :/                  spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER_AREA_PARTY); diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 5fb4d69cd02..bb9aab023af 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -909,6 +909,7 @@ bool AuraScript::_IsDefaultActionPrevented()          case AURA_SCRIPT_HOOK_EFFECT_ABSORB:          case AURA_SCRIPT_HOOK_EFFECT_SPLIT:          case AURA_SCRIPT_HOOK_PREPARE_PROC: +        case AURA_SCRIPT_HOOK_PROC:          case AURA_SCRIPT_HOOK_EFFECT_PROC:              return m_defaultActionPrevented;          default: @@ -927,6 +928,7 @@ void AuraScript::PreventDefaultAction()          case AURA_SCRIPT_HOOK_EFFECT_ABSORB:          case AURA_SCRIPT_HOOK_EFFECT_SPLIT:          case AURA_SCRIPT_HOOK_PREPARE_PROC: +        case AURA_SCRIPT_HOOK_PROC:          case AURA_SCRIPT_HOOK_EFFECT_PROC:              m_defaultActionPrevented = true;              break; diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 310527d8fe9..c81d3aaae62 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -711,9 +711,8 @@ class spell_warr_slam : public SpellScriptLoader              void HandleDummy(SpellEffIndex /*effIndex*/)              { -                int32 bp0 = GetEffectValue();                  if (GetHitUnit()) -                    GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_SLAM, &bp0, NULL, NULL, true, 0); +                    GetCaster()->CastCustomSpell(SPELL_WARRIOR_SLAM, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), TRIGGERED_FULL_MASK);              }              void Register() OVERRIDE  | 
