diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 06ae769..69b5c6b 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -31,7 +31,7 @@ jobs:
post_webhook:
needs: build
runs-on: ubuntu-latest
- if: github.ref == 'refs/heads/aaaa'
+ if: github.ref == 'refs/heads/dev'
steps:
- name: POST Webhook
diff --git a/gitignore b/.gitignore
similarity index 88%
rename from gitignore
rename to .gitignore
index d3bf8e7..aad3b71 100644
--- a/gitignore
+++ b/.gitignore
@@ -1,12 +1,12 @@
-
-# Repository build files
-build/
-bin/
-obj/
-
-Debug/
-Release/
-
-# IDE files
-.idea/
-.vs/
+
+# Repository build files
+build/
+bin/
+obj/
+
+Debug/
+Release/
+
+# IDE files
+.idea/
+.vs/
diff --git a/TTT.ln.DotSettings b/TTT.ln.DotSettings
new file mode 100644
index 0000000..f239129
--- /dev/null
+++ b/TTT.ln.DotSettings
@@ -0,0 +1,95 @@
+
+ Built-in: Full Cleanup
+ public private override virtual file new abstract internal protected sealed static readonly extern unsafe volatile async required
+ Remove
+ 0
+ END_OF_LINE
+ END_OF_LINE
+ False
+ False
+ True
+ END_OF_LINE
+ END_OF_LINE
+ TOGETHER_SAME_LINE
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ INDENT
+ 2
+ END_OF_LINE
+ True
+ True
+ True
+ True
+ True
+ True
+ END_OF_LINE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ 10
+ 5
+ 5
+ 10
+ 5
+ COMPACT
+ END_OF_LINE
+ True
+ True
+ NEVER
+ NEVER
+ False
+ False
+ NEVER
+ False
+ False
+ NEVER
+ True
+ True
+ True
+ False
+ 2
+ END_OF_LINE
+ False
+ True
+ True
+ False
+ CHOP_IF_LONG
+ CHOP_IF_LONG
+ WRAP_IF_LONG
+ 80
+ WRAP_IF_LONG
+ True
+ API
+ IO
+ LG
+ LR
+ ST
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Private, ProtectedInternal, Internal, PrivateProtected" Description="Non-Public Methods"><ElementKinds><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy>
+ <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, Public, FileLocal" Description="Public Methods"><ElementKinds><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Parameters"><ElementKinds><Kind Name="PARAMETER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb"><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy></Policy>
+ <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Enum members"><ElementKinds><Kind Name="ENUM_MEMBER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ <Policy><Descriptor Staticness="Static" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Static readonly fields (not private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy>
+ True
+ True
+ True
+ True
+
+
+
+
+
\ No newline at end of file
diff --git a/a b/a
deleted file mode 100644
index 7898192..0000000
--- a/a
+++ /dev/null
@@ -1 +0,0 @@
-a
diff --git a/mod/TTT.Detective/DetectiveConfig.cs b/mod/TTT.Detective/DetectiveConfig.cs
index 04a1344..f91d36d 100644
--- a/mod/TTT.Detective/DetectiveConfig.cs
+++ b/mod/TTT.Detective/DetectiveConfig.cs
@@ -1,7 +1,5 @@
namespace TTT.Detective;
-public class DetectiveConfig
-{
- public bool DNAScannerEnabled { get; } = true;
-
+public class DetectiveConfig {
+ public bool DNAScannerEnabled { get; } = true;
}
\ No newline at end of file
diff --git a/mod/TTT.Detective/DetectiveManager.cs b/mod/TTT.Detective/DetectiveManager.cs
index f22acc3..92bdeda 100644
--- a/mod/TTT.Detective/DetectiveManager.cs
+++ b/mod/TTT.Detective/DetectiveManager.cs
@@ -1,9 +1,7 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
-using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
-using TTT.Player;
using TTT.Public.Behaviors;
using TTT.Public.Extensions;
using TTT.Public.Formatting;
@@ -13,135 +11,117 @@
namespace TTT.Detective;
-public class DetectiveManager(IPlayerService roleService) : IDetectiveService, IPluginBehavior
-{
- private const int TaserAmmoType = 18;
+public class DetectiveManager(IPlayerService roleService)
+ : IDetectiveService, IPluginBehavior {
+ private const int TaserAmmoType = 18;
- public void Start(BasePlugin parent)
- {
- parent.RegisterListener(() =>
- {
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsValid && player.IsReal())
- .Where(player => (player.Buttons & PlayerButtons.Use) != 0)) OnPlayerUse(player);
- });
+ public void Start(BasePlugin parent) {
+ parent.RegisterListener(() => {
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player => player is { IsValid: true, IsBot: false })
+ .Where(player => (player.Buttons & PlayerButtons.Use) != 0))
+ OnPlayerUse(player);
+ });
-
- VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnZeus, HookMode.Pre);
+ VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnZeus, HookMode.Pre);
+ }
+
+ public HookResult OnZeus(DynamicHook hook) {
+ var ent = hook.GetParam(0);
+
+ var playerWhoWasDamaged = player(ent);
+
+ if (playerWhoWasDamaged == null) return HookResult.Continue;
+
+ var info = hook.GetParam(1);
+
+ CCSPlayerController? attacker = null;
+
+ if (info.Attacker.Value != null) {
+ var playerWhoAttacked = info.Attacker.Value.As();
+
+ attacker = playerWhoAttacked.Controller.Value.As();
}
- public HookResult OnZeus(DynamicHook hook)
- {
- var ent = hook.GetParam(0);
+ if (info.BitsDamageType is not 256) return HookResult.Continue;
+ if (attacker == null) return HookResult.Continue;
- var playerWhoWasDamaged = player(ent);
+ info.Damage = 0;
- if (playerWhoWasDamaged == null) return HookResult.Continue;
+ var targetRole = roleService.GetPlayer(playerWhoWasDamaged);
- var info = hook.GetParam(1);
+ Server.NextFrame(() => {
+ attacker.PrintToChat(StringUtils.FormatTTT(
+ $"You tased player {playerWhoWasDamaged.PlayerName} they are a {targetRole.PlayerRole().FormatRoleFull()}"));
+ });
- CCSPlayerController? attacker = null;
+ return HookResult.Stop;
+ }
- if (info.Attacker.Value != null)
- {
- var playerWhoAttacked = info.Attacker.Value.As();
- attacker = playerWhoAttacked.Controller.Value.As();
+ private void OnPlayerUse(CCSPlayerController player) { IdentifyBody(player); }
- }
+ private void IdentifyBody(CCSPlayerController caller) {
+ //add states
- if (info.BitsDamageType is not 256) return HookResult.Continue;
- if (attacker == null) return HookResult.Continue;
+ if (roleService.GetPlayer(caller).PlayerRole() != Role.Detective) return;
- info.Damage = 0;
+ var entity = caller.GetClientRagdollAimTarget();
- var targetRole = roleService.GetPlayer(playerWhoWasDamaged);
+ if (entity == null) return;
- Server.NextFrame(() =>
- {
- attacker.PrintToChat(
- StringUtils.FormatTTT(
- $"You tased player {playerWhoWasDamaged.PlayerName} they are a {targetRole.PlayerRole().FormatRoleFull()}"));
- });
-
- return HookResult.Stop;
- }
+ if (entity.PawnIsAlive) return;
-
- private void OnPlayerUse(CCSPlayerController player)
- {
- IdentifyBody(player);
- }
+ var player = roleService.GetPlayer(entity);
- private void IdentifyBody(CCSPlayerController caller)
- {
- //add states
+ if (player.IsFound()) return;
- if (roleService.GetPlayer(caller).PlayerRole() != Role.Detective) return;
+ var killerEntity = player.Killer();
- var entity = caller.GetClientRagdollAimTarget();
+ string message;
- if (entity == null) return;
-
- if (entity.PawnIsAlive) return;
-
- var player = roleService.GetPlayer(entity);
+ var plr = player.Player();
+ if (plr == null) return;
- if (player.IsFound()) return;
-
- var killerEntity= player.Killer();
-
- string message;
+ if (killerEntity == null || !killerEntity.IsReal())
+ message = StringUtils.FormatTTT(player.PlayerRole()
+ .FormatStringFullAfter($"{plr.PlayerName} was killed by world"));
+ else
+ message = StringUtils.FormatTTT(
+ player.PlayerRole()
+ .FormatStringFullAfter($"{plr.PlayerName} was killed by ")
+ + roleService.GetPlayer(killerEntity)
+ .PlayerRole()
+ .FormatStringFullAfter(killerEntity.PlayerName));
- var plr = player.Player();
- if (plr == null) return;
- if (killerEntity == null || !killerEntity.IsReal())
- message = StringUtils.FormatTTT(player.PlayerRole()
- .FormatStringFullAfter($"{plr.PlayerName} was killed by world"));
- else
- message = StringUtils.FormatTTT(
- player.PlayerRole().FormatStringFullAfter($"{plr.PlayerName} was killed by ") +
- roleService.GetPlayer(killerEntity).PlayerRole().FormatStringFullAfter(killerEntity.PlayerName));
+ player.SetFound(true);
+ Server.NextFrame(() => { Server.PrintToChatAll(message); });
+ }
- player.SetFound(true);
-
- Server.NextFrame(() => { Server.PrintToChatAll(message); });
- }
-
- //to be moved to a utility class
- public static CCSPlayerController? player(CEntityInstance? instance)
- {
- if (instance == null)
- {
- return null;
- }
-
- if (instance.DesignerName != "player")
- {
- return null;
- }
-
- // grab the pawn index
- int player_index = (int)instance.Index;
-
- // grab player controller from pawn
- CCSPlayerPawn player_pawn = Utilities.GetEntityFromIndex(player_index);
-
- // pawn valid
- if (player_pawn == null || !player_pawn.IsValid)
- {
- return null;
- }
-
- // controller valid
- if (player_pawn.OriginalController == null || !player_pawn.OriginalController.IsValid)
- {
- return null;
- }
-
- // any further validity is up to the caller
- return player_pawn.OriginalController.Value;
- }
+ //to be moved to a utility class
+ public static CCSPlayerController? player(CEntityInstance? instance) {
+ if (instance == null) return null;
+
+ if (instance.DesignerName != "player") return null;
+
+ // grab the pawn index
+ var player_index = (int)instance.Index;
+
+ // grab player controller from pawn
+ var player_pawn = Utilities.GetEntityFromIndex(player_index);
+
+ // pawn valid
+ if (player_pawn == null || !player_pawn.IsValid) return null;
+
+ // controller valid
+ if (player_pawn.OriginalController == null
+ || !player_pawn.OriginalController.IsValid)
+ return null;
+
+ // any further validity is up to the caller
+ return player_pawn.OriginalController.Value;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Detective/DetectiveServiceExtension.cs b/mod/TTT.Detective/DetectiveServiceExtension.cs
index e13d267..a3ba82e 100644
--- a/mod/TTT.Detective/DetectiveServiceExtension.cs
+++ b/mod/TTT.Detective/DetectiveServiceExtension.cs
@@ -4,10 +4,8 @@
namespace TTT.Detective;
-public static class DetectiveServiceExtension
-{
- public static void AddDetectiveBehavior(this IServiceCollection collection)
- {
- collection.AddPluginBehavior();
- }
+public static class DetectiveServiceExtension {
+ public static void AddDetectiveBehavior(this IServiceCollection collection) {
+ collection.AddPluginBehavior();
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Detective/TTT.Detective.csproj b/mod/TTT.Detective/TTT.Detective.csproj
index cf4da7c..961cd21 100644
--- a/mod/TTT.Detective/TTT.Detective.csproj
+++ b/mod/TTT.Detective/TTT.Detective.csproj
@@ -1,11 +1,11 @@
-
- net8.0
- enable
- enable
- TTT.Detective
-
-
-
-
+
+ net8.0
+ enable
+ enable
+ TTT.Detective
+
+
+
+
\ No newline at end of file
diff --git a/mod/TTT.Logs/LogBehavior.cs b/mod/TTT.Logs/LogBehavior.cs
index f53703b..b3bfa85 100644
--- a/mod/TTT.Logs/LogBehavior.cs
+++ b/mod/TTT.Logs/LogBehavior.cs
@@ -1,9 +1,6 @@
-using System.Collections.Generic;
-using System.Linq;
-using CounterStrikeSharp.API;
+using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
-using TTT.Public.Action;
using TTT.Public.Behaviors;
using TTT.Public.Extensions;
using TTT.Public.Mod.Logs;
@@ -11,73 +8,49 @@
namespace TTT.Logs;
-public class LogBehavior : ILogService, IPluginBehavior
-{
- private int _round = 1;
-
- public void Start(BasePlugin plugin)
- {
- }
-
- [GameEventHandler]
- public HookResult OnRoundStart(EventRoundStart _, GameEventInfo __)
- {
- CreateRound(_round++);
- return HookResult.Continue;
- }
-
- [GameEventHandler]
- public HookResult OnRoundEnd(EventRoundEnd _, GameEventInfo __)
- {
- PrintLogs(_round);
- return HookResult.Continue;
- }
-
- private readonly Dictionary _logs = new();
-
- public int GetCurrentRound()
- {
- return _round;
- }
-
- public void AddLog(Action action)
- {
- _logs[_round].AddLog(action);
- }
+public class LogBehavior : ILogService, IPluginBehavior {
+ private readonly Dictionary _logs = new();
+ private int _round = 1;
- public bool PrintLogs(int round)
- {
- if (_logs.ContainsKey(round)) return false;
- foreach (var player in Utilities.GetPlayers().Where(plr => plr.IsReal()))
- {
- PrintToPlayer(player, round);
- }
-
- PrintToConsole(round);
- return true;
- }
+ public int GetCurrentRound() { return _round; }
- public bool PrintToPlayer(CCSPlayerController player, int round)
- {
- if (!_logs.ContainsKey(round)) return false;
- player.PrintToConsole(GetLogs(round).FormattedLogs());
- return true;
- }
+ public void AddLog(Action action) { _logs[_round].AddLog(action); }
- public bool PrintToConsole(int round)
- {
- if (!_logs.ContainsKey(round)) return false;
- Server.PrintToConsole(GetLogs(round).FormattedLogs());
- return true;
- }
+ public bool PrintLogs(int round) {
+ if (_logs.ContainsKey(round)) return false;
+ foreach (var player in Utilities.GetPlayers()) PrintToPlayer(player, round);
- public IRoundLogs GetLogs(int round)
- {
- return _logs[round];
- }
-
- public void CreateRound(int round)
- {
- _logs.Add(round, new RoundLog(round));
- }
+ PrintToConsole(round);
+ return true;
+ }
+
+ public bool PrintToPlayer(CCSPlayerController player, int round) {
+ if (!_logs.ContainsKey(round)) return false;
+ player.PrintToConsole(GetLogs(round).FormattedLogs());
+ return true;
+ }
+
+ public bool PrintToConsole(int round) {
+ if (!_logs.ContainsKey(round)) return false;
+ Server.PrintToConsole(GetLogs(round).FormattedLogs());
+ return true;
+ }
+
+ public IRoundLogs GetLogs(int round) { return _logs[round]; }
+
+ public void CreateRound(int round) { _logs.Add(round, new RoundLog(round)); }
+
+ public void Start(BasePlugin plugin) { }
+
+ [GameEventHandler]
+ public HookResult OnRoundStart(EventRoundStart _, GameEventInfo __) {
+ CreateRound(_round++);
+ return HookResult.Continue;
+ }
+
+ [GameEventHandler]
+ public HookResult OnRoundEnd(EventRoundEnd _, GameEventInfo __) {
+ PrintLogs(_round);
+ return HookResult.Continue;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Logs/LogServiceExtension.cs b/mod/TTT.Logs/LogServiceExtension.cs
index f7b3feb..55dc6b2 100644
--- a/mod/TTT.Logs/LogServiceExtension.cs
+++ b/mod/TTT.Logs/LogServiceExtension.cs
@@ -1,16 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
using TTT.Public.Extensions;
using TTT.Public.Mod.Logs;
-using TTT.Public.Mod.Role;
namespace TTT.Logs;
-public static class LogServiceExtension
-{
- public static void AddLogsService(this IServiceCollection collection)
- {
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- }
+public static class LogServiceExtension {
+ public static void AddLogsService(this IServiceCollection collection) {
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Logs/LogsCommand.cs b/mod/TTT.Logs/LogsCommand.cs
index 5e5458a..f5402fc 100644
--- a/mod/TTT.Logs/LogsCommand.cs
+++ b/mod/TTT.Logs/LogsCommand.cs
@@ -8,56 +8,51 @@
namespace TTT.Logs;
-public class LogsCommand(ILogService service) : IPluginBehavior
-{
- private readonly ILogService _service = service;
+public class LogsCommand(ILogService service) : IPluginBehavior {
+ private readonly ILogService _service = service;
- public void Start(BasePlugin plugin)
- {
-
+ public void Start(BasePlugin plugin) { }
+
+ [ConsoleCommand("css_logs", "Prints logs to console")]
+ [CommandHelper(0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
+ public void Command_Logs(CCSPlayerController? executor, CommandInfo info) {
+ if (!AdminManager.PlayerHasPermissions(executor, "@css/kick")) {
+ info.ReplyToCommand(
+ StringUtils.FormatTTT(
+ "You do not have permission to execute this command"));
+ return;
+ }
+
+ var roundIdString = info.GetArg(1);
+
+ var roundId = service.GetCurrentRound();
+
+ if (string.IsNullOrEmpty(roundIdString)
+ && !int.TryParse(roundIdString, out roundId)) {
+ info.ReplyToCommand(
+ StringUtils.FormatTTT("Invalid round id, /logs "));
+ return;
}
-
- [ConsoleCommand("css_logs", "Prints logs to console")]
- [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
- public void Command_Logs(CCSPlayerController? executor, CommandInfo info)
- {
-
- if (!AdminManager.PlayerHasPermissions(executor, "@css/kick"))
- {
- info.ReplyToCommand(StringUtils.FormatTTT("You do not have permission to execute this command"));
- return;
- }
-
- var roundIdString = info.GetArg(1);
-
- var roundId = service.GetCurrentRound();
-
- if (string.IsNullOrEmpty(roundIdString) && !int.TryParse(roundIdString, out roundId))
- {
- info.ReplyToCommand(StringUtils.FormatTTT("Invalid round id, /logs "));
- return;
- }
-
- if (roundId <= 0)
- {
- info.ReplyToCommand( StringUtils.FormatTTT("Invalid round id"));
- return;
- }
-
- if (executor == null)
- {
- if (!service.PrintToConsole(roundId)) info.ReplyToCommand(StringUtils.FormatTTT("No logs found for round " + roundId));
- return;
- }
-
- if (!AdminManager.PlayerHasPermissions(executor, "@css/kick"))
- {
- info.ReplyToCommand("You do not have permission to execute this command");
- return;
- }
-
- info.ReplyToCommand(!service.PrintToPlayer(executor, roundId)
- ? StringUtils.FormatTTT("No logs found for round " + roundId)
- : StringUtils.FormatTTT("Logs printed to console"));
+
+ if (roundId <= 0) {
+ info.ReplyToCommand(StringUtils.FormatTTT("Invalid round id"));
+ return;
}
-}
+
+ if (executor == null) {
+ if (!service.PrintToConsole(roundId))
+ info.ReplyToCommand(
+ StringUtils.FormatTTT("No logs found for round " + roundId));
+ return;
+ }
+
+ if (!AdminManager.PlayerHasPermissions(executor, "@css/kick")) {
+ info.ReplyToCommand("You do not have permission to execute this command");
+ return;
+ }
+
+ info.ReplyToCommand(!service.PrintToPlayer(executor, roundId) ?
+ StringUtils.FormatTTT("No logs found for round " + roundId) :
+ StringUtils.FormatTTT("Logs printed to console"));
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Logs/LogsListener.cs b/mod/TTT.Logs/LogsListener.cs
index a59382e..16ae271 100644
--- a/mod/TTT.Logs/LogsListener.cs
+++ b/mod/TTT.Logs/LogsListener.cs
@@ -1,5 +1,4 @@
-using System;
-using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using TTT.Public.Action;
using TTT.Public.Behaviors;
@@ -10,49 +9,50 @@
namespace TTT.Logs;
-public class LogsListener(ILogService logService, IPlayerService playerService) : IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
-
- }
-
- [GameEventHandler]
- public HookResult OnPlayerDamage(EventPlayerHurt @event, GameEventInfo info)
- {
- var attackedPlayer = @event.Userid;
-
- if (attackedPlayer == null || !attackedPlayer.IsReal()) return HookResult.Continue;
-
- var attackedRole = playerService.GetPlayer(attackedPlayer).PlayerRole();
-
- var attacker = @event.Attacker == null ? null : new Tuple(@event.Attacker, playerService.GetPlayer(@event.Attacker).PlayerRole());
-
- logService.AddLog(new DamageAction(attacker,new Tuple(attackedPlayer, attackedRole), @event.DmgHealth, ServerExtensions.GetGameRules().RoundTime));
-
- return HookResult.Continue;
- }
-
- [GameEventHandler]
- public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
- {
- var killedPlayer = @event.Userid;
- var killer = @event.Attacker;
-
- if (killedPlayer == null || !killedPlayer.IsReal()) return HookResult.Continue;
-
- var killedRole = playerService.GetPlayer(killedPlayer).PlayerRole();
-
- if (killer == null || !killer.IsReal())
- {
- logService.AddLog(new DeathAction(new Tuple(killedPlayer, killedRole)));
- return HookResult.Continue;
- }
-
- var killerRole = playerService.GetPlayer(killer).PlayerRole();
-
- logService.AddLog(new KillAction(new Tuple(killedPlayer, killedRole),
- new Tuple(killer, killerRole)));
- return HookResult.Continue;
+public class LogsListener(ILogService logService, IPlayerService playerService)
+ : IPluginBehavior {
+ public void Start(BasePlugin plugin) { }
+
+ [GameEventHandler]
+ public HookResult OnPlayerDamage(EventPlayerHurt @event, GameEventInfo info) {
+ var attackedPlayer = @event.Userid;
+
+ if (attackedPlayer == null) return HookResult.Continue;
+
+ var attackedRole = playerService.GetPlayer(attackedPlayer).PlayerRole();
+
+ var attacker = @event.Attacker == null ?
+ null :
+ new Tuple(@event.Attacker,
+ playerService.GetPlayer(@event.Attacker).PlayerRole());
+
+ logService.AddLog(new DamageAction(attacker,
+ new Tuple(attackedPlayer, attackedRole),
+ @event.DmgHealth, ServerExtensions.GetGameRules().RoundTime));
+
+ return HookResult.Continue;
+ }
+
+ [GameEventHandler]
+ public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
+ var killedPlayer = @event.Userid;
+ var killer = @event.Attacker;
+
+ if (killedPlayer == null) return HookResult.Continue;
+
+ var killedRole = playerService.GetPlayer(killedPlayer).PlayerRole();
+
+ if (killer == null) {
+ logService.AddLog(new DeathAction(
+ new Tuple(killedPlayer, killedRole)));
+ return HookResult.Continue;
}
+
+ var killerRole = playerService.GetPlayer(killer).PlayerRole();
+
+ logService.AddLog(new KillAction(
+ new Tuple(killedPlayer, killedRole),
+ new Tuple(killer, killerRole)));
+ return HookResult.Continue;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Logs/RoundLog.cs b/mod/TTT.Logs/RoundLog.cs
index dcecb1e..a190563 100644
--- a/mod/TTT.Logs/RoundLog.cs
+++ b/mod/TTT.Logs/RoundLog.cs
@@ -1,45 +1,29 @@
-using System.Collections.Generic;
-using System.Text;
-using TTT.Public.Action;
+using System.Text;
using TTT.Public.Mod.Logs;
using Action = TTT.Public.Action.Action;
namespace TTT.Logs;
-public class RoundLog : IRoundLogs
-{
- private readonly List _logs = [];
- private readonly int _roundId;
-
- public RoundLog(int roundId)
- {
- _roundId = roundId;
- }
-
- public IList GetLogs()
- {
- return _logs;
- }
-
- public void AddLog(Action action)
- {
- _logs.Add(action);
- }
-
- public void RemoveLog(Action action)
- {
- _logs.Remove(action);
- }
-
- public string FormattedLogs()
- {
- var builder = new StringBuilder();
- builder.AppendLine($"[TTT] Logs round {_roundId}");
-
- foreach (var action in _logs) builder.AppendLine(action.ActionMessage());
-
- builder.AppendLine("[TTT] Logs ended!");
-
- return builder.ToString();
- }
+public class RoundLog : IRoundLogs {
+ private readonly List _logs = [];
+ private readonly int _roundId;
+
+ public RoundLog(int roundId) { _roundId = roundId; }
+
+ public IList GetLogs() { return _logs; }
+
+ public void AddLog(Action action) { _logs.Add(action); }
+
+ public void RemoveLog(Action action) { _logs.Remove(action); }
+
+ public string FormattedLogs() {
+ var builder = new StringBuilder();
+ builder.AppendLine($"[TTT] Logs round {_roundId}");
+
+ foreach (var action in _logs) builder.AppendLine(action.ActionMessage());
+
+ builder.AppendLine("[TTT] Logs ended!");
+
+ return builder.ToString();
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Logs/TTT.Logs.csproj b/mod/TTT.Logs/TTT.Logs.csproj
index ca14336..fc5f91b 100644
--- a/mod/TTT.Logs/TTT.Logs.csproj
+++ b/mod/TTT.Logs/TTT.Logs.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/mod/TTT.Manager/ChatManager.cs b/mod/TTT.Manager/ChatManager.cs
index c34d37c..5b5b51f 100644
--- a/mod/TTT.Manager/ChatManager.cs
+++ b/mod/TTT.Manager/ChatManager.cs
@@ -1,52 +1,42 @@
-using System;
-using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Utils;
using TTT.Public.Behaviors;
using TTT.Public.Mod.Role;
-using TTT.Public.Player;
namespace TTT.Manager;
-public class ChatManager(IRoleService roleService) : IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
- plugin.AddCommandListener("say_team", OnSayTeam);
- }
-
- private HookResult OnSayTeam(CCSPlayerController? caller, CommandInfo info)
- {
- if (caller == null || !caller.IsValid) return HookResult.Continue;
- var role = roleService.GetRole(caller);
- switch (role)
- {
- case Role.Innocent:
- return HookResult.Stop;
- case Role.Detective:
- {
- var message = $" {ChatColors.DarkBlue} DETECTIVE {caller.PlayerName} {info.GetArg(1)}";
- foreach (var player in roleService.GetDetectives())
- {
- player.PrintToChat(message);
- }
- break;
- }
- case Role.Traitor:
- {
- var message = $" {ChatColors.DarkRed} TRAITOR {caller.PlayerName} {info.GetArg(1)}";
- foreach (var player in roleService.GetTraitors())
- {
- player.PrintToChat(message);
- }
- break;
- }
- case Role.Unassigned:
- return HookResult.Continue;
- default:
- throw new ArgumentOutOfRangeException();
- }
+public class ChatManager(IRoleService roleService) : IPluginBehavior {
+ public void Start(BasePlugin plugin) {
+ plugin.AddCommandListener("say_team", OnSayTeam);
+ }
- return HookResult.Handled;
+ private HookResult OnSayTeam(CCSPlayerController? caller, CommandInfo info) {
+ if (caller == null || !caller.IsValid) return HookResult.Continue;
+ var role = roleService.GetRole(caller);
+ switch (role) {
+ case Role.Innocent:
+ return HookResult.Stop;
+ case Role.Detective: {
+ var message =
+ $" {ChatColors.DarkBlue} DETECTIVE {caller.PlayerName} {info.GetArg(1)}";
+ foreach (var player in roleService.GetDetectives())
+ player.PrintToChat(message);
+ break;
+ }
+ case Role.Traitor: {
+ var message =
+ $" {ChatColors.DarkRed} TRAITOR {caller.PlayerName} {info.GetArg(1)}";
+ foreach (var player in roleService.GetTraitors())
+ player.PrintToChat(message);
+ break;
+ }
+ case Role.Unassigned:
+ return HookResult.Continue;
+ default:
+ throw new ArgumentOutOfRangeException();
}
+
+ return HookResult.Handled;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Manager/InfoManager.cs b/mod/TTT.Manager/InfoManager.cs
index 1866918..8a8f849 100644
--- a/mod/TTT.Manager/InfoManager.cs
+++ b/mod/TTT.Manager/InfoManager.cs
@@ -1,154 +1,146 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using CounterStrikeSharp.API;
+using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Memory;
-using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
-using CounterStrikeSharp.API.Modules.Utils;
-using TTT.Player;
using TTT.Public.Behaviors;
using TTT.Public.Extensions;
using TTT.Public.Formatting;
using TTT.Public.Mod.Role;
using TTT.Public.Mod.Round;
using TTT.Public.Player;
-using TTT.Round;
-using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace TTT.Manager;
-public class InfoManager : IPluginBehavior
-{
- private readonly Dictionary> _playerLookAtRole = new();
- private readonly IPlayerService _playerService;
- private readonly IRoundService _manager;
- private readonly Dictionary> _spectatorLookAtRole = new();
-
- public InfoManager(IPlayerService playerService, IRoleService manager)
- {
- _playerService = playerService;
- _manager = manager.GetRoundService();
- }
-
- public void Start(BasePlugin plugin)
- {
- plugin.RegisterListener(OnTick);
- plugin.AddTimer(0.1f, OnTickAll, TimerFlags.REPEAT);
- }
+public class InfoManager : IPluginBehavior {
+ private readonly IRoundService _manager;
- public void Reset()
- {
- _playerLookAtRole.Clear();
- _spectatorLookAtRole.Clear();
- }
-
- public void RegisterLookAtRole(CCSPlayerController player, Tuple role)
- {
- _playerLookAtRole.TryAdd(player, role);
- }
+ private readonly
+ Dictionary>
+ _playerLookAtRole = new();
- public void RemoveLookAtRole(CCSPlayerController player)
- {
- _playerLookAtRole.Remove(player);
- }
+ private readonly IPlayerService _playerService;
- public void OnTick()
- {
- foreach (var gamePlayer in _playerService.Players())
- {
- if (_manager.GetRoundStatus() != RoundStatus.Started) return;
+ private readonly Dictionary>
+ _spectatorLookAtRole = new();
- var player = gamePlayer.Player();
+ public InfoManager(IPlayerService playerService, IRoleService manager) {
+ _playerService = playerService;
+ _manager = manager.GetRoundService();
+ }
- if (player == null) continue;
- if (!player.IsReal()) continue;
+ public void Start(BasePlugin plugin) {
+ plugin.RegisterListener(OnTick);
+ plugin.AddTimer(0.1f, OnTickAll, TimerFlags.REPEAT);
+ }
- var playerRole = gamePlayer.PlayerRole();
+ public void Reset() {
+ _playerLookAtRole.Clear();
+ _spectatorLookAtRole.Clear();
+ }
- if (playerRole == Role.Unassigned) continue;
+ public void RegisterLookAtRole(CCSPlayerController player,
+ Tuple role) {
+ _playerLookAtRole.TryAdd(player, role);
+ }
- if (!player.PawnIsAlive) continue;
+ public void RemoveLookAtRole(CCSPlayerController player) {
+ _playerLookAtRole.Remove(player);
+ }
- if (!_playerLookAtRole.TryGetValue(player, out var value))
- {
- Server.NextFrame(() =>
- player.PrintToCenterHtml(
- $"Your Role: {playerRole.GetCenterRole()}"));
- continue;
- }
+ public void OnTick() {
+ foreach (var gamePlayer in _playerService.Players()) {
+ if (_manager.GetRoundStatus() != RoundStatus.Started) return;
- if (!value.Item1.IsReal()) continue;
+ var player = gamePlayer.Player();
- if (!value.Item1.PawnIsAlive) HandleDeadTarget(player, playerRole, value.Item1, value.Item2);
- else HandleAliveTarget(player, playerRole, value.Item1, value.Item2);
- }
- }
+ if (player == null) continue;
+ if (!player.IsReal()) continue;
- public void HandleDeadTarget(CCSPlayerController player, Role playerRole, CCSPlayerController target, Role targetRole)
- {
- Server.NextFrame(() => player.PrintToCenterHtml(
- $"Your Role: {playerRole.GetCenterRole()}
"
- + $"{target.PlayerName}'s Corpse
"
- + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
- }
+ var playerRole = gamePlayer.PlayerRole();
+
+ if (playerRole == Role.Unassigned) continue;
+
+ if (!player.PawnIsAlive) continue;
+
+ if (!_playerLookAtRole.TryGetValue(player, out var value)) {
+ Server.NextFrame(()
+ => player.PrintToCenterHtml(
+ $"Your Role: {playerRole.GetCenterRole()}"));
+ continue;
+ }
+
+ if (!value.Item1.IsReal()) continue;
- public void HandleAliveTarget(CCSPlayerController player, Role playerRole, CCSPlayerController target, Role targetRole)
- {
- switch (targetRole)
- {
- case Role.Detective:
- Server.NextFrame(() => player.PrintToCenterHtml(
- $"Your Role: {playerRole.GetCenterRole()}
"
- + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
- return;
- case Role.Traitor when playerRole == Role.Traitor:
- Server.NextFrame(() => player.PrintToCenterHtml(
- $"Your Role: {playerRole.GetCenterRole()}
"
- + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
- return;
- default:
- Server.NextFrame(() => player.PrintToCenterHtml(
- $"Your Role: {playerRole.GetCenterRole()}
"
- + $"{target.PlayerName}'s Role: {Role.Unassigned.GetCenterRole()}"));
- break;
- }
+ if (!value.Item1.PawnIsAlive)
+ HandleDeadTarget(player, playerRole, value.Item1, value.Item2);
+ else
+ HandleAliveTarget(player, playerRole, value.Item1, value.Item2);
}
-
- public void OnTickAll()
- {
- var players = _playerService.Players().Select(plr => plr.Player());
-
- _playerLookAtRole.Clear();
-
- foreach (var player in players)
- {
- if (player == null) continue;
- if (!player.IsReal()) continue;
-
- var target = player.GetClientPlayerAimTarget();
-
- if (target == null) continue;
- if (!target.IsReal()) continue;
-
- RegisterLookAtRole(player, new Tuple(target, _playerService.GetPlayer(target).PlayerRole()));
- }
+ }
+
+ public void
+ HandleDeadTarget(CCSPlayerController player, Role playerRole,
+ CCSPlayerController target, Role targetRole) {
+ Server.NextFrame(() => player.PrintToCenterHtml(
+ $"Your Role: {playerRole.GetCenterRole()}
"
+ + $"{target.PlayerName}'s Corpse
"
+ + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
+ }
+
+ public void HandleAliveTarget(CCSPlayerController player, Role playerRole,
+ CCSPlayerController target, Role targetRole) {
+ switch (targetRole) {
+ case Role.Detective:
+ Server.NextFrame(() => player.PrintToCenterHtml(
+ $"Your Role: {playerRole.GetCenterRole()}
"
+ + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
+ return;
+ case Role.Traitor when playerRole == Role.Traitor:
+ Server.NextFrame(() => player.PrintToCenterHtml(
+ $"Your Role: {playerRole.GetCenterRole()}
"
+ + $"{target.PlayerName}'s Role: {targetRole.GetCenterRole()}"));
+ return;
+ default:
+ Server.NextFrame(() => player.PrintToCenterHtml(
+ $"Your Role: {playerRole.GetCenterRole()}
"
+ + $"{target.PlayerName}'s Role: {Role.Unassigned.GetCenterRole()}"));
+ break;
}
+ }
+
+ public void OnTickAll() {
+ var players = _playerService.Players().Select(plr => plr.Player());
+
+ _playerLookAtRole.Clear();
+
+ foreach (var player in players) {
+ if (player == null) continue;
+ if (!player.IsReal()) continue;
- [GameEventHandler]
- private HookResult OnPlayerSpectateChange(EventSpecTargetUpdated @event, GameEventInfo info)
- {
- var player = @event.Userid;
- var target = new CCSPlayerController(@event.Target);
-
- if (!player.IsReal() || !target.IsReal()) return HookResult.Continue;
-
- _spectatorLookAtRole.TryAdd(player, new Tuple(target.PlayerName, _playerService.GetPlayer(target).PlayerRole()));
-
- return HookResult.Continue;
+ var target = player.GetClientPlayerAimTarget();
+
+ if (target == null) continue;
+ if (!target.IsReal()) continue;
+
+ RegisterLookAtRole(player,
+ new Tuple(target,
+ _playerService.GetPlayer(target).PlayerRole()));
}
+ }
+
+ [GameEventHandler]
+ private HookResult OnPlayerSpectateChange(EventSpecTargetUpdated @event,
+ GameEventInfo info) {
+ var player = @event.Userid;
+ var target = new CCSPlayerController(@event.Target);
+
+ if (player == null || !player.IsReal() || !target.IsReal())
+ return HookResult.Continue;
+
+ _spectatorLookAtRole.TryAdd(player,
+ new Tuple(target.PlayerName,
+ _playerService.GetPlayer(target).PlayerRole()));
+
+ return HookResult.Continue;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Manager/ManagerServiceExtension.cs b/mod/TTT.Manager/ManagerServiceExtension.cs
index 73c6d15..cdafe34 100644
--- a/mod/TTT.Manager/ManagerServiceExtension.cs
+++ b/mod/TTT.Manager/ManagerServiceExtension.cs
@@ -4,13 +4,11 @@
namespace TTT.Manager;
-public static class ManagerServiceExtension
-{
- public static void AddManagerService(this IServiceCollection collection)
- {
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- }
+public static class ManagerServiceExtension {
+ public static void AddManagerService(this IServiceCollection collection) {
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Manager/MuteManager.cs b/mod/TTT.Manager/MuteManager.cs
index e602e1c..eff8794 100644
--- a/mod/TTT.Manager/MuteManager.cs
+++ b/mod/TTT.Manager/MuteManager.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using CounterStrikeSharp.API;
+using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Admin;
@@ -10,95 +9,77 @@
namespace TTT.Manager;
-public class MuteManager : IMuteService, IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
- plugin.RegisterListener(OnPlayerSpeak);
- }
+public class MuteManager : IMuteService, IPluginBehavior {
+ public void Mute(CCSPlayerController player) {
+ if (BypassMute(player)) return;
- [GameEventHandler]
- public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
- {
- if (@event.Userid == null) return HookResult.Continue;
- Mute(@event.Userid);
- return HookResult.Continue;
- }
-
- [GameEventHandler]
- public HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
- {
- UnMuteAll();
- return HookResult.Continue;
- }
-
- public void Mute(CCSPlayerController player)
- {
- if (BypassMute(player))
- return;
-
- player.VoiceFlags |= VoiceFlags.Muted;
- }
+ player.VoiceFlags |= VoiceFlags.Muted;
+ }
- public void UnMute(CCSPlayerController player)
- {
- player.VoiceFlags &= ~VoiceFlags.Muted;
- }
-
- public void UnMuteAll()
- {
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal() && player.Team == CsTeam.Terrorist))
- {
- UnMute(player);
- }
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal() && player.Team == CsTeam.CounterTerrorist))
- {
- UnMute(player);
- }
- }
+ public void UnMute(CCSPlayerController player) {
+ player.VoiceFlags &= ~VoiceFlags.Muted;
+ }
- public void MuteAll()
- {
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal() && player.Team == CsTeam.Terrorist))
- {
- Mute(player);
- }
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal() && player.Team == CsTeam.CounterTerrorist))
- {
- Mute(player);
- }
- }
+ public void UnMuteAll() {
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player => player.IsReal() && player.Team == CsTeam.Terrorist))
+ UnMute(player);
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player
+ => player.IsReal() && player.Team == CsTeam.CounterTerrorist))
+ UnMute(player);
+ }
- private void OnPlayerSpeak(int playerSlot)
- {
- var player = Utilities.GetPlayerFromSlot(playerSlot);
- if (!player.IsReal())
- return;
+ public void MuteAll() {
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player => player.IsReal() && player.Team == CsTeam.Terrorist))
+ Mute(player);
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player
+ => player.IsReal() && player.Team == CsTeam.CounterTerrorist))
+ Mute(player);
+ }
- if (!player.PawnIsAlive && !BypassMute(player))
- {
- // Normal players can't speak when dead
- Mute(player);
- Server.NextFrame(() => player.PrintToCenter("You are dead and muted!"));
- return;
- }
+ public void Start(BasePlugin plugin) {
+ plugin.RegisterListener(OnPlayerSpeak);
+ }
- if (IsMuted(player))
- {
- Server.NextFrame(() => player.PrintToCenter("You are muted!"));
- return;
- }
- }
-
- private bool IsMuted(CCSPlayerController player)
- {
- if (!player.IsReal())
- return false;
- return (player.VoiceFlags & VoiceFlags.Muted) != 0;
+ [GameEventHandler]
+ public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
+ if (@event.Userid == null) return HookResult.Continue;
+ Mute(@event.Userid);
+ return HookResult.Continue;
+ }
+
+ [GameEventHandler]
+ public HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info) {
+ UnMuteAll();
+ return HookResult.Continue;
+ }
+
+ private void OnPlayerSpeak(int playerSlot) {
+ var player = Utilities.GetPlayerFromSlot(playerSlot);
+ if (!player.IsReal()) return;
+
+ if (!player.PawnIsAlive && !BypassMute(player)) {
+ // Normal players can't speak when dead
+ Mute(player);
+ Server.NextFrame(() => player.PrintToCenter("You are dead and muted!"));
+ return;
}
- private bool BypassMute(CCSPlayerController player)
- {
- return player.IsReal() && AdminManager.PlayerHasPermissions(player, "@css/chat");
+ if (IsMuted(player)) {
+ Server.NextFrame(() => player.PrintToCenter("You are muted!"));
}
+ }
+
+ private bool IsMuted(CCSPlayerController player) {
+ if (!player.IsReal()) return false;
+ return (player.VoiceFlags & VoiceFlags.Muted) != 0;
+ }
+
+ private bool BypassMute(CCSPlayerController player) {
+ return player.IsReal()
+ && AdminManager.PlayerHasPermissions(player, "@css/chat");
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Manager/TTT.Manager.csproj b/mod/TTT.Manager/TTT.Manager.csproj
index d0b8182..72ebcba 100644
--- a/mod/TTT.Manager/TTT.Manager.csproj
+++ b/mod/TTT.Manager/TTT.Manager.csproj
@@ -7,6 +7,6 @@
-
+
diff --git a/mod/TTT.Manager/TraitorRoom.cs b/mod/TTT.Manager/TraitorRoom.cs
index 2ef1705..c82ec0d 100644
--- a/mod/TTT.Manager/TraitorRoom.cs
+++ b/mod/TTT.Manager/TraitorRoom.cs
@@ -6,39 +6,33 @@
namespace TTT.Manager;
-public class TraitorRoom(IPlayerService service) : IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
- plugin.AddTimer(0.1f, () =>
- {
- foreach (var plr in Utilities.GetPlayers().Where(player => player.IsReal()))
- {
- OpenTraitorRoom(plr);
- }
- });
+public class TraitorRoom(IPlayerService service) : IPluginBehavior {
+ public void Start(BasePlugin plugin) {
+ plugin.AddTimer(0.1f, () => {
+ foreach (var plr in Utilities.GetPlayers()
+ .Where(player => player.IsReal()))
+ OpenTraitorRoom(plr);
+ });
+ }
+
+
+ public void OpenTraitorRoom(CCSPlayerController player) {
+ if ((player.Buttons & PlayerButtons.Use) == 0) return;
+
+ var traitorRoom = player.GetClientPlayerTraitorRoom();
+
+ if (traitorRoom == null) {
+ Server.NextFrame(() => player.PrintToCenter("No door has been found!"));
+ return;
}
-
-
- public void OpenTraitorRoom(CCSPlayerController player)
- {
- if ((player.Buttons & PlayerButtons.Use) == 0) return;
-
- var traitorRoom = player.GetClientPlayerTraitorRoom();
-
- if (traitorRoom == null)
- {
- Server.NextFrame(() => player.PrintToCenter("No door has been found!"));
- return;
- }
-
- if (traitorRoom.Globalname is not "traitor_door")
- {
- Server.NextFrame(() => player.PrintToCenter("Door is not a traitor room!"));
- return;
- }
-
- traitorRoom.AcceptInput("Open");
- Server.NextFrame(() => player.PrintToCenter("Found traitor room!"));
+
+ if (traitorRoom.Globalname is not "traitor_door") {
+ Server.NextFrame(
+ () => player.PrintToCenter("Door is not a traitor room!"));
+ return;
}
+
+ traitorRoom.AcceptInput("Open");
+ Server.NextFrame(() => player.PrintToCenter("Found traitor room!"));
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Player/AntiBlockManager.cs b/mod/TTT.Player/AntiBlockManager.cs
index 14dc7d3..9cf2f9c 100644
--- a/mod/TTT.Player/AntiBlockManager.cs
+++ b/mod/TTT.Player/AntiBlockManager.cs
@@ -11,62 +11,56 @@
namespace TTT.Player;
-public class AntiBlockManager : IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
- }
+public class AntiBlockManager : IPluginBehavior {
+ private readonly WIN_LINUX OnCollisionRulesChangedOffset = new(173, 172);
- [GameEventHandler]
- private HookResult Event_PlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
- {
- if (!@event.Userid.IsValid) return HookResult.Continue;
+ public void Start(BasePlugin plugin) { }
- var player = @event.Userid;
+ [GameEventHandler]
+ private HookResult Event_PlayerSpawn(EventPlayerSpawn @event,
+ GameEventInfo info) {
+ if (!@event.Userid.IsValid) return HookResult.Continue;
- if (!player.IsReal()) return HookResult.Continue;
+ var player = @event.Userid;
- if (!player.PlayerPawn.IsValid) return HookResult.Continue;
+ if (!player.PlayerPawn.IsValid) return HookResult.Continue;
- var pawn = player.PlayerPawn;
+ var pawn = player.PlayerPawn;
- Server.NextFrame(() => PlayerSpawnNextFrame(player, pawn));
+ Server.NextFrame(() => PlayerSpawnNextFrame(player, pawn));
- return HookResult.Continue;
- }
+ return HookResult.Continue;
+ }
- private readonly WIN_LINUX OnCollisionRulesChangedOffset = new(173, 172);
+ private void PlayerSpawnNextFrame(CCSPlayerController player,
+ CHandle pawn) {
+ pawn.Value.Collision.CollisionGroup =
+ (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
- private void PlayerSpawnNextFrame(CCSPlayerController player, CHandle pawn)
- {
- pawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
+ pawn.Value.Collision.CollisionAttribute.CollisionGroup =
+ (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
- pawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
+ var collisionRulesChanged = new VirtualFunctionVoid(pawn.Value.Handle,
+ OnCollisionRulesChangedOffset.Get());
- var collisionRulesChanged =
- new VirtualFunctionVoid(pawn.Value.Handle, OnCollisionRulesChangedOffset.Get());
+ collisionRulesChanged.Invoke(pawn.Value.Handle);
+ }
- collisionRulesChanged.Invoke(pawn.Value.Handle);
+ public class WIN_LINUX {
+ public WIN_LINUX(T windows, T linux) {
+ Windows = windows;
+ Linux = linux;
}
-
- public class WIN_LINUX
- {
- [JsonPropertyName("Windows")] public T Windows { get; private set; }
-
- [JsonPropertyName("Linux")] public T Linux { get; private set; }
-
- public WIN_LINUX(T windows, T linux)
- {
- Windows = windows;
- Linux = linux;
- }
-
- public T Get()
- {
- if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- return Windows;
- else
- return Linux;
- }
+
+ [JsonPropertyName("Windows")]
+ public T Windows { get; }
+
+ [JsonPropertyName("Linux")]
+ public T Linux { get; }
+
+ public T Get() {
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return Windows;
+ return Linux;
}
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Player/CreditManager.cs b/mod/TTT.Player/CreditManager.cs
index b694b93..2d5c17b 100644
--- a/mod/TTT.Player/CreditManager.cs
+++ b/mod/TTT.Player/CreditManager.cs
@@ -1,49 +1,40 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using TTT.Public.Behaviors;
-using TTT.Public.Extensions;
using TTT.Public.Mod.Role;
using TTT.Public.Player;
namespace TTT.Roles.Shop;
-public class CreditManager(IPlayerService playerService) : IPluginBehavior
-{
+public class CreditManager(IPlayerService playerService) : IPluginBehavior {
+ public void Start(BasePlugin plugin) { }
- public void Start(BasePlugin plugin)
- {
-
+
+ [GameEventHandler]
+ public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
+ var attacker = @event.Attacker;
+ var victim = @event.Userid;
+
+ if (attacker == null || victim == null) return HookResult.Continue;
+ if (attacker == victim) return HookResult.Continue;
+
+ var attackerPlayer = playerService.GetPlayer(attacker);
+ var victimPlayer = playerService.GetPlayer(victim);
+
+ if (attackerPlayer.PlayerRole() == Role.Traitor
+ && victimPlayer.PlayerRole() != Role.Traitor) {
+ attackerPlayer.AddCredits(250);
+ return HookResult.Continue;
}
-
-
- [GameEventHandler]
- public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
- {
- var attacker = @event.Attacker;
- var victim = @event.Userid;
-
- if (attacker == null || victim == null) return HookResult.Continue;
- if (attacker == victim) return HookResult.Continue;
-
- var attackerPlayer = playerService.GetPlayer(attacker);
- var victimPlayer = playerService.GetPlayer(victim);
-
- if (attackerPlayer.PlayerRole() == Role.Traitor && victimPlayer.PlayerRole() != Role.Traitor)
- {
- attackerPlayer.AddCredits(250);
- return HookResult.Continue;
- }
-
- if (attackerPlayer.PlayerRole() != Role.Traitor && victimPlayer.PlayerRole() == Role.Traitor)
- {
- attackerPlayer.AddCredits(250);
- return HookResult.Continue;
- }
-
- attackerPlayer.RemoveCredits(100);
-
- return HookResult.Continue;
+
+ if (attackerPlayer.PlayerRole() != Role.Traitor
+ && victimPlayer.PlayerRole() == Role.Traitor) {
+ attackerPlayer.AddCredits(250);
+ return HookResult.Continue;
}
-
+ attackerPlayer.RemoveCredits(100);
+
+ return HookResult.Continue;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Player/KarmaManager.cs b/mod/TTT.Player/KarmaManager.cs
index c5b9517..a58d35e 100644
--- a/mod/TTT.Player/KarmaManager.cs
+++ b/mod/TTT.Player/KarmaManager.cs
@@ -7,37 +7,29 @@
namespace TTT.Player;
-public class KarmaManager(IPlayerService playerService) : IPluginBehavior
-{
- public void Start(BasePlugin plugin)
- {
-
- }
-
- [GameEventHandler]
- public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
- {
- var killedPlayer = @event.Userid;
- var killer = @event.Attacker;
- if (killedPlayer == null || !killedPlayer.IsReal()) return HookResult.Continue;
- if (killer == null || !killer.IsReal()) return HookResult.Continue;
-
- var gpKiller = playerService.GetPlayer(killer);
- var gpKilled = playerService.GetPlayer(killedPlayer);
-
- var killerRole = gpKiller.PlayerRole();
- var killedRole = gpKilled.PlayerRole();
+public class KarmaManager(IPlayerService playerService) : IPluginBehavior {
+ public void Start(BasePlugin plugin) { }
+
+ [GameEventHandler]
+ public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
+ var killedPlayer = @event.Userid;
+ var killer = @event.Attacker;
+ if (killedPlayer == null || !killedPlayer.IsReal())
+ return HookResult.Continue;
+ if (killer == null || !killer.IsReal()) return HookResult.Continue;
+
+ var gpKiller = playerService.GetPlayer(killer);
+ var gpKilled = playerService.GetPlayer(killedPlayer);
- if (killerRole == killedRole)
- {
- gpKiller.RemoveKarma(5);
- return HookResult.Continue;
- }
-
- if (killedRole == Role.Traitor)
- {
- gpKiller.AddKarma(2);
- }
- return HookResult.Continue;
+ var killerRole = gpKiller.PlayerRole();
+ var killedRole = gpKilled.PlayerRole();
+
+ if (killerRole == killedRole) {
+ gpKiller.RemoveKarma(5);
+ return HookResult.Continue;
}
-}
+
+ if (killedRole == Role.Traitor) gpKiller.AddKarma(2);
+ return HookResult.Continue;
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Player/PlayerBehavior.cs b/mod/TTT.Player/PlayerBehavior.cs
index 9785918..61a03ee 100644
--- a/mod/TTT.Player/PlayerBehavior.cs
+++ b/mod/TTT.Player/PlayerBehavior.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using TTT.Public.Behaviors;
using TTT.Public.Mod.Role;
@@ -10,82 +7,69 @@
namespace TTT.Player;
-public class PlayerBehavior() : IPlayerService, IPluginBehavior
-{
-
- public void Start(BasePlugin plugin)
- {
-
- }
-
- [GameEventHandler]
- public HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
- {
- if (@event.Userid == null) throw new NullReferenceException("Could not find player object when connecting.");
- CreatePlayer(@event.Userid);
- return HookResult.Continue;
- }
-
- private readonly Dictionary _players = [];
-
- public Dictionary GetPlayers()
- {
- return _players;
- }
-
- public void CreatePlayer(CCSPlayerController player)
- {
- if (_players.ContainsKey(player)) return;
- _players.Add(player, new GamePlayer(Role.Unassigned, 0, 110, player.UserId.Value));
- }
-
- public void AddKarma(CCSPlayerController player, int karma)
- {
- if (!_players.TryGetValue(player, out var value)) return;
- if (karma < 0) return;
-
- if (karma + value.Karma() > 110)
- value.SetKarma(110);
- else
- value.AddKarma(karma);
- }
-
- public void RemoveKarma(CCSPlayerController player, int karma)
- {
- if (!_players.TryGetValue(player, out var value)) return;
- if (karma < 0) return;
-
- if (value.Karma() - karma < 40)
- value.SetKarma(40);
- else
- value.RemoveKarma(karma);
- }
+public class PlayerBehavior : IPlayerService, IPluginBehavior {
+ private readonly Dictionary _players = [];
- public List Players()
- {
- return _players.Values.ToList();
- }
+ public void CreatePlayer(CCSPlayerController player) {
+ if (_players.ContainsKey(player)) return;
+ _players.Add(player,
+ new GamePlayer(Role.Unassigned, 0, 110, player.UserId.Value));
+ }
- public GamePlayer GetPlayer(CCSPlayerController player)
- {
- return _players[player];
- }
+ public void AddKarma(CCSPlayerController player, int karma) {
+ if (!_players.TryGetValue(player, out var value)) return;
+ if (karma < 0) return;
- public void RemovePlayer(CCSPlayerController player)
- {
- _players.Remove(player);
- }
+ if (karma + value.Karma() > 110)
+ value.SetKarma(110);
+ else
+ value.AddKarma(karma);
+ }
- public void Clr()
- {
- foreach (var player in Players())
- {
- player.SetKiller(null);
- player.SetPlayerRole(Role.Unassigned);
- player.ResetCredits();
- player.ModifyKarma();
- player.SetFound(false);
- player.SetDead();
- }
+ public void RemoveKarma(CCSPlayerController player, int karma) {
+ if (!_players.TryGetValue(player, out var value)) return;
+ if (karma < 0) return;
+
+ if (value.Karma() - karma < 40)
+ value.SetKarma(40);
+ else
+ value.RemoveKarma(karma);
+ }
+
+ public List Players() { return _players.Values.ToList(); }
+
+ public GamePlayer GetPlayer(CCSPlayerController player) {
+ return _players[player];
+ }
+
+ public void RemovePlayer(CCSPlayerController player) {
+ _players.Remove(player);
+ }
+
+ public void Clr() {
+ foreach (var player in Players()) {
+ player.SetKiller(null);
+ player.SetPlayerRole(Role.Unassigned);
+ player.ResetCredits();
+ player.ModifyKarma();
+ player.SetFound(false);
+ player.SetDead();
}
+ }
+
+ public void Start(BasePlugin plugin) { }
+
+ [GameEventHandler]
+ public HookResult OnPlayerConnectFull(EventPlayerConnectFull @event,
+ GameEventInfo info) {
+ if (@event.Userid == null)
+ throw new NullReferenceException(
+ "Could not find player object when connecting.");
+ CreatePlayer(@event.Userid);
+ return HookResult.Continue;
+ }
+
+ public Dictionary GetPlayers() {
+ return _players;
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Player/PlayerConfig.cs b/mod/TTT.Player/PlayerConfig.cs
index 51d41de..fdea2c6 100644
--- a/mod/TTT.Player/PlayerConfig.cs
+++ b/mod/TTT.Player/PlayerConfig.cs
@@ -1,9 +1,8 @@
namespace TTT.Player;
-public class PlayerConfig
-{
- public int StartCredits { get; } = 1000;
- public int StartKarma { get; } = 80;
- public int MaxKarma { get; } = 110;
- public int MinKarma { get; } = 40;
+public class PlayerConfig {
+ public int StartCredits { get; } = 1000;
+ public int StartKarma { get; } = 80;
+ public int MaxKarma { get; } = 110;
+ public int MinKarma { get; } = 40;
}
\ No newline at end of file
diff --git a/mod/TTT.Player/PlayerServiceExtension.cs b/mod/TTT.Player/PlayerServiceExtension.cs
index 048c288..322892f 100644
--- a/mod/TTT.Player/PlayerServiceExtension.cs
+++ b/mod/TTT.Player/PlayerServiceExtension.cs
@@ -5,13 +5,11 @@
namespace TTT.Player;
-public static class PlayerServiceExtension
-{
- public static void AddPlayerService(this IServiceCollection collection)
- {
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- }
-}
+public static class PlayerServiceExtension {
+ public static void AddPlayerService(this IServiceCollection collection) {
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Player/TTT.Player.csproj b/mod/TTT.Player/TTT.Player.csproj
index ce5ec60..fc5f91b 100644
--- a/mod/TTT.Player/TTT.Player.csproj
+++ b/mod/TTT.Player/TTT.Player.csproj
@@ -7,7 +7,7 @@
-
+
-
+
diff --git a/mod/TTT.Roles/Commands/RolesCommand.cs b/mod/TTT.Roles/Commands/RolesCommand.cs
index c396b49..ad15978 100644
--- a/mod/TTT.Roles/Commands/RolesCommand.cs
+++ b/mod/TTT.Roles/Commands/RolesCommand.cs
@@ -1,12 +1,9 @@
using System.Text;
-using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands;
-using CounterStrikeSharp.API.Modules.Menu;
using TTT.Public.Behaviors;
-using TTT.Public.Extensions;
using TTT.Public.Formatting;
using TTT.Public.Mod.Role;
using TTT.Public.Mod.Round;
@@ -14,49 +11,44 @@
namespace TTT.Roles.Commands;
-public class RolesCommand : IPluginBehavior
-{
- private readonly IPlayerService _roleService;
- private readonly IRoundService _roundService;
+public class RolesCommand : IPluginBehavior {
+ private readonly IPlayerService _roleService;
+ private readonly IRoundService _roundService;
- public RolesCommand(IPlayerService roleService, IRoleService roundService)
- {
- _roleService = roleService;
- _roundService = roundService.GetRoundService();
+ public RolesCommand(IPlayerService roleService, IRoleService roundService) {
+ _roleService = roleService;
+ _roundService = roundService.GetRoundService();
+ }
+
+ public void Start(BasePlugin plugin) { }
+
+ [ConsoleCommand("css_roles", "Get the roles of all players")]
+ [CommandHelper(0, "", CommandUsage.CLIENT_ONLY)]
+ public void Command_Toggle(CCSPlayerController? player, CommandInfo command) {
+ if (!AdminManager.PlayerHasPermissions(player, "@css/kick")) {
+ command.ReplyToCommand(
+ StringUtils.FormatTTT(
+ "You do not have permission to execute this command"));
+ return;
}
-
- public void Start(BasePlugin plugin)
- {
-
+
+ if (_roundService.GetRoundStatus() != RoundStatus.Started) {
+ command.ReplyToCommand(
+ StringUtils.FormatTTT("The round has not started yet."));
+ return;
}
-
- [ConsoleCommand("css_roles", "Get the roles of all players")]
- [CommandHelper(0, "", CommandUsage.CLIENT_ONLY)]
- public void Command_Toggle(CCSPlayerController? player, CommandInfo command)
- {
- if (!AdminManager.PlayerHasPermissions(player, "@css/kick"))
- {
- command.ReplyToCommand(StringUtils.FormatTTT("You do not have permission to execute this command"));
- return;
- }
-
- if (_roundService.GetRoundStatus() != RoundStatus.Started)
- {
- command.ReplyToCommand(StringUtils.FormatTTT("The round has not started yet."));
- return;
- }
-
- StringBuilder sb = new();
-
- command.ReplyToCommand(StringUtils.FormatTTT("List of all players roles:"));
-
- foreach (var gamePlayer in _roleService.Players())
- {
- var plr = gamePlayer.Player();
- if (plr == null) continue;
- command.ReplyToCommand(StringUtils.FormatTTT(gamePlayer.PlayerRole().FormatStringFullAfter(plr.PlayerName)));
- }
-
- command.ReplyToCommand(StringUtils.FormatTTT("End."));
+
+ StringBuilder sb = new();
+
+ command.ReplyToCommand(StringUtils.FormatTTT("List of all players roles:"));
+
+ foreach (var gamePlayer in _roleService.Players()) {
+ var plr = gamePlayer.Player();
+ if (plr == null) continue;
+ command.ReplyToCommand(StringUtils.FormatTTT(gamePlayer.PlayerRole()
+ .FormatStringFullAfter(plr.PlayerName)));
}
+
+ command.ReplyToCommand(StringUtils.FormatTTT("End."));
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Roles/ModelHandler.cs b/mod/TTT.Roles/ModelHandler.cs
index 986e14f..c455f57 100644
--- a/mod/TTT.Roles/ModelHandler.cs
+++ b/mod/TTT.Roles/ModelHandler.cs
@@ -3,36 +3,35 @@
namespace TTT.Roles;
-public class ModelHandler
-{
- public static readonly string ModelPathCtmHeavy = "characters\\models\\ctm_heavy\\ctm_heavy.vmdl";
- public static readonly string ModelPathCtmSas = "characters\\models\\ctm_sas\\ctm_sas.vmdl";
- public static readonly string ModelPathTmHeavy = "characters\\models\\tm_phoenix_heavy\\tm_phoenix_heavy.vmdl";
- public static readonly string ModelPathTmPhoenix = "characters\\models\\tm_phoenix\\tm_phoenix.vmdl";
-
-
-
- public static void RegisterListener(BasePlugin plugin)
- {
- plugin.RegisterListener(map =>
- {
- Server.PrecacheModel(ModelPathCtmHeavy);
- Server.PrecacheModel(ModelPathCtmSas);
- Server.PrecacheModel(ModelPathTmPhoenix);
- Server.PrecacheModel(ModelPathTmHeavy);
- });
- }
-
- public static void SetModel(CCSPlayerController player, string modelPath)
- {
- player.PlayerPawn.Value.SetModel(modelPath);
- }
-
- public static void SetModelNextServerFrame(CCSPlayerController playerPawn, string model)
- {
- Server.NextFrame(() =>
- {
- SetModel(playerPawn, model);
- });
- }
+public class ModelHandler {
+ public static readonly string ModelPathCtmHeavy =
+ "characters\\models\\ctm_heavy\\ctm_heavy.vmdl";
+
+ public static readonly string ModelPathCtmSas =
+ "characters\\models\\ctm_sas\\ctm_sas.vmdl";
+
+ public static readonly string ModelPathTmHeavy =
+ "characters\\models\\tm_phoenix_heavy\\tm_phoenix_heavy.vmdl";
+
+ public static readonly string ModelPathTmPhoenix =
+ "characters\\models\\tm_phoenix\\tm_phoenix.vmdl";
+
+
+ public static void RegisterListener(BasePlugin plugin) {
+ plugin.RegisterListener(map => {
+ Server.PrecacheModel(ModelPathCtmHeavy);
+ Server.PrecacheModel(ModelPathCtmSas);
+ Server.PrecacheModel(ModelPathTmPhoenix);
+ Server.PrecacheModel(ModelPathTmHeavy);
+ });
+ }
+
+ public static void SetModel(CCSPlayerController player, string modelPath) {
+ player.PlayerPawn.Value.SetModel(modelPath);
+ }
+
+ public static void SetModelNextServerFrame(CCSPlayerController playerPawn,
+ string model) {
+ Server.NextFrame(() => { SetModel(playerPawn, model); });
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Roles/RoleBehavior.cs b/mod/TTT.Roles/RoleBehavior.cs
index be4a477..3e3d45a 100644
--- a/mod/TTT.Roles/RoleBehavior.cs
+++ b/mod/TTT.Roles/RoleBehavior.cs
@@ -4,7 +4,6 @@
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
-using TTT.Player;
using TTT.Public.Behaviors;
using TTT.Public.Extensions;
using TTT.Public.Formatting;
@@ -15,286 +14,255 @@
namespace TTT.Roles;
-public class RoleBehavior : IRoleService, IPluginBehavior
-{
- private const int MaxDetectives = 3;
-
- private int _innocentsLeft;
- private IRoundService _roundService;
- private int _traitorsLeft;
- private readonly IPlayerService service;
-
- public RoleBehavior(IPlayerService playerService)
- {
- _roundService = new RoundBehavior(this);
- service = playerService;
+public class RoleBehavior : IRoleService, IPluginBehavior {
+ private const int MaxDetectives = 3;
+ private readonly IPlayerService service;
+
+ private int _innocentsLeft;
+ private readonly IRoundService _roundService;
+ private int _traitorsLeft;
+
+ public RoleBehavior(IPlayerService playerService) {
+ _roundService = new RoundBehavior(this);
+ service = playerService;
+ }
+
+ public void Start(BasePlugin parent) {
+ ModelHandler.RegisterListener(parent);
+ _roundService.Start(parent);
+ /*
+ parent.RegisterEventHandler(OnPlayerConnect);
+ parent.RegisterEventHandler(OnRoundStart);
+ parent.RegisterEventHandler(OnRoundEnd);
+ parent.RegisterEventHandler(OnPlayerDisconnect);
+ parent.RegisterEventHandler(OnPlayerDeath, HookMode.Pre);
+ parent.RegisterEventHandler(OnMapStart);
+ */
+ }
+
+ public IRoundService GetRoundService() { return _roundService; }
+
+ public void AddRoles() {
+ var eligible = Utilities.GetPlayers()
+ .Where(player => player.Team is not (CsTeam.Spectator or CsTeam.None))
+ .ToList();
+
+ var traitorCount = (int)Math.Floor(Convert.ToDouble(eligible.Count / 3));
+ var detectiveCount = (int)Math.Floor(Convert.ToDouble(eligible.Count / 8));
+
+ _traitorsLeft = traitorCount;
+ _innocentsLeft = eligible.Count - traitorCount;
+
+ if (detectiveCount > MaxDetectives) detectiveCount = MaxDetectives;
+
+ for (var i = 0; i < traitorCount; i++) {
+ var chosen = eligible[Random.Shared.Next(eligible.Count)];
+ eligible.Remove(chosen);
+ AddTraitor(chosen);
}
-
- public void Start(BasePlugin parent)
- {
- ModelHandler.RegisterListener(parent);
- _roundService.Start(parent);
- /*
- parent.RegisterEventHandler(OnPlayerConnect);
- parent.RegisterEventHandler(OnRoundStart);
- parent.RegisterEventHandler(OnRoundEnd);
- parent.RegisterEventHandler(OnPlayerDisconnect);
- parent.RegisterEventHandler(OnPlayerDeath, HookMode.Pre);
- parent.RegisterEventHandler(OnMapStart);
- */
+
+ for (var i = 0; i < detectiveCount; i++) {
+ var chosen = eligible[Random.Shared.Next(eligible.Count)];
+ eligible.Remove(chosen);
+ AddDetective(chosen);
}
- public IRoundService GetRoundService()
- {
- return _roundService;
+ AddInnocents(eligible);
+ }
+
+ public ISet GetTraitors() {
+ return service.Players()
+ .Where(player => player.PlayerRole() == Role.Traitor)
+ .Select(player => player.Player())
+ .ToHashSet();
+ }
+
+ public ISet GetDetectives() {
+ return service.Players()
+ .Where(player => player.PlayerRole() == Role.Detective)
+ .Select(player => player.Player())
+ .ToHashSet();
+ }
+
+ public ISet GetInnocents() {
+ return service.Players()
+ .Where(player => player.PlayerRole() == Role.Innocent)
+ .Select(player => player.Player())
+ .ToHashSet();
+ }
+
+
+ public Role GetRole(CCSPlayerController player) {
+ return service.GetPlayer(player).PlayerRole();
+ }
+
+ public void AddTraitor(CCSPlayerController player) {
+ service.GetPlayer(player).SetPlayerRole(Role.Traitor);
+ player.SwitchTeam(CsTeam.Terrorist);
+ player.PrintToCenter(
+ Role.Traitor.FormatStringFullBefore("You are now a(n)"));
+ player.PrintToChat(Role.Traitor.FormatStringFullBefore("You are now a(n)"));
+ ModelHandler.SetModelNextServerFrame(player,
+ ModelHandler.ModelPathTmPhoenix);
+ }
+
+ public void AddDetective(CCSPlayerController player) {
+ service.GetPlayer(player).SetPlayerRole(Role.Detective);
+ player.SwitchTeam(CsTeam.CounterTerrorist);
+ player.PrintToCenter(
+ Role.Detective.FormatStringFullBefore("You are now a(n)"));
+ player.GiveNamedItem(CsItem.Taser);
+ ModelHandler.SetModelNextServerFrame(player, ModelHandler.ModelPathCtmSas);
+ }
+
+ public void AddInnocents(IEnumerable players) {
+ foreach (var player in players) {
+ service.GetPlayer(player).SetPlayerRole(Role.Innocent);
+ player.PrintToCenter(
+ Role.Innocent.FormatStringFullBefore("You are now an"));
+ player.SwitchTeam(CsTeam.Terrorist);
+ ModelHandler.SetModelNextServerFrame(player,
+ ModelHandler.ModelPathTmPhoenix);
}
-
- [GameEventHandler]
- public HookResult OnRoundStart(EventRoundFreezeEnd @event, GameEventInfo info)
- {
- _roundService.SetRoundStatus(RoundStatus.Waiting);
- foreach (var player in Utilities.GetPlayers().Where(player =>
- player.IsReal() && player.Team != CsTeam.None || player.Team != CsTeam.Spectator))
- {
- player.RemoveWeapons();
- if (!string.IsNullOrEmpty("weapon_glock"))
- player.GiveNamedItem("weapon_glock");
-
- if (!string.IsNullOrEmpty(string.Empty))
- player.GiveNamedItem(string.Empty);
-
- player.GiveNamedItem("weapon_knife");
- service.GetPlayer(player).ModifyKarma();
- }
-
- return HookResult.Continue;
+ }
+
+ public bool IsDetective(CCSPlayerController player) {
+ return service.GetPlayer(player).PlayerRole() == Role.Detective;
+ }
+
+ public bool IsTraitor(CCSPlayerController player) {
+ return service.GetPlayer(player).PlayerRole() == Role.Traitor;
+ }
+
+ public void Clear() {
+ service.Clr();
+ foreach (var key in service.Players()) {
+ key.SetPlayerRole(Role.Unassigned);
+ if (key.Player() == null) continue;
+ RemoveColor(key.Player());
}
-
- [GameEventHandler]
- public HookResult OnPlayerConnect(EventPlayerConnectFull @event, GameEventInfo info)
- {
- if (Utilities.GetPlayers().Count(player =>
- player.IsReal() && player.Team != CsTeam.None || player.Team == CsTeam.Spectator) < 3)
- {
- _roundService.ForceEnd();
- }
-
- return HookResult.Continue;
+ }
+
+ [GameEventHandler]
+ public HookResult
+ OnRoundStart(EventRoundFreezeEnd @event, GameEventInfo info) {
+ _roundService.SetRoundStatus(RoundStatus.Waiting);
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player
+ => player.Team != CsTeam.None && player.Team != CsTeam.Spectator)) {
+ player.RemoveWeapons();
+ player.GiveNamedItem("weapon_glock");
+ player.GiveNamedItem("weapon_knife");
+ service.GetPlayer(player).ModifyKarma();
}
- [GameEventHandler(HookMode.Pre)]
- public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
- {
- info.DontBroadcast = true;
+ return HookResult.Continue;
+ }
- var playerWhoWasDamaged = @event.Userid;
- var attacker = @event.Attacker;
-
-
-
-
- if (playerWhoWasDamaged == null) return HookResult.Continue;
+ [GameEventHandler]
+ public HookResult OnPlayerConnect(EventPlayerConnectFull @event,
+ GameEventInfo info) {
+ if (Utilities.GetPlayers()
+ .Count(player => player.Team != CsTeam.None
+ && player.Team != CsTeam.Spectator) < 3)
+ _roundService.ForceEnd();
- SetColor(playerWhoWasDamaged);
-
- playerWhoWasDamaged.ModifyScoreBoard();
+ return HookResult.Continue;
+ }
- service.GetPlayer(playerWhoWasDamaged).SetKiller(attacker);
-
- if (IsTraitor(playerWhoWasDamaged)) _traitorsLeft--;
+ [GameEventHandler(HookMode.Pre)]
+ public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info) {
+ info.DontBroadcast = true;
- if (IsDetective(playerWhoWasDamaged) || IsInnocent(playerWhoWasDamaged)) _innocentsLeft--;
+ var playerWhoWasDamaged = @event.Userid;
+ var attacker = @event.Attacker;
- if (_traitorsLeft == 0 || _innocentsLeft == 0) Server.NextFrame(() => _roundService.ForceEnd());
- Server.NextFrame(() =>
- {
- Server.PrintToChatAll(
- StringUtils.FormatTTT($"{GetRole(playerWhoWasDamaged).FormatStringFullAfter(" has been found.")}"));
+ if (playerWhoWasDamaged == null) return HookResult.Continue;
- if (attacker == playerWhoWasDamaged || attacker == null) return;
+ SetColor(playerWhoWasDamaged);
- attacker.ModifyScoreBoard();
+ playerWhoWasDamaged.ModifyScoreBoard();
- playerWhoWasDamaged.PrintToChat(StringUtils.FormatTTT(
- $"You were killed by {GetRole(attacker).FormatStringFullAfter(" " + attacker.PlayerName)}."));
- attacker.PrintToChat(StringUtils.FormatTTT(
- $"You killed {GetRole(playerWhoWasDamaged).FormatStringFullAfter(" " + playerWhoWasDamaged.PlayerName)}."));
- });
+ service.GetPlayer(playerWhoWasDamaged).SetKiller(attacker);
- return HookResult.Continue;
- }
+ if (IsTraitor(playerWhoWasDamaged)) _traitorsLeft--;
- [GameEventHandler]
- public HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
- {
- var players = Utilities.GetPlayers()
- .Where(player => player.IsValid).Where(player => player.IsReal()).ToList();
+ if (IsDetective(playerWhoWasDamaged) || IsInnocent(playerWhoWasDamaged))
+ _innocentsLeft--;
- foreach (var player in players) player.PrintToCenter(GetWinner().FormatStringFullAfter("s has won!"));
+ if (_traitorsLeft == 0 || _innocentsLeft == 0)
+ Server.NextFrame(() => _roundService.ForceEnd());
- Server.NextFrame(Clear);
+ Server.NextFrame(() => {
+ Server.PrintToChatAll(StringUtils.FormatTTT(
+ $"{GetRole(playerWhoWasDamaged).FormatStringFullAfter(" has been found.")}"));
- return HookResult.Continue;
- }
+ if (attacker == playerWhoWasDamaged || attacker == null) return;
- [GameEventHandler]
- public HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
- {
- var player = @event.Userid;
- Server.NextFrame(() =>
- {
- service.RemovePlayer(player);
- if (service.Players().Count == 0) _roundService.SetRoundStatus(RoundStatus.Paused);
- });
-
- return HookResult.Continue;
- }
+ attacker.ModifyScoreBoard();
- public void AddRoles()
- {
- var eligible = Utilities.GetPlayers()
- .Where(player => player.IsReal())
- .Where(player => player.Team is not (CsTeam.Spectator or CsTeam.None))
- .ToList();
+ playerWhoWasDamaged.PrintToChat(StringUtils.FormatTTT(
+ $"You were killed by {GetRole(attacker).FormatStringFullAfter(" " + attacker.PlayerName)}."));
+ attacker.PrintToChat(StringUtils.FormatTTT(
+ $"You killed {GetRole(playerWhoWasDamaged).FormatStringFullAfter(" " + playerWhoWasDamaged.PlayerName)}."));
+ });
- var traitorCount = (int)Math.Floor(Convert.ToDouble(eligible.Count / 3));
- var detectiveCount = (int)Math.Floor(Convert.ToDouble(eligible.Count / 8));
+ return HookResult.Continue;
+ }
- _traitorsLeft = traitorCount;
- _innocentsLeft = eligible.Count - traitorCount;
+ [GameEventHandler]
+ public HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info) {
+ var players = Utilities.GetPlayers().ToList();
- if (detectiveCount > MaxDetectives) detectiveCount = MaxDetectives;
+ foreach (var player in players)
+ player.PrintToCenter(GetWinner().FormatStringFullAfter("s has won!"));
- for (var i = 0; i < traitorCount; i++)
- {
- var chosen = eligible[Random.Shared.Next(eligible.Count)];
- eligible.Remove(chosen);
- AddTraitor(chosen);
- }
+ Server.NextFrame(Clear);
- for (var i = 0; i < detectiveCount; i++)
- {
- var chosen = eligible[Random.Shared.Next(eligible.Count)];
- eligible.Remove(chosen);
- AddDetective(chosen);
- }
+ return HookResult.Continue;
+ }
- AddInnocents(eligible);
- }
+ [GameEventHandler]
+ public HookResult OnPlayerDisconnect(EventPlayerDisconnect @event,
+ GameEventInfo info) {
+ var player = @event.Userid;
+ Server.NextFrame(() => {
+ service.RemovePlayer(player);
+ if (service.Players().Count == 0)
+ _roundService.SetRoundStatus(RoundStatus.Paused);
+ });
- public ISet GetTraitors()
- {
- return service.Players().Where(player => player.PlayerRole() == Role.Traitor).Select(player => player.Player())
- .ToHashSet();
- }
+ return HookResult.Continue;
+ }
- public ISet GetDetectives()
- {
- return service.Players().Where(player => player.PlayerRole() == Role.Detective).Select(player => player.Player())
- .ToHashSet();
- }
+ public bool IsInnocent(CCSPlayerController player) {
+ return service.GetPlayer(player).PlayerRole() == Role.Innocent;
+ }
- public ISet GetInnocents()
- {
- return service.Players().Where(player => player.PlayerRole() == Role.Innocent).Select(player => player.Player())
- .ToHashSet();
- }
+ private Role GetWinner() {
+ return _traitorsLeft > 0 ? Role.Traitor : Role.Innocent;
+ }
+ public void SetColor(CCSPlayerController player) {
+ var pawn = player.PlayerPawn.Value;
- public Role GetRole(CCSPlayerController player)
- {
- return service.GetPlayer(player).PlayerRole();
- }
+ if (pawn == null || !pawn.IsValid) return;
- public void AddTraitor(CCSPlayerController player)
- {
- service.GetPlayer(player).SetPlayerRole(Role.Traitor);
- player.SwitchTeam(CsTeam.Terrorist);
- player.PrintToCenter(Role.Traitor.FormatStringFullBefore("You are now a(n)"));
- player.PrintToChat(Role.Traitor.FormatStringFullBefore("You are now a(n)"));
- ModelHandler.SetModelNextServerFrame(player, ModelHandler.ModelPathTmPhoenix);
- }
+ pawn.RenderMode = RenderMode_t.kRenderTransColor;
+ pawn.Render = GetRole(player).GetColor();
- public void AddDetective(CCSPlayerController player)
- {
- service.GetPlayer(player).SetPlayerRole(Role.Detective);
- player.SwitchTeam(CsTeam.CounterTerrorist);
- player.PrintToCenter(Role.Detective.FormatStringFullBefore("You are now a(n)"));
- player.GiveNamedItem(CsItem.Taser);
- ModelHandler.SetModelNextServerFrame(player, ModelHandler.ModelPathCtmSas);
- }
+ Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
+ }
- public void AddInnocents(IEnumerable players)
- {
- foreach (var player in players)
- {
- service.GetPlayer(player).SetPlayerRole(Role.Innocent);
- player.PrintToCenter(Role.Innocent.FormatStringFullBefore("You are now an"));
- player.SwitchTeam(CsTeam.Terrorist);
- ModelHandler.SetModelNextServerFrame(player, ModelHandler.ModelPathTmPhoenix);
- }
- }
+ public void RemoveColor(CCSPlayerController player) {
+ var pawn = player.PlayerPawn.Value;
- public bool IsDetective(CCSPlayerController player)
- {
- return service.GetPlayer(player).PlayerRole() == Role.Detective;
- }
+ if (pawn == null || !pawn.IsValid) return;
- public bool IsTraitor(CCSPlayerController player)
- {
- return service.GetPlayer(player).PlayerRole() == Role.Traitor;
- }
-
- public void Clear()
- {
- service.Clr();
- foreach (var key in service.Players())
- {
- key.SetPlayerRole(Role.Unassigned);
- if (key.Player() == null) continue;
- RemoveColor(key.Player());
- }
- }
-
- public bool IsInnocent(CCSPlayerController player)
- {
- return service.GetPlayer(player).PlayerRole() == Role.Innocent;
- }
-
- private Role GetWinner()
- {
- return _traitorsLeft == 0 ? Role.Traitor : Role.Innocent;
- }
-
- public void SetColor(CCSPlayerController player)
- {
- if (!player.IsReal()) return;
-
- var pawn = player.PlayerPawn.Value;
-
- if (pawn == null || !pawn.IsValid) return;
-
- pawn.RenderMode = RenderMode_t.kRenderTransColor;
- pawn.Render = GetRole(player).GetColor();
-
- Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
- }
-
- public void RemoveColor(CCSPlayerController player)
- {
- if (!player.IsReal()) return;
-
- var pawn = player.PlayerPawn.Value;
-
- if (pawn == null || !pawn.IsValid) return;
-
- pawn.RenderMode = RenderMode_t.kRenderTransColor;
- pawn.Render = Color.FromArgb(254, 255, 255, 255);
-
-
- Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
-
- }
-}
+ pawn.RenderMode = RenderMode_t.kRenderTransColor;
+ pawn.Render = Color.FromArgb(254, 255, 255, 255);
+ Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender");
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Roles/RoleConfig.cs b/mod/TTT.Roles/RoleConfig.cs
index 74619c4..f367211 100644
--- a/mod/TTT.Roles/RoleConfig.cs
+++ b/mod/TTT.Roles/RoleConfig.cs
@@ -1,10 +1,8 @@
namespace TTT.Roles;
-public class RoleConfig
-{
- public int TraitorRatio { get; } = 3;
- public int DetectiveRatio { get; } = 8;
- public string? SecondaryWeapon { get; } = "weapon_glock";
- public string? PrimaryWeapon { get; } = "";
-
+public class RoleConfig {
+ public int TraitorRatio { get; } = 3;
+ public int DetectiveRatio { get; } = 8;
+ public string? SecondaryWeapon { get; } = "weapon_glock";
+ public string? PrimaryWeapon { get; } = "";
}
\ No newline at end of file
diff --git a/mod/TTT.Roles/RoleServiceExtension.cs b/mod/TTT.Roles/RoleServiceExtension.cs
index af20a73..4bbd158 100644
--- a/mod/TTT.Roles/RoleServiceExtension.cs
+++ b/mod/TTT.Roles/RoleServiceExtension.cs
@@ -5,11 +5,9 @@
namespace TTT.Roles;
-public static class RoleServiceExtension
-{
- public static void AddTTTRoles(this IServiceCollection collection)
- {
- collection.AddPluginBehavior();
- collection.AddPluginBehavior();
- }
+public static class RoleServiceExtension {
+ public static void AddTTTRoles(this IServiceCollection collection) {
+ collection.AddPluginBehavior();
+ collection.AddPluginBehavior();
+ }
}
\ No newline at end of file
diff --git a/mod/TTT.Roles/RoleTester.cs b/mod/TTT.Roles/RoleTester.cs
index 489cca3..3f3c06d 100644
--- a/mod/TTT.Roles/RoleTester.cs
+++ b/mod/TTT.Roles/RoleTester.cs
@@ -1,22 +1,30 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Modules.Cvars;
+using CounterStrikeSharp.API.Modules.Cvars;
namespace TTT.Roles;
-public class RoleTester
-{
- private readonly FakeConVar _traitorTesterBlockTester = new("traitor_tester_block_tester",
- "For how long tester button should be disabled after using it. 0 to not block it.");
- private readonly FakeConVar _traitorTesterBlockTesterTime = new("traitor_tester_block_tester_time",
- "Determinate for how long tester button should be disabled. 0 to disable tester block.", 3);
- private readonly FakeConVar _traitorTesterBlockTesterMessage = new("traitor_tester_block_tester_message",
- "If 1 print to client info about tester cooldown. 0 to disable.");
- private readonly FakeConVar _traitorTesterLightTime = new("traitor_tester_light_time",
- "For how long the lights should be shown. Min value is 3 seconds.", 3);
- private readonly FakeConVar _traitorTesterLightDelayTime = new("traitor_tester_light_delay_time",
- "Determinate if the lights should be shown right away or after few secodns. 0 to disable.");
- private readonly FakeConVar _traitorTesterMaxPlayers = new("traitor_tester_max_players",
- "Determinate how many players can be checked at one. 0 to disable it.");
-
-
+public class RoleTester {
+ private readonly FakeConVar _traitorTesterBlockTester =
+ new("traitor_tester_block_tester",
+ "For how long tester button should be disabled after using it. 0 to not block it.");
+
+ private readonly FakeConVar _traitorTesterBlockTesterMessage =
+ new("traitor_tester_block_tester_message",
+ "If 1 print to client info about tester cooldown. 0 to disable.");
+
+ private readonly FakeConVar _traitorTesterBlockTesterTime =
+ new("traitor_tester_block_tester_time",
+ "Determinate for how long tester button should be disabled. 0 to disable tester block.",
+ 3);
+
+ private readonly FakeConVar _traitorTesterLightDelayTime =
+ new("traitor_tester_light_delay_time",
+ "Determinate if the lights should be shown right away or after few secodns. 0 to disable.");
+
+ private readonly FakeConVar _traitorTesterLightTime =
+ new("traitor_tester_light_time",
+ "For how long the lights should be shown. Min value is 3 seconds.", 3);
+
+ private readonly FakeConVar _traitorTesterMaxPlayers =
+ new("traitor_tester_max_players",
+ "Determinate how many players can be checked at one. 0 to disable it.");
}
\ No newline at end of file
diff --git a/mod/TTT.Roles/TTT.Roles.csproj b/mod/TTT.Roles/TTT.Roles.csproj
index dfd9e59..0d7766e 100644
--- a/mod/TTT.Roles/TTT.Roles.csproj
+++ b/mod/TTT.Roles/TTT.Roles.csproj
@@ -1,14 +1,14 @@
-
- net8.0
- enable
- enable
- TTT.Roles
-
-
-
-
-
+
+ net8.0
+ enable
+ enable
+ TTT.Roles
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/mod/TTT.Roles/TraitorRoom.cs b/mod/TTT.Roles/TraitorRoom.cs
index 2da0707..718c8a0 100644
--- a/mod/TTT.Roles/TraitorRoom.cs
+++ b/mod/TTT.Roles/TraitorRoom.cs
@@ -1,8 +1,3 @@
-using CounterStrikeSharp.API.Core;
+namespace TTT.Roles;
-namespace TTT.Roles;
-
-public class TraitorRoom
-{
-
-}
\ No newline at end of file
+public class TraitorRoom { }
\ No newline at end of file
diff --git a/mod/TTT.Round/Round.cs b/mod/TTT.Round/Round.cs
index be705f7..397724d 100644
--- a/mod/TTT.Round/Round.cs
+++ b/mod/TTT.Round/Round.cs
@@ -1,106 +1,95 @@
using System.Drawing;
-using System.Text;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Modules.Utils;
-using TTT.Public.Configuration;
using TTT.Public.Extensions;
-using TTT.Public.Mod.Role;
using TTT.Public.Formatting;
+using TTT.Public.Mod.Role;
namespace TTT.Round;
-public class Round
-{
- private readonly IRoleService _roleService;
- private readonly RoundConfig? _config;
- private float _graceTime = 20 * 64;
- private readonly int _roundId;
+public class Round {
+ private readonly RoundConfig? _config;
+ private readonly IRoleService _roleService;
+ private readonly int _roundId;
+ private float _graceTime = 20 * 64;
- public Round(IRoleService roleService, RoundConfig? config, int roundId)
- {
- _roleService = roleService;
- _config = config;
- _graceTime = 20 * 64;
- _roundId = roundId;
- }
+ public Round(IRoleService roleService, RoundConfig? config, int roundId) {
+ _roleService = roleService;
+ _config = config;
+ _graceTime = 20 * 64;
+ _roundId = roundId;
+ }
- public void Tick()
- {
- _graceTime--;
-
- var players = Utilities.GetPlayers()
- .Where(player => player.IsValid)
- .Where(player => player.IsReal())
- .ToList();
-
- var formattedColor = $"";
-
- foreach (var player in players)
- {
- Server.NextFrame(() =>
- {
- player.PrintToCenterHtml(
- $"{formattedColor}[TTT] Game is starting in {Math.Floor(_graceTime / 64)} seconds");
- });
- }
- }
+ public void Tick() {
+ _graceTime--;
- public float GraceTime()
- {
- return _graceTime;
- }
+ var players = Utilities.GetPlayers().ToList();
- public void Start()
- {
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal()).Where(player => !player.PawnIsAlive).Where(player => player.Team is CsTeam.Terrorist or CsTeam.CounterTerrorist))
- {
- player.Respawn();
- }
-
- _roleService.AddRoles();
- Server.NextFrame(() => Server.PrintToChatAll(StringUtils.FormatTTT($"Round #{_roundId} has started! {_roleService.GetTraitors().Count} traitors.")));
- SendTraitorMessage();
- SendDetectiveMessage();
- SendInnocentMessage();
- }
+ var formattedColor =
+ $"";
- private void SendInnocentMessage()
- {
- foreach (var player in _roleService.GetInnocents())
- {
- Server.NextFrame(() => player.PrintToChat(StringUtils.FormatTTT("You are now an innocent")));
- }
- }
-
- private void SendTraitorMessage()
- {
- var traitors = _roleService.GetTraitors();
-
- foreach (var traitor in traitors)
- {
- Server.NextFrame(() => traitor.PrintToChat(StringUtils.FormatTTT("You are a Traitor")));
- Server.NextFrame(() => traitor.PrintToChat(StringUtils.FormatTTT("Traitors:")));
- foreach (var player in traitors)
- {
- var message = StringUtils.FormatTTT(Role.Traitor.FormatStringFullAfter(player.PlayerName));
- Server.NextFrame(() => traitor.PrintToChat(message));
- }
- }
+ foreach (var player in players)
+ Server.NextFrame(() => {
+ player.PrintToCenterHtml(
+ $"{formattedColor}[TTT] Game is starting in {Math.Floor(_graceTime / 64)} seconds");
+ });
+ }
+
+ public float GraceTime() { return _graceTime; }
+
+ public void Start() {
+ foreach (var player in Utilities.GetPlayers()
+ .Where(player => !player.PawnIsAlive)
+ .Where(player
+ => player.Team is CsTeam.Terrorist or CsTeam.CounterTerrorist))
+ player.Respawn();
+
+ _roleService.AddRoles();
+ Server.NextFrame(()
+ => Server.PrintToChatAll(StringUtils.FormatTTT(
+ $"Round #{_roundId} has started! {_roleService.GetTraitors().Count} traitors.")));
+ SendTraitorMessage();
+ SendDetectiveMessage();
+ SendInnocentMessage();
+ }
+
+ private void SendInnocentMessage() {
+ foreach (var player in _roleService.GetInnocents())
+ Server.NextFrame(()
+ => player.PrintToChat(
+ StringUtils.FormatTTT("You are now an innocent")));
+ }
+
+ private void SendTraitorMessage() {
+ var traitors = _roleService.GetTraitors();
+
+ foreach (var traitor in traitors) {
+ Server.NextFrame(()
+ => traitor.PrintToChat(StringUtils.FormatTTT("You are a Traitor")));
+ Server.NextFrame(()
+ => traitor.PrintToChat(StringUtils.FormatTTT("Traitors:")));
+ foreach (var player in traitors) {
+ var message =
+ StringUtils.FormatTTT(
+ Role.Traitor.FormatStringFullAfter(player.PlayerName));
+ Server.NextFrame(() => traitor.PrintToChat(message));
+ }
}
+ }
+
+ private void SendDetectiveMessage() {
+ var detectives = _roleService.GetDetectives();
- private void SendDetectiveMessage()
- {
- var detectives = _roleService.GetDetectives();
-
- foreach (var detective in detectives)
- {
- Server.NextFrame(() => detective.PrintToChat(StringUtils.FormatTTT("You are a Detective")));
- Server.NextFrame(() => detective.PrintToChat(StringUtils.FormatTTT("Detective:")));
- foreach (var player in detectives)
- {
- var message = StringUtils.FormatTTT(Role.Detective.FormatStringFullAfter(" " + player.PlayerName));
- Server.NextFrame(() => detective.PrintToChat(message));
- }
- }
+ foreach (var detective in detectives) {
+ Server.NextFrame(()
+ => detective.PrintToChat(StringUtils.FormatTTT("You are a Detective")));
+ Server.NextFrame(()
+ => detective.PrintToChat(StringUtils.FormatTTT("Detective:")));
+ foreach (var player in detectives) {
+ var message = StringUtils.FormatTTT(
+ Role.Detective.FormatStringFullAfter(" " + player.PlayerName));
+ Server.NextFrame(() => detective.PrintToChat(message));
+ }
}
-}
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Round/RoundBehavior.cs b/mod/TTT.Round/RoundBehavior.cs
index a227f9d..2a45306 100644
--- a/mod/TTT.Round/RoundBehavior.cs
+++ b/mod/TTT.Round/RoundBehavior.cs
@@ -5,137 +5,130 @@
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
-using TTT.Public.Action;
-using TTT.Public.Behaviors;
using TTT.Public.Extensions;
using TTT.Public.Formatting;
-using TTT.Public.Mod.Logs;
using TTT.Public.Mod.Role;
using TTT.Public.Mod.Round;
-using TTT.Public.Player;
namespace TTT.Round;
-public class RoundBehavior(IRoleService _roleService) : IRoundService
-{
- private Round? _round;
- private RoundStatus _roundStatus = RoundStatus.Paused;
- private int _roundId = 1;
-
- public void Start(BasePlugin plugin)
- {
- plugin.RegisterListener(TickWaiting);
- plugin.AddCommandListener("jointeam", OnTeamJoin);
- VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(BlockDamage, HookMode.Pre);
- plugin.AddTimer(3, EndRound, TimerFlags.REPEAT);
+public class RoundBehavior(IRoleService _roleService) : IRoundService {
+ private Round? _round;
+ private int _roundId = 1;
+ private RoundStatus _roundStatus = RoundStatus.Paused;
+
+ public void Start(BasePlugin plugin) {
+ plugin.RegisterListener(TickWaiting);
+ plugin.AddCommandListener("jointeam", OnTeamJoin);
+ VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(BlockDamage,
+ HookMode.Pre);
+ plugin.AddTimer(3, EndRound, TimerFlags.REPEAT);
+ }
+
+ public RoundStatus GetRoundStatus() { return _roundStatus; }
+
+ public void SetRoundStatus(RoundStatus roundStatus) {
+ switch (roundStatus) {
+ case RoundStatus.Ended:
+ ForceEnd();
+ break;
+ case RoundStatus.Waiting:
+ _round = new Round(_roleService, null, _roundId);
+ break;
+ case RoundStatus.Started:
+ ForceStart();
+ break;
+ case RoundStatus.Paused:
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(roundStatus), roundStatus,
+ "Invalid round status.");
}
- public RoundStatus GetRoundStatus()
- {
- return _roundStatus;
- }
+ _roundStatus = roundStatus;
+ }
- public void SetRoundStatus(RoundStatus roundStatus)
- {
- switch (roundStatus)
- {
- case RoundStatus.Ended:
- ForceEnd();
- break;
- case RoundStatus.Waiting:
- _round = new Round(_roleService, null, _roundId);
- break;
- case RoundStatus.Started:
- ForceStart();
- break;
- case RoundStatus.Paused:
- break;
- default:
- throw new ArgumentOutOfRangeException(nameof(roundStatus), roundStatus, "Invalid round status.");
- }
- _roundStatus = roundStatus;
+ public void TickWaiting() {
+ if (_round == null) {
+ _round = new Round(_roleService, null, _roundId);
+ return;
}
- public void TickWaiting()
- {
- if (_round == null)
- {
- _round = new Round(_roleService, null, _roundId);
- return;
- }
-
- if (_roundStatus != RoundStatus.Waiting) return;
-
- _round.Tick();
-
- if (_round.GraceTime() != 0) return;
-
-
- if (Utilities.GetPlayers().Where(player => player is { IsValid: true, PawnIsAlive: true }).ToList().Count <= 2)
- {
- Server.PrintToChatAll(StringUtils.FormatTTT("Not enough players to start the round. Round has been ended."));
- _roundStatus = RoundStatus.Paused;
- return;
- }
-
- SetRoundStatus(RoundStatus.Started);
-
- }
+ if (_roundStatus != RoundStatus.Waiting) return;
- public void ForceStart()
- {
- foreach (var player in Utilities.GetPlayers().Where(player => player.IsReal()).Where(player => player.IsReal())
- .ToList()) player.VoiceFlags = VoiceFlags.Normal;
- _round!.Start();
- ServerExtensions.GetGameRules().RoundTime = 360;
- Utilities.SetStateChanged(ServerExtensions.GetGameRulesProxy(), "CCSGameRulesProxy", "m_pGameRules");
- }
+ _round.Tick();
- public void ForceEnd()
- {
- if (_roundStatus == RoundStatus.Ended) return;
- _roundStatus = RoundStatus.Ended;
- Utilities.FindAllEntitiesByDesignerName("cs_gamerules").First().GameRules!.TerminateRound(5,
- RoundEndReason.RoundDraw);
- }
+ if (_round.GraceTime() != 0) return;
- private void EndRound()
- {
- if (_roundStatus == RoundStatus.Started && Utilities.GetPlayers().Count(player => player.PawnIsAlive) == 1)
- {
- ForceEnd();
- }
-
- var traitorCount = _roleService.GetTraitors().Count(player => player.PawnIsAlive);
- var innocentCount = _roleService.GetInnocents().Count(player => player.PawnIsAlive);
- var detectiveCount = _roleService.GetDetectives().Count(player => player.PawnIsAlive);
-
- if (_roundStatus == RoundStatus.Started && (traitorCount == 0 || innocentCount + detectiveCount == 0))
- {
- ForceEnd();
- }
- }
- private HookResult BlockDamage(DynamicHook hook)
- {
- if (hook.GetParam(0).DesignerName is not "player") return HookResult.Continue;
- return _roundStatus != RoundStatus.Waiting ? HookResult.Continue : HookResult.Stop;
+ if (Utilities.GetPlayers()
+ .Where(player => player is { IsValid: true, PawnIsAlive: true })
+ .ToList()
+ .Count <= 2) {
+ Server.PrintToChatAll(StringUtils.FormatTTT(
+ "Not enough players to start the round. Round has been ended."));
+ _roundStatus = RoundStatus.Paused;
+ return;
}
- private HookResult OnTeamJoin(CCSPlayerController? executor, CommandInfo info)
- {
- if (_roundStatus != RoundStatus.Started) return HookResult.Continue;
- if (executor == null) return HookResult.Continue;
- if (!executor.IsReal()) return HookResult.Continue;
- if (_roleService.GetRole(executor) != Role.Unassigned) return HookResult.Continue;
- Server.NextFrame(() => executor.CommitSuicide(false, true));
-
- return HookResult.Continue;
- }
-
- private HookResult OnRoundEnd(EventRoundEnd _, GameEventInfo __)
- {
- _roundId++;
- return HookResult.Continue;
- }
-}
+ SetRoundStatus(RoundStatus.Started);
+ }
+
+ public void ForceStart() {
+ foreach (var player in Utilities.GetPlayers().ToList())
+ player.VoiceFlags = VoiceFlags.Normal;
+ _round!.Start();
+ ServerExtensions.GetGameRules().RoundTime = 360;
+ Utilities.SetStateChanged(ServerExtensions.GetGameRulesProxy(),
+ "CCSGameRulesProxy", "m_pGameRules");
+ }
+
+ public void ForceEnd() {
+ if (_roundStatus == RoundStatus.Ended) return;
+ _roundStatus = RoundStatus.Ended;
+ Utilities.FindAllEntitiesByDesignerName("cs_gamerules")
+ .First()
+ .GameRules!.TerminateRound(5, RoundEndReason.RoundDraw);
+ }
+
+ private void EndRound() {
+ if (_roundStatus == RoundStatus.Started
+ && Utilities.GetPlayers().Count(player => player.PawnIsAlive) == 1)
+ ForceEnd();
+
+ var traitorCount =
+ _roleService.GetTraitors().Count(player => player.PawnIsAlive);
+ var innocentCount =
+ _roleService.GetInnocents().Count(player => player.PawnIsAlive);
+ var detectiveCount = _roleService.GetDetectives()
+ .Count(player => player.PawnIsAlive);
+
+ if (_roundStatus == RoundStatus.Started
+ && (traitorCount == 0 || innocentCount + detectiveCount == 0))
+ ForceEnd();
+ }
+
+ private HookResult BlockDamage(DynamicHook hook) {
+ if (hook.GetParam(0).DesignerName is not "player")
+ return HookResult.Continue;
+ return _roundStatus != RoundStatus.Waiting ?
+ HookResult.Continue :
+ HookResult.Stop;
+ }
+
+ private HookResult
+ OnTeamJoin(CCSPlayerController? executor, CommandInfo info) {
+ if (_roundStatus != RoundStatus.Started) return HookResult.Continue;
+ if (executor == null) return HookResult.Continue;
+ if (_roleService.GetRole(executor) != Role.Unassigned)
+ return HookResult.Continue;
+ Server.NextFrame(() => executor.CommitSuicide(false, true));
+
+ return HookResult.Continue;
+ }
+
+ private HookResult OnRoundEnd(EventRoundEnd _, GameEventInfo __) {
+ _roundId++;
+ return HookResult.Continue;
+ }
+}
\ No newline at end of file
diff --git a/mod/TTT.Round/RoundConfig.cs b/mod/TTT.Round/RoundConfig.cs
index a8e77f6..a229469 100644
--- a/mod/TTT.Round/RoundConfig.cs
+++ b/mod/TTT.Round/RoundConfig.cs
@@ -1,7 +1,6 @@
namespace TTT.Round;
-public class RoundConfig
-{
- public int GracePeriod { get; } = 20;
- public int RoundTime { get; } = 360;
+public class RoundConfig {
+ public int GracePeriod { get; } = 20;
+ public int RoundTime { get; } = 360;
}
\ No newline at end of file
diff --git a/mod/TTT.Round/RoundServiceExtension.cs b/mod/TTT.Round/RoundServiceExtension.cs
index b41b37b..588fedb 100644
--- a/mod/TTT.Round/RoundServiceExtension.cs
+++ b/mod/TTT.Round/RoundServiceExtension.cs
@@ -1,12 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
-using TTT.Public.Extensions;
-using TTT.Public.Mod.Round;
namespace TTT.Round;
-public static class RoundServiceExtension
-{
- public static void AddRoundService(this IServiceCollection collection)
- {
- }
+public static class RoundServiceExtension {
+ public static void AddRoundService(this IServiceCollection collection) { }
}
\ No newline at end of file
diff --git a/mod/TTT.Round/TTT.Round.csproj b/mod/TTT.Round/TTT.Round.csproj
index 33298b6..f28455f 100644
--- a/mod/TTT.Round/TTT.Round.csproj
+++ b/mod/TTT.Round/TTT.Round.csproj
@@ -1,10 +1,10 @@
-
- net8.0
- enable
- enable
-
-
-
-
+
+ net8.0
+ enable
+ enable
+
+
+
+
\ No newline at end of file
diff --git a/mod/TTT.Shop/TTT.Shop.csproj b/mod/TTT.Shop/TTT.Shop.csproj
index 31fb7ca..a056d1b 100644
--- a/mod/TTT.Shop/TTT.Shop.csproj
+++ b/mod/TTT.Shop/TTT.Shop.csproj
@@ -6,9 +6,9 @@
enable
TTT.Shop
-
+
-
+
diff --git a/public/TTT.Formatting/Base/IView.cs b/public/TTT.Formatting/Base/IView.cs
index 2d15db0..e5bd4f7 100644
--- a/public/TTT.Formatting/Base/IView.cs
+++ b/public/TTT.Formatting/Base/IView.cs
@@ -2,7 +2,6 @@
namespace TTT.Formatting.Base;
-public interface IView
-{
- void Render(FormatWriter writer);
+public interface IView {
+ void Render(FormatWriter writer);
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Base/SimpleView.cs b/public/TTT.Formatting/Base/SimpleView.cs
index b3382f8..28a8fae 100644
--- a/public/TTT.Formatting/Base/SimpleView.cs
+++ b/public/TTT.Formatting/Base/SimpleView.cs
@@ -1,70 +1,49 @@
using System.Collections;
-
using TTT.Formatting.Core;
namespace TTT.Formatting.Base;
-public class SimpleView : IView, IEnumerable>
-{
- public struct Newline
- {
-
- }
-
- public static Newline NEWLINE = new Newline();
-
- private List> _lines = new();
+public class SimpleView : IView, IEnumerable> {
+ public static Newline NEWLINE = new();
- public SimpleView()
- {
+ private readonly List> _lines = new();
- }
+ public IEnumerator> GetEnumerator() {
+ return _lines.GetEnumerator();
+ }
- ///
- /// Add an item to the end of the last row in this SimpleView
- /// Eg, { abc, 123, weee } is all one row
- ///
- ///
- public void Add(FormatObject item)
- {
- if (_lines.Count == 0)
- _lines.Add(new List());
+ IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
- _lines[_lines.Count - 1].Add(item);
- }
+ public void Render(FormatWriter writer) {
+ foreach (var formatObjects in _lines) writer.Line(formatObjects.ToArray());
+ }
- ///
- /// Add multiple items at a time to this SimpleView
- ///
- ///
- public void Add(params FormatObject[] line)
- {
- if (_lines.Count == 0)
- _lines.Add(new List());
+ ///
+ /// Add an item to the end of the last row in this SimpleView
+ /// Eg, { abc, 123, weee } is all one row
+ ///
+ ///
+ public void Add(FormatObject item) {
+ if (_lines.Count == 0) _lines.Add(new List());
- _lines[_lines.Count - 1].AddRange(line);
- }
+ _lines[_lines.Count - 1].Add(item);
+ }
- ///
- /// Add a new line to this SimpleView
- ///
- ///
- public void Add(Newline newline)
- {
- _lines.Add(new List());
- }
+ ///
+ /// Add multiple items at a time to this SimpleView
+ ///
+ ///
+ public void Add(params FormatObject[] line) {
+ if (_lines.Count == 0) _lines.Add(new List());
- public void Render(FormatWriter writer)
- {
- foreach (var formatObjects in _lines)
- writer.Line(formatObjects.ToArray());
- }
+ _lines[_lines.Count - 1].AddRange(line);
+ }
- public IEnumerator> GetEnumerator()
- => _lines.GetEnumerator();
+ ///
+ /// Add a new line to this SimpleView
+ ///
+ ///
+ public void Add(Newline newline) { _lines.Add(new List()); }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
-}
+ public struct Newline { }
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Core/FormatObject.cs b/public/TTT.Formatting/Core/FormatObject.cs
index 956333d..d39b5c0 100644
--- a/public/TTT.Formatting/Core/FormatObject.cs
+++ b/public/TTT.Formatting/Core/FormatObject.cs
@@ -4,53 +4,41 @@
namespace TTT.Formatting.Core;
-public abstract class FormatObject
-{
+public abstract class FormatObject {
///
- /// Output this format object compatible with CS2 chat formatting.
+ /// Output this format object compatible with CS2 chat formatting.
///
///
- public virtual string ToChat()
- {
- return ToPlain();
- }
+ public virtual string ToChat() { return ToPlain(); }
///
- /// Output this format object in a panorama-compatible format.
+ /// Output this format object in a panorama-compatible format.
///
///
- public virtual string ToPanorama()
- {
- return ToPlain().Sanitize();
- }
+ public virtual string ToPanorama() { return ToPlain().Sanitize(); }
///
- /// Output plaintext
+ /// Output plaintext
///
///
public abstract string ToPlain();
- public static implicit operator FormatObject(string value)
- {
- return new StringFormatObject(value);
- }
+ public static implicit operator FormatObject(string value) {
+ return new StringFormatObject(value);
+ }
- public static implicit operator FormatObject(CCSPlayerController value)
- {
- return new PlayerFormatObject(value);
- }
+ public static implicit operator FormatObject(CCSPlayerController value) {
+ return new PlayerFormatObject(value);
+ }
- public static implicit operator FormatObject(int value)
- {
- return new IntegerFormatObject(value);
- }
+ public static implicit operator FormatObject(int value) {
+ return new IntegerFormatObject(value);
+ }
- public static FormatObject FromObject(object value)
- {
- return new StringFormatObject(value.ToString() ?? "null");
- }
+ public static FormatObject FromObject(object value) {
+ return new StringFormatObject(value.ToString() ?? "null");
+ }
- public override string ToString()
- => ToPlain();
-}
+ public override string ToString() { return ToPlain(); }
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Core/FormatWriter.cs b/public/TTT.Formatting/Core/FormatWriter.cs
index 78f66d7..d4034c4 100644
--- a/public/TTT.Formatting/Core/FormatWriter.cs
+++ b/public/TTT.Formatting/Core/FormatWriter.cs
@@ -1,25 +1,26 @@
namespace TTT.Formatting.Core;
-public class FormatWriter
-{
- private readonly List _lines = new();
+public class FormatWriter {
+ private readonly List _lines = new();
- public IEnumerable Lines => _lines;
+ public IEnumerable Lines => _lines;
- public IEnumerable Chat
- => Lines.Select(array => string.Join(' ', array.Select(obj => obj.ToChat())));
+ public IEnumerable Chat
+ => Lines.Select(
+ array => string.Join(' ', array.Select(obj => obj.ToChat())));
- public IEnumerable Panorama
- => Lines.Select(array => string.Join(' ', array.Select(obj => obj.ToPanorama())));
+ public IEnumerable Panorama
+ => Lines.Select(array
+ => string.Join(' ', array.Select(obj => obj.ToPanorama())));
- public IEnumerable Plain
- => Lines.Select(array => string.Join(' ', array.Select(obj => obj.ToPlain())));
+ public IEnumerable Plain
+ => Lines.Select(array
+ => string.Join(' ', array.Select(obj => obj.ToPlain())));
- public FormatWriter Line(params FormatObject[] args)
- {
- _lines.Add(args);
+ public FormatWriter Line(params FormatObject[] args) {
+ _lines.Add(args);
- return this;
- }
+ return this;
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Extensions/ViewExtensions.cs b/public/TTT.Formatting/Extensions/ViewExtensions.cs
index f03bfb6..b29d970 100644
--- a/public/TTT.Formatting/Extensions/ViewExtensions.cs
+++ b/public/TTT.Formatting/Extensions/ViewExtensions.cs
@@ -1,110 +1,93 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
-
using TTT.Formatting.Base;
using TTT.Formatting.Core;
using TTT.Public.Extensions;
namespace TTT.Formatting.Extensions;
-public static class ViewExtensions
-{
-
- public static FormatWriter ToWriter(this IView view)
- {
- var writer = new FormatWriter();
+public static class ViewExtensions {
+ public static FormatWriter ToWriter(this IView view) {
+ var writer = new FormatWriter();
- view.Render(writer);
+ view.Render(writer);
- return writer;
- }
+ return writer;
+ }
- public static IView ToServerConsole(this IView view)
- {
- var writer = view.ToWriter();
+ public static IView ToServerConsole(this IView view) {
+ var writer = view.ToWriter();
- foreach (string s in writer.Plain)
- {
- Server.PrintToConsole(s);
- }
+ foreach (var s in writer.Plain) Server.PrintToConsole(s);
- return view;
- }
+ return view;
+ }
- #region Individual
+ public static IView ToAllConsole(this IView view) {
+ Utilities.GetPlayers().ForEach(player => view.ToPlayerConsole(player));
- public static IView ToPlayerConsole(this IView view, CCSPlayerController player)
- {
- if (!player.IsReal() || player.IsBot)
- return view;
+ return view;
+ }
- var writer = view.ToWriter();
+ public static IView ToAllChat(this IView view) {
+ Utilities.GetPlayers().ForEach(player => view.ToPlayerChat(player));
- foreach (var writerLine in writer.Plain)
- player.PrintToConsole(writerLine);
+ return view;
+ }
- return view;
- }
+ public static IView ToAllCenter(this IView view) {
+ Utilities.GetPlayers().ForEach(player => view.ToPlayerCenter(player));
- public static IView ToPlayerChat(this IView view, CCSPlayerController player)
- {
- if (!player.IsReal() || player.IsBot)
- return view;
+ return view;
+ }
- var writer = view.ToWriter();
+ #region Individual
- foreach (var writerLine in writer.Chat)
- player.PrintToChat(writerLine);
+ public static IView ToPlayerConsole(this IView view,
+ CCSPlayerController player) {
+ if (!player.IsReal(false)) return view;
- return view;
- }
+ var writer = view.ToWriter();
- public static IView ToPlayerCenter(this IView view, CCSPlayerController player)
- {
- if (!player.IsReal() || player.IsBot)
- return view;
+ foreach (var writerLine in writer.Plain) player.PrintToConsole(writerLine);
- var writer = view.ToWriter();
- var merged = string.Join('\n', writer.Plain);
+ return view;
+ }
- player.PrintToCenter(merged);
+ public static IView
+ ToPlayerChat(this IView view, CCSPlayerController player) {
+ if (!player.IsReal(false)) return view;
- return view;
- }
+ var writer = view.ToWriter();
- public static IView ToPlayerCenterHtml(this IView view, CCSPlayerController player)
- {
- if (!player.IsReal() || player.IsBot)
- return view;
+ foreach (var writerLine in writer.Chat) player.PrintToChat(writerLine);
- var writer = view.ToWriter();
- var merged = string.Join('\n', writer.Panorama);
+ return view;
+ }
- player.PrintToCenterHtml(merged);
+ public static IView ToPlayerCenter(this IView view,
+ CCSPlayerController player) {
+ if (!player.IsReal(false)) return view;
- return view;
- }
+ var writer = view.ToWriter();
+ var merged = string.Join('\n', writer.Plain);
- #endregion
+ player.PrintToCenter(merged);
- public static IView ToAllConsole(this IView view)
- {
- Utilities.GetPlayers().ForEach(player => view.ToPlayerConsole(player));
+ return view;
+ }
- return view;
- }
+ public static IView ToPlayerCenterHtml(this IView view,
+ CCSPlayerController player) {
+ if (!player.IsReal(false)) return view;
- public static IView ToAllChat(this IView view)
- {
- Utilities.GetPlayers().ForEach(player => view.ToPlayerChat(player));
+ var writer = view.ToWriter();
+ var merged = string.Join('\n', writer.Panorama);
- return view;
- }
+ player.PrintToCenterHtml(merged);
- public static IView ToAllCenter(this IView view)
- {
- Utilities.GetPlayers().ForEach(player => view.ToPlayerCenter(player));
+ return view;
+ }
- return view;
- }
-}
+ #endregion
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Languages/English.cs b/public/TTT.Formatting/Languages/English.cs
index 727c519..7b5d539 100644
--- a/public/TTT.Formatting/Languages/English.cs
+++ b/public/TTT.Formatting/Languages/English.cs
@@ -2,6 +2,4 @@
namespace TTT.Formatting.Languages;
-public class English : IDialect
-{
-}
\ No newline at end of file
+public class English : IDialect { }
\ No newline at end of file
diff --git a/public/TTT.Formatting/Logistics/IDialect.cs b/public/TTT.Formatting/Logistics/IDialect.cs
index 52b81ef..76a77f3 100644
--- a/public/TTT.Formatting/Logistics/IDialect.cs
+++ b/public/TTT.Formatting/Logistics/IDialect.cs
@@ -1,9 +1,7 @@
namespace TTT.Formatting.Logistics;
///
-/// A specific language, such as "English" or "French",
-/// should inherit this interface.
+/// A specific language, such as "English" or "French",
+/// should inherit this interface.
///
-public interface IDialect
-{
-}
\ No newline at end of file
+public interface IDialect { }
\ No newline at end of file
diff --git a/public/TTT.Formatting/Logistics/ILanguage.cs b/public/TTT.Formatting/Logistics/ILanguage.cs
index d19e0d2..40b1479 100644
--- a/public/TTT.Formatting/Logistics/ILanguage.cs
+++ b/public/TTT.Formatting/Logistics/ILanguage.cs
@@ -1,11 +1,8 @@
namespace TTT.Formatting.Logistics;
///
-/// Specifies that this class is written in a specific language
-/// Eg, ILanguage<English> or ILanguage<French>
+/// Specifies that this class is written in a specific language
+/// Eg, ILanguage<English> or ILanguage<French>
///
///
-public interface ILanguage
- where TDialect : IDialect
-{
-}
\ No newline at end of file
+public interface ILanguage where TDialect : IDialect { }
\ No newline at end of file
diff --git a/public/TTT.Formatting/Logistics/LanguageConfig.cs b/public/TTT.Formatting/Logistics/LanguageConfig.cs
index 11c25ae..040be1b 100644
--- a/public/TTT.Formatting/Logistics/LanguageConfig.cs
+++ b/public/TTT.Formatting/Logistics/LanguageConfig.cs
@@ -1,18 +1,11 @@
-using TTT.Formatting.Views;
-
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection;
namespace TTT.Formatting.Logistics;
-public class LanguageConfig
- where TDialect: IDialect
-{
-
- private IServiceCollection _collection;
-
- public LanguageConfig(IServiceCollection collection)
- {
- _collection = collection;
- }
+public class LanguageConfig where TDialect : IDialect {
+ private IServiceCollection _collection;
-}
+ public LanguageConfig(IServiceCollection collection) {
+ _collection = collection;
+ }
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Logistics/RegisterLanguageExtensions.cs b/public/TTT.Formatting/Logistics/RegisterLanguageExtensions.cs
index d2606f8..72ded0f 100644
--- a/public/TTT.Formatting/Logistics/RegisterLanguageExtensions.cs
+++ b/public/TTT.Formatting/Logistics/RegisterLanguageExtensions.cs
@@ -2,15 +2,11 @@
namespace TTT.Formatting.Logistics;
-public static class RegisterLanguageExtensions
-{
- public static void AddLanguage(
- this IServiceCollection collection,
- Action> factory)
- where TDialect : IDialect
- {
- var config = new LanguageConfig(collection);
+public static class RegisterLanguageExtensions {
+ public static void AddLanguage(this IServiceCollection collection,
+ Action> factory) where TDialect : IDialect {
+ var config = new LanguageConfig(collection);
- factory(config);
- }
+ factory(config);
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Objects/HiddenFormatObject.cs b/public/TTT.Formatting/Objects/HiddenFormatObject.cs
index ef4f112..d6fe3f1 100644
--- a/public/TTT.Formatting/Objects/HiddenFormatObject.cs
+++ b/public/TTT.Formatting/Objects/HiddenFormatObject.cs
@@ -2,39 +2,29 @@
namespace TTT.Formatting.Objects;
-public class HiddenFormatObject : FormatObject
-{
- public FormatObject Value;
-
- public HiddenFormatObject(FormatObject value)
- {
- Value = value;
- }
-
- public bool Plain { get; set; } = true;
-
- public bool Panorama { get; set; } = true;
-
- public bool Chat { get; set; } = true;
-
- public override string ToChat()
- {
- if (Chat)
- return Value.ToChat();
- return string.Empty;
- }
-
- public override string ToPanorama()
- {
- if (Panorama)
- return Value.ToPanorama();
- return string.Empty;
- }
-
- public override string ToPlain()
- {
- if (Plain)
- return Value.ToPlain();
- return string.Empty;
- }
+public class HiddenFormatObject : FormatObject {
+ public FormatObject Value;
+
+ public HiddenFormatObject(FormatObject value) { Value = value; }
+
+ public bool Plain { get; set; } = true;
+
+ public bool Panorama { get; set; } = true;
+
+ public bool Chat { get; set; } = true;
+
+ public override string ToChat() {
+ if (Chat) return Value.ToChat();
+ return string.Empty;
+ }
+
+ public override string ToPanorama() {
+ if (Panorama) return Value.ToPanorama();
+ return string.Empty;
+ }
+
+ public override string ToPlain() {
+ if (Plain) return Value.ToPlain();
+ return string.Empty;
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Objects/IntegerFormatObject.cs b/public/TTT.Formatting/Objects/IntegerFormatObject.cs
index 2f06eac..acea79d 100644
--- a/public/TTT.Formatting/Objects/IntegerFormatObject.cs
+++ b/public/TTT.Formatting/Objects/IntegerFormatObject.cs
@@ -1,32 +1,20 @@
-using CounterStrikeSharp.API.Modules.Utils;
-using TTT.Formatting.Core;
+using TTT.Formatting.Core;
namespace TTT.Formatting.Objects;
-public class IntegerFormatObject : FormatObject
-{
- private readonly char _chatColor;
+public class IntegerFormatObject : FormatObject {
+ private readonly char _chatColor;
- public IntegerFormatObject(int value, char chatColor = '\x09')
- {
- Value = value;
- _chatColor = chatColor;
- }
+ public IntegerFormatObject(int value, char chatColor = '\x09') {
+ Value = value;
+ _chatColor = chatColor;
+ }
- public int Value { get; }
+ public int Value { get; }
- public override string ToChat()
- {
- return $"{_chatColor}{Value.ToString()}";
- }
+ public override string ToChat() { return $"{_chatColor}{Value.ToString()}"; }
- public override string ToPanorama()
- {
- return Value.ToString();
- }
+ public override string ToPanorama() { return Value.ToString(); }
- public override string ToPlain()
- {
- return Value.ToString();
- }
+ public override string ToPlain() { return Value.ToString(); }
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Objects/PlayerFormatObject.cs b/public/TTT.Formatting/Objects/PlayerFormatObject.cs
index 846fdcb..c03bd4b 100644
--- a/public/TTT.Formatting/Objects/PlayerFormatObject.cs
+++ b/public/TTT.Formatting/Objects/PlayerFormatObject.cs
@@ -5,27 +5,16 @@
namespace TTT.Formatting.Objects;
-public class PlayerFormatObject : FormatObject
-{
- private readonly string _name;
+public class PlayerFormatObject : FormatObject {
+ private readonly string _name;
- public PlayerFormatObject(CCSPlayerController player)
- {
- _name = player.PlayerName;
- }
+ public PlayerFormatObject(CCSPlayerController player) {
+ _name = player.PlayerName;
+ }
- public override string ToChat()
- {
- return $"{ChatColors.Yellow}{_name}";
- }
+ public override string ToChat() { return $"{ChatColors.Yellow}{_name}"; }
- public override string ToPanorama()
- {
- return _name.Sanitize();
- }
+ public override string ToPanorama() { return _name.Sanitize(); }
- public override string ToPlain()
- {
- return _name;
- }
-}
+ public override string ToPlain() { return _name; }
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Objects/StringFormatObject.cs b/public/TTT.Formatting/Objects/StringFormatObject.cs
index 7c85915..511d9fc 100644
--- a/public/TTT.Formatting/Objects/StringFormatObject.cs
+++ b/public/TTT.Formatting/Objects/StringFormatObject.cs
@@ -2,30 +2,19 @@
namespace TTT.Formatting.Objects;
-public class StringFormatObject : FormatObject
-{
- private readonly char _chatColor;
+public class StringFormatObject : FormatObject {
+ private readonly char _chatColor;
- public StringFormatObject(string value, char chatColor = '\x01')
- {
- Value = value;
- _chatColor = chatColor;
- }
+ public StringFormatObject(string value, char chatColor = '\x01') {
+ Value = value;
+ _chatColor = chatColor;
+ }
- public string Value { get; }
+ public string Value { get; }
- public override string ToChat()
- {
- return $"{_chatColor}{Value}";
- }
+ public override string ToChat() { return $"{_chatColor}{Value}"; }
- public override string ToPanorama()
- {
- return Value;
- }
+ public override string ToPanorama() { return Value; }
- public override string ToPlain()
- {
- return Value;
- }
+ public override string ToPlain() { return Value; }
}
\ No newline at end of file
diff --git a/public/TTT.Formatting/Objects/TreeFormatObject.cs b/public/TTT.Formatting/Objects/TreeFormatObject.cs
index 647c812..da6f8d9 100644
--- a/public/TTT.Formatting/Objects/TreeFormatObject.cs
+++ b/public/TTT.Formatting/Objects/TreeFormatObject.cs
@@ -1,86 +1,67 @@
using System.Collections;
-
using TTT.Formatting.Core;
namespace TTT.Formatting.Objects;
///
-/// Merges several FormatObjects into one.
-/// This class will throw an error if any of it's descendant formatobjects are itself,
-/// to prevent looping.
+/// Merges several FormatObjects into one.
+/// This class will throw an error if any of it's descendant formatobjects are itself,
+/// to prevent looping.
///
-public class TreeFormatObject : FormatObject, IEnumerable
-{
- private List _children = new();
-
- private int _locked = 0;
-
- public TreeFormatObject()
- {
-
- }
-
- ///
- /// Lock this object, execute callback, then unlock.
- ///
- ///
- private T Lock(Func callback)
- {
- // Achieve a re-entrant mutex for this thread.
- // We can re-enter this lock as long as we are in the same thread, but others are blocked.
- // this allows us to do the internal increment safely.
- lock (this)
- {
- // set _locked to 1 if value is 0
- int old = Interlocked.CompareExchange(ref _locked, 1, 0);
-
- if (old == 1)
- throw new Exception("Possible loop detected in TreeFormatObject! Already locked during traversal");
-
- var result = callback();
- _locked = 0;
-
- return result;
- }
- }
-
- public override string ToPlain()
- {
- return Lock(() =>
- {
- var childPlain = _children.Select(child => child.ToPlain());
- return string.Join(' ', childPlain);
- });
- }
-
- public override string ToChat()
- {
- return Lock(() =>
- {
- var childChat = _children.Select(child => child.ToChat());
- return string.Join(' ', childChat);
- });
- }
-
- public override string ToPanorama()
- {
- return Lock(() =>
- {
- var childPanorama = _children.Select(child => child.ToPanorama());
- return string.Join(' ', childPanorama);
- });
- }
-
- public void Add(FormatObject formatObject)
- => _children.Add(formatObject);
-
- public IEnumerator GetEnumerator()
- {
- return _children.GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
-}
+public class TreeFormatObject : FormatObject, IEnumerable {
+ private readonly List _children = new();
+
+ private int _locked;
+
+ public IEnumerator GetEnumerator() {
+ return _children.GetEnumerator();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
+
+ ///
+ /// Lock this object, execute callback, then unlock.
+ ///
+ ///
+ private T Lock(Func callback) {
+ // Achieve a re-entrant mutex for this thread.
+ // We can re-enter this lock as long as we are in the same thread, but others are blocked.
+ // this allows us to do the internal increment safely.
+ lock (this) {
+ // set _locked to 1 if value is 0
+ var old = Interlocked.CompareExchange(ref _locked, 1, 0);
+
+ if (old == 1)
+ throw new Exception(
+ "Possible loop detected in TreeFormatObject! Already locked during traversal");
+
+ var result = callback();
+ _locked = 0;
+
+ return result;
+ }
+ }
+
+ public override string ToPlain() {
+ return Lock(() => {
+ var childPlain = _children.Select(child => child.ToPlain());
+ return string.Join(' ', childPlain);
+ });
+ }
+
+ public override string ToChat() {
+ return Lock(() => {
+ var childChat = _children.Select(child => child.ToChat());
+ return string.Join(' ', childChat);
+ });
+ }
+
+ public override string ToPanorama() {
+ return Lock(() => {
+ var childPanorama = _children.Select(child => child.ToPanorama());
+ return string.Join(' ', childPanorama);
+ });
+ }
+
+ public void Add(FormatObject formatObject) { _children.Add(formatObject); }
+}
\ No newline at end of file
diff --git a/public/TTT.Formatting/TTT.Formatting.csproj b/public/TTT.Formatting/TTT.Formatting.csproj
index 0d44a15..77467aa 100644
--- a/public/TTT.Formatting/TTT.Formatting.csproj
+++ b/public/TTT.Formatting/TTT.Formatting.csproj
@@ -7,7 +7,7 @@
-
-
+
+
diff --git a/public/TTT.Formatting/Views/IRoleNotifications.cs b/public/TTT.Formatting/Views/IRoleNotifications.cs
index 35826a6..94be705 100644
--- a/public/TTT.Formatting/Views/IRoleNotifications.cs
+++ b/public/TTT.Formatting/Views/IRoleNotifications.cs
@@ -3,9 +3,8 @@
namespace TTT.Formatting.Views;
-public interface IRoleNotifications
-{
- IView GetRoleNotification(Role role);
- IView KilledByRoleNotification(Role role);
- IView KilledRoleNotification(Role role);
+public interface IRoleNotifications {
+ IView GetRoleNotification(Role role);
+ IView KilledByRoleNotification(Role role);
+ IView KilledRoleNotification(Role role);
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/DamageAction.cs b/public/TTT.Public/Action/DamageAction.cs
index 842b0c9..160d780 100644
--- a/public/TTT.Public/Action/DamageAction.cs
+++ b/public/TTT.Public/Action/DamageAction.cs
@@ -4,38 +4,32 @@
namespace TTT.Public.Action;
-public class DamageAction : Action
-{
- private readonly Tuple? _actor;
- private readonly Tuple _attackedPlayer;
- private readonly int _damage;
- private readonly int _roundTime;
+public class DamageAction : Action {
+ private readonly Tuple? _actor;
+ private readonly Tuple _attackedPlayer;
+ private readonly int _damage;
+ private readonly int _roundTime;
- public DamageAction(Tuple? actor, Tuple attackedPlayer,
- int damage, int roundTime)
- {
- _actor = actor;
- _attackedPlayer = attackedPlayer;
- _damage = damage;
- _roundTime = roundTime;
- }
+ public DamageAction(Tuple? actor,
+ Tuple attackedPlayer, int damage,
+ int roundTime) {
+ _actor = actor;
+ _attackedPlayer = attackedPlayer;
+ _damage = damage;
+ _roundTime = roundTime;
+ }
- public override CCSPlayerController Actor()
- {
- return _actor.Item1;
- }
-
- private string GetActorName()
- {
- return _actor?.Item2.FormatStringFullAfter(" " + _actor?.Item1.PlayerName) ?? "World";
- }
+ public override CCSPlayerController Actor() { return _actor.Item1; }
- public override string ActionMessage()
- {
-
- var attackedPlayerRole = _attackedPlayer.Item2;
- return $"[TTT] {GetActorName()}" +
- $" damaged {attackedPlayerRole.FormatStringFullAfter(" " + _attackedPlayer.Item1.PlayerName)}" +
- $" for {_damage} hp.";
- }
+ private string GetActorName() {
+ return _actor?.Item2.FormatStringFullAfter(" " + _actor?.Item1.PlayerName)
+ ?? "World";
+ }
+
+ public override string ActionMessage() {
+ var attackedPlayerRole = _attackedPlayer.Item2;
+ return $"[TTT] {GetActorName()}"
+ + $" damaged {attackedPlayerRole.FormatStringFullAfter(" " + _attackedPlayer.Item1.PlayerName)}"
+ + $" for {_damage} hp.";
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/DeathAction.cs b/public/TTT.Public/Action/DeathAction.cs
index 4c4fa32..87bac54 100644
--- a/public/TTT.Public/Action/DeathAction.cs
+++ b/public/TTT.Public/Action/DeathAction.cs
@@ -4,24 +4,17 @@
namespace TTT.Public.Action;
-public class DeathAction : Action
-{
- private readonly Tuple _actor;
+public class DeathAction : Action {
+ private readonly Tuple _actor;
- public DeathAction(Tuple actor)
- {
- _actor = actor;
- }
+ public DeathAction(Tuple actor) { _actor = actor; }
- public override CCSPlayerController Actor()
- {
- return _actor.Item1;
- }
+ public override CCSPlayerController Actor() { return _actor.Item1; }
- public override string ActionMessage()
- {
- var actorRole = _actor.Item2;
- return $"[TTT] {actorRole.FormatStringFullAfter(" " + _actor.Item1.PlayerName)}" +
- $" was killed by world.";
- }
+ public override string ActionMessage() {
+ var actorRole = _actor.Item2;
+ return
+ $"[TTT] {actorRole.FormatStringFullAfter(" " + _actor.Item1.PlayerName)}"
+ + $" was killed by world.";
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/IAction.cs b/public/TTT.Public/Action/IAction.cs
index a32097a..11ae959 100644
--- a/public/TTT.Public/Action/IAction.cs
+++ b/public/TTT.Public/Action/IAction.cs
@@ -3,13 +3,11 @@
namespace TTT.Public.Action;
-public abstract class Action
-{
- public abstract CCSPlayerController Actor();
- public abstract string ActionMessage();
+public abstract class Action {
+ public abstract CCSPlayerController Actor();
+ public abstract string ActionMessage();
- protected static string GoodAction(Role actor, Role actor2)
- {
- return actor == actor2 ? "[Bad action!]" : "";
- }
+ protected static string GoodAction(Role actor, Role actor2) {
+ return actor == actor2 ? "[Bad action!]" : "";
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/KillAction.cs b/public/TTT.Public/Action/KillAction.cs
index b383450..b5084bb 100644
--- a/public/TTT.Public/Action/KillAction.cs
+++ b/public/TTT.Public/Action/KillAction.cs
@@ -4,28 +4,24 @@
namespace TTT.Public.Action;
-public class KillAction : Action
-{
- private readonly Tuple _actor;
- private readonly Tuple _attackedPlayer;
+public class KillAction : Action {
+ private readonly Tuple _actor;
+ private readonly Tuple _attackedPlayer;
- public KillAction(Tuple actor, Tuple attackedPlayer)
- {
- _actor = actor;
- _attackedPlayer = attackedPlayer;
- }
+ public KillAction(Tuple actor,
+ Tuple attackedPlayer) {
+ _actor = actor;
+ _attackedPlayer = attackedPlayer;
+ }
- public override CCSPlayerController Actor()
- {
- return _actor.Item1;
- }
+ public override CCSPlayerController Actor() { return _actor.Item1; }
- public override string ActionMessage()
- {
- var actorRole = _actor.Item2;
- var attackedPlayerRole = _attackedPlayer.Item2;
- return $"[TTT] {actorRole.FormatStringFullAfter(" " + _actor.Item1.PlayerName)}" +
- $" killed {attackedPlayerRole.FormatStringFullAfter(" " + _attackedPlayer.Item1.PlayerName)}. " +
- $"{GoodAction(actorRole, attackedPlayerRole)}";
- }
+ public override string ActionMessage() {
+ var actorRole = _actor.Item2;
+ var attackedPlayerRole = _attackedPlayer.Item2;
+ return
+ $"[TTT] {actorRole.FormatStringFullAfter(" " + _actor.Item1.PlayerName)}"
+ + $" killed {attackedPlayerRole.FormatStringFullAfter(" " + _attackedPlayer.Item1.PlayerName)}. "
+ + $"{GoodAction(actorRole, attackedPlayerRole)}";
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/MiscAction.cs b/public/TTT.Public/Action/MiscAction.cs
index f4cbdfb..63994d4 100644
--- a/public/TTT.Public/Action/MiscAction.cs
+++ b/public/TTT.Public/Action/MiscAction.cs
@@ -2,24 +2,18 @@
namespace TTT.Public.Action;
-public class MiscAction : Action
-{
- private readonly string _action;
- private readonly CCSPlayerController _actor;
+public class MiscAction : Action {
+ private readonly string _action;
+ private readonly CCSPlayerController _actor;
- public MiscAction(string action, CCSPlayerController actor)
- {
- _action = action;
- _actor = actor;
- }
+ public MiscAction(string action, CCSPlayerController actor) {
+ _action = action;
+ _actor = actor;
+ }
- public override CCSPlayerController Actor()
- {
- return _actor;
- }
+ public override CCSPlayerController Actor() { return _actor; }
- public override string ActionMessage()
- {
- return _actor.PlayerName + " " + _action;
- }
+ public override string ActionMessage() {
+ return _actor.PlayerName + " " + _action;
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Action/ShopAction.cs b/public/TTT.Public/Action/ShopAction.cs
index 0d946ea..d852bdb 100644
--- a/public/TTT.Public/Action/ShopAction.cs
+++ b/public/TTT.Public/Action/ShopAction.cs
@@ -1,5 +1,3 @@
namespace TTT.Public.Action;
-public class ShopAction
-{
-}
\ No newline at end of file
+public class ShopAction { }
\ No newline at end of file
diff --git a/public/TTT.Public/Behaviors/IPluginBehavior.cs b/public/TTT.Public/Behaviors/IPluginBehavior.cs
index ada7b0a..b070b6b 100644
--- a/public/TTT.Public/Behaviors/IPluginBehavior.cs
+++ b/public/TTT.Public/Behaviors/IPluginBehavior.cs
@@ -3,18 +3,13 @@
namespace TTT.Public.Behaviors;
///
-/// A plugin extension class that is
+/// A plugin extension class that is
///
-public interface IPluginBehavior : IDisposable
-{
- void IDisposable.Dispose()
- {
- }
+public interface IPluginBehavior : IDisposable {
+ void IDisposable.Dispose() { }
- ///
- /// Tells the plugin that it will be starting imminently
- ///
- void Start(BasePlugin parent)
- {
- }
+ ///
+ /// Tells the plugin that it will be starting imminently
+ ///
+ void Start(BasePlugin parent) { }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Configuration/IConfigService.cs b/public/TTT.Public/Configuration/IConfigService.cs
index 45f07c0..7eccf1a 100644
--- a/public/TTT.Public/Configuration/IConfigService.cs
+++ b/public/TTT.Public/Configuration/IConfigService.cs
@@ -1,16 +1,14 @@
namespace TTT.Public.Configuration;
-public interface IConfigService
-{
- public const string ConfigPath = "jailbreak.json";
+public interface IConfigService {
+ public const string ConfigPath = "jailbreak.json";
- ///
- /// Get the configuration object with the provided name
- ///
- ///
- /// If the configuration service would return the default value, fail instead. Loudly.
- ///
- ///
- T Get(string path, bool failOnDefault = false)
- where T : class, new();
+ ///
+ /// Get the configuration object with the provided name
+ ///
+ ///
+ /// If the configuration service would return the default value, fail instead. Loudly.
+ ///
+ ///
+ T Get(string path, bool failOnDefault = false) where T : class, new();
}
\ No newline at end of file
diff --git a/public/TTT.Public/Database/DatabaseService.cs b/public/TTT.Public/Database/DatabaseService.cs
index 39e8a51..e337c5c 100644
--- a/public/TTT.Public/Database/DatabaseService.cs
+++ b/public/TTT.Public/Database/DatabaseService.cs
@@ -2,66 +2,55 @@
using MySqlConnector;
using TTT.Player;
using TTT.Public.Mod.Role;
-using TTT.Public.Player;
namespace TTT.Public.Database;
-public class DatabaseService
-{
- private MySqlConnection _connector;
+public class DatabaseService {
+ private readonly MySqlConnection _connector;
- public DatabaseService()
- {
- _connector = new MySqlConnection();
- _connector.OpenAsync();
- CreateTable();
- }
+ public DatabaseService() {
+ _connector = new MySqlConnection();
+ _connector.OpenAsync();
+ CreateTable();
+ }
- public void CreateTable()
- {
- Task.Run(async () =>
- {
- var command = new MySqlCommand("CREATE TABLE IF NOT EXISTS PlayerData(steamid VARCHAR(17) NOT NULL," +
- "kills INT," +
- "deaths INT," +
- "karma INT," +
- "traitor_kills INT," +
- "traitors_killed INT," +
- "PRIMARY KEY(steamid));");
- command.Connection = _connector;
- await command.ExecuteNonQueryAsync();
- });
-
- }
+ public void CreateTable() {
+ Task.Run(async () => {
+ var command = new MySqlCommand(
+ "CREATE TABLE IF NOT EXISTS PlayerData(steamid VARCHAR(17) NOT NULL,"
+ + "kills INT," + "deaths INT," + "karma INT," + "traitor_kills INT,"
+ + "traitors_killed INT," + "PRIMARY KEY(steamid));");
+ command.Connection = _connector;
+ await command.ExecuteNonQueryAsync();
+ });
+ }
- public GamePlayer CreateProfile(CCSPlayerController player)
- {
- var id = player.SteamID;
+ public GamePlayer CreateProfile(CCSPlayerController player) {
+ var id = player.SteamID;
- Task.Run(async () =>
- {
- var command = new MySqlCommand("INSERT IGNORE INTO PlayerData(steamid, kills, deaths, karma, traitor_kills, traitors_killed)" +
- $" VALUES ({id}, 0, 0, 80, 0, 0);");
- command.Connection = _connector;
- await command.ExecuteNonQueryAsync();
- });
- return new GamePlayer(Role.Unassigned, 800, 0, player.UserId.Value);
- }
+ Task.Run(async () => {
+ var command = new MySqlCommand(
+ "INSERT IGNORE INTO PlayerData(steamid, kills, deaths, karma, traitor_kills, traitors_killed)"
+ + $" VALUES ({id}, 0, 0, 80, 0, 0);");
+ command.Connection = _connector;
+ await command.ExecuteNonQueryAsync();
+ });
+ return new GamePlayer(Role.Unassigned, 800, 0, player.UserId.Value);
+ }
- public void UpdatePlayer(GamePlayer player)
- {
- Task.Run(async () =>
- {
- var command = new MySqlCommand("UPDATE PlayerData SET kills = @kills, deaths = @deaths, karma = @karma, traitor_kills = @traitor_kills, traitors_killed = @traitors_killed" +
- " WHERE steamid = @steamid;");
- command.Parameters.AddWithValue("@kills", 0);
- command.Parameters.AddWithValue("@deaths", 0);
- command.Parameters.AddWithValue("@karma", player.Karma());
- command.Parameters.AddWithValue("@traitor_kills", 0);
- command.Parameters.AddWithValue("@traitors_killed", 0);
- command.Parameters.AddWithValue("@steamid", player.Player().SteamID);
- command.Connection = _connector;
- await command.ExecuteNonQueryAsync();
- });
- }
+ public void UpdatePlayer(GamePlayer player) {
+ Task.Run(async () => {
+ var command = new MySqlCommand(
+ "UPDATE PlayerData SET kills = @kills, deaths = @deaths, karma = @karma, traitor_kills = @traitor_kills, traitors_killed = @traitors_killed"
+ + " WHERE steamid = @steamid;");
+ command.Parameters.AddWithValue("@kills", 0);
+ command.Parameters.AddWithValue("@deaths", 0);
+ command.Parameters.AddWithValue("@karma", player.Karma());
+ command.Parameters.AddWithValue("@traitor_kills", 0);
+ command.Parameters.AddWithValue("@traitors_killed", 0);
+ command.Parameters.AddWithValue("@steamid", player.Player().SteamID);
+ command.Connection = _connector;
+ await command.ExecuteNonQueryAsync();
+ });
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Extensions/EntityIOExtensions.cs b/public/TTT.Public/Extensions/EntityIOExtensions.cs
index 5183f40..63fd3fd 100644
--- a/public/TTT.Public/Extensions/EntityIOExtensions.cs
+++ b/public/TTT.Public/Extensions/EntityIOExtensions.cs
@@ -3,26 +3,22 @@
namespace TTT.Public.Extensions;
-public static class EntityIOExtensions
-{
- public static bool TryGetController(this CEntityInstance pawn, out CCSPlayerController? controller)
- {
- controller = null;
+public static class EntityIOExtensions {
+ public static bool TryGetController(this CEntityInstance pawn,
+ out CCSPlayerController? controller) {
+ controller = null;
- if (!pawn.IsValid)
- return false;
+ if (!pawn.IsValid) return false;
- var index = (int)pawn.Index;
- var playerPawn = Utilities.GetEntityFromIndex(index);
+ var index = (int)pawn.Index;
+ var playerPawn = Utilities.GetEntityFromIndex(index);
- if (!playerPawn.IsValid)
- return false;
+ if (!playerPawn.IsValid) return false;
- if (!playerPawn.OriginalController.IsValid)
- return false;
+ if (!playerPawn.OriginalController.IsValid) return false;
- controller = playerPawn.OriginalController.Value;
+ controller = playerPawn.OriginalController.Value;
- return controller?.IsReal() == true;
- }
-}
+ return controller?.IsReal() == true;
+ }
+}
\ No newline at end of file
diff --git a/public/TTT.Public/Extensions/PlayerExtensions.cs b/public/TTT.Public/Extensions/PlayerExtensions.cs
index c73f338..f914c31 100644
--- a/public/TTT.Public/Extensions/PlayerExtensions.cs
+++ b/public/TTT.Public/Extensions/PlayerExtensions.cs
@@ -5,87 +5,88 @@
namespace TTT.Public.Extensions;
-public static class PlayerExtensions
-{
- public static CsTeam GetTeam(this CCSPlayerController controller)
- {
- return (CsTeam)controller.TeamNum;
- }
-
- public static string GetActiveWeaponName(this CCSPlayerController player)
- {
- return player.PlayerPawn.Value?.WeaponServices?.ActiveWeapon.Value?.DesignerName ?? string.Empty;
- }
-
- public static CCSPlayerController? GetClientPlayerAimTarget(this CCSPlayerController player)
- {
- var GameRules = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault()?.GameRules;
-
- if (GameRules is null)
- return null;
-
- VirtualFunctionWithReturn findPickerEntity = new(GameRules.Handle, 28);
- var target = new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
-
- if (target.DesignerName is "player")
- {
- return target.As().OriginalController.Value;
- }
-
- return null;
-
- }
-
- public static CCSPlayerController? GetClientRagdollAimTarget(this CCSPlayerController player)
- {
- var GameRules = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault()?.GameRules;
-
- if (GameRules is null)
- return null;
-
- VirtualFunctionWithReturn findPickerEntity = new(GameRules.Handle, 28);
- var target = new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
-
- if (target.DesignerName is "player")
- {
- return target.As().OriginalController.Value;
- }
-
- return null;
- }
-
- public static CBaseDoor? GetClientPlayerTraitorRoom(this CCSPlayerController player)
- {
- var GameRules = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault()?.GameRules;
-
- if (GameRules is null)
- return null;
-
- VirtualFunctionWithReturn findPickerEntity = new(GameRules.Handle, 28);
- var target = new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
-
- if (target.DesignerName is "func_door" || target.DesignerName is "prop_door_rotating")
- {
- return target.As();
- }
-
- return null;
- }
-
-
- public static bool IsReal(this CCSPlayerController player)
- {
- // Do nothing else before this:
- // Verifies the handle points to an entity within the global entity list.
- if (!player.IsValid)
- return false;
-
- if (player.Connected != PlayerConnectedState.PlayerConnected)
- return false;
-
- if (player.IsBot || player.IsHLTV)
- return false;
-
- return true;
- }
+public static class PlayerExtensions {
+ public static CsTeam GetTeam(this CCSPlayerController controller) {
+ return (CsTeam)controller.TeamNum;
+ }
+
+ public static string GetActiveWeaponName(this CCSPlayerController player) {
+ return player.PlayerPawn.Value?.WeaponServices?.ActiveWeapon.Value
+ ?.DesignerName ?? string.Empty;
+ }
+
+ public static CCSPlayerController? GetClientPlayerAimTarget(
+ this CCSPlayerController player) {
+ var GameRules = Utilities
+ .FindAllEntitiesByDesignerName("cs_gamerules")
+ .FirstOrDefault()
+ ?.GameRules;
+
+ if (GameRules is null) return null;
+
+ VirtualFunctionWithReturn findPickerEntity =
+ new(GameRules.Handle, 28);
+ var target =
+ new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
+
+ if (target.DesignerName is "player")
+ return target.As().OriginalController.Value;
+
+ return null;
+ }
+
+ public static CCSPlayerController? GetClientRagdollAimTarget(
+ this CCSPlayerController player) {
+ var GameRules = Utilities
+ .FindAllEntitiesByDesignerName("cs_gamerules")
+ .FirstOrDefault()
+ ?.GameRules;
+
+ if (GameRules is null) return null;
+
+ VirtualFunctionWithReturn findPickerEntity =
+ new(GameRules.Handle, 28);
+ var target =
+ new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
+
+ if (target.DesignerName is "player")
+ return target.As().OriginalController.Value;
+
+ return null;
+ }
+
+ public static CBaseDoor? GetClientPlayerTraitorRoom(
+ this CCSPlayerController player) {
+ var GameRules = Utilities
+ .FindAllEntitiesByDesignerName("cs_gamerules")
+ .FirstOrDefault()
+ ?.GameRules;
+
+ if (GameRules is null) return null;
+
+ VirtualFunctionWithReturn findPickerEntity =
+ new(GameRules.Handle, 28);
+ var target =
+ new CBaseEntity(findPickerEntity.Invoke(GameRules.Handle, player.Handle));
+
+ if (target.DesignerName is "func_door"
+ || target.DesignerName is "prop_door_rotating")
+ return target.As();
+
+ return null;
+ }
+
+
+ public static bool IsReal(this CCSPlayerController player, bool bot = true) {
+ // Do nothing else before this:
+ // Verifies the handle points to an entity within the global entity list.
+ if (!player.IsValid) return false;
+
+ if (player.Connected != PlayerConnectedState.PlayerConnected) return false;
+
+ if (player.IsBot) return bot;
+ if (player.IsHLTV) return false;
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Extensions/ScoreboardExtension.cs b/public/TTT.Public/Extensions/ScoreboardExtension.cs
index d7f9902..ff85fc2 100644
--- a/public/TTT.Public/Extensions/ScoreboardExtension.cs
+++ b/public/TTT.Public/Extensions/ScoreboardExtension.cs
@@ -5,104 +5,96 @@
namespace TTT.Round;
-public static class ScoreboardExtension
-{
- public static void ModifyScoreBoard(this CCSPlayerController? player)
- {
- if (player == null) return;
- if (!player.IsReal()) return;
- var actionService = player.ActionTrackingServices;
- if (actionService == null) return;
+public static class ScoreboardExtension {
+ public static void ModifyScoreBoard(this CCSPlayerController? player) {
+ if (player == null) return;
+ var actionService = player.ActionTrackingServices;
+ if (actionService == null) return;
- RemoveKills(player);
- RemoveDamage(player);
- RemoveDeaths(player);
- RemoveUtilityDamage(player);
- RemoveAssists(player);
- RemoveEnemiesFlashed(player);
- RemoveHeadshotKills(player);
- KillIconTest(player);
- }
-
- public static void ModifyKarma(this GamePlayer gamePlayer)
- {
- var player = gamePlayer.Player();
- if (player == null) return;
- SetScore(gamePlayer);
- }
+ RemoveKills(player);
+ RemoveDamage(player);
+ RemoveDeaths(player);
+ RemoveUtilityDamage(player);
+ RemoveAssists(player);
+ RemoveEnemiesFlashed(player);
+ RemoveHeadshotKills(player);
+ KillIconTest(player);
+ }
- private static void SetScore(GamePlayer gamePlayer)
- {
- var player = gamePlayer.Player();
- if (player == null) return;
-
- if (player.Score == gamePlayer.Karma()) return;
- player.Score = gamePlayer.Karma();
- }
-
- private static void KillIconTest(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices;
- if (matchStats.NumRoundKills == 0 && matchStats.NumRoundKillsHeadshots == 0) return;
- matchStats.NumRoundKills = 0;
- matchStats.NumRoundKillsHeadshots = 0;
- Utilities.SetStateChanged(player, "CCSPlayerController_ActionTrackingServices", "m_iNumRoundKills");
- Utilities.SetStateChanged(player, "CCSPlayerController_ActionTrackingServices", "m_iNumRoundKillsHeadshots");
- }
-
- private static void RemoveKills(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.Kills == 0) return;
- matchStats.Kills = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iKills");
- }
+ public static void ModifyKarma(this GamePlayer gamePlayer) {
+ var player = gamePlayer.Player();
+ if (player == null) return;
+ SetScore(gamePlayer);
+ }
- private static void RemoveDamage(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.Damage == 0) return;
- matchStats.Damage = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iDamage");
- }
-
- private static void RemoveUtilityDamage(CCSPlayerController player) {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.UtilityDamage == 0) return;
- matchStats.UtilityDamage = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iUtilityDamage");
- }
+ private static void SetScore(GamePlayer gamePlayer) {
+ var player = gamePlayer.Player();
+ if (player == null) return;
- private static void RemoveDeaths(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.Deaths == 0) return;
- matchStats.Deaths = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iDeaths");
- }
+ if (player.Score == gamePlayer.Karma()) return;
+ player.Score = gamePlayer.Karma();
+ }
- private static void RemoveAssists(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.Assists == 0) return;
- matchStats.Assists = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iAssists");
- }
+ private static void KillIconTest(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices;
+ if (matchStats.NumRoundKills == 0 && matchStats.NumRoundKillsHeadshots == 0)
+ return;
+ matchStats.NumRoundKills = 0;
+ matchStats.NumRoundKillsHeadshots = 0;
+ Utilities.SetStateChanged(player,
+ "CCSPlayerController_ActionTrackingServices", "m_iNumRoundKills");
+ Utilities.SetStateChanged(player,
+ "CCSPlayerController_ActionTrackingServices",
+ "m_iNumRoundKillsHeadshots");
+ }
- private static void RemoveEnemiesFlashed(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.EnemiesFlashed == 0) return;
- matchStats.EnemiesFlashed = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iEnemiesFlashed");
- }
-
- private static void RemoveHeadshotKills(CCSPlayerController player)
- {
- var matchStats = player.ActionTrackingServices!.MatchStats;
- if (matchStats.HeadShotKills == 0) return;
- matchStats.HeadShotKills = 0;
- Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iHeadShotKills");
- }
+ private static void RemoveKills(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.Kills == 0) return;
+ matchStats.Kills = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iKills");
+ }
+
+ private static void RemoveDamage(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.Damage == 0) return;
+ matchStats.Damage = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iDamage");
+ }
+
+ private static void RemoveUtilityDamage(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.UtilityDamage == 0) return;
+ matchStats.UtilityDamage = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iUtilityDamage");
+ }
+
+ private static void RemoveDeaths(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.Deaths == 0) return;
+ matchStats.Deaths = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iDeaths");
+ }
+
+ private static void RemoveAssists(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.Assists == 0) return;
+ matchStats.Assists = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iAssists");
+ }
+
+ private static void RemoveEnemiesFlashed(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.EnemiesFlashed == 0) return;
+ matchStats.EnemiesFlashed = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iEnemiesFlashed");
+ }
+
+ private static void RemoveHeadshotKills(CCSPlayerController player) {
+ var matchStats = player.ActionTrackingServices!.MatchStats;
+ if (matchStats.HeadShotKills == 0) return;
+ matchStats.HeadShotKills = 0;
+ Utilities.SetStateChanged(player, "CSPerRoundStats_t", "m_iHeadShotKills");
+ }
}
\ No newline at end of file
diff --git a/public/TTT.Public/Extensions/ServerExtensions.cs b/public/TTT.Public/Extensions/ServerExtensions.cs
index 4bda151..3f76c60 100644
--- a/public/TTT.Public/Extensions/ServerExtensions.cs
+++ b/public/TTT.Public/Extensions/ServerExtensions.cs
@@ -5,26 +5,27 @@
namespace TTT.Public.Extensions;
-public static class ServerExtensions
-{
- public static void PrintToCenterAll(string message)
- {
- VirtualFunctions.ClientPrintAll(HudDestination.Center, message, 0, 0, 0, 0);
- }
+public static class ServerExtensions {
+ public static void PrintToCenterAll(string message) {
+ VirtualFunctions.ClientPrintAll(HudDestination.Center, message, 0, 0, 0, 0);
+ }
- ///
- /// Get the current CCSGameRules for the server
- ///
- ///
- public static CCSGameRules GetGameRules()
- {
- // From killstr3ak
- return Utilities.FindAllEntitiesByDesignerName("cs_gamerules").First().GameRules!;
- }
-
- public static CCSGameRulesProxy GetGameRulesProxy()
- {
- // From killstr3ak
- return Utilities.FindAllEntitiesByDesignerName("cs_gamerules").First()!;
- }
-}
+ ///
+ /// Get the current CCSGameRules for the server
+ ///
+ ///
+ public static CCSGameRules GetGameRules() {
+ // From killstr3ak
+ return Utilities
+ .FindAllEntitiesByDesignerName("cs_gamerules")
+ .First()
+ .GameRules!;
+ }
+
+ public static CCSGameRulesProxy GetGameRulesProxy() {
+ // From killstr3ak
+ return Utilities
+ .FindAllEntitiesByDesignerName("cs_gamerules")
+ .First()!;
+ }
+}
\ No newline at end of file
diff --git a/public/TTT.Public/Extensions/ServiceCollectionExtensions.cs b/public/TTT.Public/Extensions/ServiceCollectionExtensions.cs
index 1408fee..d647b78 100644
--- a/public/TTT.Public/Extensions/ServiceCollectionExtensions.cs
+++ b/public/TTT.Public/Extensions/ServiceCollectionExtensions.cs
@@ -1,63 +1,66 @@
-using TTT.Public.Behaviors;
+using Microsoft.Extensions.DependencyInjection;
+using TTT.Public.Behaviors;
using TTT.Public.Configuration;
-using Microsoft.Extensions.DependencyInjection;
namespace TTT.Public.Extensions;
-public static class ServiceCollectionExtensions
-{
+public static class ServiceCollectionExtensions {
///
- /// Add a to the global service collection
+ /// Add a to the global service collection
///
///
///
- public static void AddPluginBehavior(this IServiceCollection collection)
- where TExtension : class, IPluginBehavior
- {
- // Add the root extension itself as a scoped service.
- // This means every time Load is called in the main Jailbreak loader,
- // the extension will be fetched and kept as a singleton for the duration
- // until "Unload" is called.
- collection.AddScoped();
+ public static void
+ AddPluginBehavior(this IServiceCollection collection)
+ where TExtension : class, IPluginBehavior {
+ // Add the root extension itself as a scoped service.
+ // This means every time Load is called in the main Jailbreak loader,
+ // the extension will be fetched and kept as a singleton for the duration
+ // until "Unload" is called.
+ collection.AddScoped();
- collection.AddTransient(provider => provider.GetRequiredService());
- }
+ collection.AddTransient(provider
+ => provider.GetRequiredService());
+ }
///
- /// Add a to the global service collection
+ /// Add a to the global service collection
///
///
///
///
- public static void AddPluginBehavior(this IServiceCollection collection)
- where TExtension : class, IPluginBehavior, TInterface
- where TInterface : class
- {
- // Add the root extension itself as a scoped service.
- // This means every time Load is called in the main Jailbreak loader,
- // the extension will be fetched and kept as a singleton for the duration
- // until "Unload" is called.
- collection.AddScoped();
+ public static void
+ AddPluginBehavior(
+ this IServiceCollection collection)
+ where TExtension : class, IPluginBehavior, TInterface
+ where TInterface : class {
+ // Add the root extension itself as a scoped service.
+ // This means every time Load is called in the main Jailbreak loader,
+ // the extension will be fetched and kept as a singleton for the duration
+ // until "Unload" is called.
+ collection.AddScoped();
- collection.AddTransient(provider => provider.GetRequiredService());
- collection.AddTransient(provider => provider.GetRequiredService());
- }
+ collection.AddTransient(provider
+ => provider.GetRequiredService