*Merge. Note: A better way is needed for Sanctuary effect. (interrupt all spells towards self).
--HG-- branch : trunk
This commit is contained in:
+11
-3
@@ -1036,7 +1036,8 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
||||
SpellMissInfo missInfo = DoSpellHitOnUnit(spellHitTarget, mask);
|
||||
if(missInfo != SPELL_MISS_NONE)
|
||||
{
|
||||
m_caster->SendSpellMiss(unit, m_spellInfo->Id, missInfo);
|
||||
if(missInfo != SPELL_MISS_MISS)
|
||||
m_caster->SendSpellMiss(unit, m_spellInfo->Id, missInfo);
|
||||
m_damage = 0;
|
||||
spellHitTarget = NULL;
|
||||
}
|
||||
@@ -1186,10 +1187,17 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
||||
|
||||
if( !m_caster->IsFriendlyTo(unit) )
|
||||
{
|
||||
// reset damage to 0 if target has Invisibility or Vanish aura (_only_ vanish, not stealth) and isn't visible for caster
|
||||
// I do not think this is a correct way to fix it. Sanctuary effect should make all delayed spells invalid
|
||||
// for delayed spells ignore not visible explicit target
|
||||
if(m_spellInfo->speed > 0.0f && unit == m_targets.getUnitTarget() && !unit->isVisibleForOrDetect(m_caster,false))
|
||||
if(m_spellInfo->speed > 0.0f && unit == m_targets.getUnitTarget()
|
||||
&& (unit->HasAuraType(SPELL_AURA_MOD_INVISIBILITY)
|
||||
|| unit->HasAuraTypeWithFamilyFlags(SPELL_AURA_MOD_STEALTH, SPELLFAMILY_ROGUE, SPELLFAMILYFLAG_ROGUE_VANISH))
|
||||
&& !unit->isVisibleForOrDetect(m_caster, true))
|
||||
{
|
||||
return SPELL_MISS_EVADE;
|
||||
// that was causing CombatLog errors
|
||||
// return SPELL_MISS_EVADE;
|
||||
return SPELL_MISS_MISS; // miss = do not send anything here
|
||||
}
|
||||
|
||||
unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_HITBYSPELL);
|
||||
|
||||
@@ -513,6 +513,17 @@ void Unit::UpdateInterruptMask()
|
||||
m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
|
||||
}
|
||||
|
||||
bool Unit::HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint32 familyFlags) const
|
||||
{
|
||||
if(!HasAuraType(auraType)) return false;
|
||||
AuraEffectList const &auras = GetAurasByType(auraType);
|
||||
for(AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
|
||||
if(SpellEntry const *iterSpellProto = (*itr)->GetSpellProto())
|
||||
if(iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Called by DealDamage for auras that have a chance to be dispelled on damage taken. */
|
||||
void Unit::RemoveSpellbyDamageTaken(uint32 damage, uint32 spell)
|
||||
{
|
||||
|
||||
@@ -1243,6 +1243,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
void ClearInCombat();
|
||||
uint32 GetCombatTimer() const { return m_CombatTimer; }
|
||||
|
||||
bool HasAuraTypeWithFamilyFlags(AuraType auraType, uint32 familyName, uint32 familyFlags) const;
|
||||
bool virtual HasSpell(uint32 /*spellID*/) const { return false; }
|
||||
|
||||
bool HasStealthAura() const { return HasAuraType(SPELL_AURA_MOD_STEALTH); }
|
||||
|
||||
Reference in New Issue
Block a user