Compare commits
No commits in common. "main" and "v1.2.4.b3-panorama2" have entirely different histories.
main
...
v1.2.4.b3-
5 changed files with 67 additions and 131 deletions
|
|
@ -2,7 +2,6 @@ using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Admin;
|
using CounterStrikeSharp.API.Modules.Admin;
|
||||||
using CounterStrikeSharp.API.Modules.Commands;
|
using CounterStrikeSharp.API.Modules.Commands;
|
||||||
using CounterStrikeSharp.API.Modules.Commands.Targeting;
|
|
||||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using src.menu;
|
using src.menu;
|
||||||
|
|
@ -116,14 +115,14 @@ namespace src.command
|
||||||
|
|
||||||
if (command.ArgCount < 2)
|
if (command.ArgCount < 2)
|
||||||
{
|
{
|
||||||
Reply("Usage: css_setoverride <name, steamid64, @me, @all, @ct, @t, @random, ...>");
|
Reply("Usage: css_setoverride <name or steamid64>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// zio: same targets as css_setskill. Several targets are all set to one state:
|
var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid
|
||||||
// on if any of them is off, otherwise off.
|
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)
|
||||||
var targets = GetSetSkillTargets(player, command.GetArg(1), _ => true);
|
|| p.PlayerName.Equals(command.GetArg(1), StringComparison.OrdinalIgnoreCase)));
|
||||||
if (targets.Count == 0)
|
if (targetPlayer == null)
|
||||||
{
|
{
|
||||||
Reply(player == null
|
Reply(player == null
|
||||||
? Localization.GetTranslationWithoutIlliterate("player_not_found_setskill")
|
? Localization.GetTranslationWithoutIlliterate("player_not_found_setskill")
|
||||||
|
|
@ -131,28 +130,37 @@ namespace src.command
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enabled = targets.Any(p => !CooldownOverride.IsSet(p));
|
bool enabled = CooldownOverride.Toggle(targetPlayer);
|
||||||
foreach (var targetPlayer in targets)
|
Reply($"Cooldown override {(enabled ? $"{ChatColors.Lime}ON" : $"{ChatColors.LightRed}OFF")}{ChatColors.Default} for {ChatColors.LightRed}\u202A{targetPlayer.PlayerName}\u202C");
|
||||||
CooldownOverride.Set(targetPlayer, enabled);
|
|
||||||
|
|
||||||
string who = targets.Count == 1 ? targets[0].PlayerName : $"{targets.Count} players";
|
|
||||||
Reply($"Cooldown override {(enabled ? $"{ChatColors.Lime}ON" : $"{ChatColors.LightRed}OFF")}{ChatColors.Default} for {ChatColors.LightRed}\u202A{who}\u202C");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 (!string.IsNullOrEmpty(config.NormalCommands.SetSkillCommand.Permissions) && !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 != null && p.IsValid
|
||||||
void Reply(string key)
|
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)
|
||||||
{
|
|| p.PlayerName.Equals(command.GetArg(1), StringComparison.OrdinalIgnoreCase)));
|
||||||
if (player == null) Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate(key));
|
|
||||||
else SkillUtils.PrintToChat(player, player.GetTranslationWithoutIlliterate(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command.ArgCount < 2)
|
if (command.ArgCount < 2)
|
||||||
{
|
{
|
||||||
Reply("correct_form_setskill");
|
if (player == null)
|
||||||
|
{
|
||||||
|
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("correct_form_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SkillUtils.PrintToChat(player, player.GetTranslationWithoutIlliterate("correct_form_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetPlayer == null)
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("player_not_found_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SkillUtils.PrintToChat(player, player.GetTranslationWithoutIlliterate("player_not_found_setskill"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,114 +169,45 @@ namespace src.command
|
||||||
|
|
||||||
if (skill == null)
|
if (skill == null)
|
||||||
{
|
{
|
||||||
Reply("skill_not_found_setskill");
|
if (player == null)
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// zio: team-only skills (e.g. ChillOut for CTs) are never given to the other team; those players keep their skill.
|
|
||||||
int onlyTeam = SkillsInfo.GetValue<int>(skill.Skill, "onlyTeam");
|
|
||||||
bool TeamAllowed(CCSPlayerController p) => onlyTeam == 0 || (int)p.Team == onlyTeam;
|
|
||||||
|
|
||||||
var targets = GetSetSkillTargets(player, command.GetArg(1), TeamAllowed);
|
|
||||||
if (targets.Count == 0)
|
|
||||||
{
|
|
||||||
Reply("player_not_found_setskill");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var done = new List<CCSPlayerController>();
|
|
||||||
var wrongTeam = new List<CCSPlayerController>();
|
|
||||||
foreach (var targetPlayer in targets)
|
|
||||||
{
|
|
||||||
if (!TeamAllowed(targetPlayer))
|
|
||||||
{
|
{
|
||||||
wrongTeam.Add(targetPlayer);
|
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("skill_not_found_setskill"));
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
|
SkillUtils.PrintToChat(player, player.GetTranslationWithoutIlliterate("skill_not_found_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var skillPlayer = PlayerManager.GetPlayerByIndex(targetPlayer.Index);
|
var skillPlayer = PlayerManager.GetPlayerByIndex(targetPlayer.Index);
|
||||||
if (skillPlayer == null) continue;
|
if (skillPlayer != null)
|
||||||
|
{
|
||||||
Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]);
|
Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]);
|
||||||
skillPlayer.Skill = skill.Skill;
|
skillPlayer.Skill = skill.Skill;
|
||||||
skillPlayer.SpecialSkill = Skills.None;
|
skillPlayer.SpecialSkill = Skills.None;
|
||||||
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]);
|
||||||
Event.UpdateSkillHudExpired(skillPlayer, skill.Skill);
|
Event.UpdateSkillHudExpired(skillPlayer, skill.Skill);
|
||||||
done.Add(targetPlayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
string teamName = onlyTeam == (int)CsTeam.Terrorist ? "T" : "CT";
|
if (player == null)
|
||||||
if (player == null)
|
{
|
||||||
{
|
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("done_setskill"));
|
||||||
if (done.Count > 0)
|
return;
|
||||||
Server.PrintToConsole($"{Localization.GetTranslationWithoutIlliterate("done_setskill")}: {skill.Skill} -> {string.Join(", ", done.Select(p => p.PlayerName))}");
|
}
|
||||||
if (wrongTeam.Count > 0)
|
|
||||||
Server.PrintToConsole($"{skill.Skill} is {teamName}-only, skipped: {string.Join(", ", wrongTeam.Select(p => p.PlayerName))}");
|
|
||||||
if (done.Count == 0 && wrongTeam.Count == 0)
|
|
||||||
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("error_setskill"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (done.Count > 0)
|
SkillUtils.PrintToChat(player, $"{player.GetTranslationWithoutIlliterate("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslationWithoutIlliterate("for_setskill")} {ChatColors.LightRed}\u202A{targetPlayer.PlayerName}\u202C");
|
||||||
{
|
|
||||||
string who = done.Count == 1 ? done[0].PlayerName : $"{done.Count} players";
|
|
||||||
SkillUtils.PrintToChat(player, $"{player.GetTranslationWithoutIlliterate("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslationWithoutIlliterate("for_setskill")} {ChatColors.LightRed}\u202A{who}\u202C");
|
|
||||||
|
|
||||||
if (skill.Display)
|
if (skill.Display)
|
||||||
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(skill.Skill)}", border: "b");
|
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(skill.Skill)}", border: "b");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (wrongTeam.Count > 0)
|
|
||||||
{
|
{
|
||||||
string who = wrongTeam.Count == 1 ? wrongTeam[0].PlayerName : $"{wrongTeam.Count} players";
|
if (player == null)
|
||||||
SkillUtils.PrintToChat(player, $"{ChatColors.LightRed}{player.GetSkillName(skill.Skill)}{ChatColors.Default} is {teamName}-only, not given to {ChatColors.LightRed}\u202A{who}\u202C");
|
{
|
||||||
|
Server.PrintToConsole(Localization.GetTranslationWithoutIlliterate("error_setskill"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillUtils.PrintToChat(player, player.GetTranslationWithoutIlliterate("error_setskill"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (done.Count == 0 && wrongTeam.Count == 0)
|
|
||||||
Reply("error_setskill");
|
|
||||||
}
|
|
||||||
|
|
||||||
// zio: one player for commands that take a single target (css_setstaticskill, css_next): the
|
|
||||||
// css_setskill rules, so part of a name works, but only when it picks out one player.
|
|
||||||
private static CCSPlayerController? GetSinglePlayerTarget(CCSPlayerController? caller, string arg)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(arg)) return null;
|
|
||||||
var targets = GetSetSkillTargets(caller, arg, _ => true);
|
|
||||||
return targets.Count == 1 ? targets[0] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// zio: css_setskill targets. An exact name or SteamID64 as before, CSS's own selectors
|
|
||||||
// (@me, @all, @ct, @t, @alive, #userid, ...), or @random/@randomct/@randomt: one random
|
|
||||||
// alive player, drawn only from players the skill's team restriction allows.
|
|
||||||
private static List<CCSPlayerController> GetSetSkillTargets(CCSPlayerController? caller, string arg, Func<CCSPlayerController, bool> teamAllowed)
|
|
||||||
{
|
|
||||||
var players = Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV).ToList();
|
|
||||||
|
|
||||||
CsTeam? randomTeam = arg.ToLowerInvariant() switch
|
|
||||||
{
|
|
||||||
"@random" => CsTeam.None,
|
|
||||||
"@randomct" => CsTeam.CounterTerrorist,
|
|
||||||
"@randomt" => CsTeam.Terrorist,
|
|
||||||
_ => null
|
|
||||||
};
|
|
||||||
if (randomTeam != null)
|
|
||||||
{
|
|
||||||
var pool = players.Where(p => (p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)
|
|
||||||
&& (randomTeam == CsTeam.None || p.Team == randomTeam)
|
|
||||||
&& p.PawnIsAlive && teamAllowed(p)).ToList();
|
|
||||||
return pool.Count == 0 ? [] : [pool[Random.Shared.Next(pool.Count)]];
|
|
||||||
}
|
|
||||||
|
|
||||||
var exact = players.FirstOrDefault(p => p.SteamID.ToString().Equals(arg, StringComparison.CurrentCultureIgnoreCase)
|
|
||||||
|| p.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase));
|
|
||||||
if (exact != null) return [exact];
|
|
||||||
|
|
||||||
var matched = new Target(arg).GetTarget(caller).Players.Where(p => p != null && p.IsValid && !p.IsHLTV).ToList();
|
|
||||||
if (arg.StartsWith('@'))
|
|
||||||
return [.. matched.Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)];
|
|
||||||
|
|
||||||
// A partial name only counts when it matches one player, so a typo can't hit several.
|
|
||||||
return matched.Count == 1 ? matched : [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
|
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
|
||||||
|
|
@ -583,7 +522,9 @@ namespace src.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 (!string.IsNullOrEmpty(config.NormalCommands.SetStaticSkillCommand.Permissions) && !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 = GetSinglePlayerTarget(player, command.GetArg(1));
|
var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid
|
||||||
|
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)
|
||||||
|
|| p.PlayerName.Equals(command.GetArg(1), StringComparison.OrdinalIgnoreCase)));
|
||||||
|
|
||||||
if (command.ArgCount < 2)
|
if (command.ArgCount < 2)
|
||||||
{
|
{
|
||||||
|
|
@ -730,7 +671,9 @@ namespace src.command
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(playerString))
|
if (!string.IsNullOrEmpty(playerString))
|
||||||
{
|
{
|
||||||
targetPlayer = GetSinglePlayerTarget(player, playerString);
|
targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid
|
||||||
|
&& (p.SteamID.ToString().Equals(playerString, StringComparison.CurrentCultureIgnoreCase)
|
||||||
|
|| p.PlayerName.Equals(playerString, StringComparison.OrdinalIgnoreCase)));
|
||||||
|
|
||||||
if (targetPlayer == null)
|
if (targetPlayer == null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ namespace src
|
||||||
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
||||||
public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)";
|
public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)";
|
||||||
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
|
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
|
||||||
public override string ModuleVersion => "1.2.4.b3-panorama5";
|
public override string ModuleVersion => "1.2.4.b3-panorama2";
|
||||||
|
|
||||||
public override void Load(bool hotReload)
|
public override void Load(bool hotReload)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -633,7 +633,7 @@
|
||||||
|
|
||||||
"skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
|
"skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
|
||||||
"player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
|
"player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
|
||||||
"correct_form_setskill": "Correct usage: CHATCOLORS.RED!setskill <nickname/@me/@all/@ct/@t/@random/@randomct/@randomt> <skill>",
|
"correct_form_setskill": "Correct usage: CHATCOLORS.RED!setskill <nickname> <skill>",
|
||||||
"correct_form_setscore": "Correct usage: CHATCOLORS.RED!setscore <CT> <TT>",
|
"correct_form_setscore": "Correct usage: CHATCOLORS.RED!setscore <CT> <TT>",
|
||||||
"done_setskill": "skill set",
|
"done_setskill": "skill set",
|
||||||
"error_setskill": "Failed to set CHATCOLORS.REDskill",
|
"error_setskill": "Failed to set CHATCOLORS.REDskill",
|
||||||
|
|
|
||||||
|
|
@ -15,16 +15,14 @@ namespace src.utils
|
||||||
private static readonly HashSet<ulong> _players = [];
|
private static readonly HashSet<ulong> _players = [];
|
||||||
private static readonly ConcurrentDictionary<Type, FieldInfo[]> _stateFields = new();
|
private static readonly ConcurrentDictionary<Type, FieldInfo[]> _stateFields = new();
|
||||||
|
|
||||||
// Sets the override for one player.
|
// Toggles the override and returns the new state.
|
||||||
public static void Set(CCSPlayerController player, bool enabled)
|
public static bool Toggle(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (enabled) _players.Add(Key(player));
|
if (_players.Remove(Key(player))) return false;
|
||||||
else _players.Remove(Key(player));
|
_players.Add(Key(player));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The player's own setting, without following a bot takeover like Has does.
|
|
||||||
public static bool IsSet(CCSPlayerController player) => _players.Contains(Key(player));
|
|
||||||
|
|
||||||
// A bot a human has taken over counts as that human, since skills run on the bot's controller.
|
// A bot a human has taken over counts as that human, since skills run on the bot's controller.
|
||||||
public static bool Has(CCSPlayerController? player)
|
public static bool Has(CCSPlayerController? player)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
11
release.sh
11
release.sh
|
|
@ -29,13 +29,8 @@ set -euo pipefail
|
||||||
FORGEJO_URL="https://git.zio.sh"
|
FORGEJO_URL="https://git.zio.sh"
|
||||||
OWNER="cs2"
|
OWNER="cs2"
|
||||||
REPO="jRandomSkills"
|
REPO="jRandomSkills"
|
||||||
# Needs write:repository. Only uploading needs it; downloading from the public repo doesn't. From the
|
# Placeholder - replace, or set FORGEJO_TOKEN in the environment instead. Needs write:repository.
|
||||||
# environment, or else from .forgejo-token in the cs2/ folder above every plugin (outside their
|
# Only uploading needs it; downloading from the public repo doesn't. Don't commit a real token.
|
||||||
# repos, mode 600). Don't commit a real token.
|
|
||||||
TOKEN_FILE="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/../../.forgejo-token"
|
|
||||||
if [[ -z "${FORGEJO_TOKEN:-}" && -r "$TOKEN_FILE" ]]; then
|
|
||||||
FORGEJO_TOKEN="$(tr -d '[:space:]' < "$TOKEN_FILE")"
|
|
||||||
fi
|
|
||||||
FORGEJO_TOKEN="${FORGEJO_TOKEN:-CHANGE_ME_FORGEJO_TOKEN}"
|
FORGEJO_TOKEN="${FORGEJO_TOKEN:-CHANGE_ME_FORGEJO_TOKEN}"
|
||||||
|
|
||||||
# CS2 client used to compile the Panorama layouts, and the Workshop Tools addon compiled into.
|
# CS2 client used to compile the Panorama layouts, and the Workshop Tools addon compiled into.
|
||||||
|
|
@ -65,7 +60,7 @@ if [[ -z "$TAG" ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ "$FORGEJO_TOKEN" == "CHANGE_ME_FORGEJO_TOKEN" ]]; then
|
if [[ "$FORGEJO_TOKEN" == "CHANGE_ME_FORGEJO_TOKEN" ]]; then
|
||||||
echo "Set FORGEJO_TOKEN (export it, or put it in $TOKEN_FILE) first." >&2
|
echo "Set FORGEJO_TOKEN (edit release.sh or export it) first." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue