/// <summary> /// Calculates and sets splash damage reductions and bonuses against splashTarget. /// </summary> /// <param name="splashTarget"></param> /// <param name="damageSplash"></param> /// <param name="skill"></param> /// <param name="critSkill"></param> /// <param name="aAction"></param> /// <param name="tAction"></param> /// <param name="tSplashAction"></param> public void CalculateSplashDamage(Creature splashTarget, ref float damageSplash, Skill skill, Skill critSkill, AttackerAction aAction, TargetAction tAction, TargetAction tSplashAction, Item weapon = null) { //Splash Damage Reduction if (skill.Info.Id == SkillId.Smash) damageSplash *= skill.Info.Rank < SkillRank.R1 ? 0.1f : 0.2f; else damageSplash *= weapon != null ? weapon.Data.SplashDamage : 0f; // Critical Hit if (critSkill != null && tAction.Has(TargetOptions.Critical)) { // Add crit bonus var bonus = critSkill.RankData.Var1 / 100f; damageSplash = damageSplash + (damageSplash * bonus); // Set splashTarget option tSplashAction.Set(TargetOptions.Critical); } var maxDamageSplash = damageSplash; //Damage without Defense and Protection // Subtract splashTarget def/prot SkillHelper.HandleDefenseProtection(splashTarget, ref damageSplash); // Defense Channel.Skills.Combat.Defense.Handle(aAction, tSplashAction, ref damageSplash); // Mana Shield ManaShield.Handle(splashTarget, ref damageSplash, tSplashAction, maxDamageSplash); if (damageSplash <= 0f) damageSplash = 1f; }
// ------------------------------------------------------------------ /// <summary> /// Called when creature is hit. /// </summary> /// <param name="action"></param> public virtual void OnHit(TargetAction action) { // Aggro attacker if there is not current target, // or if there is a target but it's not a player, and the attacker is one, // or if the current target is not aggroed yet. //if (this.Creature.Target == null || (this.Creature.Target != null && action.Attacker != null && !this.Creature.Target.IsPlayer && action.Attacker.IsPlayer) || _state != AiState.Aggro) //{ // this.AggroCreature(action.Attacker); //} var activeSkillWas = SkillId.None; if (this.Creature.Skills.ActiveSkill != null) { activeSkillWas = this.Creature.Skills.ActiveSkill.Info.Id; this.SharpMind(this.Creature.Skills.ActiveSkill.Info.Id, SharpMindStatus.Cancelling); } lock (_reactions) { if (activeSkillWas == SkillId.Defense && _reactions[_state].ContainsKey(AiEvent.DefenseHit)) { this.SwitchAction(_reactions[_state][AiEvent.DefenseHit]); } else if ((action.Has(TargetOptions.KnockDown) || action.Has(TargetOptions.Smash)) && _reactions[_state].ContainsKey(AiEvent.KnockDown)) { this.SwitchAction(_reactions[_state][AiEvent.KnockDown]); } else if (_reactions[_state].ContainsKey(AiEvent.Hit)) { this.SwitchAction(_reactions[_state][AiEvent.Hit]); } } }