diff --git a/.github/en.md b/.github/en.md index 22a77a8..ad7ab51 100644 --- a/.github/en.md +++ b/.github/en.md @@ -357,6 +357,18 @@ This plugin uses content from the following projects: ## 📋 Changelog +
+v1.2.2.b4 + +- #### General: + - ###### Updated the GitHub source code to implement the changes introduced in merge request (https://github.com/Juzlus/jRandomSkills/pull/32). + +- #### Skill improvements: + - ###### Ninja: + - ###### Removed debug chat messages that were used for testing. + +
+
v1.2.2.b3 diff --git a/.github/pl.md b/.github/pl.md index d72859c..5f548ac 100644 --- a/.github/pl.md +++ b/.github/pl.md @@ -355,6 +355,18 @@ Plugin korzysta z zawartości następujących projektów: ## 📋 Lista Zmian +
+v1.2.2.b4 + +- #### General: + - Ogólne Uaktualizowano kod źródłowy na GitHubie, aby uwzględniał zmiany wprowadzone w merge request: https://github.com/Juzlus/jRandomSkills/pull/32. + +- #### Poprawki mocy: + - ###### Ninja: + - ###### Usunięto wiadomości z czatu używane do celów testowych. + +
+
v1.2.2.b3 diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj index ad9f274..33a5330 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -12,9 +12,6 @@ - - - @@ -53,7 +50,7 @@ $(MSBuildProjectDirectory)\src\lang $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills\languages - $(MSBuildProjectDirectory)\bin\Debug\net10.0 + $(MSBuildProjectDirectory)\bin\$(Configuration)\$(TargetFramework) $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills $(MSBuildProjectDirectory)\src\gamedata $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\gamedata diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index db40d62..f49cbc5 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; -using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.menu; @@ -24,7 +23,7 @@ namespace src.command public static void Load() { config = Config.LoadedConfig; - if (config == null || config == null) return; + if (config == null) return; lock (setLock) { @@ -201,7 +200,7 @@ namespace src.command private static void ChangeMap(CommandInfo command) { - string map = command.GetArg(1).ToLower(); + string map = command.GetArg(1).ToLowerInvariant(); if (string.IsNullOrEmpty(map)) { @@ -549,7 +548,7 @@ namespace src.command if (langInfo.IsoCodes.Contains(newLangCode)) fileName = langInfo.FileName; if (Localization.HasTranslation(newLangCode)) - fileName = newLangCode.ToLower(); + fileName = newLangCode.ToLowerInvariant(); Localization.ChangePlayerLanguage(player, fileName); } diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 160b1c6..d90254b 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -28,7 +28,7 @@ namespace src public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; - public override string ModuleVersion => "1.2.2.b2"; + public override string ModuleVersion => "1.2.2.b4"; public override void Load(bool hotReload) { @@ -78,43 +78,38 @@ namespace src Debug.WriteToDebug($"Loaded: {skill.Skill}"); } + private static readonly ConcurrentDictionary<(string Skill, string Method), MethodInfo?> _skillMethodCache = new(); + internal object? SkillAction(string skill, string methodName, object[]? param = null) { if (string.IsNullOrEmpty(skill)) return null; - string className = $"src.player.skills.{skill}"; - - Type? type = Type.GetType(className) - ?? Assembly.GetExecutingAssembly().GetType(className) - ?? AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(a => - { - try { return a.GetTypes(); } - catch (ReflectionTypeLoadException ex) { return ex.Types.Where(t => t!= null)!; } - catch { return []; } - }) - .FirstOrDefault(t => t != null && string.Equals(t.FullName, className, StringComparison.Ordinal)); - - if (type != null && typeof(ISkill).IsAssignableFrom(type)) + var method = _skillMethodCache.GetOrAdd((skill, methodName), key => { - MethodInfo? method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); - return method?.Invoke(null, param); - } - else - Server.PrintToConsole($"Could not find or load {className}"); + string className = $"src.player.skills.{key.Skill}"; - return null; - } + Type? type = Type.GetType(className) + ?? Assembly.GetExecutingAssembly().GetType(className) + ?? AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(a => + { + try { return a.GetTypes(); } + catch (ReflectionTypeLoadException ex) { return ex.Types.Where(t => t != null)!; } + catch { return []; } + }) + .FirstOrDefault(t => t != null && string.Equals(t.FullName, className, StringComparison.Ordinal)); - internal void RegisterListener(Action onTick, HookMode pre) - { - throw new NotImplementedException(); - } + if (type == null || !typeof(ISkill).IsAssignableFrom(type)) + { + Server.PrintToConsole($"Could not find or load {className}"); + return null; + } - internal void RegisterListener(Action value, HookMode pre) - { - throw new NotImplementedException(); + return type.GetMethod(key.Method, BindingFlags.Static | BindingFlags.Public); + }); + + return method?.Invoke(null, param); } internal new void AddCommand(string name, string description, CommandInfo.CommandCallback handler) @@ -328,10 +323,7 @@ namespace src public string Color { get; set; } = color; public bool Display { get; } = display; - public static implicit operator Skills(jSkill_SkillInfo v) - { - throw new NotImplementedException(); - } + public static implicit operator Skills(jSkill_SkillInfo v) => v?.Skill ?? Skills.None; } public static class SkillData diff --git a/jRandomSkills - SRC Files/src/lang/tr.json b/jRandomSkills - SRC Files/src/lang/tr.json index 25e1f9b..87d07ef 100644 --- a/jRandomSkills - SRC Files/src/lang/tr.json +++ b/jRandomSkills - SRC Files/src/lang/tr.json @@ -24,6 +24,7 @@ "areareaper_select_info": "Kapatılacak bomba alanını seç:", "areareaper_site_disabled": "{0} alanı mühürlendi - artık buraya bomba kurulamaz!", "areareaper_used_info": "Yeteneğini zaten kullandın, açgözlülük yapma", + "areareaper_teammates_info": "{0} Bölgesi bomba kurmaya kapatıldı.", "areareaper_bombsite_disabled": "Bu bomba alanı kullanıma kapatıldı!", "armored": "Zırhlı", @@ -62,6 +63,7 @@ "carefulbullets": "Dikkatli Mermiler", "carefulbullets_desc": "Düşman mermi kaçırırsa hasar alır", "carefulbullets_enemy_info": "Mermi kaçırmak canını yakacak", + "carefulbullets_disable_info": "Artık mermi kaçırmak can yakmayacak.", "carefulbullets_player_info": "'{0}' artık mermi sıkarken iki kere düşünecek", "carefulbullets_select_info": "İsabetsiz atışların hasar vereceği oyuncu:", @@ -85,6 +87,7 @@ "darkness": "Karanlık", "darkness_desc": "Bir düşmanın ekranını karart", "darkness_enemy_info": "Işıklar sönsün", + "darkness_disable_info": "Işıklar geldi.", "darkness_player_info": "'{0}' isimli oyuncunun dünyasını kararttın", "darkness_select_info": "Karanlık bir oyuncuyu seç:", @@ -97,6 +100,7 @@ "deaf": "Sağır", "deaf_desc": "Bir düşmanın kulağını kapat ve sesleri duymaz hale getir", "deaf_enemy_info": "Kulaklıkların tıkandı", + "deaf_disable_info": "Kulakların açıldı.", "deaf_player_info": "'{0}' isimli oyuncu için sesler kapatıldı.", "deaf_select_info": "Sağır bir oyuncuyu seç:", @@ -167,6 +171,7 @@ "glitch": "Glitç", "glitch_desc": "Seçilen bir düşmanın radarını kapatır", "glitch_enemy_info": "Radarın kapandı", + "glitch_disable_info": "Radarın açıldı", "glitch_player_info": "'{0}' isimli oyuncunun radarı devre dışı bırakıldı.", "glitch_select_info": "Radarı kapatılacak oyuncuyu seç:", @@ -219,6 +224,7 @@ "jammer": "Sinyal Kesici", "jammer_desc": "Bir oyuncunun nişangahını (crosshair) kapatmak için seç", "jammer_enemy_info": "Nişangahın kapatıldı.", + "jammer_disable_info": "Nişangahın açıldı", "jammer_player_info": "'{0}' isimli oyuncunun nişangahı kapatıldı.", "jammer_select_info": "Nişangahı kapatılacak oyuncuyu seç:", @@ -231,6 +237,7 @@ "jumpban": "Bacaksız", "jumpban_desc": "Zıplayamayacak bir oyuncu seç", "jumpban_enemy_info": "Bacakların kesildi", + "jumpban_disable_info": "Bacaklarına kavuştun", "jumpban_player_info": "'{0}' artık zıplayamaz.", "jumpban_select_info": "Zıplaması yasaklanacak oyuncu:", @@ -261,6 +268,7 @@ "magnifier": "Büyüteç", "magnifier_desc": "Düşmanın ekranını yakınlaştırarak görüş alanını daraltır", "magnifier_enemy_info": "Görüşün bozuldu!", + "magnifier_disable_info": "Görüşün düzeldi", "magnifier_player_info": "'{0}' isimli oyuncunun ekranı yakınlaştırıldı.", "magnifier_select_info": "Ekranı büyütülecek oyuncuyu seç:", @@ -322,12 +330,14 @@ "poison": "Zehir", "poison_desc": "Birkaç saniyede bir hasar alacak bir oyuncu seç", "poison_enemy_info": "Zehirlendin.", + "poison_disable_info": "Zehire bağışıklık kazandın", "poison_player_info": "'{0}' isimli oyuncu zehirlendi.", "poison_select_info": "Zehirlenecek oyuncuyu seç:", "primaryban": "Tüfek Yasak", "primaryban_desc": "Tüfek kullanamayacak bir oyuncu seç", "primaryban_enemy_info": "Tüfek kullanmayı unuttun", + "primaryban_disable_info": "Tüfek kullanabilirsin", "primaryban_player_info": "'{0}' artık tüfek kullanamaz.", "primaryban_select_info": "Tüfek kullanımı yasaklanacak oyuncu:", diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index c897992..676cfb4 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -46,7 +46,7 @@ namespace src.player Instance.RegisterEventHandler(PlayerSpawned); Instance.RegisterEventHandler(RoundStart); Instance.RegisterEventHandler(RoundEnd); - + Instance.RegisterEventHandler(PlayerDeath); Instance.RegisterEventHandler(PlayerBlind); Instance.RegisterEventHandler(PlayerHurt); @@ -138,17 +138,21 @@ namespace src.player return candidates[Random.Shared.Next(candidates.Count)]; } + private static void DispatchToActiveSkills(string methodName, params object[] args) + { + var seen = new HashSet(); + foreach (var p in Instance.SkillPlayer) + { + if (p.IsDrawing || !seen.Add(p.Skill)) continue; + Instance.SkillAction(p.Skill.ToString(), methodName, args); + } + } + private static HookResult PlayerMakeSound(UserMessage um) { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "PlayerMakeSound", [um]); + DispatchToActiveSkills("PlayerMakeSound", um); return HookResult.Continue; } } @@ -157,13 +161,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "WeaponFire", [@event]); + DispatchToActiveSkills("WeaponFire", @event); return HookResult.Continue; } } @@ -172,13 +170,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "WeaponEquip", [@event]); + DispatchToActiveSkills("WeaponEquip", @event); return HookResult.Continue; } } @@ -187,13 +179,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "WeaponPickup", [@event]); + DispatchToActiveSkills("WeaponPickup", @event); return HookResult.Continue; } } @@ -202,13 +188,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "WeaponReload", [@event]); + DispatchToActiveSkills("WeaponReload", @event); return HookResult.Continue; } } @@ -217,13 +197,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "GrenadeThrown", [@event]); + DispatchToActiveSkills("GrenadeThrown", @event); return HookResult.Continue; } } @@ -232,13 +206,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "BombBeginplant", [@event]); + DispatchToActiveSkills("BombBeginplant", @event); return HookResult.Continue; } } @@ -247,13 +215,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "BombAbortplant", [@event]); + DispatchToActiveSkills("BombAbortplant", @event); return HookResult.Continue; } } @@ -262,13 +224,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "BombPlanted", [@event]); + DispatchToActiveSkills("BombPlanted", @event); return HookResult.Continue; } } @@ -277,13 +233,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "BombBegindefuse", [@event]); + DispatchToActiveSkills("BombBegindefuse", @event); return HookResult.Continue; } } @@ -292,13 +242,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "DecoyStarted", [@event]); + DispatchToActiveSkills("DecoyStarted", @event); return HookResult.Continue; } } @@ -307,13 +251,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "DecoyDetonate", [@event]); + DispatchToActiveSkills("DecoyDetonate", @event); return HookResult.Continue; } } @@ -322,13 +260,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "SmokegrenadeDetonate", [@event]); + DispatchToActiveSkills("SmokegrenadeDetonate", @event); return HookResult.Continue; } } @@ -337,13 +269,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "SmokegrenadeExpired", [@event]); + DispatchToActiveSkills("SmokegrenadeExpired", @event); return HookResult.Continue; } } @@ -352,13 +278,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "PlayerHurt", [@event]); + DispatchToActiveSkills("PlayerHurt", @event); return HookResult.Continue; } } @@ -367,13 +287,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "PlayerJump", [@event]); + DispatchToActiveSkills("PlayerJump", @event); return HookResult.Continue; } } @@ -391,13 +305,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "PlayerBlind", [@event]); + DispatchToActiveSkills("PlayerBlind", @event); return HookResult.Continue; } } @@ -406,15 +314,10 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); + DispatchToActiveSkills("OnTakeDamage", h); - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "OnTakeDamage", [h]); - - if (Fortnite.skillInThisRound == true && !activeSkills.Any(s => s == "Fortnite")) + if (Fortnite.skillInThisRound == true && + !Instance.SkillPlayer.Any(p => !p.IsDrawing && p.Skill == Skills.Fortnite)) Instance.SkillAction("Fortnite", "OnTakeDamage", [h]); return HookResult.Continue; @@ -428,13 +331,7 @@ namespace src.player CBaseTrigger trigger = hook.GetParam(0); CBaseEntity entity = hook.GetParam(1); - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "OnTriggerEnter", [trigger, entity]); + DispatchToActiveSkills("OnTriggerEnter", trigger, entity); return HookResult.Continue; } } @@ -446,13 +343,7 @@ namespace src.player CBaseTrigger trigger = hook.GetParam(0); CBaseEntity entity = hook.GetParam(1); - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "OnTriggerExit", [trigger, entity]); + DispatchToActiveSkills("OnTriggerExit", trigger, entity); return HookResult.Continue; } } @@ -539,9 +430,9 @@ namespace src.player foreach (var skill in activeSkills) if (SkillsInfo.GetValue(skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - continue; - else - Instance.SkillAction(skill.ToString(), "OnTick"); + continue; + else + Instance.SkillAction(skill.ToString(), "OnTick"); } } @@ -555,6 +446,13 @@ namespace src.player if (player.IsBot && !Config.LoadedConfig.EnableBotSkills) return; + var existing = Instance.SkillPlayer.FirstOrDefault(p => p.PlayerIndex == player.Index); + if (existing != null) + { + PlayerManager.Register(existing); + return; + } + var playerInfo = new jSkill_PlayerInfo { IsBot = player.IsBot, @@ -617,11 +515,11 @@ namespace src.player { var userID = @event.Userid; if (userID == 0 || string.IsNullOrEmpty(@event.Text)) return HookResult.Continue; - + string text = @event.Text.Split(' ')[0].Trim(); string commandName = text.StartsWith('!') || text.StartsWith('/') ? text[1..] : text; - + var player = Utilities.GetPlayerFromUserid(userID); if (player == null || !player.IsValid) return HookResult.Continue; @@ -630,7 +528,7 @@ namespace src.player var temp = skillPlayer.SkillHudExpired; skillPlayer.SkillHudExpired = DateTime.MinValue; -; + ; Instance.AddTimer(5f, () => { if (skillPlayer.SkillHudExpired == DateTime.MinValue) @@ -709,7 +607,6 @@ namespace src.player if (playerInfo == null) continue; Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); - Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound"); playerInfo.Skill = noneSkill.Skill; playerInfo.SpecialSkill = noneSkill.Skill; @@ -719,6 +616,9 @@ namespace src.player RestorePlayer(player); } + + foreach (var skill in SkillData.Skills) + Instance.SkillAction(skill.Skill.ToString(), "NewRound"); } } @@ -743,23 +643,24 @@ namespace src.player lock (setLock) { isTransmitRegistered = false; - - Instance.AddTimer(.1f, () => { - DisableAll(); - ConVar.Find("sv_legacy_jump")?.SetValue("1"); - - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - Instance.RemoveListener(CheckTransmit); - + + Fortnite.skillInThisRound = false; + EntityManager.DestroyAllTracked(); + foreach (var skill in SkillData.Skills) + Instance.SkillAction(skill.Skill.ToString(), "NewRound"); + playersSkills.Clear(); staticSkills.Clear(); - + ctSkill = noneSkill; tSkill = noneSkill; allSkill = noneSkill; - + + Instance.SkillPlayer.Clear(); PlayerManager.Clear(); + + ConVar.Find("sv_legacy_jump")?.SetValue("1"); } } @@ -813,13 +714,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "PlayerDeath", [@event]); + DispatchToActiveSkills("PlayerDeath", @event); var victim = PlayerManager.GetPlayerEvent(@event.Userid); var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); @@ -840,7 +735,7 @@ namespace src.player if (skillData == null || specialSkillData == null) return HookResult.Continue; string skillDesc = victim.GetSkillDescription(skillData.Skill); - SkillUtils.PrintToChat(victim, + SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? victim.GetSkillName(skillData.Skill) : $"{victim.GetSkillName(specialSkillData.Skill)} -> {victim.GetSkillName(skillData.Skill)}")}{ChatColors.Lime} - {skillDesc}", title: $"{victim.GetTranslation("enemy_skill")} {ChatColors.DarkRed}\u202A{attacker.PlayerName}\u202C{ChatColors.Lime}"); } @@ -858,11 +753,13 @@ namespace src.player string? button = Config.LoadedConfig.AlternativeSkillButton; if (string.IsNullOrEmpty(button) || button.Length < 2) return; - string buttonName = $"{char.ToUpper(button[0])}{button[1..].ToLower()}"; + string buttonName = $"{char.ToUpperInvariant(button[0])}{button[1..].ToLowerInvariant()}"; if (!Enum.TryParse(buttonName, out var skillButton)) return; if ((pressed & skillButton) == 0) return; + if (SkillUtils.HasMenu(player)) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.IsDrawing) return; @@ -903,13 +800,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "OnEntitySpawned", [entity]); + DispatchToActiveSkills("OnEntitySpawned", entity); } } @@ -917,13 +808,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "BulletImpact", [@event]); + DispatchToActiveSkills("BulletImpact", @event); return HookResult.Continue; } } @@ -1059,7 +944,7 @@ namespace src.player Instance?.AddTimer(.2f, () => { - if(player == null || !player.IsValid) return; + if (player == null || !player.IsValid) return; if (randomSkill.Display) SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", @@ -1084,7 +969,7 @@ namespace src.player float descriptionHudExpired = Config.LoadedConfig.SkillDescriptionDuration; skillPlayer.SkillDescriptionHudExpired = descriptionHudExpired == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(descriptionHudExpired); - + if (Config.LoadedConfig.TeamMateSkillChatInfo) { Instance?.AddTimer(.6f, () => @@ -1200,6 +1085,7 @@ namespace src.player } } + Instance?.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]); skillPlayer.Skill = randomSkill.Skill; skillPlayer.SpecialSkill = Skills.None; @@ -1231,13 +1117,7 @@ namespace src.player { lock (setLock) { - var activeSkills = Instance.SkillPlayer - .Where(p => !p.IsDrawing) - .Select(p => p.Skill.ToString()) - .Distinct(); - - foreach (string skillName in activeSkills) - Instance.SkillAction(skillName, "CheckTransmit", [infoList]); + DispatchToActiveSkills("CheckTransmit", infoList); } } @@ -1285,4 +1165,4 @@ namespace src.player public static DateTime GetFreezeTimeEnd() => freezeTimeEnd; } -} +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 88dd9b3..ae03ed1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -63,6 +63,10 @@ namespace src.player.skills playerInfo.SkillUsed = true; playersToTarget[player.Index] = targetSite.Index; + + string siteLetter = site == 0 ? "A" : "B"; + foreach (var ct in Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team == CsTeam.CounterTerrorist)) + ct.PrintToChat($" {ChatColors.Green}" + ct.GetTranslation("areareaper_teammates_info", siteLetter)); } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index f836faf..378f7e6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -133,7 +133,11 @@ namespace src.player.skills { var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); if (target != null && target.IsValid) + { SetUpPostProcessing(target, true); + if (target.PawnIsAlive && !SkillUtils.IsFreezeTime()) + target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info")); + } playersInDark.TryRemove(targetIndex, out _); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 13d974a..d2beffa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -123,6 +123,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { deafPlayers.TryRemove(targetIndex, out _); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index b5f450f..d32f123 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -130,7 +130,11 @@ namespace src.player.skills { var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); if (target != null && target.IsValid) + { target.ReplicateConVar("sv_disable_radar", "0"); + if (target.PawnIsAlive && !SkillUtils.IsFreezeTime()) + target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info")); + } glitchedPlayers.TryRemove(targetIndex, out _); } diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 041c75a..377d7b0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -131,6 +131,7 @@ namespace src.player.skills return; if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { bannedPlayers.TryRemove(targetIndex, out _); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index cf3a60c..1dfb529 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -134,11 +134,16 @@ namespace src.player.skills { var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); if (target != null && target.IsValid) + { if (playersFOV.TryGetValue(targetIndex, out uint fov)) { target.DesiredFOV = fov; Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV"); } + + if (target.PawnIsAlive && !SkillUtils.IsFreezeTime()) + target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info")); + } playersFOV.TryRemove(targetIndex, out _); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 396d7d6..96ec055 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -184,8 +184,6 @@ namespace src.player.skills if (player.PlayerPawn?.Value?.Health <= 0) return; - Server.PrintToChatAll($"Update ninja for {player.PlayerName}"); - var playerEvent = PlayerManager.GetPlayerEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index ed2b072..fdf02d0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -130,6 +130,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { poisonedPlayers.TryRemove(targetIndex, out _); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index 5179091..58bb8db 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -132,6 +132,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { bannedPlayers.TryRemove(targetIndex, out _); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 6f15728..98c6563 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -112,7 +112,10 @@ namespace src.player.skills playersInAction.TryRemove(player.Index, out _); if (playersInAction.IsEmpty) + { NewRound(); + return; + } SkillUtils.ForceFullUpdateToAll(); } diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index f25b19c..a333f40 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -71,9 +71,6 @@ namespace src.utils public class SettingsModel { - [DisplayName("Game Mode")] - [Description("TESTfafw..")] - [Range(0, 5)] public string ConfigName { get; set; } public int GameMode { get; set; } public bool YourSkillChatInfo { get; set; } diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index f61b72a..d90a39b 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -50,7 +50,7 @@ namespace src.utils if (!File.Exists(langPath)) return; - var code = Path.GetFileNameWithoutExtension(langPath).ToLower(); + var code = Path.GetFileNameWithoutExtension(langPath).ToLowerInvariant(); var jsonText = File.ReadAllText(langPath); var translations = JsonConvert.DeserializeObject>(jsonText); @@ -60,7 +60,7 @@ namespace src.utils public static bool HasTranslation(string code) { - return _translations.ContainsKey(code.ToLower()); + return _translations.ContainsKey(code.ToLowerInvariant()); } public static string GetSkillName(this CCSPlayerController player, Skills skill, float? chance = null) @@ -68,7 +68,7 @@ namespace src.utils string langCode = GetLangCode(player); if (chance == null) { - var translation = GetTranslation(skill.ToString().ToLower(), langCode); + var translation = GetTranslation(skill.ToString().ToLowerInvariant(), langCode); if (!translation.Contains("{0}")) return translation; @@ -81,7 +81,7 @@ namespace src.utils } var value = Math.Round((double)(chance ?? 1), 2); - var skillNameText = GetTranslation(skill.ToString().ToLower(), langCode, player, value); + var skillNameText = GetTranslation(skill.ToString().ToLowerInvariant(), langCode, player, value); if (skillNameText.Contains('%')) skillNameText = skillNameText.Replace(value.ToString(), Math.Round(value * 100, 0).ToString()); return skillNameText; } @@ -91,7 +91,7 @@ namespace src.utils string langCode = GetLangCode(player); if (chance == null) { - var translation = GetTranslation($"{skill.ToString().ToLower()}_desc", langCode); + var translation = GetTranslation($"{skill.ToString().ToLowerInvariant()}_desc", langCode); if (!translation.Contains("{0}")) return translation; @@ -103,12 +103,12 @@ namespace src.utils return string.Join(' ', filtered); } - var skillName = $"{skill.ToString().ToLower()}_desc2"; + var skillName = $"{skill.ToString().ToLowerInvariant()}_desc2"; var value = Math.Round((double)(chance ?? 1), 2); var desc2 = GetTranslation(skillName, langCode, player, value); var skilLDescription = desc2 == skillName - ? player.GetTranslation($"{skill.ToString().ToLower()}_desc") + ? player.GetTranslation($"{skill.ToString().ToLowerInvariant()}_desc") : desc2.Contains('%') ? desc2.Replace(value.ToString(), Math.Round(value * 100, 0).ToString()) : desc2; return skilLDescription; } diff --git a/jRandomSkills - SRC Files/src/utils/RayTrace.cs b/jRandomSkills - SRC Files/src/utils/RayTrace.cs index 5b67078..96bd90e 100644 --- a/jRandomSkills - SRC Files/src/utils/RayTrace.cs +++ b/jRandomSkills - SRC Files/src/utils/RayTrace.cs @@ -28,7 +28,10 @@ namespace src.utils playerPawn.CBodyComponent?.SceneNode == null) return null; - var rayTrace = RayTraceInterface.Get(); + CRayTraceInterface? rayTrace; + try { rayTrace = RayTraceInterface.Get(); } + catch { return null; } + if (rayTrace == null) return null; @@ -111,7 +114,10 @@ namespace src.utils playerPawn.CBodyComponent?.SceneNode == null) return null; - var rayTrace = RayTraceInterface.Get(); + CRayTraceInterface? rayTrace; + try { rayTrace = RayTraceInterface.Get(); } + catch { return null; } + if (rayTrace == null) return null; diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index d95ce2f..c1a26ef 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -524,7 +524,7 @@ namespace src.utils ? $"\u202A{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}\u202C
" : $"\u202A{player.GetSkillName(skillData.Skill)}\u202C
"; - var skill_select_info = player.GetTranslation($"{playerInfo.Skill.ToString().ToLower()}_select_info"); + var skill_select_info = player.GetTranslation($"{playerInfo.Skill.ToString().ToLowerInvariant()}_select_info"); string remainingLine = string.IsNullOrWhiteSpace(skill_select_info) ? "" : $"{skill_select_info}
"; @@ -585,8 +585,8 @@ namespace src.utils { if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; var teams = Utilities.FindAllEntitiesByDesignerName("cs_team_manager"); - var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); - var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); + var ctTeam = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); + var tTeams = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); if (ctTeam == null || tTeams == null) return; short ctScore = (short)(winnerTeam == CsTeam.CounterTerrorist ? ctTeam.Score + 1 : ctTeam.Score); @@ -686,8 +686,8 @@ namespace src.utils private static void UpdateClientTeamScores(MCCSMatch match) { var teams = Utilities.FindAllEntitiesByDesignerName("cs_team_manager"); - var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); - var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); + var ctTeam = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); + var tTeams = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); if (ctTeam != null && tTeams != null) { diff --git a/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs b/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs index 72381f0..04a1f01 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs @@ -18,6 +18,10 @@ namespace src.utils private static SkillsInfoModel config = LoadSkillsInfo(); public static SkillsInfoModel LoadedConfig => config; + private static SkillsInfoModel? _indexedConfig; + private static ConcurrentDictionary _byName = new(); + private static readonly ConcurrentDictionary<(Type Type, string Key), MemberInfo?> _memberCache = new(); + public static SkillsInfoModel LoadSkillsInfo() { lock (fileLock) @@ -84,26 +88,39 @@ namespace src.utils { if (config == null) return default!; - var skillConfig = LoadedConfig.FirstOrDefault(s => s.Name == skill.ToString()); - if (skillConfig == null) return default!; + EnsureIndex(); + if (!_byName.TryGetValue(skill.ToString()!, out var skillConfig) || skillConfig == null) + return default!; - var prop = skillConfig.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); - if (prop != null) + var member = _memberCache.GetOrAdd((skillConfig.GetType(), key), k => { - var value = prop.GetValue(skillConfig); - if (value == null) return default!; - else return (T)Convert.ChangeType(value, typeof(T)); - } + MemberInfo? m = k.Type.GetProperty(k.Key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + m ??= k.Type.GetField(k.Key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); + return m; + }); - var field = skillConfig.GetType().GetField(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); - if (field != null) + object? value = member switch { - var value = field.GetValue(skillConfig); - if (value == null) return default!; - else return (T)Convert.ChangeType(value, typeof(T)); - } + PropertyInfo p => p.GetValue(skillConfig), + FieldInfo f => f.GetValue(skillConfig), + _ => null + }; - return default!; + if (value == null) return default!; + return (T)Convert.ChangeType(value, typeof(T)); + } + + private static void EnsureIndex() + { + if (ReferenceEquals(_indexedConfig, config)) return; + + var dict = new ConcurrentDictionary(); + foreach (var s in config) + dict[s.Name] = s; + + _byName = dict; + _indexedConfig = config; + _memberCache.Clear(); } public class SkillsInfoModel : ConcurrentBag @@ -124,7 +141,7 @@ namespace src.utils .Where(instance => instance != null) .Cast()) Add(skill); - } + } } public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll index b6f84f2..f18b273 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index 1fdf43f..87a83ae 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json index 12fc4da..2381f53 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json and b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json differ