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.
This commit is contained in:
Juzlus 2026-06-29 16:10:59 +02:00
parent 36bd85ef06
commit 42e5453fd4
25 changed files with 212 additions and 268 deletions

12
.github/en.md vendored
View file

@ -357,6 +357,18 @@ This plugin uses content from the following projects:
## 📋 Changelog ## 📋 Changelog
<details>
<summary><b>v1.2.2.b4</b></summary>
- #### 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.
</details>
<details> <details>
<summary><b>v1.2.2.b3</b></summary> <summary><b>v1.2.2.b3</b></summary>

12
.github/pl.md vendored
View file

@ -355,6 +355,18 @@ Plugin korzysta z zawartości następujących projektów:
## 📋 Lista Zmian ## 📋 Lista Zmian
<details>
<summary><b>v1.2.2.b4</b></summary>
- #### 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.
</details>
<details> <details>
<summary><b>v1.2.2.b3</b></summary> <summary><b>v1.2.2.b3</b></summary>

View file

@ -12,9 +12,6 @@
<ItemGroup> <ItemGroup>
<Compile Remove="tools\**" /> <Compile Remove="tools\**" />
<None Remove="tools\**" /> <None Remove="tools\**" />
<None Remove="src\command\Command.cs~RF4f34d1e7.TMP" />
<None Remove="src\player\PlayerOnTick.cs~RF38b6229.TMP" />
<None Remove="src\player\skills\RespWroga.cs~RF528d210.TMP" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -53,7 +50,7 @@
<PropertyGroup> <PropertyGroup>
<SourceLangDir>$(MSBuildProjectDirectory)\src\lang</SourceLangDir> <SourceLangDir>$(MSBuildProjectDirectory)\src\lang</SourceLangDir>
<ServerLangDir>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills\languages</ServerLangDir> <ServerLangDir>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills\languages</ServerLangDir>
<SourceDLL>$(MSBuildProjectDirectory)\bin\Debug\net10.0</SourceDLL> <SourceDLL>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(TargetFramework)</SourceDLL>
<ServerDLL>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills</ServerDLL> <ServerDLL>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills</ServerDLL>
<SourceGamedataDir>$(MSBuildProjectDirectory)\src\gamedata</SourceGamedataDir> <SourceGamedataDir>$(MSBuildProjectDirectory)\src\gamedata</SourceGamedataDir>
<ServerGamedataDir>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\gamedata</ServerGamedataDir> <ServerGamedataDir>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\gamedata</ServerGamedataDir>

View file

