/CounterStrikeSharp

CounterStrikeSharp allows you to write server plugins in C# for Counter-Strike 2/Source2/CS2

Primary LanguageC#GNU General Public License v3.0GPL-3.0

CounterStrikeSharp

CounterStrikeSharp is a server side modding framework for Counter-Strike: Global Offensive. This project attempts to implement a .NET Core scripting layer on top of a Metamod Source Plugin, allowing developers to create plugins that interact with the game server in a modern language (C#) to facilitate the creation of maintainable and testable code.

Come and join our Discord

History

This project is an ongoing migration of a previous project (titled VSP.NET) whereby a scripting layer was added to a Valve Server Plugin for CSGO.

Due to the architectural changes of CS2, the plugin is being rebuilt on the ground up, to support Linux 64-bit, something which was previously impossible.

Install

Download the latest build from here. (Download the with runtime version if this is your first time installing).

Detailed installation instructions can be found in the docs.

What works?

(Note, these were features in the previous VSP.NET project, but have not been implemented yet in this project)

These features are the core of the platform and work pretty well/have a low risk of causing issues.

  • Console Commands, Server Commands (e.g. css_mycommand)
  • Chat Commands with ! and / prefixes (e.g. !mycommand)
  • (In Progress) Console Variables
  • Game Event Handlers & Custom Events (e.g. player_death)
    • Basic event value get/set (string, bool, int32, float)
    • Complex event values get/set (ehandle, pawn, player controller)
  • Game Tick Based Timers (e.g. repeating map timers)
    • Timer Flags (REPEAT, STOP_ON_MAPCHANGE)
  • Listeners (e.g. client connected, disconnected, map start etc.)
    • Client Listeners (e.g. connect, disconnect, put in server)
    • OnMapStart
    • OnTick
  • Server Information (current map, game time, tick rate, model precaching)
  • Schema System Access (access player values like current weapon, money, location etc.)

Links

Examples

You can view the example Warcraft plugin migrated from the previous VSP.NET project to give you an idea of the kind of power this scripting runtime is capable of. This plugin shows how you can hook events, create commands, use third party libraries (SQLite) and do basic entity manipulation.

Basic Example with Game Event & Console Commands

using CounterStrikeSharp.API.Core;

namespace HelloWorldPlugin;

public class HelloWorldPlugin : BasePlugin
{
    public override string ModuleName => "Hello World Plugin";

    public override string ModuleVersion => "0.0.1";

    public override void Load(bool hotReload)
    {
        Console.WriteLine("Hello World!");
    }

    [GameEventHandler]
    public HookResult OnPlayerConnect(EventPlayerConnect @event, GameEventInfo info)
    {
        // Userid will give you a reference to a CCSPlayerController class
        Log($"Player {@event.Userid.PlayerName} has connected!");

        return HookResult.Continue;
    }

    [ConsoleCommand("issue_warning", "Issue warning to player")]
    public void OnCommand(CCSPlayerController? player, CommandInfo command)
    {
        Log("You shouldn't be doing that!");
    }
}

Credits

A lot of code has been borrowed from SourceMod as well as Source.Python, two pioneering source engine plugin frameworks which this project lends a lot of its credit to. I've also used the scripting context & native system that is implemented in FiveM for GTA5. Also shoutout to the CS2Fixes project for providing good reverse-engineering information so shortly after CS2 release.

How to Build

Building requires CMake.

Clone the repository

git clone https://github.com/roflmuffin/counterstrikesharp

Init and update submodules

git submodule update --init --recursive

Make build folder

mkdir build
cd build

Generate CMake Build Files

cmake ..

Build

cmake --build . --config Debug