Refactor skill spawn logic and HUD expiration, Gambler fix, Auto Lang System fix

This commit is contained in:
Juzlus 2025-10-22 01:57:47 +02:00
parent 4c333f5d15
commit 4b2bff91b1
37 changed files with 324 additions and 164 deletions

View file

@ -17,7 +17,7 @@
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.342" /> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.342" />
<PackageReference Include="CS2TraceRay" Version="1.0.8" /> <PackageReference Include="CS2TraceRay" Version="1.0.8" />
<PackageReference Include="MaxMind.Db" Version="4.2.0" /> <PackageReference Include="MaxMind.Db" Version="4.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -3,6 +3,7 @@ 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.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.menu; using src.menu;
using src.player; using src.player;
@ -51,6 +52,8 @@ namespace src.command
{ SplitCommands(config.VotingCommands.ShuffleCommand.Alias), ("Shuffle team", Command_Shuffle) }, { SplitCommands(config.VotingCommands.ShuffleCommand.Alias), ("Shuffle team", Command_Shuffle) },
{ SplitCommands(config.VotingCommands.PauseCommand.Alias), ("Pause game", Command_Pause) }, { SplitCommands(config.VotingCommands.PauseCommand.Alias), ("Pause game", Command_Pause) },
{ SplitCommands(config.VotingCommands.SetScoreCommand.Alias), ("Set teams score", Command_SetScore) }, { SplitCommands(config.VotingCommands.SetScoreCommand.Alias), ("Set teams score", Command_SetScore) },
{ new []{ "show" }, ("Show layout", Command_Show) },
}; };
foreach (var commandPair in commands) foreach (var commandPair in commands)
@ -90,7 +93,7 @@ namespace src.command
private static void Command_SetSkill(CCSPlayerController? player, CommandInfo command) private static void Command_SetSkill(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setskill {command.ArgString} 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 var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)
|| p.PlayerName.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) private static void Command_SkillsListMenu(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_skills {command.ArgString} 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); Menu.DisplaySkillsList(player);
} }
@ -185,12 +189,13 @@ namespace src.command
private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command) private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_map {command.ArgString} 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 (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); if (!config.VotingCommands.ChangeMapCommand.EnableVoting) return;
return; player.Vote(VoteType.ChangeMap, command.ArgString);
} return;
}
ChangeMap(command); ChangeMap(command);
} }
@ -218,12 +223,13 @@ namespace src.command
private static void Command_StartGame(CCSPlayerController? player, CommandInfo command) private static void Command_StartGame(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_start {command.ArgString} 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 (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); if (!config.VotingCommands.StartGameCommand.EnableVoting) return;
return; player.Vote(VoteType.StartGame);
} return;
}
StartGame(command); StartGame(command);
} }
@ -252,12 +258,13 @@ namespace src.command
private static void Command_Swap(CCSPlayerController? player, CommandInfo command) private static void Command_Swap(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_swap {command.ArgString} 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 (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); if (!config.VotingCommands.SwapCommand.EnableVoting) return;
return; player.Vote(VoteType.SwapTeam);
} return;
}
Swap(); Swap();
} }
@ -273,12 +280,13 @@ namespace src.command
private static void Command_Shuffle(CCSPlayerController? player, CommandInfo command) private static void Command_Shuffle(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_shuffle {command.ArgString} 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 (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); if (!config.VotingCommands.ShuffleCommand.EnableVoting) return;
return; player.Vote(VoteType.ShuffleTeam);
} return;
}
Shuffle(); Shuffle();
} }
@ -299,12 +307,13 @@ namespace src.command
private static void Command_Pause(CCSPlayerController? player, CommandInfo command) private static void Command_Pause(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_pause {command.ArgString} 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 (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); if (!config.VotingCommands.PauseCommand.EnableVoting) return;
return; player.Vote(VoteType.PauseGame);
} return;
}
Pause(); Pause();
} }
@ -320,7 +329,7 @@ namespace src.command
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_heal {command.ArgString} 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 (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); SkillUtils.AddHealth(player.PlayerPawn.Value, 100);
player.PrintToChat($" {ChatColors.Green}{player.GetTranslation("healed")}"); 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."); 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 (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); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
@ -344,12 +353,13 @@ namespace src.command
private static void Command_SetScore(CCSPlayerController? player, CommandInfo command) private static void Command_SetScore(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setscore {command.ArgString} 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 (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); if (!config.VotingCommands.SetScoreCommand.EnableVoting) return;
return; player.Vote(VoteType.SetScore, command.ArgString);
} return;
}
SetScore(player, command); SetScore(player, command);
} }
@ -369,7 +379,8 @@ namespace src.command
private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command) private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_console {command.ArgString} 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; string param = command.ArgString;
Server.ExecuteCommand(param); Server.ExecuteCommand(param);
} }
@ -378,7 +389,7 @@ namespace src.command
private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command) private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setstaticskill {command.ArgString} 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 var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)
|| p.PlayerName.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."); Debug.WriteToDebug($"Player {player?.PlayerName} used the css_lang {command.ArgString} command.");
if (player == null || !player.IsValid) return; 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 fileName;
string newLangCode = command.GetArg(1).ToUpper(); string newLangCode = command.GetArg(1).ToUpper();
@ -491,8 +502,8 @@ namespace src.command
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
private static void Command_Reload(CCSPlayerController? player, CommandInfo command) private static void Command_Reload(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerName} used the css_lang {command.ArgString} command."); Debug.WriteToDebug($"Player {player?.PlayerName} used the css_reload {command.ArgString} command.");
if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ReloadCommand.Permissions)) return; if (!string.IsNullOrEmpty(config.NormalCommands.ReloadCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ReloadCommand.Permissions)) return;
lock (setLock) 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();
}
} }
} }

