private static void UseSkillImpl(Client arg1, BinaryReader reader) { int skillId = reader.ReadInt32(); Console.WriteLine("Use skill: " + skillId); int targetId = (int)arg1.SelectedCharacter.GetStatsContainer().GetStat(StatType.TARGET_ID).value; Character target = ServerManager.Instance.CharactersManager.GetCharacterById(targetId); if (target != null) { if (target.IsDead) { return; } var data = ServerManager.Instance.SkillsManager.GetSkill(skillId); if (data != null) { StatsContainer stats = arg1.SelectedCharacter.GetStatsContainer(); if (stats.CanUseSkill(data)) { float time = ServerManager.Instance.TickManager.Time; if (!stats.skillsUseTime.TryAdd(data.baseId, time)) { stats.skillsUseTime[data.baseId] = time; } } else { return; } } else { return; } foreach (var client in ServerManager.Instance.CharactersManager.GetClientsInRange(arg1.SelectedCharacter.Position)) { Server.Instance.SendData(client.Value.ip, new ExecuteUseSkillPacket(arg1.SelectedCharacter.Id, targetId, skillId)); } ServerManager.Instance.CombatManager.DealDamage(arg1.SelectedCharacter, target, new AttackData() { attackerId = arg1.SelectedCharacter.Id, targetId = target.Id, damage = (ushort)new Random().Next(data.minDmg, data.maxDmg), damageType = 0 }); } }