コード例 #1
0
ファイル: CounterHandler.cs プロジェクト: Fuhhue/aura_legacy
        public override SkillResults UseCombat(MabiCreature attacker, ulong targetId, MabiSkill skill)
        {
            var target = WorldManager.Instance.GetCreatureById(targetId);
            if (target == null)
                return SkillResults.InvalidTarget;

            var sAction = new AttackerAction(CombatActionType.HardHit, attacker, skill.Id, targetId);
            sAction.Options |= AttackerOptions.Result;

            var tAction = new TargetAction(CombatActionType.CounteredHit, target, attacker, skill.Id);
            tAction.Options |= TargetOptions.Result | TargetOptions.KnockDown;

            var cap = new CombatActionPack(attacker, skill.Id);
            cap.Add(sAction, tAction);

            var damage =
                (attacker.GetRndTotalDamage() * (skill.RankInfo.Var2 / 100f)) +
                (target.GetRndTotalDamage() * (skill.RankInfo.Var1 / 100f));

            if (CombatHelper.TryAddCritical(attacker, ref damage, (target.CriticalChanceAgainst(attacker) + skill.RankInfo.Var3)))
                tAction.Options |= TargetOptions.Critical;

            CombatHelper.ReduceDamage(ref damage, target.DefenseTotal, target.Protection);

            target.TakeDamage(tAction.Damage = damage);

            if (target.IsDead)
                tAction.Options |= TargetOptions.FinishingKnockDown;

            attacker.Stun = sAction.StunTime = StunTime;
            target.Stun = tAction.StunTime = StunTime;

            tAction.OldPosition = CombatHelper.KnockBack(target, attacker);

            WorldManager.Instance.HandleCombatActionPack(cap);

            Send.SkillUse(attacker.Client, attacker, skill.Id, StunTime, 1);

            SkillHelper.GiveSkillExp(attacker, skill, 20);

            return SkillResults.Okay;
        }
コード例 #2
0
ファイル: WindmillHandler.cs プロジェクト: nvrlcky/aura
        public override SkillResults Use(MabiCreature attacker, MabiSkill skill, MabiPacket packet)
        {
            //Logger.Debug(packet);

            var targetId = packet.GetLong();
            var unk1 = packet.GetInt();
            var unk2 = packet.GetInt();

            // Determine range, doesn't seem to be included in rank info.
            var range = this.GetRange(skill);

            // Add attack range from race, range must increase depending on "size".
            range += (uint)attacker.RaceInfo.AttackRange;

            var enemies = WorldManager.Instance.GetAttackableCreaturesInRange(attacker, range);
            if (enemies.Count < 1)
            {
                Send.Notice(attacker.Client, Localization.Get("skills.wm_no_target")); // Unable to use when there is no target.
                Send.SkillSilentCancel(attacker.Client, attacker);

                return SkillResults.OutOfRange | SkillResults.Failure;
            }

            var rnd = RandomProvider.Get();

            attacker.StopMove();

            // Spin motion
            Send.UseMotion(attacker, 8, 4);

            var cap = new CombatActionPack(attacker, skill.Id);

            // One source action, target actions are added for every target
            // and then we send the pack on its way.
            var sAction = new AttackerAction(CombatActionType.Hit, attacker, skill.Id, targetId);
            sAction.Options |= AttackerOptions.Result | AttackerOptions.KnockBackHit1;

            cap.Add(sAction);

            attacker.Stun = sAction.StunTime = 2500;

            // For aggro selection, only one enemy gets it.
            MabiCreature aggroTarget = null;
            var survived = new List<MabiCreature>();

            foreach (var target in enemies)
            {
                target.StopMove();

                var tAction = new TargetAction(CombatActionType.TakeHit, target, attacker, skill.Id);
                cap.Add(tAction);

                var damage = attacker.GetRndTotalDamage();
                damage *= skill.RankInfo.Var1 / 100;

                if (CombatHelper.TryAddCritical(attacker, ref damage, attacker.CriticalChance))
                    tAction.Options |= TargetOptions.Critical;

                target.TakeDamage(tAction.Damage = damage);
                if (target.IsDead)
                    tAction.Options |= TargetOptions.FinishingKnockDown;

                tAction.Options |= TargetOptions.KnockDown;
                target.Stun = tAction.StunTime = CombatHelper.GetStunTarget(CombatHelper.GetAverageAttackSpeed(attacker), true);

                tAction.OldPosition = CombatHelper.KnockBack(target, attacker, 375);

                tAction.Delay = (uint)rnd.Next(300, 351);

                if (target.Target == attacker)
                    aggroTarget = target;

                if (!target.IsDead)
                    survived.Add(target);
            }

            // No aggro yet, random target.
            if (aggroTarget == null && survived.Count > 0)
                aggroTarget = survived[rnd.Next(0, survived.Count)];

            if (aggroTarget != null)
                CombatHelper.SetAggro(attacker, aggroTarget);

            WorldManager.Instance.HandleCombatActionPack(cap);

            Send.SkillUse(attacker.Client, attacker, skill.Id, targetId, unk1, unk2);
            //attacker.Client.SendSkillStackUpdate(attacker, skill.Id, 0);

            SkillHelper.DecStack(attacker, skill);
            SkillHelper.GiveSkillExp(attacker, skill, 20);

            return SkillResults.Okay;
        }
コード例 #3
0
ファイル: SmashHandler.cs プロジェクト: Fuhhue/aura_legacy
        private float calculateSmashDamage(MabiCreature attacker, MabiCreature target)
        {
            var dmg = attacker.GetRndTotalDamage();
            dmg *= attacker.Skills.Get(SkillConst.Smash).RankInfo.Var1 / 100f;

            if (attacker.RightHand != null && attacker.RightHand.IsTwoHandWeapon)
            {
                dmg *= 1.20f;
            }

            return dmg;
        }