View file

@ -106,6 +106,7 @@ namespace src
public Skills SpecialSkill { get; set; } public Skills SpecialSkill { get; set; }
public float? SkillChance { get; set; } public float? SkillChance { get; set; }
public bool IsDrawing { get; set; } public bool IsDrawing { get; set; }
public DateTime SkillHudExpired { get; set; }
public DateTime SkillDescriptionHudExpired { get; set; } public DateTime SkillDescriptionHudExpired { get; set; }
public string? PrintHTML { get; set; } public string? PrintHTML { get; set; }
public bool DisplayHUD { get; set; } public bool DisplayHUD { get; set; }

View file

@ -41,6 +41,9 @@ public interface ISkill
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate _) { } public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate _) { }
public static void SmokegrenadeExpired(EventSmokegrenadeExpired _) { } public static void SmokegrenadeExpired(EventSmokegrenadeExpired _) { }
public static void OnTriggerEnter(CBaseTrigger _, CBaseEntity __) { }
public static void OnTriggerExit(CBaseTrigger _, CBaseEntity __) { }
public class SkillConfig { } public class SkillConfig { }
} }

View file

@ -2,14 +2,15 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static src.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent;
using src.utils;
namespace src.player namespace src.player
{ {
@ -66,6 +67,9 @@ namespace src.player
Instance.HookUserMessage(208, PlayerMakeSound); Instance.HookUserMessage(208, PlayerMakeSound);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); 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) 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<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(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<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(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() private static void OnTick()
{ {
lock (setLock) lock (setLock)
@ -461,9 +493,10 @@ namespace src.player
lock (setLock) lock (setLock)
{ {
string? button = Config.LoadedConfig.AlternativeSkillButton; 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<PlayerButtons>(button, out var skillButton)) if (Enum.TryParse<PlayerButtons>(buttonName, out var skillButton))
{ {
if (pressed != skillButton) return; if (pressed != skillButton) return;
} }
@ -605,6 +638,7 @@ namespace src.player
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]);
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); 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); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration);
if (Config.LoadedConfig.TeamMateSkillChatInfo) if (Config.LoadedConfig.TeamMateSkillChatInfo)

View file

@ -49,7 +49,7 @@ namespace src.player
{ {
if (player == null) return; if (player == null) return;
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); 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 infoLine = "";
string skillLine = ""; string skillLine = "";

View file

@ -57,7 +57,7 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillUsed = false; 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) public static void DisableSkill(CCSPlayerController player)

View file

@ -62,7 +62,7 @@ namespace src.player.skills
ResetMoney(enemy); ResetMoney(enemy);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("bankrupt_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -66,8 +66,12 @@ namespace src.player.skills
if (player == null) continue; if (player == null) continue;
foreach ((var playerId, var itemList) in invisibleEntities) foreach ((var playerId, var itemList) in invisibleEntities)
if (player.SteamID != playerId) if (player.SteamID != playerId)
foreach (var item in itemList) foreach (var entityIndex in itemList)
info.TransmitEntities.Remove(item); {
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)entityIndex);
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
}
} }
} }

