public SpellCastResult CheckExplicitTarget(Unit caster, Unit target) { if (ExplicitTargetType != SpellExplicitTargetType.Target) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask)) { if (target == null) { return(SpellCastResult.BadTargets); } if (target.IsDead && !HasAttribute(SpellAttributes.CanTargetDead)) { return(SpellCastResult.TargetDead); } if (!HasAttribute(SpellExtraAttributes.CanTargetInvisible) && !caster.CanSeeOrDetect(target)) { return(SpellCastResult.BadTargets); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitEnemy) && caster.IsHostileTo(target)) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitAlly) && caster.IsFriendlyTo(target)) { return(SpellCastResult.Success); } return(SpellCastResult.BadTargets); } return(SpellCastResult.Success); }
internal bool IsImmuneToSpell(SpellInfo spellInfo, Unit caster) { if (spellInfo.HasAttribute(SpellAttributes.UnaffectedByInvulnerability)) { return(false); } if (spellInfo.SchoolMask != 0) { SpellSchoolMask immunedSchools = 0; foreach (var schoolImmunityEntry in schoolImmunities) { if (!schoolImmunityEntry.Key.HasAnyFlag(spellInfo.SchoolMask)) { continue; } foreach (SpellInfo immunitySpells in schoolImmunityEntry.Value) { if (!immunitySpells.IsPositive || !spellInfo.IsPositive || !unit.IsFriendlyTo(caster)) { if (!spellInfo.CanPierceImmuneAura(immunitySpells)) { immunedSchools |= schoolImmunityEntry.Key; } } } } if (immunedSchools.HasTargetFlag(spellInfo.SchoolMask)) { return(true); } } return(false); }
private void ProcessTarget(SpellTargetEntry targetEntry) { if (targetEntry.Processed) { return; } targetEntry.Processed = true; if (targetEntry.Target.IsAlive != targetEntry.Alive) { return; } Unit caster = OriginalCaster ?? Caster; if (caster == null) { return; } SpellMissType missType = targetEntry.MissCondition; EffectDamage = 0; EffectHealing = 0; Unit hitTarget = targetEntry.Target; if (missType == SpellMissType.Reflect && targetEntry.ReflectResult == SpellMissType.None) { hitTarget = Caster; } missType = ProcessSpellHit(targetEntry); if (missType != SpellMissType.None) { EffectDamage = 0; } EventHandler.ExecuteEvent(EventHandler.GlobalDispatcher, GameEvents.ServerSpellHit, Caster, hitTarget, SpellInfo, missType); Caster.Spells.ApplySpellTriggers(SpellTriggerFlags.DoneSpellHit, hitTarget, this); if (EffectHealing > 0) { caster.Spells.HealBySpell(new SpellHealInfo(caster, targetEntry.Target, SpellInfo, (uint)EffectHealing, targetEntry.Crit)); } else if (EffectDamage > 0) { caster.Spells.DamageBySpell(new SpellDamageInfo(caster, targetEntry.Target, SpellInfo, (uint)EffectDamage, targetEntry.Crit, SpellDamageType.Direct), this); } if (missType == SpellMissType.None) { for (int effectIndex = 0; effectIndex < SpellInfo.Effects.Count; effectIndex++) { if (targetEntry.EffectMask.HasBit(effectIndex)) { SpellInfo.Effects[effectIndex].Handle(this, effectIndex, hitTarget, SpellEffectHandleMode.HitFinal); } } } if (missType != SpellMissType.Evade && !caster.IsFriendlyTo(hitTarget) && !SpellInfo.IsPositive) { caster.Combat.StartCombatWith(hitTarget); } }
public SpellCastResult CheckExplicitTarget(Unit caster, Unit target) { if (ExplicitTargetType == SpellExplicitTargetType.None) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasAnyFlag(SpellCastTargetFlags.UnitMask)) { if (target == null) { return(SpellCastResult.BadTargets); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitEnemy) && caster.IsHostileTo(target)) { return(SpellCastResult.Success); } if (ExplicitCastTargets.HasTargetFlag(SpellCastTargetFlags.UnitAlly) && caster.IsFriendlyTo(target)) { return(SpellCastResult.Success); } return(SpellCastResult.BadTargets); } return(SpellCastResult.Success); }
internal bool IsImmuneToSpellSchool(SpellSchoolMask schoolMask, SpellInfo spellInfo, Unit caster) { if (schoolMask != 0) { SpellSchoolMask immunedSchools = 0; foreach (var schoolImmunityEntry in schoolImmunities) { if (!schoolImmunityEntry.Key.HasAnyFlag(spellInfo.SchoolMask)) { continue; } foreach (SpellInfo immunitySpells in schoolImmunityEntry.Value) { if (!immunitySpells.IsPositive || !spellInfo.IsPositive || caster != null && !unit.IsFriendlyTo(caster)) { if (!spellInfo.CanPierceImmuneAura(immunitySpells)) { immunedSchools |= schoolImmunityEntry.Key; } } } } if (immunedSchools.HasTargetFlag(spellInfo.SchoolMask)) { return(true); } } return(false); }