diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index e3b0b97..991d162 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -127,11 +127,19 @@ namespace jRandomSkills Menu.DisplaySkillsList(player); } - [RequiresPermissions("@jRandmosSkills/admin")] [CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command) { - if (player == null) return; + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) + { + player.Vote(VoteType.ChangeMap, command.ArgString); + return; + } + ChangeMap(player, command); + } + + private static void ChangeMap(CCSPlayerController? player, CommandInfo command) + { string map = command.GetArg(1); if (string.IsNullOrEmpty(map)) @@ -150,13 +158,20 @@ namespace jRandomSkills Server.ExecuteCommand($"changelevel {map}"); } - [RequiresPermissions("@jRandmosSkills/admin")] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_StartGame(CCSPlayerController? player, CommandInfo command) { - if (player == null) return; - int cheats = command.GetArg(1) == "sv" ? 1 : 0; + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) + { + player.Vote(VoteType.StartGame, command.ArgString); + return; + } + StartGame(player, command); + } + private static void StartGame(CCSPlayerController? player, CommandInfo command) + { + int cheats = command.GetArg(1) == "sv" ? 1 : 0; Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); Server.ExecuteCommand("mp_warmup_end"); Server.ExecuteCommand("mp_restartgame 1"); @@ -170,18 +185,18 @@ namespace jRandomSkills }); } - [RequiresPermissions("@jRandmosSkills/root")] - [CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command) + [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + private static void Command_Swap(CCSPlayerController? player, CommandInfo command) { - if (player == null) return; - string param = command.ArgString; - Server.ExecuteCommand(param); + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) + { + player.Vote(VoteType.SwapTeam, command.ArgString); + return; + } + Swap(player, command); } - [RequiresPermissions("@jRandmosSkills/admin")] - [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - private static void Command_Swap(CCSPlayerController? _player, CommandInfo command) + private static void Swap(CCSPlayerController? _player, CommandInfo command) { foreach (var player in Utilities.GetPlayers()) if (Instance.IsPlayerValid(player) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(player.Team)) @@ -189,9 +204,18 @@ namespace jRandomSkills Server.ExecuteCommand($"mp_restartgame 1"); } - [RequiresPermissions("@jRandmosSkills/admin")] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] - private static void Command_Shuffle(CCSPlayerController? _player, CommandInfo command) + private static void Command_Shuffle(CCSPlayerController? player, CommandInfo command) + { + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) + { + player.Vote(VoteType.ShuffleTeam, command.ArgString); + return; + } + Shuffle(player, command); + } + + private static void Shuffle(CCSPlayerController? _player, CommandInfo command) { var players = Utilities.GetPlayers().FindAll(p => (Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team))); double CTlimit = Instance.Random.Next(0, 2) == 0 ? Math.Floor(players.Count / 2.0) : Math.Ceiling(players.Count / 2.0); @@ -204,9 +228,18 @@ namespace jRandomSkills Server.ExecuteCommand($"mp_restartgame 1"); } - [RequiresPermissions("@jRandmosSkills/admin")] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_Pause(CCSPlayerController? player, CommandInfo command) + { + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) + { + player.Vote(VoteType.PauseGame, command.ArgString); + return; + } + Pause(player, command); + } + + private static void Pause(CCSPlayerController? player, CommandInfo command) { Server.PrintToChatAll($" {(gamePaused ? ChatColors.Green : ChatColors.Red)}{Localization.GetTranslation(gamePaused ? "unpause" : "pause")}"); Server.ExecuteCommand( gamePaused ? "mp_unpause_match" : "mp_pause_match"); @@ -221,9 +254,18 @@ namespace jRandomSkills player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("healed")}"); } - [RequiresPermissions("@jRandmosSkills/root")] [CommandHelper(minArgs: 2, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_SetScore(CCSPlayerController? player, CommandInfo command) + { + if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@testset/testset")) + { + player.Vote(VoteType.SetScore, command.ArgString); + return; + } + SetScore(player, command); + } + + private static void SetScore(CCSPlayerController? player, CommandInfo command) { if (!int.TryParse(command.GetArg(1), out int ctScore) || !int.TryParse(command.GetArg(2), out int tScore)) { @@ -233,5 +275,14 @@ namespace jRandomSkills SkillUtils.SetTeamScores((short)ctScore, (short)tScore, RoundEndReason.RoundDraw); } + + [RequiresPermissions("@jRandmosSkills/root")] + [CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command) + { + if (player == null) return; + string param = command.ArgString; + Server.ExecuteCommand(param); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/command/VoteSystem.cs b/jRandomSkills - SRC Files/src/command/VoteSystem.cs new file mode 100644 index 0000000..a52cdb5 --- /dev/null +++ b/jRandomSkills - SRC Files/src/command/VoteSystem.cs @@ -0,0 +1,110 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Events; +using CounterStrikeSharp.API.Modules.Utils; + +namespace jRandomSkills +{ + public static class VoteSystem + { + private static HashSet votes = new HashSet(); + + public static void Load() + { + jRandomSkills.Instance.DeregisterEventHandler((@event, info) => + { + var player = @event.Userid; + var text = @event.Text; + return HookResult.Continue; + }); + } + + private static VoteData CreateVote(VoteType voteType, string? args = null) + { + var vote = new VoteData(10, + () => { + Server.ExecuteCommand($"{VoteTypeCommands.GetCommand(voteType)}{(args != null ? $" {args}" : "")}"); + }, 60, voteType, args); + votes.Add(vote); + + jRandomSkills.Instance.AddTimer(vote?.TimeToVote ?? 0, () => + { + if (!votes.Contains(vote)) return; + votes.Remove(vote); + Server.PrintToChatAll($" {ChatColors.Red}Vote '!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}' timed out!"); + }); + return vote; + } + + public static void Vote(this CCSPlayerController player, VoteType voteType, string? args = null) + { + var vote = votes.FirstOrDefault(v => v.Type == voteType); + if (vote == null) + vote = CreateVote(voteType, args); + + if (!vote.PlayersVoted.Add(player.SteamID)) + player.PrintToChat($" {ChatColors.Red}You have already voted!"); + else CheckVote(vote); + } + + private static void CheckVote(VoteData vote) + { + int voted = vote.PlayersVoted.Count; + int playerCount = Utilities.GetPlayers().Where(p => !p.IsBot).ToArray().Length; + int playersNeeded = (int)Math.Ceiling(playerCount * (vote.PercentagesToSuccess / 100f)); + + if (voted >= playersNeeded) + { + vote.SuccessAction.Invoke(); + votes.Remove(vote); + } + else + Server.PrintToChatAll($" {ChatColors.Yellow}Vote '!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}': {ChatColors.Green}{voted}/{playersNeeded}"); + } + } + + public class VoteData + { + public float TimeToVote { get; set; } + public Action SuccessAction { get; set; } + public float PercentagesToSuccess { get; set; } + public VoteType Type { get; set; } + public string Args { get; set; } + public HashSet PlayersVoted { get; set; } + + public VoteData(float timeToVote, Action successAction, float percentagesToSuccess, VoteType type, string? args = null) + { + TimeToVote = timeToVote; + SuccessAction = successAction; + PercentagesToSuccess = percentagesToSuccess; + Type = type; + Args = args; + PlayersVoted = new HashSet(); + } + } + + public enum VoteType + { + StartGame, + PauseGame, + ShuffleTeam, + SwapTeam, + ChangeMap, + SetScore, + } + + public static class VoteTypeCommands + { + private static readonly Dictionary names = new Dictionary() + { + { VoteType.StartGame, "css_start" }, + { VoteType.PauseGame, "css_pause" }, + { VoteType.ShuffleTeam, "css_shuffle" }, + { VoteType.SwapTeam, "css_swap" }, + { VoteType.ChangeMap, "css_map" }, + { VoteType.SetScore, "css_setscore" }, + }; + + public static string GetCommand(VoteType type) => names[type]; + } +} diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 81a6e1e..86251b4 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -19,7 +19,7 @@ namespace jRandomSkills public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; - public override string ModuleVersion => "1.1.0"; + public override string ModuleVersion => "1.1.2"; public override void Load(bool hotReload) { diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json index e65afe3..fc0aa2b 100644 --- a/jRandomSkills - SRC Files/src/lang/en.json +++ b/jRandomSkills - SRC Files/src/lang/en.json @@ -199,6 +199,12 @@ "longzeus": "Long Zeus", "longzeus_desc": "Zeus deals damage regardless of distance", + "magnifier": "Magnifier", + "magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view", + "magnifier_enemy_info": "Your field of view has been distorted!", + "magnifier_player_info": "Player '{0}' has been forced into zoom mode.", + "magnifier_select_info": "Select the player whose screen you want to magnify:", + "medic": "Medic", "medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health", @@ -230,7 +236,8 @@ "onlyhead_desc": "You only take damage to the head", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "You get an extra jump", + "paweljumper_desc": "You get a random number of extra jumps", + "paweljumper_desc2": "You get {0} extra jumps", "phoenix": "Phoenix", "phoenix_desc": "You have a random chance to respawn after death", @@ -353,6 +360,9 @@ "thirdeye": "Third Eye", "thirdeye_desc": "Click [css_useSkill] to activate third-person view", + "thorns": "Thorns", + "thorns_desc": "Your opponent will receive a portion of the damage that they inflicted on you", + "toxicsmoke": "Toxic Smoke", "toxicsmoke_desc": "Your smoke grenades deal damage", diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index 35b8bc6..70741e1 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -199,6 +199,12 @@ "longzeus": "Długi Zeus", "longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości", + "magnifier": "Lupa", + "magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi", + "magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!", + "magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.", + "magnifier_select_info": "Wybierz gracza, którego ekran chcesz powiększyć:", + "medic": "Medyk", "medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia", @@ -230,7 +236,8 @@ "onlyhead_desc": "Otrzymujesz obrażenia tylko w głowę", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Otrzymujesz dodatkowy skok", + "paweljumper_desc": "Otrzymujesz losową liczbę dodatkowych skoków", + "paweljumper_desc2": "Otrzymujesz {0} dodatkowych skoków", "phoenix": "Feniks", "phoenix_desc": "Masz losową szans na odrodzenie się po śmierci", @@ -353,6 +360,9 @@ "thirdeye": "Trzecie Oko", "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę", + "thorns": "Ciernie", + "thorns_desc": "Twój przeciwnik otrzymuje część obrażeń, które zadał ci", + "toxicsmoke": "Toksyczny Dym", "toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia", diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json index 991dd1a..ff42def 100644 --- a/jRandomSkills - SRC Files/src/lang/pt-br.json +++ b/jRandomSkills - SRC Files/src/lang/pt-br.json @@ -199,6 +199,12 @@ "longzeus": "Zeus Longo", "longzeus_desc": "Zeus causa dano independentemente da distância", + "magnifier": "Lupa", + "magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão", + "magnifier_enemy_info": "Seu campo de visão foi distorcido!", + "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.", + "magnifier_select_info": "Selecione o jogador cuja tela você deseja ampliar:", + "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", @@ -230,7 +236,8 @@ "onlyhead_desc": "Você só recebe dano na cabeça", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Você ganha um pulo extra", + "paweljumper_desc": "Você recebe um número aleatório de saltos extras", + "paweljumper_desc2": "Você ganha {0} saltos extras", "phoenix": "Fênix", "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte", @@ -353,6 +360,9 @@ "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", + "thorns": "Espinhos", + "thorns_desc": "Seu oponente receberá uma parte do dano que causou a você", + "toxicsmoke": "Fumaça Tóxica", "toxicsmoke_desc": "Suas granadas de fumaça causam dano", diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json index fa0b554..f0e5b19 100644 --- a/jRandomSkills - SRC Files/src/lang/zh.json +++ b/jRandomSkills - SRC Files/src/lang/zh.json @@ -199,6 +199,12 @@ "longzeus": "长宙斯", "longzeus_desc": "宙斯电击枪无论距离多远都能造成伤害", + "magnifier": "放大镜", + "magnifier_desc": "强制敌方屏幕放大,缩小其视野范围", + "magnifier_enemy_info": "你的视野已被扭曲!", + "magnifier_player_info": "玩家'{0}'已被强制进入放大模式。", + "magnifier_select_info": "选择需要放大的玩家:", + "medic": "医务兵", "medic_desc": "点击 [css_useSkill] 使用治疗装置恢复50点生命值", @@ -230,7 +236,8 @@ "onlyhead_desc": "你只会在头部受到伤害", "paweljumper": "帕维尔跳跃者", - "paweljumper_desc": "你获得额外的跳跃", + "paweljumper_desc": "你将获得随机数量的额外跳跃机会", + "paweljumper_desc2": "你获得 {0} 次额外跳跃", "phoenix": "凤凰", "phoenix_desc": "你有随机几率在死亡后复活", @@ -353,6 +360,9 @@ "thirdeye": "第三只眼", "thirdeye_desc": "点击 [css_useSkill] 激活第三人称视角", + "thorns": "荊棘", + "thorns_desc": "你的對手將承受其對你造成傷害的一部分", + "toxicsmoke": "毒烟", "toxicsmoke_desc": "你的烟雾弹会造成伤害", diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index d8f38c0..ee6c6e3 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -66,6 +66,7 @@ public enum Skills LifeSwap, LongKnife, LongZeus, + Magnifier, Medic, MoneySwap, Muhammed, @@ -111,6 +112,7 @@ public enum Skills Teleporter, Thief, ThirdEye, + Thorns, ToxicSmoke, Wallhack, Watchmaker, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 5c2e6b4..e3d8181 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -153,35 +153,38 @@ namespace jRandomSkills skillPlayer.IsDrawing = false; jSkill_SkillInfo randomSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false); - if (Config.config.Settings.GameMode == (int)Config.GameModes.Normal) + if (Instance?.GameRules?.WarmupPeriod == false) { - List skillList = new List(SkillData.Skills); - skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); - - if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count == 1) + if (Config.config.Settings.GameMode == (int)Config.GameModes.Normal) { - Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.config.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); - skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); + List skillList = new List(SkillData.Skills); + skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); + + if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count == 1) + { + Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.config.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); + skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); + } + + if (player.Team == CsTeam.Terrorist) + skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + else + skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + + randomSkill = skillList.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : skillList[Instance.Random.Next(skillList.Count)]; + } + else if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills) + randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; + else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills) + randomSkill = allSkill; + else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug) + { + if (debugSkills.Count == 0) + debugSkills = new List(SkillData.Skills); + randomSkill = debugSkills[0]; + debugSkills.RemoveAt(0); + player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); } - - if (player.Team == CsTeam.Terrorist) - skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - else - skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - - randomSkill = skillList.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : skillList[Instance.Random.Next(skillList.Count)]; - } - else if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills) - randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; - else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills) - randomSkill = allSkill; - else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug) - { - if (debugSkills.Count == 0) - debugSkills = new List(SkillData.Skills); - randomSkill = debugSkills[0]; - debugSkills.RemoveAt(0); - player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); } skillPlayer.Skill = randomSkill.Skill; diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index a647392..727d77e 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -2,8 +2,8 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using jRandomSkills.src.player; using jRandomSkills.src.utils; +using System.Reflection.Metadata; using static CounterStrikeSharp.API.Core.Listeners; -using static jRandomSkills.Config; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -38,10 +38,10 @@ namespace jRandomSkills private static void UpdateGameRules() { - if (Instance.GameRules == null) + if (Instance?.GameRules == null || Instance?.GameRules?.Handle == IntPtr.Zero) InitializeGameRules(); else - Instance.GameRules.GameRestart = Instance.GameRules.RestartRoundTime < Server.CurrentTime; + Instance.GameRules.GameRestart = Instance?.GameRules?.RestartRoundTime < Server.CurrentTime; } private static void UpdatePlayerHud(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index 97c1bd1..2ff6a19 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -161,8 +161,11 @@ namespace jRandomSkills private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) { - if (roundEnd) return; - foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons) + if (roundEnd || player == null || !player.IsValid) return; + var pawn = player?.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid) return; + + foreach (var weapon in pawn?.WeaponServices?.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) if (disabledWeapons.Contains(weapon?.Value?.DesignerName)) { diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index 6718ec5..a58162f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -73,7 +73,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -134,8 +133,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; playerPawn.Teleport(GetEnemySpawnVector(player)); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -156,7 +153,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index 975b713..68b576e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -13,13 +13,16 @@ namespace jRandomSkills public class Fortnite : ISkill { private const Skills skillName = Skills.Fortnite; - private static float timerCooldown = Config.GetValue(skillName, "Cooldown"); - private const string propModel = "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl"; + private static float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static int barricadeHealth = Config.GetValue(skillName, "barricadeHealth"); + private static string propModel = Config.GetValue(skillName, "propModel"); + private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static Dictionary barricades = new Dictionary(); public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); Instance.RegisterEventHandler((@event, info) => { @@ -40,6 +43,7 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { SkillPlayerInfo.Clear(); + barricades.Clear(); return HookResult.Continue; }); @@ -80,7 +84,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -127,8 +130,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; CreateBox(player); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -146,6 +147,7 @@ namespace jRandomSkills box.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); box.DispatchSpawn(); + barricades.Add(box.Index, barricadeHealth); Server.NextFrame(() => { box.SetModel(propModel); @@ -167,7 +169,14 @@ namespace jRandomSkills var box = param.As(); if (box == null || !box.IsValid) return HookResult.Continue; box.EmitSound("Wood_Plank.BulletImpact", volume: 1f); - box.Remove(); + + if (barricades.TryGetValue(box.Index, out int health)) + { + health -= (int)param2.Damage; + barricades[box.Index] = health; + if (health <= 0) box.Remove(); + } + else box.Remove(); return HookResult.Continue; } @@ -176,15 +185,18 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo { public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 2f) : base(skill, active, color, onlyTeam, needsTeammates) + public int BarricadeHealth { get; set; } + public string PropModel { get; set; } + public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 2f, int barricadeHealth = 115, string propModel = "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl") : base(skill, active, color, onlyTeam, needsTeammates) { Cooldown = cooldown; + BarricadeHealth = barricadeHealth; + PropModel = propModel; } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 046bfa5..6833712 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -182,8 +182,11 @@ namespace jRandomSkills private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) { - if (roundEnd) return; - foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons) + if (roundEnd || player == null || !player.IsValid) return; + var pawn = player?.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid) return; + + foreach (var weapon in pawn?.WeaponServices?.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) if (disabledWeapons.Contains(weapon?.Value?.DesignerName)) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index c568bd7..8f33c25 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -31,9 +31,6 @@ namespace jRandomSkills if (playerInfo?.Skill == skillName) EnableSkill(player); } - - if (exists) - Instance.RegisterListener(CheckTransmit); }); return HookResult.Continue; }); @@ -41,8 +38,7 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, @info) => { smokes.Clear(); - if (exists) - Instance.RemoveListener(CheckTransmit); + Instance.RemoveListener(CheckTransmit); exists = false; return HookResult.Continue; }); @@ -66,8 +62,11 @@ namespace jRandomSkills { if (player == null) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; + var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); + var observerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); + + if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; foreach (var smoke in smokes) info.TransmitEntities.Remove(smoke); } @@ -75,6 +74,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { + if (!exists) + Instance.RegisterListener(CheckTransmit); exists = true; SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index 0221b22..3cbc825 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -73,7 +73,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -130,8 +129,6 @@ namespace jRandomSkills } }); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -140,7 +137,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index e1ae942..f3b81fc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -33,9 +33,6 @@ namespace jRandomSkills if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } - - if (exists) - Instance.RegisterListener(CheckTransmit); }); return HookResult.Continue; @@ -52,8 +49,7 @@ namespace jRandomSkills authorBeams.Clear(); stepBeams.Clear(); - if (exists) - Instance.RemoveListener(CheckTransmit); + Instance.RemoveListener(CheckTransmit); exists = false; return HookResult.Continue; }); @@ -63,14 +59,21 @@ namespace jRandomSkills private static void OnTick() { - foreach (var step in stepBeams) + if (Server.TickCount % 8 != 0) return; + foreach (var step in stepBeams.ToList()) { - if (Server.TickCount % 8 != 0) continue; + var player = step.Key; + if (player == null || !player.IsValid) + { + stepBeams.Remove(player); + continue; + } + + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue; - var pawn = step.Key.PlayerPawn.Value; var beams = step.Value; - if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue; - Vector lastBeamVector = beams.LastOrDefault()?.EndPos ?? pawn.AbsOrigin; + Vector lastBeamVector = beams?.LastOrDefault()?.EndPos ?? pawn?.AbsOrigin; var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin); if (newBeam != null) @@ -86,15 +89,21 @@ namespace jRandomSkills public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) { - foreach(var (info, player) in infoList) + foreach( var (info, player) in infoList) { if (player == null) continue; foreach (var step in stepBeams) { var enemy = step.Key; var beams = step.Value; + + var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); + + bool playerHasBeam = authorBeams.TryGetValue(player.Index, out uint pIndex) && pIndex == enemy.Index; + bool observerHasBeam = observedPlayer != null && authorBeams.TryGetValue(observedPlayer.Index, out uint oIndex) && oIndex == enemy.Index; + foreach (var beam in beams) - if (!authorBeams.TryGetValue(player.Index, out uint enemyIndex) || enemyIndex != enemy.Index) + if (!playerHasBeam && !observerHasBeam) info.TransmitEntities.Remove(beam); } } @@ -148,6 +157,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { + if (!exists) + Instance.RegisterListener(CheckTransmit); exists = true; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); playerInfo.SkillChance = 0; diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs new file mode 100644 index 0000000..b64f3a7 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -0,0 +1,114 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.player; +using jRandomSkills.src.utils; +using static jRandomSkills.jRandomSkills; + +namespace jRandomSkills +{ + public class Magnifier : ISkill + { + private const Skills skillName = Skills.Magnifier; + private static uint customFOV = Config.GetValue(skillName, "customFOV"); + private static Dictionary playersFOV = new Dictionary(); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in playersFOV.Keys) + DisableSkill(player); + return HookResult.Continue; + }); + } + + public static void TypeSkill(CCSPlayerController player, string[] commands) + { + if (player == null || !player.IsValid || !player.PawnIsAlive) return; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + if (playerInfo.SkillChance == 1) + { + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_used_info")}"); + return; + } + + string enemyId = commands[0]; + var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + + if (enemy == null) + { + player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")); + return; + } + + if (!playersFOV.ContainsKey(enemy)) + playersFOV.Add(enemy, enemy.DesiredFOV); + Server.PrintToChatAll($"FOV: {enemy.DesiredFOV}"); + enemy.DesiredFOV = customFOV; + Utilities.SetStateChanged(enemy, "CBasePlayerController", "m_iDesiredFOV"); + + playerInfo.SkillChance = 1; + player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("magnifier_player_info", enemy.PlayerName)); + enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("magnifier_enemy_info")); + } + + public static void EnableSkill(CCSPlayerController player) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + playerInfo.SkillChance = 0; + + SkillUtils.PrintToChat(player, Localization.GetTranslation("magnifier") + ":", false); + + player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("magnifier_select_info")}"); + var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).ToArray(); + if (enemies.Length > 0) + { + foreach (var enemy in enemies) + player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + } + else + player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); + player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (playersFOV.TryGetValue(player, out uint fov)) + { + player.DesiredFOV = fov; + Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); + } + playersFOV.Remove(player); + } + + public class SkillConfig : Config.DefaultSkillInfo + { + public uint CustomFOV { get; set; } + public SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : base(skill, active, color, onlyTeam, needsTeammates) + { + CustomFOV = customFOV; + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index 146ed0f..dc70125 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -73,7 +73,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -131,8 +130,6 @@ namespace jRandomSkills playerPawn.ActualMoveType = MoveType_t.MOVETYPE_NOCLIP; Instance.AddTimer(duration, () => playerPawn.ActualMoveType = MoveType_t.MOVETYPE_WALK); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -141,7 +138,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index 0744425..063ea09 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -2,6 +2,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; +using jRandomSkills.src.utils; using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; @@ -10,6 +11,9 @@ namespace jRandomSkills public class PawelJumper : ISkill { private const Skills skillName = Skills.PawelJumper; + private static int extraJumpsMin = Config.GetValue(skillName, "extraJumpsMin"); + private static int extraJumpsMax = Config.GetValue(skillName, "extraJumpsMax"); + private static readonly PlayerFlags[] LF = new PlayerFlags[64]; private static readonly int?[] J = new int?[64]; private static readonly PlayerButtons[] LB = new PlayerButtons[64]; @@ -32,12 +36,29 @@ namespace jRandomSkills }); } + public static void EnableSkill(CCSPlayerController player) + { + var playerPawn = player.PlayerPawn.Value; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerPawn == null) return; + + var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString()); + if (skillConfig == null) return; + + float extraJumps = (float)Instance.Random.Next(extraJumpsMin, extraJumpsMax + 1); + playerInfo.SkillChance = extraJumps; + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("paweljumper")}{ChatColors.Lime}: " + Localization.GetTranslation("paweljumper_desc2", extraJumps), false); + } + private static void GiveAdditionalJump(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerPawn == null) return; + if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0) { //J[player.Slot] ++; @@ -46,9 +67,9 @@ namespace jRandomSkills { J[player.Slot] = 0; } - else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < 1) + else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < playerInfo.SkillChance) { - J[player.Slot] ++; + J[player.Slot]++; playerPawn.AbsVelocity.Z = 300; } @@ -58,8 +79,12 @@ namespace jRandomSkills public class SkillConfig : Config.DefaultSkillInfo { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFA500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) + public int ExtraJumpsMin { get; set; } + public int ExtraJumpsMax { get; set; } + public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFA500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int extraJumpsMin = 1, int extraJumpsMax = 4) : base(skill, active, color, onlyTeam, needsTeammates) { + ExtraJumpsMin = extraJumpsMin; + ExtraJumpsMax = extraJumpsMax; } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index 3d8ede4..d8bac25 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -81,7 +81,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -128,8 +127,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; RemoveAndGiveWeapon(player); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -175,7 +172,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index ca2df3e..c1b12b1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -89,7 +89,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -139,7 +138,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index 35af400..2237e76 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -74,7 +74,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -121,8 +120,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; CreateReplica(player); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -177,7 +174,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index 4c755ad..1200982 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -72,7 +72,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -119,8 +118,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; playerPawn.Teleport(GetSpawnVector(player)); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -141,7 +138,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 945dd73..75cc42f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -26,8 +26,13 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var victimPawn = victim.PlayerPawn.Value; + if (victimPawn == null || !victimPawn.IsValid) return HookResult.Continue; + if (attackerInfo?.Skill == skillName) - playersToSlow.Add(victim.PlayerPawn.Value, Server.TickCount + (64 * rubberTime)); + if (playersToSlow.ContainsKey(victimPawn)) + playersToSlow[victimPawn] = Server.TickCount + (64 * rubberTime); + else playersToSlow.TryAdd(victimPawn, Server.TickCount + (64 * rubberTime)); return HookResult.Continue; }); diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index 6b63740..ca4c3dd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -70,7 +70,6 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastClick = DateTime.MinValue, }; } @@ -117,8 +116,6 @@ namespace jRandomSkills skillInfo.Cooldown = DateTime.Now; MakeSound(player); } - else - skillInfo.LastClick = DateTime.Now; } } @@ -134,7 +131,6 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public DateTime LastClick { get; set; } } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs new file mode 100644 index 0000000..5955b48 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -0,0 +1,42 @@ +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.player; +using static jRandomSkills.jRandomSkills; + +namespace jRandomSkills +{ + public class Thorns : ISkill + { + private const Skills skillName = Skills.Thorns; + private static float healthTakenScale = Config.GetValue(skillName, "healthTakenScale"); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + + Instance.RegisterEventHandler((@event, info) => + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; + var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + if (victimInfo?.Skill == skillName && victim.PawnIsAlive && attacker.PawnIsAlive) + { + SkillUtils.TakeHealth(attacker.PlayerPawn.Value, (int)(@event.DmgHealth * healthTakenScale)); + attacker.EmitSound("Player.DamageBody.Onlooker"); + } + return HookResult.Continue; + }); + } + + public class SkillConfig : Config.DefaultSkillInfo + { + public float HealthTakenScale { get; set; } + public SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthTakenScale = .3f) : base(skill, active, color, onlyTeam, needsTeammates) + { + HealthTakenScale = healthTakenScale; + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 307029e..bdc5625 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -31,9 +31,6 @@ namespace jRandomSkills if (playerInfo?.Skill == skillName) EnableSkill(player); } - - if (exists) - Instance.RegisterListener(CheckTransmit); }); return HookResult.Continue; }); @@ -47,8 +44,7 @@ namespace jRandomSkills } glows.Clear(); - if (exists) - Instance.RemoveListener(CheckTransmit); + Instance.RemoveListener(CheckTransmit); exists = false; return HookResult.Continue; }); @@ -60,7 +56,12 @@ namespace jRandomSkills { if (player == null) continue; var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) continue; + + var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); + var observerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); + + if (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName)) + continue; foreach (var glow in glows) { @@ -72,6 +73,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { + if (!exists) + Instance.RegisterListener(CheckTransmit); exists = true; SetGlowEffectForEnemies(player); } @@ -106,7 +109,7 @@ namespace jRandomSkills modelGlow.Glow.GlowColorOverride = enemy.Team == CsTeam.Terrorist ? Color.FromArgb(255, 255, 165, 0) : Color.FromArgb(255, 173, 216, 230); modelGlow.Glow.GlowRange = 5000; - modelGlow.Glow.GlowTeam = (int)player.Team; + modelGlow.Glow.GlowTeam = -1; modelGlow.Glow.GlowType = 3; modelGlow.Glow.GlowRangeMin = 100; diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index dbc38f0..9938bbc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -69,7 +69,7 @@ namespace jRandomSkills private static void UpdateHUD(CCSPlayerController player) { var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); - if (skillData == null) return; + if (skillData == null || Instance?.GameRules == null || Instance?.GameRules?.RoundTime == null || Instance.GameRules?.RoundStartTime == null) return; int seconds = 1 + (int)(Instance.GameRules.RoundTime - (Server.CurrentTime - Instance.GameRules.RoundStartTime)); diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json b/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json index d7072e1..af21cca 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json @@ -266,6 +266,8 @@ }, { "Cooldown": 2.0, + "BarricadeHealth": 115, + "PropModel": "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl", "NeedsTeammates": false, "OnlyTeam": 0, "Color": "#1b04cc", @@ -435,6 +437,14 @@ "Active": true, "Name": "LongZeus" }, + { + "CustomFOV": 50, + "NeedsTeammates": false, + "OnlyTeam": 0, + "Color": "#9ba882", + "Active": true, + "Name": "Magnifier" + }, { "HealthToAdd": 50, "HealthShotLimit": 3, @@ -516,6 +526,8 @@ "Name": "OnlyHead" }, { + "ExtraJumpsMin": 1, + "ExtraJumpsMax": 4, "NeedsTeammates": false, "OnlyTeam": 0, "Color": "#FFA500", @@ -803,6 +815,14 @@ "Active": true, "Name": "ThirdEye" }, + { + "HealthTakenScale": 0.3, + "NeedsTeammates": false, + "OnlyTeam": 0, + "Color": "#962631", + "Active": true, + "Name": "Thorns" + }, { "SmokeDamage": 2, "SmokeRadius": 180.0, diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index a7d9621..af5887d 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json index e65afe3..fc0aa2b 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json @@ -199,6 +199,12 @@ "longzeus": "Long Zeus", "longzeus_desc": "Zeus deals damage regardless of distance", + "magnifier": "Magnifier", + "magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view", + "magnifier_enemy_info": "Your field of view has been distorted!", + "magnifier_player_info": "Player '{0}' has been forced into zoom mode.", + "magnifier_select_info": "Select the player whose screen you want to magnify:", + "medic": "Medic", "medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health", @@ -230,7 +236,8 @@ "onlyhead_desc": "You only take damage to the head", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "You get an extra jump", + "paweljumper_desc": "You get a random number of extra jumps", + "paweljumper_desc2": "You get {0} extra jumps", "phoenix": "Phoenix", "phoenix_desc": "You have a random chance to respawn after death", @@ -353,6 +360,9 @@ "thirdeye": "Third Eye", "thirdeye_desc": "Click [css_useSkill] to activate third-person view", + "thorns": "Thorns", + "thorns_desc": "Your opponent will receive a portion of the damage that they inflicted on you", + "toxicsmoke": "Toxic Smoke", "toxicsmoke_desc": "Your smoke grenades deal damage", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json index 35b8bc6..70741e1 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json @@ -199,6 +199,12 @@ "longzeus": "Długi Zeus", "longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości", + "magnifier": "Lupa", + "magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi", + "magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!", + "magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.", + "magnifier_select_info": "Wybierz gracza, którego ekran chcesz powiększyć:", + "medic": "Medyk", "medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia", @@ -230,7 +236,8 @@ "onlyhead_desc": "Otrzymujesz obrażenia tylko w głowę", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Otrzymujesz dodatkowy skok", + "paweljumper_desc": "Otrzymujesz losową liczbę dodatkowych skoków", + "paweljumper_desc2": "Otrzymujesz {0} dodatkowych skoków", "phoenix": "Feniks", "phoenix_desc": "Masz losową szans na odrodzenie się po śmierci", @@ -353,6 +360,9 @@ "thirdeye": "Trzecie Oko", "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę", + "thorns": "Ciernie", + "thorns_desc": "Twój przeciwnik otrzymuje część obrażeń, które zadał ci", + "toxicsmoke": "Toksyczny Dym", "toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json index 991dd1a..ff42def 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json @@ -199,6 +199,12 @@ "longzeus": "Zeus Longo", "longzeus_desc": "Zeus causa dano independentemente da distância", + "magnifier": "Lupa", + "magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão", + "magnifier_enemy_info": "Seu campo de visão foi distorcido!", + "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.", + "magnifier_select_info": "Selecione o jogador cuja tela você deseja ampliar:", + "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", @@ -230,7 +236,8 @@ "onlyhead_desc": "Você só recebe dano na cabeça", "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Você ganha um pulo extra", + "paweljumper_desc": "Você recebe um número aleatório de saltos extras", + "paweljumper_desc2": "Você ganha {0} saltos extras", "phoenix": "Fênix", "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte", @@ -353,6 +360,9 @@ "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", + "thorns": "Espinhos", + "thorns_desc": "Seu oponente receberá uma parte do dano que causou a você", + "toxicsmoke": "Fumaça Tóxica", "toxicsmoke_desc": "Suas granadas de fumaça causam dano", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json index fa0b554..f0e5b19 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json @@ -199,6 +199,12 @@ "longzeus": "长宙斯", "longzeus_desc": "宙斯电击枪无论距离多远都能造成伤害", + "magnifier": "放大镜", + "magnifier_desc": "强制敌方屏幕放大,缩小其视野范围", + "magnifier_enemy_info": "你的视野已被扭曲!", + "magnifier_player_info": "玩家'{0}'已被强制进入放大模式。", + "magnifier_select_info": "选择需要放大的玩家:", + "medic": "医务兵", "medic_desc": "点击 [css_useSkill] 使用治疗装置恢复50点生命值", @@ -230,7 +236,8 @@ "onlyhead_desc": "你只会在头部受到伤害", "paweljumper": "帕维尔跳跃者", - "paweljumper_desc": "你获得额外的跳跃", + "paweljumper_desc": "你将获得随机数量的额外跳跃机会", + "paweljumper_desc2": "你获得 {0} 次额外跳跃", "phoenix": "凤凰", "phoenix_desc": "你有随机几率在死亡后复活", @@ -353,6 +360,9 @@ "thirdeye": "第三只眼", "thirdeye_desc": "点击 [css_useSkill] 激活第三人称视角", + "thorns": "荊棘", + "thorns_desc": "你的對手將承受其對你造成傷害的一部分", + "toxicsmoke": "毒烟", "toxicsmoke_desc": "你的烟雾弹会造成伤害",