Exemplo n.º 1
0
        internal void EffectDispelMechanic(EffectDispelMechanic effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null)
            {
                return;
            }

            var aurasToDispel = new List <Aura>();
            IReadOnlyList <Aura> ownedAuras = target.Auras.OwnedAuras;

            for (int i = 0; i < ownedAuras.Count; i++)
            {
                if (ownedAuras[i].AuraInfo.HasAnyMechanics(effect.MechanicToDispel))
                {
                    aurasToDispel.Add(ownedAuras[i]);
                }
            }

            foreach (Aura aura in aurasToDispel)
            {
                if (!aura.IsRemoved)
                {
                    aura.Remove(AuraRemoveMode.Spell);
                }
            }
        }
Exemplo n.º 2
0
        internal void EffectKill(EffectKill effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null || !target.IsAlive)
            {
                return;
            }

            Caster.Kill(target);
        }
Exemplo n.º 3
0
        internal void EffectAddPower(EffectAddPower effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitStart || target == null || !target.IsAlive)
            {
                return;
            }

            target.Attributes.ModifyPower(effect.PowerType, (int)effect.Value);
        }
        internal void EffectTriggerSpell(EffectTriggerSpell effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null)
            {
                return;
            }

            Caster.Spells.TriggerSpell(effect.TriggerSpell, target, effect.ExtraCastFlags);
        }
Exemplo n.º 5
0
        internal void EffectAddComboPoints(EffectAddComboPoints effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal)
            {
                return;
            }

            target.ModifyComboPoints(effect.ComboPoints);
        }
Exemplo n.º 6
0
        internal void EffectResurrect(EffectResurrect effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null || target.IsAlive)
            {
                return;
            }

            Caster.DealHeal(target, target.MaxHealth.CalculatePercentage(effect.HealthPercent));
            target.ModifyDeathState(DeathState.Alive);
        }
        internal void EffectApplyAura(EffectApplyAura effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null)
            {
                return;
            }

            if (target.IsDead && !effect.AuraInfo.HasAttribute(AuraAttributes.DeathPersistent))
            {
                return;
            }

            target.Auras.RefreshOrCreateAura(effect.AuraInfo, SpellInfo, OriginalCaster, this);
        }
    public void HandleEffects(Unit unitTarget, int i, SpellEffectHandleMode mode)
    {
        EffectHandleMode = mode;
        UnitTarget       = unitTarget;

        EffectInfo = GetEffect(i);

        if (EffectInfo == null)
        {
            Debug.LogErrorFormat("Spell: {0} HandleEffects at EffectIndex: {1} missing effect", SpellInfo.Id, i);
            return;
        }

        Debug.LogFormat("Spell: {0} Effect: {1}", SpellInfo.Id, EffectInfo.Effect);

        Damage += CalculateDamage(i, UnitTarget, Variance);

        ExecuteEffect(EffectInfo.Effect, i);
    }