View file

@ -81,7 +81,7 @@ namespace src.player.skills
SetUpPostProcessing(enemy); SetUpPostProcessing(enemy);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("darkness_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -114,7 +114,7 @@ namespace src.player.skills
Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", [enemy]); Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", [enemy]);
enemyInfo.SpecialSkill = enemyInfo.Skill; enemyInfo.SpecialSkill = enemyInfo.Skill;
enemyInfo.Skill = Skills.None; enemyInfo.Skill = Skills.None;
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("deactivator_enemy_info")); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("deactivator_enemy_info"));
} }
} }

View file

@ -73,7 +73,7 @@ namespace src.player.skills
deafPlayers.TryAdd(enemy, 0); deafPlayers.TryAdd(enemy, 0);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("deaf_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -86,24 +86,14 @@ namespace src.player.skills
{ {
skillInfo.CanUse = false; skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now; 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<SpawnPoint>(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 class PlayerSkillInfo
{ {
public ulong SteamID { get; set; } public ulong SteamID { get; set; }

View file

@ -41,8 +41,12 @@ namespace src.player.skills
return; return;
} }
if (skill.Skill == skillName) if (skill.Skill == skillName && !TakeMoney(player))
TakeMoney(player); {
player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("gambler_no_money"));
return;
}
Instance.AddTimer(.1f, () => Instance.AddTimer(.1f, () =>
{ {
playerInfo.Skill = skill.Skill; 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; if (player == null || !player.IsValid || player.InGameMoneyServices == null) return false;
var account = player.InGameMoneyServices.Account; int account = player.InGameMoneyServices.Account;
player.InGameMoneyServices.Account = Math.Max(0, account - SkillsInfo.GetValue<int>(skillName, "refreshPrice")); int refreshPrice = SkillsInfo.GetValue<int>(skillName, "refreshPrice");
int remainingMoney = account - refreshPrice;
if (remainingMoney < 0)
return false;
player.InGameMoneyServices.Account = remainingMoney;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
return true;
} }
public static void EnableSkill(CCSPlayerController player) 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()), ConcurrentBag<(string, string)> menuItems = [(player.GetSkillName(firstSkill.Skill), firstSkill.Skill.ToString()),
(player.GetSkillName(secondSkill.Skill), secondSkill.Skill.ToString())]; (player.GetSkillName(secondSkill.Skill), secondSkill.Skill.ToString())];
SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue<int>(skillName, "refreshPrice")), skillName.ToString())); SkillUtils.CreateMenu(player, menuItems, (player.GetTranslation("gambler_more", SkillsInfo.GetValue<int>(skillName, "refreshPrice")), skillName.ToString(), false));
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -70,8 +70,12 @@ namespace src.player.skills
if (player == null) continue; if (player == null) continue;
foreach ((var playerId, var itemList) in invisibleEntities) foreach ((var playerId, var itemList) in invisibleEntities)
if (player.SteamID != playerId) if (player.SteamID != playerId)
foreach (var item in itemList) foreach (var entityIndex in itemList)
info.TransmitEntities.Remove(item); {
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)entityIndex);
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
}
} }
} }

View file

@ -47,8 +47,12 @@ namespace src.player.skills
var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID);
if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue;
foreach (var smoke in smokes.Keys) foreach (var entityIndex in smokes.Keys)
info.TransmitEntities.Remove(smoke); {
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)entityIndex);
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
}
} }
} }

View file

@ -76,7 +76,7 @@ namespace src.player.skills
enemy.ReplicateConVar("sv_disable_radar", "1"); enemy.ReplicateConVar("sv_disable_radar", "1");
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("glitch_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -46,10 +46,15 @@ namespace src.player.skills
var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID);
foreach (var beam in beams) foreach (var beam in beams)
{
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)beam.Index);
if (entity == null || !entity.IsValid) continue;
if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName)
info.TransmitEntities.Remove(beam); info.TransmitEntities.Remove(entity.Index);
else if (enemy.Team == player.Team) else if (enemy.Team == player.Team)
info.TransmitEntities.Remove(beam); info.TransmitEntities.Remove(beam.Index);
}
} }
} }
} }

