Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
            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);
            }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
            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);
            }