Beispiel #1
0
        protected void PerformDamage(ICharacter source, ICharacter victim, IAbility ability, CombatHelpers.AttackResults attackResult, int damage, SchoolTypes damageType)
        {
            if (ability.Kind == AbilityKinds.Skill)
            {
                // TODO: refactor same code in Character.OneHit
                switch (attackResult)
                {
                case CombatHelpers.AttackResults.Miss:
                case CombatHelpers.AttackResults.Dodge:
                case CombatHelpers.AttackResults.Parry:
                    return;     // no damage

                case CombatHelpers.AttackResults.Block:
                    damage = (damage * 7) / 10;
                    break;

                case CombatHelpers.AttackResults.Critical:
                    // TODO http://wow.gamepedia.com/Critical_strike
                    if (victim.ImpersonatedBy != null)     // PVP
                    {
                        damage = (damage * 150) / 200;
                    }
                    else     // PVE
                    {
                        damage *= 2;
                    }
                    break;

                case CombatHelpers.AttackResults.CrushingBlow:
                    // http://wow.gamepedia.com/Crushing_Blow
                    damage = (damage * 150) / 200;
                    break;

                case CombatHelpers.AttackResults.Hit:
                    // not modified
                    break;
                }
            }
            else if (ability.Kind == AbilityKinds.Spell)
            {
                // Miss/Hit/Critical
                switch (attackResult)
                {
                case CombatHelpers.AttackResults.Miss:
                    return;      // no damage

                case CombatHelpers.AttackResults.Critical:
                    // http://wow.gamepedia.com/Spell_critical_strike
                    damage *= 2;
                    break;

                case CombatHelpers.AttackResults.Hit:
                    // no modifier
                    break;
                }
            }
            victim.AbilityDamage(source, ability, damage, damageType, true);
        }
Beispiel #2
0
        // Process periodic aura (return true if aura is elapsed)
        public bool Process(ICharacter victim)
        {
            if (TicksLeft <= 0)
            {
                Log.Default.WriteLine(LogLevels.Error, "PeriodicAura.Process: no tick left");
                return(true);
            }

            // Set/Reset start time on first tick
            DateTime now = DependencyContainer.Instance.GetInstance <IServer>().CurrentTime;

            if (TicksLeft == TotalTicks) // first tick
            {
                _startTime = now;
            }

            // Compute delay between now and previous check
            TimeSpan diff = now - _lastTickElapsed;

            // If TickDelay in seconds elapsed, perform heal/damage
            if (diff.TotalSeconds > TickDelay)
            {
                Log.Default.WriteLine(LogLevels.Debug, "Processing periodic aura {0} on {1} from {2} tick left {3} delay {4}", Ability == null ? "<<??>>" : Ability.Name, victim.Name, Source == null ? "<<??>>" : Source.Name, TicksLeft, TickDelay);

                _lastTickElapsed = now;
                TicksLeft--;

                int amount = Amount;
                if (AmountOperator == AmountOperators.Percentage)
                {
                    amount = victim[SecondaryAttributeTypes.MaxHitPoints] * Amount / 100; // percentage of max hit points
                }
                if (AuraType == PeriodicAuraTypes.Heal)
                {
                    victim.Heal(Source, Ability, amount, TickVisible);
                }
                else if (AuraType == PeriodicAuraTypes.Damage)
                {
                    if (Source == null)
                    {
                        victim.UnknownSourceDamage(Ability, amount, School, TickVisible);
                    }
                    else
                    {
                        victim.AbilityDamage(Source, Ability, amount, School, TickVisible);
                    }
                }
            }
            return(TicksLeft == 0);
        }