@ -2,7 +2,6 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Commands.Targeting;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.menu; using src.menu;
@ -24,7 +23,7 @@ namespace src.command
public static void Load() public static void Load()
{ {
config = Config.LoadedConfig; config = Config.LoadedConfig;
if (config == null || config == null) return; if (config == null) return;
lock (setLock) lock (setLock)
{ {
@ -201,7 +200,7 @@ namespace src.command
private static void ChangeMap(CommandInfo command) private static void ChangeMap(CommandInfo command)
{ {
string map = command.GetArg(1).ToLower(); string map = command.GetArg(1).ToLowerInvariant();
if (string.IsNullOrEmpty(map)) if (string.IsNullOrEmpty(map))
{ {
@ -549,7 +548,7 @@ namespace src.command
if (langInfo.IsoCodes.Contains(newLangCode)) if (langInfo.IsoCodes.Contains(newLangCode))
fileName = langInfo.FileName; fileName = langInfo.FileName;
if (Localization.HasTranslation(newLangCode)) if (Localization.HasTranslation(newLangCode))
fileName = newLangCode.ToLower(); fileName = newLangCode.ToLowerInvariant();
Localization.ChangePlayerLanguage(player, fileName); Localization.ChangePlayerLanguage(player, fileName);
} }

View file

@ -28,7 +28,7 @@ namespace src
public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleName => "[CS2] [ jRandomSkills ]";
public override string ModuleAuthor => "D3X, Juzlus"; 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 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) public override void Load(bool hotReload)
{ {
@ -78,12 +78,16 @@ namespace src
Debug.WriteToDebug($"Loaded: {skill.Skill}"); 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) internal object? SkillAction(string skill, string methodName, object[]? param = null)
{ {
if (string.IsNullOrEmpty(skill)) if (string.IsNullOrEmpty(skill))
return null; return null;
string className = $"src.player.skills.{skill}"; var method = _skillMethodCache.GetOrAdd((skill, methodName), key =>
{
string className = $"src.player.skills.{key.Skill}";
Type? type = Type.GetType(className) Type? type = Type.GetType(className)
?? Assembly.GetExecutingAssembly().GetType(className) ?? Assembly.GetExecutingAssembly().GetType(className)
@ -96,25 +100,16 @@ namespace src
}) })
.FirstOrDefault(t => t != null && string.Equals(t.FullName, className, StringComparison.Ordinal)); .FirstOrDefault(t => t != null && string.Equals(t.FullName, className, StringComparison.Ordinal));
if (type != null && typeof(ISkill).IsAssignableFrom(type)) if (type == null || !typeof(ISkill).IsAssignableFrom(type))
{ {
MethodInfo? method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public);
return method?.Invoke(null, param);
}
else
Server.PrintToConsole($"Could not find or load {className}"); Server.PrintToConsole($"Could not find or load {className}");
return null; return null;
} }
internal void RegisterListener<T>(Action onTick, HookMode pre) return type.GetMethod(key.Method, BindingFlags.Static | BindingFlags.Public);
{ });
throw new NotImplementedException();
}
internal void RegisterListener<T>(Action<object, object> value, HookMode pre) return method?.Invoke(null, param);
{
throw new NotImplementedException();
} }
internal new void AddCommand(string name, string description, CommandInfo.CommandCallback handler) internal new void AddCommand(string name, string description, CommandInfo.CommandCallback handler)
@ -328,10 +323,7 @@ namespace src
public string Color { get; set; } = color; public string Color { get; set; } = color;
public bool Display { get; } = display; public bool Display { get; } = display;
public static implicit operator Skills(jSkill_SkillInfo v) public static implicit operator Skills(jSkill_SkillInfo v) => v?.Skill ?? Skills.None;
{
throw new NotImplementedException();
}
} }
public static class SkillData public static class SkillData

View file

