using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; using static jRandomSkills.jRandomSkills; using System.Collections.Concurrent; namespace jRandomSkills { public class Gambler : ISkill { private const Skills skillName = Skills.Gambler; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); } public static void NewRound() { foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) { player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}"); return; } var skill = SkillData.Skills.FirstOrDefault(s => player.GetSkillName(s.Skill).Equals(commands[0], StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(commands[0], StringComparison.OrdinalIgnoreCase)); if (skill == null) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("skill_not_found_setskill")); return; } if (skill.Skill == skillName) TakeMoney(player); Instance.AddTimer(.1f, () => { playerInfo.Skill = skill.Skill; if (skill.Skill != skillName) playerInfo.SpecialSkill = skillName; playerInfo.SkillChance = 1; if (SkillsInfo.GetValue(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == skill.Skill) == null) return; Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); }); else Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); }); } private static void TakeMoney(CCSPlayerController player) { if (player == null || !player.IsValid || player.InGameMoneyServices == null) return; var account = player.InGameMoneyServices.Account; player.InGameMoneyServices.Account = Math.Max(0, account - SkillsInfo.GetValue(skillName, "refreshPrice")); Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); } public static void EnableSkill(CCSPlayerController player) { var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; playerInfo.SkillChance = 0; var skills = GetSkills(player); var firstSkill = skills[Instance.Random.Next(skills.Count)]; skills.Remove(firstSkill); var secondSkill = skills[Instance.Random.Next(skills.Count)]; ConcurrentBag<(string, string)> menuItems = [(player.GetSkillName(firstSkill.Skill), firstSkill.Skill.ToString()), (player.GetSkillName(secondSkill.Skill), secondSkill.Skill.ToString())]; SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue(skillName, "refreshPrice")), skillName.ToString())); } public static void DisableSkill(CCSPlayerController player) { SkillUtils.CloseMenu(player); } private static List GetSkills(CCSPlayerController player) { var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer == null) return [Event.noneSkill]; List skillList = new(SkillData.Skills); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) { SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); } if (player.Team == CsTeam.Terrorist) skillList.RemoveAll(s => Event.counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); else skillList.RemoveAll(s => Event.terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); return skillList.Count == 0 ? [Event.noneSkill] : skillList; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7eff47", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, int refreshPrice = 150) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) { public int RefreshPrice { get; set; } = refreshPrice; } } }