diff options
Diffstat (limited to 'src/game/Unit.cpp')
| -rw-r--r-- | src/game/Unit.cpp | 56 | 
1 files changed, 50 insertions, 6 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index aebf7b54002..06f2b4e2b93 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -2308,7 +2308,7 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe  void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool extra )  { -    if(!extra && hasUnitState(UNIT_STAT_CANNOT_AUTOATTACK) || HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) ) +    if(hasUnitState(UNIT_STAT_CANNOT_AUTOATTACK) || HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) )          return;      if (!pVictim->isAlive()) @@ -2340,8 +2340,9 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex      // Send log damage message to client      DealDamageMods(pVictim,damageInfo.damage,&damageInfo.absorb);      SendAttackStateUpdate(&damageInfo); -    DealMeleeDamage(&damageInfo,true); +      ProcDamageAndSpell(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, damageInfo.damage, damageInfo.attackType); +    DealMeleeDamage(&damageInfo,true);      if (GetTypeId() == TYPEID_PLAYER)          DEBUG_LOG("AttackerStateUpdate: (Player) %u attacked %u (TypeId: %u) for %u dmg, absorbed %u, blocked %u, resisted %u.", @@ -6848,6 +6849,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger                      // check if shown in spell book                      if(!itr->second->active || itr->second->disabled || itr->second->state == PLAYERSPELL_REMOVED)                          continue; +                      SpellEntry const *spellProto = sSpellStore.LookupEntry(itr->first);                      if (!spellProto)                          continue; @@ -6959,8 +6961,10 @@ bool Unit::HandleObsModEnergyAuraProc(Unit *pVictim, uint32 damage, AuraEffect*      SpellEntry const *dummySpell = triggeredByAura->GetSpellProto ();      uint32 effIndex = triggeredByAura->GetEffIndex();      int32  triggerAmount = triggeredByAura->GetAmount(); +      Item* castItem = triggeredByAura->GetParentAura()->GetCastItemGUID() && GetTypeId()==TYPEID_PLAYER          ? ((Player*)this)->GetItemByGuid(triggeredByAura->GetParentAura()->GetCastItemGUID()) : NULL; +      uint32 triggered_spell_id = 0;      Unit* target = pVictim;      int32 basepoints0 = 0; @@ -6984,21 +6988,26 @@ bool Unit::HandleObsModEnergyAuraProc(Unit *pVictim, uint32 damage, AuraEffect*      // processed charge only counting case      if(!triggered_spell_id)          return true; +      SpellEntry const* triggerEntry = sSpellStore.LookupEntry(triggered_spell_id); +      if(!triggerEntry)      {          sLog.outError("Unit::HandleObsModEnergyAuraProc: Spell %u have not existed triggered spell %u",dummySpell->Id,triggered_spell_id);          return false;      } +      // default case      if(!target || target!=this && !target->isAlive())          return false; +      if( cooldown && GetTypeId()==TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(triggered_spell_id))          return false;      if(basepoints0)          CastCustomSpell(target,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);      else          CastSpell(target,triggered_spell_id,true,castItem,triggeredByAura); +      if( cooldown && GetTypeId()==TYPEID_PLAYER )          ((Player*)this)->AddSpellCooldown(triggered_spell_id,0,time(NULL) + cooldown);      return true; @@ -7008,6 +7017,7 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit *pVictim, uint32 damage, AuraEff      SpellEntry const *dummySpell = triggeredByAura->GetSpellProto ();      uint32 effIndex = triggeredByAura->GetEffIndex();      int32  triggerAmount = triggeredByAura->GetAmount(); +      Item* castItem = triggeredByAura->GetParentAura()->GetCastItemGUID() && GetTypeId()==TYPEID_PLAYER          ? ((Player*)this)->GetItemByGuid(triggeredByAura->GetParentAura()->GetCastItemGUID()) : NULL; @@ -7025,11 +7035,42 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit *pVictim, uint32 damage, AuraEff                  switch (getPowerType())                  {                      case POWER_MANA:   triggered_spell_id = 57319; break; +                    default: +                        return false; +                } +            } +            break; +        } +    }      // processed charge only counting case +    if(!triggered_spell_id)          return true; + +    SpellEntry const* triggerEntry = sSpellStore.LookupEntry(triggered_spell_id); + +    if(!triggerEntry) +    {          sLog.outError("Unit::HandleModDamagePctTakenAuraProc: Spell %u have not existed triggered spell %u",dummySpell->Id,triggered_spell_id); +        return false; +    } +      // default case      if(!target || target!=this && !target->isAlive()) +        return false; + +    if( cooldown && GetTypeId()==TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(triggered_spell_id)) +        return false; + +    if(basepoints0) +        CastCustomSpell(target,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura); +    else +        CastSpell(target,triggered_spell_id,true,castItem,triggeredByAura); + +    if( cooldown && GetTypeId()==TYPEID_PLAYER ) +        ((Player*)this)->AddSpellCooldown(triggered_spell_id,0,time(NULL) + cooldown); + +    return true; +}  // Used in case when access to whole aura is needed  // All procs should be handled like this... @@ -7597,6 +7638,10 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig      }      */ +    // not allow proc extra attack spell at extra attack +    if( m_extraAttacks && IsSpellHaveEffect(triggerEntry, SPELL_EFFECT_ADD_EXTRA_ATTACKS) ) +        return false; +      // Custom requirements (not listed in procEx) Warning! damage dealing after this      // Custom triggered spells      switch (auraSpellInfo->Id) @@ -7854,15 +7899,14 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig      if(!target || target!=this && !target->isAlive())          return false; -    // apply spell cooldown before casting to prevent triggering spells with SPELL_EFFECT_ADD_EXTRA_ATTACKS if spell has hidden cooldown -    if( cooldown && GetTypeId()==TYPEID_PLAYER ) -        ((Player*)this)->AddSpellCooldown(trigger_spell_id,0,time(NULL) + cooldown); -      if(basepoints0)          CastCustomSpell(target,trigger_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);      else          CastSpell(target,trigger_spell_id,true,castItem,triggeredByAura); +    if( cooldown && GetTypeId()==TYPEID_PLAYER ) +        ((Player*)this)->AddSpellCooldown(trigger_spell_id,0,time(NULL) + cooldown); +      return true;  }  | 
