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
<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>
<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
<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>
<summary><b>v1.2.2.b3</b></summary>

View file

@ -12,9 +12,6 @@
<ItemGroup>
<Compile 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>
@ -53,7 +50,7 @@
<PropertyGroup>
<SourceLangDir>$(MSBuildProjectDirectory)\src\lang</SourceLangDir>
<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>
<SourceGamedataDir>$(MSBuildProjectDirectory)\src\gamedata</SourceGamedataDir>
<ServerGamedataDir>$(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\gamedata</ServerGamedataDir>

View file

@ -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);
}

View file

@ -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,12 +78,16 @@ 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}";
var method = _skillMethodCache.GetOrAdd((skill, methodName), key =>
{
string className = $"src.player.skills.{key.Skill}";
Type? type = Type.GetType(className)
?? Assembly.GetExecutingAssembly().GetType(className)
@ -96,25 +100,16 @@ namespace src
})
.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}");
return null;
}
internal void RegisterListener<T>(Action onTick, HookMode pre)
{
throw new NotImplementedException();
}
return type.GetMethod(key.Method, BindingFlags.Static | BindingFlags.Public);
});
internal void RegisterListener<T>(Action<object, object> value, HookMode pre)
{
throw new NotImplementedException();
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

View file

@ -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:",

View file

@ -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<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)
{
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<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(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<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(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;
}
}
@ -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,
@ -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,15 +643,13 @@ 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>(CheckTransmit);
Fortnite.skillInThisRound = false;
EntityManager.DestroyAllTracked();
foreach (var skill in SkillData.Skills)
Instance.SkillAction(skill.Skill.ToString(), "NewRound");
playersSkills.Clear();
staticSkills.Clear();
@ -759,7 +657,10 @@ namespace src.player
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);
@ -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<PlayerButtons>(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;
}
}
@ -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);
}
}

View file

@ -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));
}
}
}

View file

@ -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 _);
}

View file

@ -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));

View file

@ -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 _);
}

View file

@ -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));

View file

@ -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 _);
}

View file

@ -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;

View file

@ -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));

View file

@ -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));

View file

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

View file

@ -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; }

View file

@ -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<ConcurrentDictionary<string, string>>(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;
}

View file

@ -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;

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}' 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)
? ""
: $"<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;
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("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<CCSTeam>("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)
{

View file

@ -18,6 +18,10 @@ namespace src.utils
private static SkillsInfoModel config = LoadSkillsInfo();
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()
{
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!;
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));
}
EnsureIndex();
if (!_byName.TryGetValue(skill.ToString()!, out var skillConfig) || skillConfig == null)
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>