GetCharactersInRange() private method

private GetCharactersInRange ( short mapX, short mapY, byte distance ) : IEnumerable
mapX short
mapY short
distance byte
return IEnumerable
        private void TargetHit2(ClientSession targetSession, NpcMonsterSkill npcMonsterSkill, int damage, int hitmode)
        {
            Path = new List <GridPos>();
            targetSession.Character.LastDefence = DateTime.Now;
            bool isDead = targetSession.Character.Hp <= 0;

            targetSession.Character.GetDamage(damage);

            Map.Broadcast(null, ServerManager.Instance.GetUserMethod <string>(Target, "GenerateStat"), ReceiverType.OnlySomeone, "", Target);

            Map.Broadcast(npcMonsterSkill != null
                ? $"su 3 {MapMonsterId} 1 {Target} {npcMonsterSkill.SkillVNum} {npcMonsterSkill.Skill.Cooldown} {npcMonsterSkill.Skill.AttackAnimation} {npcMonsterSkill.Skill.Effect} {MapX} {MapY} {(targetSession.Character.Hp > 0 ? 1 : 0)} {(int)(targetSession.Character.Hp / targetSession.Character.HPLoad() * 100)} {damage} {hitmode} 0"
                : $"su 3 {MapMonsterId} 1 {Target} 0 {Monster.BasicCooldown} 11 {Monster.BasicSkill} 0 0 {(targetSession.Character.Hp > 0 ? 1 : 0)} {(int)(targetSession.Character.Hp / targetSession.Character.HPLoad() * 100)} {damage} {hitmode} 0");

            LastEffect = DateTime.Now;
            if (targetSession.Character.Hp <= 0 && !isDead)
            {
                Observable.Timer(TimeSpan.FromMilliseconds(1000))
                .Subscribe(
                    o =>
                {
                    ServerManager.Instance.AskRevive(targetSession.Character.CharacterId);
                    RemoveTarget();
                });
            }
            if (npcMonsterSkill != null && (npcMonsterSkill.Skill.Range > 0 || npcMonsterSkill.Skill.TargetRange > 0))
            {
                foreach (Character characterInRange in Map.GetCharactersInRange(npcMonsterSkill.Skill.TargetRange == 0 ? MapX : targetSession.Character.MapX, npcMonsterSkill.Skill.TargetRange == 0 ? MapY : targetSession.Character.MapY, npcMonsterSkill.Skill.TargetRange).Where(s => s.CharacterId != Target && s.Hp > 0 && !s.InvisibleGm))
                {
                    if (characterInRange.IsSitting)
                    {
                        characterInRange.IsSitting = false;
                        Map.Broadcast(characterInRange.GenerateRest());
                        Thread.Sleep(500);
                    }
                    if (characterInRange.HasGodMode)
                    {
                        damage  = 0;
                        hitmode = 1;
                    }
                    bool alreadyDead = characterInRange.Hp <= 0;
                    characterInRange.GetDamage(damage);
                    characterInRange.LastDefence = DateTime.Now;
                    Map.Broadcast(null, characterInRange.GenerateStat(), ReceiverType.OnlySomeone, "", characterInRange.CharacterId);
                    Map.Broadcast($"su 3 {MapMonsterId} 1 {characterInRange.CharacterId} 0 {Monster.BasicCooldown} 11 {Monster.BasicSkill} 0 0 {(characterInRange.Hp > 0 ? 1 : 0)} { (int)(characterInRange.Hp / characterInRange.HPLoad() * 100) } {damage} {hitmode} 0");
                    if (characterInRange.Hp <= 0 && !alreadyDead)
                    {
                        Observable.Timer(TimeSpan.FromMilliseconds(1000))
                        .Subscribe(
                            o =>
                        {
                            ServerManager.Instance.AskRevive(characterInRange.CharacterId);
                            RemoveTarget();
                        });
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Hit the Target Character.
        /// </summary>
        /// <param name="targetSession"></param>
        /// <param name="npcMonsterSkill"></param>
        private void TargetHit(ClientSession targetSession, NpcMonsterSkill npcMonsterSkill)
        {
            if (Monster != null && (((DateTime.Now - LastEffect).TotalMilliseconds >= 1000 + Monster.BasicCooldown * 200 && !Skills.Any()) || npcMonsterSkill != null))
            {
                int damage  = 0;
                int hitmode = 0;
                if (npcMonsterSkill != null)
                {
                    damage = GenerateDamage(targetSession.Character, npcMonsterSkill.Skill, ref hitmode);
                }
                else
                {
                    damage = GenerateDamage(targetSession.Character, null, ref hitmode);
                }

                if (npcMonsterSkill != null)
                {
                    if (CurrentMp < npcMonsterSkill.Skill.MpCost)
                    {
                        FollowTarget(targetSession);
                        return;
                    }
                    npcMonsterSkill.LastSkillUse = DateTime.Now;
                    this.CurrentMp -= npcMonsterSkill.Skill.MpCost;
                    Map.Broadcast($"ct 3 {MapMonsterId} 1 {Target} {npcMonsterSkill.Skill.CastAnimation} {npcMonsterSkill.Skill.CastEffect} {npcMonsterSkill.Skill.SkillVNum}");
                }
                LastMove = DateTime.Now;

                // deal 0 damage to GM with GodMode
                if (targetSession.Character.HasGodMode)
                {
                    damage = 0;
                }
                if (targetSession.Character.IsSitting)
                {
                    targetSession.Character.IsSitting = false;
                    Map.Broadcast(targetSession.Character.GenerateRest());
                    Thread.Sleep(500);
                }
                if (npcMonsterSkill != null && npcMonsterSkill.Skill.CastEffect != 0)
                {
                    Map.Broadcast(GenerateEff(npcMonsterSkill.Skill.CastEffect), MapX, MapY);
                    Thread.Sleep(npcMonsterSkill.Skill.CastTime * 100);
                }
                Path = new List <GridPos>();
                targetSession.Character.LastDefence = DateTime.Now;
                targetSession.Character.GetDamage(damage);

                Map.Broadcast(null, ServerManager.Instance.GetUserMethod <string>(Target, "GenerateStat"), ReceiverType.OnlySomeone, "", Target);

                if (npcMonsterSkill != null)
                {
                    Map.Broadcast($"su 3 {MapMonsterId} 1 {Target} {npcMonsterSkill.SkillVNum} {npcMonsterSkill.Skill.Cooldown} {npcMonsterSkill.Skill.AttackAnimation} {npcMonsterSkill.Skill.Effect} {this.MapX} {this.MapY} {(targetSession.Character.Hp > 0 ? 1 : 0)} { (int)(targetSession.Character.Hp / targetSession.Character.HPLoad() * 100) } {damage} {hitmode} 0");
                }
                else
                {
                    Map.Broadcast($"su 3 {MapMonsterId} 1 {Target} 0 {Monster.BasicCooldown} 11 {Monster.BasicSkill} 0 0 {(targetSession.Character.Hp > 0 ? 1 : 0)} { (int)(targetSession.Character.Hp / targetSession.Character.HPLoad() * 100) } {damage} {hitmode} 0");
                }

                LastEffect = DateTime.Now;
                if (targetSession.Character.Hp <= 0)
                {
                    Thread.Sleep(1000);
                    ServerManager.Instance.AskRevive(targetSession.Character.CharacterId);
                    RemoveTarget();
                }
                if (npcMonsterSkill != null && (npcMonsterSkill.Skill.Range > 0 || npcMonsterSkill.Skill.TargetRange > 0))
                {
                    foreach (Character characterInRange in Map.GetCharactersInRange(npcMonsterSkill.Skill.TargetRange == 0 ? this.MapX : targetSession.Character.MapX, npcMonsterSkill.Skill.TargetRange == 0 ? this.MapY : targetSession.Character.MapY, npcMonsterSkill.Skill.TargetRange).Where(s => s.CharacterId != Target && s.Hp > 0))
                    {
                        if (characterInRange.IsSitting)
                        {
                            characterInRange.IsSitting = false;
                            Map.Broadcast(characterInRange.GenerateRest());
                            Thread.Sleep(500);
                        }
                        if (characterInRange.HasGodMode)
                        {
                            damage  = 0;
                            hitmode = 1;
                        }
                        bool alreadyDead2 = characterInRange.Hp <= 0;
                        characterInRange.GetDamage(damage);
                        characterInRange.LastDefence = DateTime.Now;
                        Map.Broadcast(null, characterInRange.GenerateStat(), ReceiverType.OnlySomeone, "", characterInRange.CharacterId);
                        Map.Broadcast($"su 3 {MapMonsterId} 1 {characterInRange.CharacterId} 0 {Monster.BasicCooldown} 11 {Monster.BasicSkill} 0 0 {(characterInRange.Hp > 0 ? 1 : 0)} { (int)(characterInRange.Hp / characterInRange.HPLoad() * 100) } {damage} {hitmode} 0");
                        if (characterInRange.Hp <= 0 && !alreadyDead2)
                        {
                            damage = characterInRange.HasGodMode ? 0 : damage;
                        }
                        bool alreadyDead = characterInRange.Hp <= 0;
                        characterInRange.GetDamage(damage);
                        characterInRange.LastDefence = DateTime.Now;
                        characterInRange.Session.SendPacket(characterInRange.GenerateStat());

                        Map.Broadcast($"su 3 {MapMonsterId} 1 {characterInRange.CharacterId} 0 {Monster.BasicCooldown} 11 {Monster.BasicSkill} 0 0 {(characterInRange.Hp > 0 ? 1 : 0)} { (int)(characterInRange.Hp / characterInRange.HPLoad() * 100) } {damage} {hitmode} 0");
                        if (characterInRange.Hp <= 0 && !alreadyDead)
                        {
                            Thread.Sleep(1000);
                            ServerManager.Instance.AskRevive(characterInRange.CharacterId);
                            RemoveTarget();
                        }
                    }
                }
            }
        }