diff --git a/jRandomSkills - SRC Files/!jRandomSkills.csproj b/jRandomSkills - SRC Files/!jRandomSkills.csproj index 33a6d61..006dbc6 100644 --- a/jRandomSkills - SRC Files/!jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/!jRandomSkills.csproj @@ -17,7 +17,7 @@ - + diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 2001af9..60a2b4e 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities.Constants; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.menu; using src.player; @@ -51,6 +52,8 @@ namespace src.command { SplitCommands(config.VotingCommands.ShuffleCommand.Alias), ("Shuffle team", Command_Shuffle) }, { SplitCommands(config.VotingCommands.PauseCommand.Alias), ("Pause game", Command_Pause) }, { SplitCommands(config.VotingCommands.SetScoreCommand.Alias), ("Set teams score", Command_SetScore) }, + + { new []{ "show" }, ("Show layout", Command_Show) }, }; foreach (var commandPair in commands) @@ -90,7 +93,7 @@ namespace src.command private static void Command_SetSkill(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setskill {command.ArgString} command."); - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetSkillCommand.Permissions)) return; + if (!string.IsNullOrEmpty(config.NormalCommands.SetSkillCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetSkillCommand.Permissions)) return; var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase))); @@ -177,7 +180,8 @@ namespace src.command private static void Command_SkillsListMenu(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_skills {command.ArgString} command."); - if (player == null || !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SkillsListCommand.Permissions)) return; + if (player == null) return; + if (!string.IsNullOrEmpty(config.NormalCommands.SkillsListCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SkillsListCommand.Permissions)) return; Menu.DisplaySkillsList(player); } @@ -185,12 +189,13 @@ namespace src.command private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_map {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.ChangeMapCommand.Permissions)) - { - if (!config.VotingCommands.ChangeMapCommand.EnableVoting) return; - player.Vote(VoteType.ChangeMap, command.ArgString); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.ChangeMapCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.ChangeMapCommand.Permissions)) + { + if (!config.VotingCommands.ChangeMapCommand.EnableVoting) return; + player.Vote(VoteType.ChangeMap, command.ArgString); + return; + } ChangeMap(command); } @@ -218,12 +223,13 @@ namespace src.command private static void Command_StartGame(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_start {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.StartGameCommand.Permissions)) - { - if (!config.VotingCommands.StartGameCommand.EnableVoting) return; - player.Vote(VoteType.StartGame); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.StartGameCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.StartGameCommand.Permissions)) + { + if (!config.VotingCommands.StartGameCommand.EnableVoting) return; + player.Vote(VoteType.StartGame); + return; + } StartGame(command); } @@ -252,12 +258,13 @@ namespace src.command private static void Command_Swap(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_swap {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.SwapCommand.Permissions)) - { - if (!config.VotingCommands.SwapCommand.EnableVoting) return; - player.Vote(VoteType.SwapTeam); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.SwapCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.SwapCommand.Permissions)) + { + if (!config.VotingCommands.SwapCommand.EnableVoting) return; + player.Vote(VoteType.SwapTeam); + return; + } Swap(); } @@ -273,12 +280,13 @@ namespace src.command private static void Command_Shuffle(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_shuffle {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.ShuffleCommand.Permissions)) - { - if (!config.VotingCommands.ShuffleCommand.EnableVoting) return; - player.Vote(VoteType.ShuffleTeam); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.ShuffleCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.ShuffleCommand.Permissions)) + { + if (!config.VotingCommands.ShuffleCommand.EnableVoting) return; + player.Vote(VoteType.ShuffleTeam); + return; + } Shuffle(); } @@ -299,12 +307,13 @@ namespace src.command private static void Command_Pause(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_pause {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.PauseCommand.Permissions)) - { - if (!config.VotingCommands.PauseCommand.EnableVoting) return; - player.Vote(VoteType.PauseGame); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.PauseCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.PauseCommand.Permissions)) + { + if (!config.VotingCommands.PauseCommand.EnableVoting) return; + player.Vote(VoteType.PauseGame); + return; + } Pause(); } @@ -320,7 +329,7 @@ namespace src.command { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_heal {command.ArgString} command."); if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.HealCommand.Permissions)) return; + if (!string.IsNullOrEmpty(config.NormalCommands.HealCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.HealCommand.Permissions)) return; SkillUtils.AddHealth(player.PlayerPawn.Value, 100); player.PrintToChat($" {ChatColors.Green}{player.GetTranslation("healed")}"); } @@ -330,7 +339,7 @@ namespace src.command { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_hud {command.ArgString} command."); if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.HudCommand.Permissions)) return; + if (!string.IsNullOrEmpty(config.NormalCommands.HudCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.HudCommand.Permissions)) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; @@ -344,12 +353,13 @@ namespace src.command private static void Command_SetScore(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setscore {command.ArgString} command."); - if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.SetScoreCommand.Permissions)) - { - if (!config.VotingCommands.SetScoreCommand.EnableVoting) return; - player.Vote(VoteType.SetScore, command.ArgString); - return; - } + if (player != null && player.IsValid) + if (!string.IsNullOrEmpty(config.VotingCommands.SetScoreCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.VotingCommands.SetScoreCommand.Permissions)) + { + if (!config.VotingCommands.SetScoreCommand.EnableVoting) return; + player.Vote(VoteType.SetScore, command.ArgString); + return; + } SetScore(player, command); } @@ -369,7 +379,8 @@ namespace src.command private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_console {command.ArgString} command."); - if (player == null || !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ConsoleCommand.Permissions)) return; + if (player == null) return; + if (!string.IsNullOrEmpty(config.NormalCommands.ConsoleCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ConsoleCommand.Permissions)) return; string param = command.ArgString; Server.ExecuteCommand(param); } @@ -378,7 +389,7 @@ namespace src.command private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setstaticskill {command.ArgString} command."); - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetStaticSkillCommand.Permissions)) return; + if (!string.IsNullOrEmpty(config.NormalCommands.SetStaticSkillCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetStaticSkillCommand.Permissions)) return; var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase))); @@ -474,7 +485,7 @@ namespace src.command { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_lang {command.ArgString} command."); if (player == null || !player.IsValid) return; - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return; + if (!string.IsNullOrEmpty(config.NormalCommands.ChangeLanguageCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return; string fileName; string newLangCode = command.GetArg(1).ToUpper(); @@ -491,8 +502,8 @@ namespace src.command [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_Reload(CCSPlayerController? player, CommandInfo command) { - Debug.WriteToDebug($"Player {player?.PlayerName} used the css_lang {command.ArgString} command."); - if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ReloadCommand.Permissions)) return; + Debug.WriteToDebug($"Player {player?.PlayerName} used the css_reload {command.ArgString} command."); + if (!string.IsNullOrEmpty(config.NormalCommands.ReloadCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ReloadCommand.Permissions)) return; lock (setLock) { @@ -520,5 +531,24 @@ namespace src.command } } } + + + + + + + + + + + + + + [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + private static void Command_Show(CCSPlayerController? player, CommandInfo command) + { + MemoryFunctionVoid show_layout = new("55 48 89 E5 41 57 41 56 41 55 41 54 53 48 83 EC 58 80 3D ? ? ? ? 00 75 ? 0F 28 05 ? ? ? ? C6 05 ? ? ? ? 01 0F 29 05 ? ? ? ? 80 3D ? ? ? ? 00 75 ? 66 0F EF C0 C6 05 ? ? ? ? 01 0F 29 05 ? ? ? ? 80 3D ? ? ? ? 00 0F 84 ? ? ? ? 80 3D ? ? ? ? 00 75 ? 31 D2 C6 05 ? ? ? ? 01 48 89 15 ? ? ? ? 48 89 15 ? ? ? ? C6 05 ? ? ? ? 00 80 3D ? ? ? ? 00 0F 85 ? ? ? ? C6 05 ? ? ? ? 01 4C 8D 3D ? ? ? ? 49 8D 9F ? ? ? ? 49 C7 47 ? 00 00 00 00 BE 00 04 00 00 4C 89 FF 45 31 F6 41 C7 47 ? 00 00 00 00 41 C7 47 ? 00 00 00 00 41 C7 07 00 00 00 00 E8 ? ? ? ? EB ? ? ? ? ? ? ? ? 74 ? 41 C7 45 00 00 00 00 00 4D 8B 6F ? 4D 01 F5 41 81 65 ? 00 00 00 C0 49 83 C6 18 49 81 FE 00 60 00 00 0F 84 ? ? ? ? 4D 8B 6F ? 4D 01 F5 45 8B 65 00 45 85 E4 79 ? 41 8B 7D ? 85 FF 0F 88 ? ? ? ? 49 8B 45 ? 49 63 D4 44 89 E6 41 C7 45 00 00 00 00 00 48 8D 14 ? F7 DE 48 C1 E2 03 48 01 D0 48 C7 40 ? 00 00 00 00 48 C7 40 ? 00 00 00 00 48 C7 40 ? 00 00 00 00 41 83 FC FF 74 ? 48 83 C2 28 B9 01 00 00 00 66 66 2E 0F 1F 84 ? 00 00 00 00 66 66 2E 0F 1F 84 ? 00 00 00 00 66 0F 1F 44 ? 00 49 8B 45 ? 83 C1 01 48 01 D0 48 83 C2 28 48 C7 40 ? 00 00 00 00 48 C7 40 ? 00 00 00 00 48 C7 40 ? 00 00 00 00 39 CE 7F ? E9 ? ? ? ? ? 41 8B 75 ? 81 FE FF FF FF 3F 76 ? 89 F0 25 00 00 00 C0 3D 00 00 00 80 0F 85 ? ? ? ? 81 E6 FF FF FF 3F 31 D2 B9 28 00 00 00 E8 ? ? ? ? 49 63 55 ? 66 0F EF C9 31 F6 66 0F 6E C0 49 8B 7D ? 66 0F 38 3D C1 66 0F 7E C0 66 0F 7E 45 ? 48 8D 0C ? 48 98 48 8D 14 ? 48 C1 E1 03 48 C1 E2 03 41 81 7D ? FF FF FF 3F 40 0F 96 C6 E8 ? ? ? ? 41 8B 55 ? 66 0F 6E 45 ? 49 89 45 ? 81 FA FF FF FF 3F 76 ? 81 E2 FF FF FF 3F 41 89 55 ? 66 41 0F 7E 45 ? E9 ? ? ? ? ? ? ? 4D 8D 6F ? 31 C0 41 C6 47 ? 01 41 C7 47 ? FF 03 00 00 4C 89 EF 49 C7 47 ? 00 00 00 00 66 41 89 47 ? 41 C6 47 ? 00 49 C7 47 ? 00 00 00 00 E8 ? ? ? ? BE 01 00 00 00 4C 89 EF E8 ? ? ? ? 49 8D 7F ? 4C 89 EE 49 83 C7 68 E8 ? ? ? ? 4C 39 FB 0F 85 ? ? ? ? 48 8D 05 ? ? ? ? 49 89 DF 48 39 C3 0F 85 ? ? ? ? 48 8D 15 ? ? ? ? 31 F6 48 8D 3D ? ? ? ? E8 ? ? ? ? 80 3D ? ? ? ? 00 4C 8D 65"); + show_layout.Invoke(); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 63d659f..22dde63 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -106,6 +106,7 @@ namespace src public Skills SpecialSkill { get; set; } public float? SkillChance { get; set; } public bool IsDrawing { get; set; } + public DateTime SkillHudExpired { get; set; } public DateTime SkillDescriptionHudExpired { get; set; } public string? PrintHTML { get; set; } public bool DisplayHUD { get; set; } diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index cc5c5b6..f9e3b45 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -41,6 +41,9 @@ public interface ISkill public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate _) { } public static void SmokegrenadeExpired(EventSmokegrenadeExpired _) { } + public static void OnTriggerEnter(CBaseTrigger _, CBaseEntity __) { } + public static void OnTriggerExit(CBaseTrigger _, CBaseEntity __) { } + public class SkillConfig { } } diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index b5d95b3..a3f8f1b 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -2,14 +2,15 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; +using src.utils; +using System.Collections.Concurrent; using static CounterStrikeSharp.API.Core.Listeners; using static src.jRandomSkills; -using System.Collections.Concurrent; -using src.utils; namespace src.player { @@ -66,6 +67,9 @@ namespace src.player Instance.HookUserMessage(208, PlayerMakeSound); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); + + VirtualFunctions.CBaseTrigger_StartTouchFunc.Hook(OnTriggerEnter, HookMode.Post); + VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(OnTriggerExit, HookMode.Post); } private static HookResult PlayerMakeSound(UserMessage um) @@ -255,6 +259,34 @@ namespace src.player } } + private static HookResult OnTriggerEnter(DynamicHook hook) + { + lock (setLock) + { + CBaseTrigger trigger = hook.GetParam(0); + CBaseEntity entity = hook.GetParam(1); + + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTriggerEnter", [trigger, entity]); + return HookResult.Continue; + } + } + + private static HookResult OnTriggerExit(DynamicHook hook) + { + lock (setLock) + { + CBaseTrigger trigger = hook.GetParam(0); + CBaseEntity entity = hook.GetParam(1); + + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTriggerExit", [trigger, entity]); + return HookResult.Continue; + } + } + private static void OnTick() { lock (setLock) @@ -461,9 +493,10 @@ namespace src.player lock (setLock) { string? button = Config.LoadedConfig.AlternativeSkillButton; - if (string.IsNullOrEmpty(button)) return; + if (string.IsNullOrEmpty(button) || button.Length < 2) return; + string buttonName = $"{char.ToUpper(button[0])}{button[1..].ToLower()}"; - if (Enum.TryParse(button, out var skillButton)) + if (Enum.TryParse(buttonName, out var skillButton)) { if (pressed != skillButton) return; } @@ -605,6 +638,7 @@ namespace src.player Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); + skillPlayer.SkillHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillHudDuration); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); if (Config.LoadedConfig.TeamMateSkillChatInfo) diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index 7a110fd..579e478 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -49,7 +49,7 @@ namespace src.player { if (player == null) return; var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer == null || !skillPlayer.DisplayHUD) return; + if (skillPlayer == null || !skillPlayer.DisplayHUD || (player.PawnIsAlive && skillPlayer.SkillHudExpired < DateTime.Now)) return; string infoLine = ""; string skillLine = ""; diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 6abc359..98d78d1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -57,7 +57,7 @@ namespace src.player.skills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; playerInfo.SkillUsed = false; - SkillUtils.CreateMenu(player, [(player.GetTranslation("bombsite_a"), "a")], (player.GetTranslation("bombsite_b"), "b")); + SkillUtils.CreateMenu(player, [(player.GetTranslation("bombsite_a"), "a")], (player.GetTranslation("bombsite_b"), "b", true)); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs index 29541ec..18b9ea7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs @@ -62,7 +62,7 @@ namespace src.player.skills ResetMoney(enemy); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("bankrupt_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("bankrupt_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("bankrupt_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index 58899bc..302c459 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -66,8 +66,12 @@ namespace src.player.skills if (player == null) continue; foreach ((var playerId, var itemList) in invisibleEntities) if (player.SteamID != playerId) - foreach (var item in itemList) - info.TransmitEntities.Remove(item); + foreach (var entityIndex in itemList) + { + var entity = Utilities.GetEntityFromIndex((int)entityIndex); + if (entity == null || !entity.IsValid) continue; + info.TransmitEntities.Remove(entity.Index); + } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 8606e49..a939619 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -81,7 +81,7 @@ namespace src.player.skills SetUpPostProcessing(enemy); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("darkness_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("darkness_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("darkness_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index 0767708..e30b61a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -114,7 +114,7 @@ namespace src.player.skills Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", [enemy]); enemyInfo.SpecialSkill = enemyInfo.Skill; enemyInfo.Skill = Skills.None; - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("deactivator_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("deactivator_enemy_info")); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 8fbd079..4107689 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -73,7 +73,7 @@ namespace src.player.skills deafPlayers.TryAdd(enemy, 0); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("deaf_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("deaf_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("deaf_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index 9fff467..2c3f6c2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -86,24 +86,14 @@ namespace src.player.skills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - playerPawn.Teleport(GetEnemySpawnVector(player)); + + var spawnpoint = SkillUtils.GetSpawnPointVector(player, true); + if (spawnpoint == null) return; + playerPawn.Teleport(spawnpoint); } } } - private static Vector GetEnemySpawnVector(CCSPlayerController player) - { - var abs = player!.PlayerPawn!.Value?.AbsOrigin; - var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.CounterTerrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Count != 0) - { - var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; - if (randomSpawn.AbsOrigin != null) - return randomSpawn.AbsOrigin; - } - return abs == null ? new Vector(0, 0, 0) : new Vector(abs.X, abs.Y, abs.Z); - } - public class PlayerSkillInfo { public ulong SteamID { get; set; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs index 51db253..7796fe5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs @@ -41,8 +41,12 @@ namespace src.player.skills return; } - if (skill.Skill == skillName) - TakeMoney(player); + if (skill.Skill == skillName && !TakeMoney(player)) + { + player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("gambler_no_money")); + return; + } + Instance.AddTimer(.1f, () => { playerInfo.Skill = skill.Skill; @@ -60,12 +64,19 @@ namespace src.player.skills }); } - private static void TakeMoney(CCSPlayerController player) + private static bool TakeMoney(CCSPlayerController player) { - if (player == null || !player.IsValid || player.InGameMoneyServices == null) return; - var account = player.InGameMoneyServices.Account; - player.InGameMoneyServices.Account = Math.Max(0, account - SkillsInfo.GetValue(skillName, "refreshPrice")); + if (player == null || !player.IsValid || player.InGameMoneyServices == null) return false; + int account = player.InGameMoneyServices.Account; + int refreshPrice = SkillsInfo.GetValue(skillName, "refreshPrice"); + + int remainingMoney = account - refreshPrice; + if (remainingMoney < 0) + return false; + + player.InGameMoneyServices.Account = remainingMoney; Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); + return true; } public static void EnableSkill(CCSPlayerController player) @@ -81,7 +92,7 @@ namespace src.player.skills ConcurrentBag<(string, string)> menuItems = [(player.GetSkillName(firstSkill.Skill), firstSkill.Skill.ToString()), (player.GetSkillName(secondSkill.Skill), secondSkill.Skill.ToString())]; - SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue(skillName, "refreshPrice")), skillName.ToString())); + SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue(skillName, "refreshPrice")), skillName.ToString(), false)); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 4bf17bb..e19d353 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -70,8 +70,12 @@ namespace src.player.skills if (player == null) continue; foreach ((var playerId, var itemList) in invisibleEntities) if (player.SteamID != playerId) - foreach (var item in itemList) - info.TransmitEntities.Remove(item); + foreach (var entityIndex in itemList) + { + var entity = Utilities.GetEntityFromIndex((int)entityIndex); + if (entity == null || !entity.IsValid) continue; + info.TransmitEntities.Remove(entity.Index); + } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index d024bec..7580016 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -47,8 +47,12 @@ namespace src.player.skills var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; - foreach (var smoke in smokes.Keys) - info.TransmitEntities.Remove(smoke); + foreach (var entityIndex in smokes.Keys) + { + var entity = Utilities.GetEntityFromIndex((int)entityIndex); + if (entity == null || !entity.IsValid) continue; + info.TransmitEntities.Remove(entity.Index); + } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index d37ef7a..4d22d1e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -76,7 +76,7 @@ namespace src.player.skills enemy.ReplicateConVar("sv_disable_radar", "1"); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("glitch_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("glitch_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("glitch_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index ade14c5..f4dcffb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -46,10 +46,15 @@ namespace src.player.skills var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); foreach (var beam in beams) + { + var entity = Utilities.GetEntityFromIndex((int)beam.Index); + if (entity == null || !entity.IsValid) continue; + if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) - info.TransmitEntities.Remove(beam); + info.TransmitEntities.Remove(entity.Index); else if (enemy.Team == player.Team) - info.TransmitEntities.Remove(beam); + info.TransmitEntities.Remove(beam.Index); + } } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 49c8589..01f7a64 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -71,7 +71,7 @@ namespace src.player.skills SetCrosshair(enemy, false); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jammer_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("jammer_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("jammer_enemy_info")); } private static void SetCrosshair(CCSPlayerController player, bool enabled) diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 56eaefd..252e8f5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -81,7 +81,7 @@ namespace src.player.skills bannedPlayers.AddOrUpdate(enemy.PlayerPawn.Value, 0, (k, v) => 0); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jumpban_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("jumpban_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("jumpban_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index f00adfb..13ac9cb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -62,7 +62,7 @@ namespace src.player.skills SwapHealth(player, enemy); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("lifeswap_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("lifeswap_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("lifeswap_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index 0fca573..6825079 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -77,7 +77,7 @@ namespace src.player.skills playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("magnifier_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("magnifier_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("magnifier_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index a084538..2cf786f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -62,7 +62,7 @@ namespace src.player.skills SwapMoney(player, enemy); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("moneyswap_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("moneyswap_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("moneyswap_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 313f136..a8aef47 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -54,8 +54,12 @@ namespace src.player.skills if (player == null) continue; foreach ((var playerId, var itemList) in invisibleEntities) if (player.SteamID != playerId) - foreach (var item in itemList) - info.TransmitEntities.Remove(item); + foreach (var entityIndex in itemList) + { + var entity = Utilities.GetEntityFromIndex((int)entityIndex); + if (entity == null || !entity.IsValid) continue; + info.TransmitEntities.Remove(entity.Index); + } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 3f70751..3f293df 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -74,7 +74,7 @@ namespace src.player.skills poisonedPlayers.TryAdd(enemy, 0); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("poison_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("poison_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("poison_enemy_info")); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index ee75d11..ba2162f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -83,7 +83,7 @@ namespace src.player.skills CheckWeapon(enemy); playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("primaryban_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("primaryban_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("primaryban_enemy_info")); } private static void CheckWeapon(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index b69140c..eff0641 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -84,22 +84,14 @@ namespace src.player.skills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - playerPawn.Teleport(GetSpawnVector(player)); + + var spawnpoint = SkillUtils.GetSpawnPointVector(player); + if (spawnpoint == null) return; + playerPawn.Teleport(spawnpoint); } } } - private static Vector? GetSpawnVector(CCSPlayerController player) - { - var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Count != 0) - { - var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; - return randomSpawn.AbsOrigin; - } - return null; - } - public class PlayerSkillInfo { public ulong SteamID { get; set; } diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs index c27b34c..6df82f4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -35,9 +35,10 @@ namespace src.player.skills if (playersToSender.ContainsKey(victim!.Handle)) return; - var spawn = GetSpawnVector(victim); - if (spawn == null) return; - victim!.PlayerPawn!.Value!.Teleport(spawn); + var spawnpoint = SkillUtils.GetSpawnPointVector(victim); + if (spawnpoint == null) return; + + victim!.PlayerPawn!.Value!.Teleport(spawnpoint); playersToSender.TryAdd(victim.Handle, 0); } @@ -46,17 +47,6 @@ namespace src.player.skills playersToSender.TryRemove(player.Handle, out _); } - private static Vector? GetSpawnVector(CCSPlayerController player) - { - var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Count != 0) - { - var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; - return randomSpawn.AbsOrigin; - } - return null; - } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a68132", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) { } diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index 4a3f9fa..e88096b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -40,9 +40,10 @@ namespace src.player.skills { secondLifePlayers.TryAdd(victim.Handle, 0); SetHealth(victim, SkillsInfo.GetValue(skillName, "startHealth")); - var spawn = GetSpawnVector(victim); - if (spawn != null) - victimPawn.Teleport(spawn, victimPawn.AbsRotation, null); + + var spawnpoint = SkillUtils.GetSpawnPointVector(victim); + if (spawnpoint == null) return; + victimPawn.Teleport(spawnpoint, victimPawn.AbsRotation, null); } } @@ -70,21 +71,6 @@ namespace src.player.skills Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_ArmorValue"); } - private static Vector? GetSpawnVector(CCSPlayerController player) - { - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return null; - - var abs = pawn.AbsOrigin; - var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Count != 0) - { - var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; - return randomSpawn.AbsOrigin; - } - return abs == null ? null : new Vector(abs.X, abs.Y, abs.Z); - } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d41c1c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, int startHealth = 50) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) { public int StartHealth { get; set; } = startHealth; diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index 6b50822..987c462 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -102,7 +102,11 @@ namespace src.player.skills { foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team)) if (enemy != null && enemy.IsValid && enemy.PawnIsAlive && enemy.PlayerPawn.Value != null && enemy.PlayerPawn.Value.IsValid) - enemy.PlayerPawn.Value.EmitSound($"C4.PlantSoundB", volume: 1f); + enemy.PlayerPawn.Value.EmitSound( + enemy.Team == CsTeam.CounterTerrorist + ? SkillsInfo.GetValue(skillName, "CTSoundEvent") + : SkillsInfo.GetValue(skillName, "TSoundEvent") + , volume: 1f); } public class PlayerSkillInfo @@ -112,9 +116,11 @@ namespace src.player.skills public DateTime Cooldown { get; set; } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float cooldown = 5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float cooldown = 5f, string ctSoundEvent = "c4.disarmstart", string tSoundEvent = "C4.PlantSoundB") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) { public float Cooldown { get; set; } = cooldown; + public string CTSoundEvent { get; set; } = ctSoundEvent; + public string TSoundEvent { get; set; } = tSoundEvent; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index 697d4f0..6f01023 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -152,7 +152,7 @@ namespace src.player.skills Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [enemy]); enemyInfo.SpecialSkill = enemySkill; enemyInfo.Skill = Skills.None; - enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("thief_enemy_info")); + enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("thief_enemy_info")); }); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 58dceae..91fcc07 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -1,9 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; +using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; +using System.Reflection.Metadata; using static src.jRandomSkills; namespace src.player.skills @@ -11,7 +13,10 @@ namespace src.player.skills public class ToxicSmoke : ISkill { private const Skills skillName = Skills.ToxicSmoke; - private static readonly ConcurrentDictionary smokes = []; + private static readonly ConcurrentDictionary players = []; + private static readonly ConcurrentDictionary triggers = []; + + private const string triggerName = "toxic_smoke"; public static void LoadSkill() { @@ -20,7 +25,8 @@ namespace src.player.skills public static void NewRound() { - smokes.Clear(); + players.Clear(); + triggers.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -28,6 +34,28 @@ namespace src.player.skills SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } + public static void OnTriggerEnter(CBaseTrigger trigger, CBaseEntity entity) + { + if (!trigger.Globalname.StartsWith(triggerName) || entity.DesignerName != "player") return; + + CCSPlayerPawn playerPawn = new(entity.Handle); + if (playerPawn == null || playerPawn.Controller?.Value == null)return; + CCSPlayerController player = playerPawn.Controller.Value.As(); + if (player == null) return; + + players.TryAdd(player, 0); + Server.PrintToChatAll($"Enter: {player?.PlayerName}"); + } + + public static void OnTriggerExit(CBaseTrigger trigger, CBaseEntity entity) + { + if (!trigger.Globalname.StartsWith(triggerName) || entity.DesignerName != "player") return; + var player = entity.As(); + if (player == null) return; + players.TryRemove(player, out _); + Server.PrintToChatAll($"Exit: {player?.PlayerName}"); + } + public static void OnEntitySpawned(CEntityInstance entity) { var name = entity.DesignerName; @@ -60,7 +88,14 @@ namespace src.player.skills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); + + var trigger = SkillUtils.CreateTrigger(triggerName, SkillsInfo.GetValue(skillName, "smokeRadius"), new Vector(@event.X, @event.Y, @event.Z)); + if (trigger == null) return; + triggers.TryAdd(trigger, 0); + + new VirtualFunctionVoid(trigger.Handle, 153); + + } public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) @@ -69,8 +104,12 @@ namespace src.player.skills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) - smokes.TryRemove(smoke, out _); + + foreach (var trigger in triggers.Keys.Where(t => t.AbsOrigin?.X == @event.X && t.AbsOrigin?.Y == @event.Y && t.AbsOrigin?.Z == @event.Z)) + { + triggers.TryRemove(trigger, out _); + trigger.AcceptInput("Kill"); + } } private static void AddHealth(CCSPlayerPawn player, int health) @@ -88,13 +127,12 @@ namespace src.player.skills public static void OnTick() { - foreach (Vector smokePos in smokes.Keys) - foreach (var player in Utilities.GetPlayers()) - if (Server.TickCount % 17 == 0) - if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) - if (player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE && player.PlayerPawn.Value.AbsOrigin != null) - if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue(skillName, "smokeRadius")) - AddHealth(player.PlayerPawn.Value, -SkillsInfo.GetValue(skillName, "smokeDamage")); + if (Server.TickCount % 17 != 0) return; + foreach (var player in players.Keys) + { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || !player.PawnIsAlive) return; + AddHealth(player.PlayerPawn.Value, -SkillsInfo.GetValue(skillName, "smokeDamage")); + } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, int smokeDamage = 2, float smokeRadius = 180) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index ce6892c..ba972fc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -35,8 +35,14 @@ namespace src.player.skills if (glow.Item3 != player.Team && (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName))) continue; - info.TransmitEntities.Remove(glow.Item1); - info.TransmitEntities.Remove(glow.Item2); + var glowEntity1 = Utilities.GetEntityFromIndex((int)glow.Item1.Index); + if (glowEntity1 == null || !glowEntity1.IsValid) continue; + + var glowEntity2 = Utilities.GetEntityFromIndex((int)glow.Item2.Index); + if (glowEntity2 == null || !glowEntity2.IsValid) continue; + + info.TransmitEntities.Remove(glowEntity1.Index); + info.TransmitEntities.Remove(glowEntity2.Index); } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index 6ed3a68..89605ab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -50,10 +50,12 @@ namespace src.player.skills var roundTime = SkillsInfo.GetValue(skillName, "changeRoundTime"); Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime; + if (player.Team == CsTeam.Terrorist) Localization.PrintTranslationToChatAll($" {ChatColors.Orange}{{0}}", ["watchmaker_tt"], [roundTime]); else Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]); + player.EmitSound(SkillsInfo.GetValue(skillName, "SoundEvent")); } public static void OnTick() @@ -80,9 +82,10 @@ namespace src.player.skills playerInfo.PrintHTML = SkillUtils.SecondsToTimer(seconds); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, int changeRoundTime = 10) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, int changeRoundTime = 10, string soundEvent = "UIPanorama.sidemenu_select") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) { public int ChangeRoundTime { get; set; } = changeRoundTime; + public string SoundEvent { get; set; } = soundEvent; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index ea4d5f5..e169fa1 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -77,6 +77,7 @@ namespace src.utils public bool DebugMode { get; set; } public string? AlternativeSkillButton { get; set; } public float SkillTimeBeforeStart { get; set; } + public float SkillHudDuration { get; set; } public float SkillDescriptionDuration { get; set; } public bool DisplayAlwaysDescription { get; set; } public bool DisableSpectateHUD { get; set; } @@ -99,6 +100,7 @@ namespace src.utils DebugMode = true; AlternativeSkillButton = null; SkillTimeBeforeStart = 7; + SkillHudDuration = 999; SkillDescriptionDuration = 7; DisplayAlwaysDescription = false; FlashingHtmlHudFix = true; diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index 11818d9..d6030bd 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -192,7 +192,7 @@ namespace src.utils var data = reader.Find>(ip); if (data == null || data.IsEmpty) return null; - if (data.TryGetValue("country", out var _country) && _country is ConcurrentDictionary country) + if (data.TryGetValue("country", out var _country) && _country is Dictionary country) if (country.TryGetValue("iso_code", out var _isoCode) && _isoCode is string isoCode) { string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode; diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 52690c8..5a0d006 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -81,11 +81,25 @@ namespace src.utils if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid || playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; - if (scale <= 0) return; + var skeleton = playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance(); + if (scale <= 0 || skeleton == null) return; - playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = scale; - Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); - Server.NextFrame(() => playerPawn.AcceptInput("SetScale", null, null, scale.ToString())); + skeleton.Scale = scale; + playerPawn.AcceptInput("SetScale", null, null, scale.ToString()); + Server.NextFrame(() => Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent")); + } + + public static Vector? GetSpawnPointVector(CCSPlayerController player, bool enemySpawn = false) + { + var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist && !enemySpawn + ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); + if (spawns.Count != 0) + { + var randomSpawn = spawns[jRandomSkills.Instance.Random.Next(spawns.Count)]; + if (randomSpawn != null && randomSpawn.IsValid && randomSpawn.AbsOrigin != null) + return randomSpawn.AbsOrigin; + } + return null; } public static void CreateHEGrenadeProjectile(Vector pos, QAngle angle, Vector vel, int teamNum) @@ -124,6 +138,38 @@ namespace src.utils playerInfo.PrintHTML = null; } + public static CTriggerMultiple? CreateTrigger(string name, float radius, Vector pos) + { + if (pos == null) return null; + + var trigger = Utilities.CreateEntityByName("trigger_multiple"); + if (trigger == null || trigger.AbsOrigin == null) return null; + + trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE; + trigger.Collision.SolidFlags = 0; + trigger.Spawnflags = 1; + trigger.Globalname = $"{name}_{trigger.Index}"; + trigger.Collision.SolidFlags = 1; + + trigger.AbsOrigin.X = pos.X; + trigger.AbsOrigin.Y = pos.Y; + trigger.AbsOrigin.Z = pos.Z; + + trigger.Collision.CapsuleRadius = radius; + trigger.Collision.BoundingRadius = radius; + + trigger.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_TRIGGER; + trigger.Collision.EnablePhysics = 1; + trigger.Collision.TriggerBloat = 0; + + trigger.Collision.SurroundType = SurroundingBoundsType_t.USE_OBB_COLLISION_BOUNDS; + trigger.Collision.CollisionAttribute.CollisionFunctionMask = 39; + trigger.Collision.CollisionAttribute.CollisionGroup = 2; + + trigger.DispatchSpawn(); + return trigger; + } + public static void AddHealth(CCSPlayerPawn? pawn, int extraHealth, int maxHealth = 100) { if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) @@ -197,7 +243,7 @@ namespace src.utils manager.UpdateActiveMenu(player, list); } - public static void CreateMenu(CCSPlayerController? player, ConcurrentBag<(string, string)> enemies, (string, string)? lastElement = null) + public static void CreateMenu(CCSPlayerController? player, ConcurrentBag<(string, string)> enemies, (string, string, bool)? lastElement = null) { if (player == null || !player.IsValid) return; @@ -246,7 +292,8 @@ namespace src.utils menu.Add(lastElement.Value.Item1, (p, option) => { jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { lastElement.Value.Item2 }]); - manager.CloseMenu(p); + if (lastElement.Value.Item3) + manager.CloseMenu(p); }); manager.OpenMainMenu(player, menu); }