View file

@ -71,7 +71,7 @@ namespace src.player.skills
SetCrosshair(enemy, false); SetCrosshair(enemy, false);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jammer_player_info", enemy.PlayerName)); 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) private static void SetCrosshair(CCSPlayerController player, bool enabled)

View file

@ -81,7 +81,7 @@ namespace src.player.skills
bannedPlayers.AddOrUpdate(enemy.PlayerPawn.Value, 0, (k, v) => 0); bannedPlayers.AddOrUpdate(enemy.PlayerPawn.Value, 0, (k, v) => 0);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jumpban_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -62,7 +62,7 @@ namespace src.player.skills
SwapHealth(player, enemy); SwapHealth(player, enemy);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("lifeswap_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -77,7 +77,7 @@ namespace src.player.skills
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("magnifier_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -62,7 +62,7 @@ namespace src.player.skills
SwapMoney(player, enemy); SwapMoney(player, enemy);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("moneyswap_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -54,8 +54,12 @@ namespace src.player.skills
if (player == null) continue; if (player == null) continue;
foreach ((var playerId, var itemList) in invisibleEntities) foreach ((var playerId, var itemList) in invisibleEntities)
if (player.SteamID != playerId) if (player.SteamID != playerId)
foreach (var item in itemList) foreach (var entityIndex in itemList)
info.TransmitEntities.Remove(item); {
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)entityIndex);
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
}
} }
} }

View file

@ -74,7 +74,7 @@ namespace src.player.skills
poisonedPlayers.TryAdd(enemy, 0); poisonedPlayers.TryAdd(enemy, 0);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("poison_player_info", enemy.PlayerName)); 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) public static void EnableSkill(CCSPlayerController player)

View file

@ -83,7 +83,7 @@ namespace src.player.skills
CheckWeapon(enemy); CheckWeapon(enemy);
playerInfo.SkillUsed = true; playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("primaryban_player_info", enemy.PlayerName)); 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) private static void CheckWeapon(CCSPlayerController player)

View file

@ -84,22 +84,14 @@ namespace src.player.skills
{ {
skillInfo.CanUse = false; skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now; 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<SpawnPoint>(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 class PlayerSkillInfo
{ {
public ulong SteamID { get; set; } public ulong SteamID { get; set; }

View file

@ -35,9 +35,10 @@ namespace src.player.skills
if (playersToSender.ContainsKey(victim!.Handle)) if (playersToSender.ContainsKey(victim!.Handle))
return; return;
var spawn = GetSpawnVector(victim); var spawnpoint = SkillUtils.GetSpawnPointVector(victim);
if (spawn == null) return; if (spawnpoint == null) return;
victim!.PlayerPawn!.Value!.Teleport(spawn);
victim!.PlayerPawn!.Value!.Teleport(spawnpoint);
playersToSender.TryAdd(victim.Handle, 0); playersToSender.TryAdd(victim.Handle, 0);
} }
@ -46,17 +47,6 @@ namespace src.player.skills
playersToSender.TryRemove(player.Handle, out _); playersToSender.TryRemove(player.Handle, out _);
} }
private static Vector? GetSpawnVector(CCSPlayerController player)
{
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(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) 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)
{ {
} }

View file

@ -40,9 +40,10 @@ namespace src.player.skills
{ {
secondLifePlayers.TryAdd(victim.Handle, 0); secondLifePlayers.TryAdd(victim.Handle, 0);
SetHealth(victim, SkillsInfo.GetValue<int>(skillName, "startHealth")); SetHealth(victim, SkillsInfo.GetValue<int>(skillName, "startHealth"));
var spawn = GetSpawnVector(victim);
if (spawn != null) var spawnpoint = SkillUtils.GetSpawnPointVector(victim);
victimPawn.Teleport(spawn, victimPawn.AbsRotation, null); if (spawnpoint == null) return;
victimPawn.Teleport(spawnpoint, victimPawn.AbsRotation, null);
} }
} }
@ -70,21 +71,6 @@ namespace src.player.skills
Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_ArmorValue"); 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<SpawnPoint>(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 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; public int StartHealth { get; set; } = startHealth;

View file