@ -24,6 +24,7 @@
"areareaper_select_info": "Kapatılacak bomba alanını seç:", "areareaper_select_info": "Kapatılacak bomba alanını seç:",
"areareaper_site_disabled": "{0} alanı mühürlendi - artık buraya bomba kurulamaz!", "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_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ı!", "areareaper_bombsite_disabled": "Bu bomba alanı kullanıma kapatıldı!",
"armored": "Zırhlı", "armored": "Zırhlı",
@ -62,6 +63,7 @@
"carefulbullets": "Dikkatli Mermiler", "carefulbullets": "Dikkatli Mermiler",
"carefulbullets_desc": "Düşman mermi kaçırırsa hasar alır", "carefulbullets_desc": "Düşman mermi kaçırırsa hasar alır",
"carefulbullets_enemy_info": "Mermi kaçırmak canını yakacak", "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_player_info": "'{0}' artık mermi sıkarken iki kere düşünecek",
"carefulbullets_select_info": "İsabetsiz atışların hasar vereceği oyuncu:", "carefulbullets_select_info": "İsabetsiz atışların hasar vereceği oyuncu:",
@ -85,6 +87,7 @@
"darkness": "Karanlık", "darkness": "Karanlık",
"darkness_desc": "Bir düşmanın ekranını karart", "darkness_desc": "Bir düşmanın ekranını karart",
"darkness_enemy_info": "Işıklar sönsün", "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_player_info": "'{0}' isimli oyuncunun dünyasını kararttın",
"darkness_select_info": "Karanlık bir oyuncuyu seç:", "darkness_select_info": "Karanlık bir oyuncuyu seç:",
@ -97,6 +100,7 @@
"deaf": "Sağır", "deaf": "Sağır",
"deaf_desc": "Bir düşmanın kulağını kapat ve sesleri duymaz hale getir", "deaf_desc": "Bir düşmanın kulağını kapat ve sesleri duymaz hale getir",
"deaf_enemy_info": "Kulaklıkların tıkandı", "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_player_info": "'{0}' isimli oyuncu için sesler kapatıldı.",
"deaf_select_info": "Sağır bir oyuncuyu seç:", "deaf_select_info": "Sağır bir oyuncuyu seç:",
@ -167,6 +171,7 @@
"glitch": "Glitç", "glitch": "Glitç",
"glitch_desc": "Seçilen bir düşmanın radarını kapatır", "glitch_desc": "Seçilen bir düşmanın radarını kapatır",
"glitch_enemy_info": "Radarın kapandı", "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_player_info": "'{0}' isimli oyuncunun radarı devre dışı bırakıldı.",
"glitch_select_info": "Radarı kapatılacak oyuncuyu seç:", "glitch_select_info": "Radarı kapatılacak oyuncuyu seç:",
@ -219,6 +224,7 @@
"jammer": "Sinyal Kesici", "jammer": "Sinyal Kesici",
"jammer_desc": "Bir oyuncunun nişangahını (crosshair) kapatmak için seç", "jammer_desc": "Bir oyuncunun nişangahını (crosshair) kapatmak için seç",
"jammer_enemy_info": "Nişangahın kapatıldı.", "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_player_info": "'{0}' isimli oyuncunun nişangahı kapatıldı.",
"jammer_select_info": "Nişangahı kapatılacak oyuncuyu seç:", "jammer_select_info": "Nişangahı kapatılacak oyuncuyu seç:",
@ -231,6 +237,7 @@
"jumpban": "Bacaksız", "jumpban": "Bacaksız",
"jumpban_desc": "Zıplayamayacak bir oyuncu seç", "jumpban_desc": "Zıplayamayacak bir oyuncu seç",
"jumpban_enemy_info": "Bacakların kesildi", "jumpban_enemy_info": "Bacakların kesildi",
"jumpban_disable_info": "Bacaklarına kavuştun",
"jumpban_player_info": "'{0}' artık zıplayamaz.", "jumpban_player_info": "'{0}' artık zıplayamaz.",
"jumpban_select_info": "Zıplaması yasaklanacak oyuncu:", "jumpban_select_info": "Zıplaması yasaklanacak oyuncu:",
@ -261,6 +268,7 @@
"magnifier": "Büyüteç", "magnifier": "Büyüteç",
"magnifier_desc": "Düşmanın ekranını yakınlaştırarak görüş alanını daraltır", "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_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_player_info": "'{0}' isimli oyuncunun ekranı yakınlaştırıldı.",
"magnifier_select_info": "Ekranı büyütülecek oyuncuyu seç:", "magnifier_select_info": "Ekranı büyütülecek oyuncuyu seç:",
@ -322,12 +330,14 @@
"poison": "Zehir", "poison": "Zehir",
"poison_desc": "Birkaç saniyede bir hasar alacak bir oyuncu seç", "poison_desc": "Birkaç saniyede bir hasar alacak bir oyuncu seç",
"poison_enemy_info": "Zehirlendin.", "poison_enemy_info": "Zehirlendin.",
"poison_disable_info": "Zehire bağışıklık kazandın",
"poison_player_info": "'{0}' isimli oyuncu zehirlendi.", "poison_player_info": "'{0}' isimli oyuncu zehirlendi.",
"poison_select_info": "Zehirlenecek oyuncuyu seç:", "poison_select_info": "Zehirlenecek oyuncuyu seç:",
"primaryban": "Tüfek Yasak", "primaryban": "Tüfek Yasak",
"primaryban_desc": "Tüfek kullanamayacak bir oyuncu seç", "primaryban_desc": "Tüfek kullanamayacak bir oyuncu seç",
"primaryban_enemy_info": "Tüfek kullanmayı unuttun", "primaryban_enemy_info": "Tüfek kullanmayı unuttun",
"primaryban_disable_info": "Tüfek kullanabilirsin",
"primaryban_player_info": "'{0}' artık tüfek kullanamaz.", "primaryban_player_info": "'{0}' artık tüfek kullanamaz.",
"primaryban_select_info": "Tüfek kullanımı yasaklanacak oyuncu:", "primaryban_select_info": "Tüfek kullanımı yasaklanacak oyuncu:",

View file

