예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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
                };
            }