@ -102,7 +102,11 @@ namespace src.player.skills
{ {
foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team)) 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) 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<string>(skillName, "CTSoundEvent")
: SkillsInfo.GetValue<string>(skillName, "TSoundEvent")
, volume: 1f);
} }
public class PlayerSkillInfo public class PlayerSkillInfo
@ -112,9 +116,11 @@ namespace src.player.skills
public DateTime Cooldown { get; set; } 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 float Cooldown { get; set; } = cooldown;
public string CTSoundEvent { get; set; } = ctSoundEvent;
public string TSoundEvent { get; set; } = tSoundEvent;
} }
} }
} }

View file

@ -152,7 +152,7 @@ namespace src.player.skills
Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [enemy]); Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [enemy]);
enemyInfo.SpecialSkill = enemySkill; enemyInfo.SpecialSkill = enemySkill;
enemyInfo.Skill = Skills.None; enemyInfo.Skill = Skills.None;
enemy.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("thief_enemy_info")); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("thief_enemy_info"));
}); });
} }

View file

@ -1,9 +1,11 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Reflection.Metadata;
using static src.jRandomSkills; using static src.jRandomSkills;
namespace src.player.skills namespace src.player.skills
@ -11,7 +13,10 @@ namespace src.player.skills
public class ToxicSmoke : ISkill public class ToxicSmoke : ISkill
{ {
private const Skills skillName = Skills.ToxicSmoke; private const Skills skillName = Skills.ToxicSmoke;
private static readonly ConcurrentDictionary<Vector, byte> smokes = []; private static readonly ConcurrentDictionary<CCSPlayerController, byte> players = [];
private static readonly ConcurrentDictionary<CTriggerMultiple, byte> triggers = [];
private const string triggerName = "toxic_smoke";
public static void LoadSkill() public static void LoadSkill()
{ {
@ -20,7 +25,8 @@ namespace src.player.skills
public static void NewRound() public static void NewRound()
{ {
smokes.Clear(); players.Clear();
triggers.Clear();
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -28,6 +34,28 @@ namespace src.player.skills
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); 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<CCSPlayerController>();
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<CCSPlayerController>();
if (player == null) return;
players.TryRemove(player, out _);
Server.PrintToChatAll($"Exit: {player?.PlayerName}");
}
public static void OnEntitySpawned(CEntityInstance entity) public static void OnEntitySpawned(CEntityInstance entity)
{ {
var name = entity.DesignerName; var name = entity.DesignerName;
@ -60,7 +88,14 @@ namespace src.player.skills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0);
var trigger = SkillUtils.CreateTrigger(triggerName, SkillsInfo.GetValue<float>(skillName, "smokeRadius"), new Vector(@event.X, @event.Y, @event.Z));
if (trigger == null) return;
triggers.TryAdd(trigger, 0);
new VirtualFunctionVoid<CBaseEntity>(trigger.Handle, 153);
} }
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
@ -69,8 +104,12 @@ namespace src.player.skills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; 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) private static void AddHealth(CCSPlayerPawn player, int health)
@ -88,13 +127,12 @@ namespace src.player.skills
public static void OnTick() public static void OnTick()
{ {
foreach (Vector smokePos in smokes.Keys) if (Server.TickCount % 17 != 0) return;
foreach (var player in Utilities.GetPlayers()) foreach (var player in players.Keys)
if (Server.TickCount % 17 == 0) {
if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE && player.PlayerPawn.Value.AbsOrigin != null) AddHealth(player.PlayerPawn.Value, -SkillsInfo.GetValue<int>(skillName, "smokeDamage"));
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius")) }
AddHealth(player.PlayerPawn.Value, -SkillsInfo.GetValue<int>(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) 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)

View file

@ -35,8 +35,14 @@ namespace src.player.skills
if (glow.Item3 != player.Team && (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName))) if (glow.Item3 != player.Team && (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName)))
continue; continue;
info.TransmitEntities.Remove(glow.Item1); var glowEntity1 = Utilities.GetEntityFromIndex<CBaseEntity>((int)glow.Item1.Index);
info.TransmitEntities.Remove(glow.Item2); if (glowEntity1 == null || !glowEntity1.IsValid) continue;
var glowEntity2 = Utilities.GetEntityFromIndex<CBaseEntity>((int)glow.Item2.Index);
if (glowEntity2 == null || !glowEntity2.IsValid) continue;
info.TransmitEntities.Remove(glowEntity1.Index);
info.TransmitEntities.Remove(glowEntity2.Index);
} }
} }
} }

