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); }
// 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); }