Esempio n. 1
0
        public BristlebackEffectApplier(IAbilitySkill skill)
            : base(skill)
        {
            var worker = new EffectApplierWorker(
                false,
                () =>
            {
                return(unit =>
                {
                    unit.DamageManipulation.DamageReduction.AddSpecialSkillValue(
                        skill,
                        (abilityUnit, damageValue) =>
                    {
                        var angle = unit.SourceUnit.FindRelativeAngle(abilityUnit.Position.Current)
                                    % (2 * Math.PI * 180) / Math.PI;
                        if (angle >= 110 && angle <= 250)
                        {
                            return (1 + skill.Level.Current) * 0.08;
                        }
                        else if (angle >= 70 && angle <= 290)
                        {
                            return (1 + skill.Level.Current) * 0.04;
                        }

                        return 0;
                    });
                });
            },
                () => unit => { unit.DamageManipulation.DamageReduction.RemoveSpecialSkillValue(skill); },
                null);

            this.Workers.Add(worker);
        }
Esempio n. 2
0
        public IceBlastModifierEffectApplier(IAbilityModifier modifier)
            : base(modifier)
        {
            var value  = 0d;
            var worker = new EffectApplierWorker(
                true,
                () =>
            {
                return(unit =>
                {
                    value = modifier.SourceSkill.SourceAbility.GetAbilityData("kill_pct") / 100;
                    unit.DamageManipulation.Aa = new ValueHolder <float>(
                        (abilityUnit, f) =>
                    {
                        var percent = modifier.AffectedUnit.Health.Maximum * value;
                        if (modifier.AffectedUnit.Health.Current - f <= percent)
                        {
                            return (float)percent;
                        }

                        return 0;
                    },
                        true,
                        () => modifier.SourceModifier.DieTime);
                });
            },
                () => unit => unit.DamageManipulation.Aa = null,
                () =>
            {
                return(unit =>
                {
                    value = modifier.SourceSkill.SourceAbility.GetAbilityData("kill_pct") / 100;
                    unit.DamageManipulation.Aa = new ValueHolder <float>(
                        (abilityUnit, f) =>
                    {
                        var percent = modifier.AffectedUnit.Health.Maximum * value;
                        if (modifier.AffectedUnit.Health.Current - f <= percent)
                        {
                            return (float)percent;
                        }

                        return 0;
                    },
                        true,
                        () => modifier.SourceModifier.DieTime);
                });
            });

            this.Workers.Add(worker);
        }
Esempio n. 3
0
        public FleshGolemModifierEffectApplier(IAbilityModifier modifier)
            : base(modifier)
        {
            var worker = new EffectApplierWorker(
                false,
                () =>
            {
                return(unit =>
                {
                    Console.WriteLine("applying undying");
                    unit.DamageManipulation.DamageAmplification.AddSpecialModifierValue(
                        modifier,
                        (abilityUnit, f) =>
                    {
                        var baseAmp = .05 * modifier.SourceSkill.Level.Current;
                        var distance =
                            modifier.SourceSkill.Owner.Position.Current.Distance2D(
                                modifier.AffectedUnit.Position.Current);
                        if (distance <= 200)
                        {
                            return baseAmp + 0.15;
                        }
                        else if (distance > 750)
                        {
                            return 0.1;
                        }
                        else
                        {
                            return baseAmp + (750 - distance) * 0.03 / 110;
                        }
                    });
                });
            },
                () => unit => { unit.DamageManipulation.DamageAmplification.RemoveSpecialModifierValue(modifier); },
                null);

            this.Workers.Add(worker);
        }
Esempio n. 4
0
        public BloodrageModifierEffectApplier(IAbilityModifier modifier)
            : base(modifier)
        {
            this.ampApplier = new EffectApplierWorker(
                true,
                () =>
            {
                return(unit =>
                {
                    this.realValue =
                        Math.Floor(
                            this.Modifier.SourceSkill.SourceAbility.GetAbilityData("damage_increase_pct"))
                        / 100;
                    this.value = this.realValue;
                    unit.DamageManipulation.DamageAmplification.AddSpecialModifierValue(
                        modifier,
                        (abilityUnit, damageValue) =>
                    {
                        if (
                            modifier.AffectedUnit.Position.Current.Distance2D(
                                abilityUnit.Position.Current) < 2200)
                        {
                            return this.value;
                        }
                        else
                        {
                            return this.value / 2;
                        }
                    },
                        true);
                    unit.DamageManipulation.AmpFromMe.AddSpecialModifierValue(
                        modifier,
                        (abilityUnit, damageValue) =>
                    {
                        if (
                            modifier.AffectedUnit.Position.Current.Distance2D(
                                abilityUnit.Position.Current) < 2200)
                        {
                            return this.value;
                        }
                        else
                        {
                            return this.value / 2;
                        }
                    },
                        true);
                });
            },
                () =>
            {
                return(unit =>
                {
                    unit.DamageManipulation.DamageAmplification.RemoveSpecialModifierValue(modifier);
                    unit.DamageManipulation.AmpFromMe.RemoveSpecialModifierValue(modifier);
                });
            },
                () =>
            {
                return(unit =>
                {
                    this.realValue =
                        Math.Floor(
                            this.Modifier.SourceSkill.SourceAbility.GetAbilityData("damage_increase_pct"))
                        / 100;
                    this.value = this.realValue;
                    unit.DamageManipulation.DamageAmplification.UpdateSpecialModifierValue(
                        modifier,
                        (abilityUnit, damageValue) =>
                    {
                        if (
                            modifier.AffectedUnit.Position.Current.Distance2D(
                                abilityUnit.Position.Current) < 2200)
                        {
                            return this.value;
                        }
                        else
                        {
                            return this.value / 2;
                        }
                    });
                    unit.DamageManipulation.AmpFromMe.UpdateSpecialModifierValue(
                        modifier,
                        (abilityUnit, damageValue) =>
                    {
                        if (
                            modifier.AffectedUnit.Position.Current.Distance2D(
                                abilityUnit.Position.Current) < 2200)
                        {
                            return this.value;
                        }
                        else
                        {
                            return this.value / 2;
                        }
                    });
                });
            });

            this.Workers.Add(this.ampApplier);
        }