@ -138,17 +138,21 @@ namespace src.player
return candidates[Random.Shared.Next(candidates.Count)]; return candidates[Random.Shared.Next(candidates.Count)];
} }
private static void DispatchToActiveSkills(string methodName, params object[] args)
{
var seen = new HashSet<Skills>();
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) private static HookResult PlayerMakeSound(UserMessage um)
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("PlayerMakeSound", um);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerMakeSound", [um]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -157,13 +161,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("WeaponFire", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponFire", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -172,13 +170,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("WeaponEquip", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponEquip", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -187,13 +179,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("WeaponPickup", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponPickup", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -202,13 +188,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("WeaponReload", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponReload", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -217,13 +197,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("GrenadeThrown", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "GrenadeThrown", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -232,13 +206,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("BombBeginplant", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombBeginplant", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -247,13 +215,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("BombAbortplant", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombAbortplant", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -262,13 +224,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("BombPlanted", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombPlanted", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -277,13 +233,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("BombBegindefuse", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombBegindefuse", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -292,13 +242,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("DecoyStarted", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "DecoyStarted", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -307,13 +251,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("DecoyDetonate", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "DecoyDetonate", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -322,13 +260,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("SmokegrenadeDetonate", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "SmokegrenadeDetonate", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -337,13 +269,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("SmokegrenadeExpired", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "SmokegrenadeExpired", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -352,13 +278,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("PlayerHurt", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerHurt", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -367,13 +287,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("PlayerJump", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerJump", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -391,13 +305,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("PlayerBlind", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerBlind", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -406,15 +314,10 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("OnTakeDamage", h);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills) if (Fortnite.skillInThisRound == true &&
Instance.SkillAction(skillName, "OnTakeDamage", [h]); !Instance.SkillPlayer.Any(p => !p.IsDrawing && p.Skill == Skills.Fortnite))
if (Fortnite.skillInThisRound == true && !activeSkills.Any(s => s == "Fortnite"))
Instance.SkillAction("Fortnite", "OnTakeDamage", [h]); Instance.SkillAction("Fortnite", "OnTakeDamage", [h]);
return HookResult.Continue; return HookResult.Continue;
@ -428,13 +331,7 @@ namespace src.player
CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0); CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(1); CBaseEntity entity = hook.GetParam<CBaseEntity>(1);
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("OnTriggerEnter", trigger, entity);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnTriggerEnter", [trigger, entity]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -446,13 +343,7 @@ namespace src.player
CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0); CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(1); CBaseEntity entity = hook.GetParam<CBaseEntity>(1);
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("OnTriggerExit", trigger, entity);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnTriggerExit", [trigger, entity]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -555,6 +446,13 @@ namespace src.player
if (player.IsBot && !Config.LoadedConfig.EnableBotSkills) if (player.IsBot && !Config.LoadedConfig.EnableBotSkills)
return; return;
var existing = Instance.SkillPlayer.FirstOrDefault(p => p.PlayerIndex == player.Index);
if (existing != null)
{
PlayerManager.Register(existing);
return;
}
var playerInfo = new jSkill_PlayerInfo var playerInfo = new jSkill_PlayerInfo
{ {
IsBot = player.IsBot, IsBot = player.IsBot,
@ -709,7 +607,6 @@ namespace src.player
if (playerInfo == null) continue; if (playerInfo == null) continue;
Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]);
Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound");
playerInfo.Skill = noneSkill.Skill; playerInfo.Skill = noneSkill.Skill;
playerInfo.SpecialSkill = noneSkill.Skill; playerInfo.SpecialSkill = noneSkill.Skill;
@ -719,6 +616,9 @@ namespace src.player
RestorePlayer(player); RestorePlayer(player);
} }
foreach (var skill in SkillData.Skills)
Instance.SkillAction(skill.Skill.ToString(), "NewRound");
} }
} }
@ -743,15 +643,13 @@ namespace src.player
lock (setLock) lock (setLock)
{ {
isTransmitRegistered = false; isTransmitRegistered = false;
Instance.AddTimer(.1f, () => {
DisableAll();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
Instance.RemoveListener<CheckTransmit>(CheckTransmit); Instance.RemoveListener<CheckTransmit>(CheckTransmit);
Fortnite.skillInThisRound = false;
EntityManager.DestroyAllTracked();
foreach (var skill in SkillData.Skills)
Instance.SkillAction(skill.Skill.ToString(), "NewRound");
playersSkills.Clear(); playersSkills.Clear();
staticSkills.Clear(); staticSkills.Clear();
@ -759,7 +657,10 @@ namespace src.player
tSkill = noneSkill; tSkill = noneSkill;
allSkill = noneSkill; allSkill = noneSkill;
Instance.SkillPlayer.Clear();
PlayerManager.Clear(); PlayerManager.Clear();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
} }
} }
@ -813,13 +714,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("PlayerDeath", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerDeath", [@event]);
var victim = PlayerManager.GetPlayerEvent(@event.Userid); var victim = PlayerManager.GetPlayerEvent(@event.Userid);
var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var attacker = PlayerManager.GetPlayerEvent(@event.Attacker);
@ -858,11 +753,13 @@ namespace src.player
string? button = Config.LoadedConfig.AlternativeSkillButton; string? button = Config.LoadedConfig.AlternativeSkillButton;
if (string.IsNullOrEmpty(button) || button.Length < 2) return; 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<PlayerButtons>(buttonName, out var skillButton)) return; if (!Enum.TryParse<PlayerButtons>(buttonName, out var skillButton)) return;
if ((pressed & skillButton) == 0) return; if ((pressed & skillButton) == 0) return;
if (SkillUtils.HasMenu(player)) return;
var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
if (playerInfo == null || playerInfo.IsDrawing) return; if (playerInfo == null || playerInfo.IsDrawing) return;
@ -903,13 +800,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("OnEntitySpawned", entity);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnEntitySpawned", [entity]);
} }
} }
@ -917,13 +808,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("BulletImpact", @event);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BulletImpact", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
} }
@ -1200,6 +1085,7 @@ namespace src.player
} }
} }
Instance?.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]);
skillPlayer.Skill = randomSkill.Skill; skillPlayer.Skill = randomSkill.Skill;
skillPlayer.SpecialSkill = Skills.None; skillPlayer.SpecialSkill = Skills.None;
@ -1231,13 +1117,7 @@ namespace src.player
{ {
lock (setLock) lock (setLock)
{ {
var activeSkills = Instance.SkillPlayer DispatchToActiveSkills("CheckTransmit", infoList);
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "CheckTransmit", [infoList]);
} }
} }

