Skip to content

Commit 8c79f0d

Browse files
committed
Add @ in chat as an alias to !say, and admins only when in team chat.
Initial work to support filters.
1 parent 64d7487 commit 8c79f0d

File tree

5 files changed

+106
-9
lines changed

5 files changed

+106
-9
lines changed

BasicAdmin/BasicAdmin.cs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace BasicAdmin;
1111

12+
// [MinimumApiVersion(66)]
1213
public sealed class BasicAdmin : BasePlugin, IPluginConfig<BasicAdminConfig>
1314
{
1415
public override string ModuleName => "BasicAdmin";
@@ -23,7 +24,48 @@ public void OnConfigParsed(BasicAdminConfig config)
2324
}
2425

2526
public override void Load(bool hotReload)
26-
{ }
27+
{
28+
base.Load(hotReload);
29+
30+
AddCommandListener("say", OnSayCommand);
31+
AddCommandListener("say_team", OnSayCommand);
32+
}
33+
34+
// public override void Unload(bool hotReload)
35+
// {
36+
// base.Unload(hotReload);
37+
//
38+
// RemoveCommandListener("say", OnSayCommand, HookMode.Pre);
39+
// RemoveCommandListener("say_team", OnSayCommand, HookMode.Pre);
40+
// }
41+
42+
public HookResult OnSayCommand(CCSPlayerController? caller, CommandInfo info)
43+
{
44+
if (!(info.GetArg(1).StartsWith('@') && AdminManager.PlayerHasPermissions(caller, "@css/chat")))
45+
return HookResult.Continue;
46+
47+
var isTeam = info.GetArg(0).Equals("say_team");
48+
var start = isTeam ? 11 : 6;
49+
string message;
50+
51+
if (isTeam)
52+
{
53+
message = string.Format(Config.AdminSayTextTeam, caller!.PlayerName,
54+
info.GetCommandString[start..^1]);
55+
}
56+
else
57+
{
58+
message = FormatAdminMessage(string.Format(Config.AdminSayText, caller!.PlayerName,
59+
info.GetCommandString[start..^1]));
60+
}
61+
62+
if (isTeam)
63+
ServerUtils.PrintToChatTeam(TargetFilter.Admin, message);
64+
else
65+
Server.PrintToChatAll(message);
66+
67+
return HookResult.Stop;
68+
}
2769

2870
[ConsoleCommand("css_map", "Change map.")]
2971
[CommandHelper(1, "<mapname>")]
@@ -104,7 +146,7 @@ public void OnSlayCommand(CCSPlayerController? caller, CommandInfo info)
104146
[RequiresPermissions("@css/cvar")]
105147
public void OnGiveCommand(CCSPlayerController? caller, CommandInfo info)
106148
{
107-
if (!GetTarget(info, out var player))
149+
if (!GetTarget(info, out var player))
108150
return;
109151

110152
var range = info.GetArg(0).Length + info.GetArg(1).Length + 2;

BasicAdmin/BasicAdminConfig.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Text.Json.Serialization;
22
using CounterStrikeSharp.API.Core;
3+
using CounterStrikeSharp.API.Modules.Utils;
34

45
namespace BasicAdmin;
56

@@ -10,4 +11,10 @@ public class BasicAdminConfig : BasePluginConfig
1011

1112
[JsonPropertyName("hide_activity")]
1213
public bool HideActivity { get; set; } = false;
14+
15+
[JsonPropertyName("admin_say_text")]
16+
public string AdminSayText { get; set; } = $"\x03{{0}}\x01: {{1}}";
17+
18+
[JsonPropertyName("admin_say_text_admins")]
19+
public string AdminSayTextTeam { get; set; } = $"(Admins only) \x03{{0}}\x01: {{1}}";
1320
}

BasicAdmin/Enums.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace BasicAdmin;
2+
3+
internal enum TargetResult
4+
{
5+
None,
6+
Multiple,
7+
Single
8+
}
9+
10+
internal enum TargetFilter
11+
{
12+
CounterTerrorist,
13+
Terrorist,
14+
Alive,
15+
Admin,
16+
Dead,
17+
Spec,
18+
}

BasicAdmin/ServerUtils.cs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
using CounterStrikeSharp.API;
22
using CounterStrikeSharp.API.Core;
3+
using CounterStrikeSharp.API.Modules.Admin;
4+
using CounterStrikeSharp.API.Modules.Utils;
35

46
namespace BasicAdmin;
57

68

79
internal static class ServerUtils
810
{
11+
private static readonly Dictionary<TargetFilter, Predicate<CCSPlayerController>> FilterPredicates = new()
12+
{
13+
{ TargetFilter.CounterTerrorist, player => player.TeamNum == (int)CsTeam.CounterTerrorist },
14+
{ TargetFilter.Terrorist, player => player.TeamNum == (int)CsTeam.Terrorist },
15+
{ TargetFilter.Alive, player => player.TeamNum == (int)LifeState_t.LIFE_ALIVE },
16+
{ TargetFilter.Admin, player => AdminManager.PlayerHasPermissions(player, "@css/chat") },
17+
{ TargetFilter.Dead, player => player.LifeState == (int)LifeState_t.LIFE_DEAD },
18+
{ TargetFilter.Spec, player => player.TeamNum == (int)CsTeam.Spectator },
19+
};
20+
21+
private static readonly Dictionary<int, TargetFilter> TeamTargetFilter = new()
22+
{
23+
{(int) CsTeam.CounterTerrorist, TargetFilter.CounterTerrorist},
24+
{(int) CsTeam.Terrorist, TargetFilter.Terrorist},
25+
{(int) CsTeam.Spectator, TargetFilter.Spec},
26+
};
27+
928
public static List<CCSPlayerController> GetPlayerFromName(string name)
1029
{
1130
return Utilities.GetPlayers().FindAll(x => x.PlayerName.Contains(name, StringComparison.OrdinalIgnoreCase));
@@ -43,11 +62,20 @@ public static void PrintToCenterAll(string message)
4362
controller.PrintToCenter(message);
4463
});
4564
}
46-
}
4765

48-
internal enum TargetResult
49-
{
50-
None,
51-
Multiple,
52-
Single
53-
}
66+
public static void PrintToChatTeam(int team, string message)
67+
{
68+
Utilities.GetPlayers().FindAll(FilterPredicates[TeamTargetFilter[team]]).ForEach(controller =>
69+
{
70+
controller.PrintToChat(message);
71+
});
72+
}
73+
74+
public static void PrintToChatTeam(TargetFilter filter, string message)
75+
{
76+
Utilities.GetPlayers().FindAll(FilterPredicates[filter]).ForEach(controller =>
77+
{
78+
controller.PrintToChat(message);
79+
});
80+
}
81+
}

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
* `css_spec`
2727
* requires `@css/kick` flag
2828
* `css_say`
29+
* `@` (alias)
30+
* `@` (in team chat, admins only)
2931
* requires `@css/chat` flag
3032
* `css_psay`
3133
* requires `@css/chat` flag

0 commit comments

Comments
 (0)