using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Reflection; using static jRandomSkills.jRandomSkills; namespace jRandomSkills { public static class Config { private static readonly string configsFolder = Path.Combine(Instance.ModuleDirectory, "configs"); private static readonly string configPath = Path.Combine(configsFolder, "config.json"); private static ConfigModel config = LoadConfig(); public static ConfigModel LoadedConfig => config; public static ConfigModel LoadConfig() { if (!File.Exists(configPath)) { Instance.Logger.LogInformation("Config file does not exist. Create a new config file..."); var defaultConfig = new ConfigModel(); SaveConfig(defaultConfig); return defaultConfig; } string json = File.ReadAllText(configPath); var config = new ConfigModel(); try { var root = JsonConvert.DeserializeObject(json); if (root == null) return config; var settings = root["Settings"]; if (settings != null) JsonConvert.PopulateObject(settings.ToString(), config.Settings); var skillsArray = (JArray?)root["SkillsInfo"]; if (skillsArray != null) foreach (var skillObj in skillsArray) { var name = skillObj["Name"]; if (name == null) continue; var instance = config.SkillsInfo.FirstOrDefault(x => x.Name == name.ToString()); if (instance != null) JsonConvert.PopulateObject(skillObj.ToString(), instance); } } catch { Instance.Logger.LogError("Error when loading the config file."); } return config; } public static void SaveConfig(ConfigModel config) { try { Directory.CreateDirectory(configsFolder); string json = JsonConvert.SerializeObject(config, Formatting.Indented); File.WriteAllText(configPath, json); } catch { Instance.Logger.LogError("Error when saving the config file."); } } public static T GetValue(object skill, string key) { var skillConfig = config.SkillsInfo.FirstOrDefault(s => s.Name == skill.ToString()); if (skillConfig == null) return default!; var prop = skillConfig.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (prop != null) { var value = prop.GetValue(skillConfig); if (value == null) return default!; else return (T)Convert.ChangeType(value, typeof(T)); } var field = skillConfig.GetType().GetField(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (field != null) { var value = field.GetValue(skillConfig); if (value == null) return default!; else return (T)Convert.ChangeType(value, typeof(T)); } return default!; } public class ConfigModel { public Settings Settings { get; set; } = new Settings(); public DefaultSkillInfo[] SkillsInfo { get; set; } public ConfigModel() { SkillsInfo = Assembly.GetExecutingAssembly().GetTypes() .Where(t => typeof(DefaultSkillInfo).IsAssignableFrom(t) && t.Name == "SkillConfig") .Select(t => { var ctor = t.GetConstructors().FirstOrDefault(c => c.GetParameters().All(p => p.IsOptional)); if (ctor == null) return null; var args = ctor.GetParameters().Select(p => Type.Missing).ToArray(); return ctor.Invoke(args) as DefaultSkillInfo; }) .Where(instance => instance != null) .ToArray()!; } } public class Settings { public string LangCode { get; set; } public int GameMode { get; set; } public bool KillerSkillInfo { get; set; } public bool TeamMateSkillInfo { get; set; } public bool SummaryAfterTheRound { get; set; } public bool DebugMode { get; set; } public string? AlternativeSkillButton { get; set; } public float SkillTimeBeforeStart { get; set; } public float SkillDescriptionDuration { get; set; } public bool DisableSpectateHUD { get; set; } public bool FlashingHtmlHudFix { get; set; } public bool CS2TraceRayDebug { get; set; } public NormalCommand SetSkillCommands { get; set; } public NormalCommand SkillsListCommands { get; set; } public NormalCommand UseSkillCommands { get; set; } public NormalCommand HealCommands { get; set; } public NormalCommand ConsoleCommands { get; set; } public NormalCommand SetStaticSkillCommands { get; set; } public NormalCommand ChangeLanguageCommands { get; set; } public NormalCommand ReloadCommands { get; set; } public VotingCommand StartGameCommands { get; set; } public VotingCommand ChangeMapCommands { get; set; } public VotingCommand SwapCommands { get; set; } public VotingCommand ShuffleCommands { get; set; } public VotingCommand PauseCommands { get; set; } public VotingCommand SetScoreCommands { get; set; } public Settings() { LangCode = "en"; GameMode = (int)GameModes.NoRepeat; KillerSkillInfo = true; TeamMateSkillInfo = true; SummaryAfterTheRound = true; DebugMode = true; AlternativeSkillButton = null; SkillTimeBeforeStart = 7; SkillDescriptionDuration = 7; FlashingHtmlHudFix = true; CS2TraceRayDebug = false; DisableSpectateHUD = false; SetSkillCommands = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandmosSkills/admin"); SkillsListCommands = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandmosSkills/admin"); UseSkillCommands = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandmosSkills/admin"); HealCommands = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandmosSkills/admin"); ConsoleCommands = new NormalCommand("console, sv, 控制台, 服务器", "@jRandmosSkills/root"); SetStaticSkillCommands = new NormalCommand("ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "@jRandmosSkills/admin"); ChangeLanguageCommands = new NormalCommand("lang, language, changelang, change_lang, jezyk, język", ""); ReloadCommands = new NormalCommand("reload, refresh", "@jRandmosSkills/admin"); StartGameCommands = new VotingCommand(true, "start, go, começar, iniciar, 开始, 启动", "@jRandmosSkills/admin", 15, 60, 15, 500, 2); ChangeMapCommands = new VotingCommand( true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandmosSkills/admin", 25, 90, 15, 500, 2); SwapCommands = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandmosSkills/admin", 15, 90, 15, 20, 2); ShuffleCommands = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandmosSkills/admin", 15, 90, 15, 20, 2); PauseCommands = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandmosSkills/admin", 15, 60, 15, 2, 2); SetScoreCommands = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandmosSkills/root", 15, 90, 15, 90, 2); } } public class NormalCommand(string alias, string permissions) { public string Alias { get; set; } = alias; public string Permissions { get; set; } = permissions; } public class VotingCommand(bool enableVoting, string alias, string permissions, float timeToVote, float percentagesToSuccess, float timeToNextVoting, float timeToNextSameVoting, int minimumPlayersToStartVoting) : NormalCommand(alias, permissions) { public bool EnableVoting { get; set; } = enableVoting; public float TimeToVote { get; set; } = timeToVote; public float PercentagesToSuccess { get; set; } = percentagesToSuccess; public float TimeToNextVoting { get; set; } = timeToNextVoting; public float TimeToNextSameVoting { get; set; } = timeToNextSameVoting; public int MinimumPlayersToStartVoting { get; set; } = minimumPlayersToStartVoting; } public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) { public bool NeedsTeammates { get; set; } = needsTeammates; public int OnlyTeam { get; set; } = (int)onlyTeam; public string Color { get; set; } = color; public bool Active { get; set; } = active; public string Name { get; set; } = skill.ToString(); } public enum GameModes { Normal = 0, TeamSkills = 1, SameSkills = 2, NoRepeat = 3, Debug = 4 } } }