View file

@ -63,6 +63,10 @@ namespace src.player.skills
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
playersToTarget[player.Index] = targetSite.Index; 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));
} }
} }
} }

View file

@ -133,7 +133,11 @@ namespace src.player.skills
{ {
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid) if (target != null && target.IsValid)
{
SetUpPostProcessing(target, true); SetUpPostProcessing(target, true);
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info"));
}
playersInDark.TryRemove(targetIndex, out _); playersInDark.TryRemove(targetIndex, out _);
} }

View file

@ -123,6 +123,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
deafPlayers.TryRemove(targetIndex, out _); deafPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -130,7 +130,11 @@ namespace src.player.skills
{ {
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid) if (target != null && target.IsValid)
{
target.ReplicateConVar("sv_disable_radar", "0"); target.ReplicateConVar("sv_disable_radar", "0");
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
}
glitchedPlayers.TryRemove(targetIndex, out _); glitchedPlayers.TryRemove(targetIndex, out _);
} }

View file

@ -131,6 +131,7 @@ namespace src.player.skills
return; return;
if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
bannedPlayers.TryRemove(targetIndex, out _); bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -134,11 +134,16 @@ namespace src.player.skills
{ {
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid) if (target != null && target.IsValid)
{
if (playersFOV.TryGetValue(targetIndex, out uint fov)) if (playersFOV.TryGetValue(targetIndex, out uint fov))
{ {
target.DesiredFOV = fov; target.DesiredFOV = fov;
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV"); Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
} }
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
}
playersFOV.TryRemove(targetIndex, out _); playersFOV.TryRemove(targetIndex, out _);
} }

View file

