/// <summary> /// Executes a melee or magic skill and inflicts the damages to the target. /// </summary> /// <param name="caster">Living entity casting a skill.</param> /// <param name="target">Living target entity touched by the skill.</param> /// <param name="skill">Skill to be casted.</param> /// <param name="reduceCasterPoints">Value that indicates if it should reduce caster points or not.</param> private void ExecuteSkill(ILivingEntity caster, ILivingEntity target, SkillInfo skill, bool reduceCasterPoints = true) { ObjectMessageType skillMessageType = ObjectMessageType.OBJMSG_NONE; IAttackArbiter attackArbiter = null; switch (skill.Data.Type) { case SkillType.Magic: attackArbiter = new MagicSkillAttackArbiter(caster, target, skill); skillMessageType = ObjectMessageType.OBJMSG_MAGICSKILL; break; case SkillType.Skill: attackArbiter = new MeleeSkillAttackArbiter(caster, target, skill); skillMessageType = ObjectMessageType.OBJMSG_MELEESKILL; break; } _battleSystem.DamageTarget(caster, target, attackArbiter, skillMessageType); if (skill.LevelData.CooldownTime > 0) { skill.SetCoolTime(skill.LevelData.CooldownTime); } if (reduceCasterPoints) { ReduceCasterPoints(caster, skill); } }
/// <inheritdoc /> public AttackResult DamageTarget(ILivingEntity attacker, ILivingEntity defender, IAttackArbiter attackArbiter, ObjectMessageType attackType) { if (!CanAttack(attacker, defender)) { ClearBattleTargets(defender); ClearBattleTargets(attacker); return(null); } if (defender is IPlayerEntity undyingPlayer) { if (undyingPlayer.PlayerData.Mode == ModeType.MATCHLESS_MODE) { _logger.LogDebug($"{attacker.Object.Name} wasn't able to inflict any damages to {defender.Object.Name} because he is in undying mode"); return(null); } } AttackResult attackResult; if (attacker is IPlayerEntity player && player.PlayerData.Mode.HasFlag(ModeType.ONEKILL_MODE)) { attackResult = new AttackResult { Damages = defender.Attributes[DefineAttributes.HP], Flags = AttackFlags.AF_GENERIC }; }