View file

@ -50,10 +50,12 @@ namespace src.player.skills
var roundTime = SkillsInfo.GetValue<int>(skillName, "changeRoundTime"); var roundTime = SkillsInfo.GetValue<int>(skillName, "changeRoundTime");
Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime; Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime;
if (player.Team == CsTeam.Terrorist) if (player.Team == CsTeam.Terrorist)
Localization.PrintTranslationToChatAll($" {ChatColors.Orange}{{0}}", ["watchmaker_tt"], [roundTime]); Localization.PrintTranslationToChatAll($" {ChatColors.Orange}{{0}}", ["watchmaker_tt"], [roundTime]);
else else
Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]); Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]);
player.EmitSound(SkillsInfo.GetValue<string>(skillName, "SoundEvent"));
} }
public static void OnTick() public static void OnTick()
@ -80,9 +82,10 @@ namespace src.player.skills
playerInfo.PrintHTML = SkillUtils.SecondsToTimer(seconds); 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 int ChangeRoundTime { get; set; } = changeRoundTime;
public string SoundEvent { get; set; } = soundEvent;
} }
} }
} }

View file

@ -77,6 +77,7 @@ namespace src.utils
public bool DebugMode { get; set; } public bool DebugMode { get; set; }
public string? AlternativeSkillButton { get; set; } public string? AlternativeSkillButton { get; set; }
public float SkillTimeBeforeStart { get; set; } public float SkillTimeBeforeStart { get; set; }
public float SkillHudDuration { get; set; }
public float SkillDescriptionDuration { get; set; } public float SkillDescriptionDuration { get; set; }
public bool DisplayAlwaysDescription { get; set; } public bool DisplayAlwaysDescription { get; set; }
public bool DisableSpectateHUD { get; set; } public bool DisableSpectateHUD { get; set; }
@ -99,6 +100,7 @@ namespace src.utils
DebugMode = true; DebugMode = true;
AlternativeSkillButton = null; AlternativeSkillButton = null;
SkillTimeBeforeStart = 7; SkillTimeBeforeStart = 7;
SkillHudDuration = 999;
SkillDescriptionDuration = 7; SkillDescriptionDuration = 7;
DisplayAlwaysDescription = false; DisplayAlwaysDescription = false;
FlashingHtmlHudFix = true; FlashingHtmlHudFix = true;

View file

@ -192,7 +192,7 @@ namespace src.utils
var data = reader.Find<ConcurrentDictionary<string, object>>(ip); var data = reader.Find<ConcurrentDictionary<string, object>>(ip);
if (data == null || data.IsEmpty) return null; if (data == null || data.IsEmpty) return null;
if (data.TryGetValue("country", out var _country) && _country is ConcurrentDictionary<string, object> country) if (data.TryGetValue("country", out var _country) && _country is Dictionary<string, object> country)
if (country.TryGetValue("iso_code", out var _isoCode) && _isoCode is string isoCode) if (country.TryGetValue("iso_code", out var _isoCode) && _isoCode is string isoCode)
{ {
string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode; string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;

View file

@ -81,11 +81,25 @@ namespace src.utils
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid || playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; 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; skeleton.Scale = scale;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); playerPawn.AcceptInput("SetScale", null, null, scale.ToString());
Server.NextFrame(() => 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<SpawnPoint>(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) public static void CreateHEGrenadeProjectile(Vector pos, QAngle angle, Vector vel, int teamNum)
@ -124,6 +138,38 @@ namespace src.utils
playerInfo.PrintHTML = null; playerInfo.PrintHTML = null;
} }
public static CTriggerMultiple? CreateTrigger(string name, float radius, Vector pos)
{
if (pos == null) return null;
var trigger = Utilities.CreateEntityByName<CTriggerMultiple>("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) public static void AddHealth(CCSPlayerPawn? pawn, int extraHealth, int maxHealth = 100)
{ {
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
@ -197,7 +243,7 @@ namespace src.utils
manager.UpdateActiveMenu(player, list); 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; if (player == null || !player.IsValid) return;
@ -246,7 +292,8 @@ namespace src.utils
menu.Add(lastElement.Value.Item1, (p, option) => menu.Add(lastElement.Value.Item1, (p, option) =>
{ {
jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { lastElement.Value.Item2 }]); 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); manager.OpenMainMenu(player, menu);
} }