@ -184,8 +184,6 @@ namespace src.player.skills
if (player.PlayerPawn?.Value?.Health <= 0) if (player.PlayerPawn?.Value?.Health <= 0)
return; return;
Server.PrintToChatAll($"Update ninja for {player.PlayerName}");
var playerEvent = PlayerManager.GetPlayerEvent(player); var playerEvent = PlayerManager.GetPlayerEvent(player);
if (playerEvent == null || !playerEvent.IsValid) return; if (playerEvent == null || !playerEvent.IsValid) return;

View file

@ -130,6 +130,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
poisonedPlayers.TryRemove(targetIndex, out _); poisonedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -132,6 +132,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
bannedPlayers.TryRemove(targetIndex, out _); bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -112,7 +112,10 @@ namespace src.player.skills
playersInAction.TryRemove(player.Index, out _); playersInAction.TryRemove(player.Index, out _);
if (playersInAction.IsEmpty) if (playersInAction.IsEmpty)
{
NewRound(); NewRound();
return;
}
SkillUtils.ForceFullUpdateToAll(); SkillUtils.ForceFullUpdateToAll();
} }

View file

@ -71,9 +71,6 @@ namespace src.utils
public class SettingsModel public class SettingsModel
{ {
[DisplayName("Game Mode")]
[Description("TESTfafw..")]
[Range(0, 5)]
public string ConfigName { get; set; } public string ConfigName { get; set; }
public int GameMode { get; set; } public int GameMode { get; set; }
public bool YourSkillChatInfo { get; set; } public bool YourSkillChatInfo { get; set; }

View file

@ -50,7 +50,7 @@ namespace src.utils
if (!File.Exists(langPath)) if (!File.Exists(langPath))
return; return;
var code = Path.GetFileNameWithoutExtension(langPath).ToLower(); var code = Path.GetFileNameWithoutExtension(langPath).ToLowerInvariant();
var jsonText = File.ReadAllText(langPath); var jsonText = File.ReadAllText(langPath);
var translations = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(jsonText); var translations = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(jsonText);
@ -60,7 +60,7 @@ namespace src.utils
public static bool HasTranslation(string code) 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) public static string GetSkillName(this CCSPlayerController player, Skills skill, float? chance = null)
@ -68,7 +68,7 @@ namespace src.utils
string langCode = GetLangCode(player); string langCode = GetLangCode(player);
if (chance == null) if (chance == null)
{ {
var translation = GetTranslation(skill.ToString().ToLower(), langCode); var translation = GetTranslation(skill.ToString().ToLowerInvariant(), langCode);
if (!translation.Contains("{0}")) if (!translation.Contains("{0}"))
return translation; return translation;
@ -81,7 +81,7 @@ namespace src.utils
} }
var value = Math.Round((double)(chance ?? 1), 2); 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()); if (skillNameText.Contains('%')) skillNameText = skillNameText.Replace(value.ToString(), Math.Round(value * 100, 0).ToString());
return skillNameText; return skillNameText;
} }
@ -91,7 +91,7 @@ namespace src.utils
string langCode = GetLangCode(player); string langCode = GetLangCode(player);
if (chance == null) if (chance == null)
{ {
var translation = GetTranslation($"{skill.ToString().ToLower()}_desc", langCode); var translation = GetTranslation($"{skill.ToString().ToLowerInvariant()}_desc", langCode);
if (!translation.Contains("{0}")) if (!translation.Contains("{0}"))
return translation; return translation;
@ -103,12 +103,12 @@ namespace src.utils
return string.Join(' ', filtered); 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 value = Math.Round((double)(chance ?? 1), 2);
var desc2 = GetTranslation(skillName, langCode, player, value); var desc2 = GetTranslation(skillName, langCode, player, value);
var skilLDescription = desc2 == skillName 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; : desc2.Contains('%') ? desc2.Replace(value.ToString(), Math.Round(value * 100, 0).ToString()) : desc2;
return skilLDescription; return skilLDescription;
} }

View file