Exemplo n.º 9
0
        internal void EffectHeal(EffectHeal effect, int effectIndex, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitStart || !target.IsAlive)
            {
                return;
            }

            float spellHealAmount = effect.CalculateSpellHeal(SpellInfo, effectIndex, Caster, target);

            for (var i = 0; i < effect.ConditionalModifiers.Count; i++)
            {
                ConditionalModifier modifier = effect.ConditionalModifiers[i];
                if (modifier.Condition.With(Caster, target, this).IsApplicableAndValid)
                {
                    modifier.Modify(ref spellHealAmount);
                }
            }

            EffectHealing += (int)spellHealAmount;
        }
        internal void EffectChargeTarget(EffectChargeTarget effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null)
            {
                return;
            }

            Vector3 chargePoint;

            switch (SpellInfo.ExplicitTargetType)
            {
            case SpellExplicitTargetType.Target when ExplicitTargets.Target != null:
                chargePoint = ExplicitTargets.Target.Position;
                break;

            case SpellExplicitTargetType.Destination when ExplicitTargets.Destination.HasValue:
                chargePoint = ExplicitTargets.Destination.Value;
                break;

            default:
                Assert.Fail($"Unexpected explicit targeting for charging: {SpellInfo.ExplicitTargetType} in spell: {SpellInfo.name}");
                return;
            }

            switch (effect.ChargeKind)
            {
            case Core.EffectChargeTarget.Kind.Charge:
                Caster.Motion.StartChargingMovement(chargePoint, effect.ChargeSpeed);
                break;

            case Core.EffectChargeTarget.Kind.Pounce:
                Caster.Motion.StartPounceMovement(chargePoint, effect.ChargeSpeed);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        internal void EffectSchoolDamage(EffectSchoolDamage effect, int effectIndex, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitStart || target == null || !target.IsAlive)
            {
                return;
            }

            float spellDamage = effect.CalculateSpellDamage(SpellInfo, effectIndex, Caster, target);

            if (SpellInfo.HasAttribute(SpellCustomAttributes.ShareDamage))
            {
                spellDamage /= Mathf.Min(1, ImplicitTargets.TargetCountForEffect(effectIndex));
            }

            for (var i = 0; i < effect.ConditionalModifiers.Count; i++)
            {
                ConditionalModifier modifier = effect.ConditionalModifiers[i];
                if (modifier.Condition.With(Caster, target, this).IsApplicableAndValid)
                {
                    modifier.Modify(ref spellDamage);
                }
            }

            EffectDamage += (int)spellDamage;
        }
 internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode)
 {
     spell.EffectApplyAura(this, target, mode);
 }
        internal void EffectApplyAuraOverride(EffectApplyAuraDurationOverride effect, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal || target == null || OriginalCaster == null)
            {
                return;
            }

            if (target.IsDead && !effect.AuraInfo.HasAttribute(AuraAttributes.DeathPersistent))
            {
                return;
            }

            int overrideDuration = effect.BaseDuraiton + ConsumedComboPoints * effect.DurationPerCombo;

            target.Auras.RefreshOrCreateAura(effect.AuraInfo, SpellInfo, OriginalCaster, this, overrideDuration);
        }
Exemplo n.º 14
0
 internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode)
 {
     spell.EffectDispelMechanic(this, target, mode);
 }
Exemplo n.º 15
0
 internal abstract void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode);
Exemplo n.º 16
0
        internal void EffectTeleportDirect(EffectTeleportDirect effect, int effectIndex, Unit target, SpellEffectHandleMode mode)
        {
            if (mode != SpellEffectHandleMode.HitFinal)
            {
                return;
            }

            if (target == null || !target.IsAlive)
            {
                return;
            }

            float topCheck     = Math.Abs(target.UnitCollider.bounds.max.y);
            float safeExtentsY = Math.Abs(target.UnitCollider.bounds.extents.y);
            float safeExtentsX = Math.Abs(target.UnitCollider.bounds.extents.x);
            float distance     = effect.HorizontalDistance;

            Vector3 targetTop = target.UnitCollider.bounds.center + Vector3.up * topCheck;
            Vector3 targetPosition;

            Drawing.DrawLine(target.UnitCollider.bounds.center, target.UnitCollider.bounds.center + Vector3.up * topCheck, Color.red, 3f);

            if (Physics.Raycast(target.UnitCollider.bounds.center, Vector3.up, out RaycastHit hitInfo, topCheck, PhysicsReference.Mask.Ground))
            {
                targetPosition = hitInfo.point - Vector3.up * safeExtentsY;
            }
Exemplo n.º 17
0
 internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode)
 {
     spell.EffectTeleportDirect(this, effectIndex, target, mode);
 }
Exemplo n.º 18
0
 internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode)
 {
     spell.EffectAddComboPoints(this, target, mode);
 }
 internal override void Handle(Spell spell, int effectIndex, Unit target, SpellEffectHandleMode mode)
 {
     spell.EffectSchoolDamage(this, effectIndex, target, mode);
 }