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(); }); } } } }
/// <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(); } } } } }