@ -28,7 +28,10 @@ namespace src.utils
playerPawn.CBodyComponent?.SceneNode == null) playerPawn.CBodyComponent?.SceneNode == null)
return null; return null;
var rayTrace = RayTraceInterface.Get(); CRayTraceInterface? rayTrace;
try { rayTrace = RayTraceInterface.Get(); }
catch { return null; }
if (rayTrace == null) if (rayTrace == null)
return null; return null;
@ -111,7 +114,10 @@ namespace src.utils
playerPawn.CBodyComponent?.SceneNode == null) playerPawn.CBodyComponent?.SceneNode == null)
return null; return null;
var rayTrace = RayTraceInterface.Get(); CRayTraceInterface? rayTrace;
try { rayTrace = RayTraceInterface.Get(); }
catch { return null; }
if (rayTrace == null) if (rayTrace == null)
return null; return null;

View file

@ -524,7 +524,7 @@ namespace src.utils
? $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}'>\u202A{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}\u202C</font><br>" ? $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}'>\u202A{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}\u202C</font><br>"
: $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}' color='{skillData.Color}'>\u202A{player.GetSkillName(skillData.Skill)}\u202C</font><br>"; : $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}' color='{skillData.Color}'>\u202A{player.GetSkillName(skillData.Skill)}\u202C</font><br>";
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) string remainingLine = string.IsNullOrWhiteSpace(skill_select_info)
? "" ? ""
: $"<font class='fontSize-{config.WSADMenuSelectInfoLineSize}' color='{config.WSADMenuSelectInfoLineColor}'>{skill_select_info}</font><br>"; : $"<font class='fontSize-{config.WSADMenuSelectInfoLineSize}' color='{config.WSADMenuSelectInfoLineColor}'>{skill_select_info}</font><br>";
@ -585,8 +585,8 @@ namespace src.utils
{ {
if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return;
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager"); var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager");
var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); var ctTeam = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist);
var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); var tTeams = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist);
if (ctTeam == null || tTeams == null) return; if (ctTeam == null || tTeams == null) return;
short ctScore = (short)(winnerTeam == CsTeam.CounterTerrorist ? ctTeam.Score + 1 : ctTeam.Score); short ctScore = (short)(winnerTeam == CsTeam.CounterTerrorist ? ctTeam.Score + 1 : ctTeam.Score);
@ -686,8 +686,8 @@ namespace src.utils
private static void UpdateClientTeamScores(MCCSMatch match) private static void UpdateClientTeamScores(MCCSMatch match)
{ {
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager"); var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager");
var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); var ctTeam = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist);
var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); var tTeams = teams.FirstOrDefault(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist);
if (ctTeam != null && tTeams != null) if (ctTeam != null && tTeams != null)
{ {

View file

@ -18,6 +18,10 @@ namespace src.utils
private static SkillsInfoModel config = LoadSkillsInfo(); private static SkillsInfoModel config = LoadSkillsInfo();
public static SkillsInfoModel LoadedConfig => config; public static SkillsInfoModel LoadedConfig => config;
private static SkillsInfoModel? _indexedConfig;
private static ConcurrentDictionary<string, DefaultSkillInfo> _byName = new();
private static readonly ConcurrentDictionary<(Type Type, string Key), MemberInfo?> _memberCache = new();
public static SkillsInfoModel LoadSkillsInfo() public static SkillsInfoModel LoadSkillsInfo()
{ {
lock (fileLock) lock (fileLock)
@ -84,26 +88,39 @@ namespace src.utils
{ {
if (config == null) return default!; if (config == null) return default!;
var skillConfig = LoadedConfig.FirstOrDefault(s => s.Name == skill.ToString()); EnsureIndex();
if (skillConfig == null) return default!; if (!_byName.TryGetValue(skill.ToString()!, out var skillConfig) || skillConfig == null)
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!; return default!;
var member = _memberCache.GetOrAdd((skillConfig.GetType(), key), k =>
{
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;
});
object? value = member switch
{
PropertyInfo p => p.GetValue(skillConfig),
FieldInfo f => f.GetValue(skillConfig),
_ => null
};
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<string, DefaultSkillInfo>();
foreach (var s in config)
dict[s.Name] = s;
_byName = dict;
_indexedConfig = config;
_memberCache.Clear();
} }
public class SkillsInfoModel : ConcurrentBag<DefaultSkillInfo> public class SkillsInfoModel : ConcurrentBag<DefaultSkillInfo>