├── CounterStrikeSharp.API.dll ├── README.md ├── Speedometer.cs └── Speedometer.csproj /CounterStrikeSharp.API.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PhantomYopta/CS2_Speedometer/4cd2efd808ec0b84e19c9c656b5f2493c6856b46/CounterStrikeSharp.API.dll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CS2_Speedometer 2 | Just a speedometer for CS2 3 | # Installation 4 | 1. Install [CounterStrike Sharp](https://github.com/roflmuffin/CounterStrikeSharp) and [Metamod:Source](https://www.sourcemm.net/downloads.php/?branch=master) 5 | 6 | 2. Download Speedometer 7 | 8 | 3. Unzip the archive and upload it to the game server 9 | 10 | # Commands 11 | `css_speed` `!speed` - Enables/Disables speedometer display 12 | -------------------------------------------------------------------------------- /Speedometer.cs: -------------------------------------------------------------------------------- 1 | using CounterStrikeSharp.API; 2 | using CounterStrikeSharp.API.Core; 3 | 4 | namespace Speedometer; 5 | 6 | public class Speedometer : BasePlugin 7 | { 8 | public override string ModuleName => "Speedometer by phantom"; 9 | public override string ModuleVersion => "1.0.0"; 10 | 11 | private UsersSettings?[] _usersSettings = new UsersSettings?[65]; 12 | private bool isHookEvent; 13 | 14 | public override void Load(bool hotReload) 15 | { 16 | RegisterListener(((slot) => 17 | { 18 | _usersSettings[slot + 1] = new UsersSettings { IsShowSpeed = true, CountJumps = 0 }; 19 | })); 20 | RegisterListener(slot => _usersSettings[slot + 1] = null); 21 | RegisterListener((name => 22 | { 23 | if(isHookEvent) return; 24 | 25 | isHookEvent = true; 26 | 27 | RegisterEventHandler(((@event, info) => 28 | { 29 | var controller = @event.Userid; 30 | var client = controller.Index; 31 | 32 | if (client == IntPtr.Zero) return HookResult.Continue; 33 | _usersSettings[client]!.CountJumps++; 34 | 35 | return HookResult.Continue; 36 | })); 37 | })); 38 | RegisterEventHandler(((@event, info) => 39 | { 40 | var playerEntities = Utilities.FindAllEntitiesByDesignerName("cs_player_controller"); 41 | foreach (var player in playerEntities) 42 | { 43 | var client = player.Index; 44 | _usersSettings[client]!.CountJumps = 0; 45 | } 46 | return HookResult.Continue; 47 | })); 48 | RegisterListener(() => 49 | { 50 | for (var i = 1; i <= Server.MaxPlayers; ++i) 51 | { 52 | var player = new CCSPlayerController(NativeAPI.GetEntityFromIndex(i)); 53 | 54 | if (player is { IsValid: true, IsBot: false, PawnIsAlive: true }) 55 | { 56 | var buttons = player.Buttons; 57 | var client = player.Index; 58 | if (client == IntPtr.Zero) return; 59 | if (!_usersSettings[client]!.IsShowSpeed) return; 60 | 61 | if (player.PlayerPawn.Value == null) continue; 62 | 63 | player.PrintToCenterHtml( 64 | $"
Speed: {Math.Round(player.PlayerPawn.Value.AbsVelocity.Length2D())}
" + 65 | $"Jumps: {_usersSettings[client]!.CountJumps}
" + 66 | $"{((buttons & PlayerButtons.Left) != 0 ? "←" : "_")} " + 67 | $"{((buttons & PlayerButtons.Forward) != 0 ? "W" : "_")} " + 68 | $"{((buttons & PlayerButtons.Right) != 0 ? "→" : "_")}
" + 69 | $"{((buttons & PlayerButtons.Moveleft) != 0 ? "A" : "_")} " + 70 | $"{((buttons & PlayerButtons.Back) != 0 ? "S" : "_")} " + 71 | $"{((buttons & PlayerButtons.Moveright) != 0 ? "D" : "_")}
"); 72 | } 73 | } 74 | }); 75 | RegisterEventHandler(((@event, info) => 76 | { 77 | if (@event.Userid.Handle == IntPtr.Zero || @event.Userid.UserId == null) return HookResult.Continue; 78 | 79 | var controller = @event.Userid; 80 | var client = controller.Index; 81 | if (client == IntPtr.Zero) return HookResult.Continue; 82 | _usersSettings[client]!.CountJumps = 0; 83 | 84 | return HookResult.Continue; 85 | })); 86 | AddCommand("css_speed", "", ((player, info) => 87 | { 88 | if (player == null) return; 89 | var client = player.Index; 90 | _usersSettings[client]!.IsShowSpeed = !_usersSettings[client]!.IsShowSpeed; 91 | player.PrintToChat(_usersSettings[client]!.IsShowSpeed ? "Speedometer: \x06On" : "Speedometer: \x02Off"); 92 | })); 93 | } 94 | 95 | private HookResult EventBombPlanted(EventBombPlanted @event, GameEventInfo info) 96 | { 97 | throw new NotImplementedException(); 98 | } 99 | } 100 | 101 | public class UsersSettings 102 | { 103 | public int CountJumps { get; set; } 104 | public bool IsShowSpeed { get; set; } 105 | } -------------------------------------------------------------------------------- /Speedometer.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | ..\..\..\CounterStrikeSharp.API.dll 12 | 13 | 14 | 15 | 16 | --------------------------------------------------------------------------------