T3MenuAPI 1.0.0

dotnet add package T3MenuAPI --version 1.0.0
                    
NuGet\Install-Package T3MenuAPI -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="T3MenuAPI" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="T3MenuAPI" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="T3MenuAPI" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add T3MenuAPI --version 1.0.0
                    
#r "nuget: T3MenuAPI, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package T3MenuAPI@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=T3MenuAPI&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=T3MenuAPI&version=1.0.0
                    
Install as a Cake Tool

T3Menu-API

T3Menu-API is a plugin created on counterstrikesharp with purpose of creating a better , refined menu controlled with player buttons.

The menu controls are fully confiugarble from config located at counterstrikesharp/configs/plugins/T3Menu-API/T3Menu-API.toml

Install

After you extract the T3Menu-API folder, Drag&Drop addons folder into game/csgo and you're good to go.

Creating Menu Tutorial

using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Core.Capabilities;
using CounterStrikeSharp.API.Modules.Commands;
using T3MenuSharedApi;

namespace MenuExample;

public class MenuExample : BasePlugin
{
    public override string ModuleAuthor => "T3Marius";
    public override string ModuleName => "T3Menu-Example";
    public override string ModuleVersion => "1.0";
    public int PlayerVotes;

    public IT3MenuManager? MenuManager;
    public IT3MenuManager? GetMenuManager() // this function is used to get the menu manager
    {
        if (MenuManager == null)
        {
            MenuManager = new PluginCapability<IT3MenuManager>("t3menu:manager").Get();
        }
        return MenuManager;
    }
    public override void Load(bool hotReload)
    {
        
    }
    [ConsoleCommand("css_menutest")]
    public void OnTest(CCSPlayerController? player, CommandInfo info)
    {
        if (player == null)
            return;

        var manager = GetMenuManager(); // get the manager using the function we've created.

        if (manager == null)
            return;

        IT3Menu menu = manager.CreateMenu($"Example Menu | Votes: {PlayerVotes}", isSubMenu: false); // if this isn't a sub menu you don't even need to call this.

        menu.AddOption("Normal Option", (p, o) =>
        {
            p.PrintToChat("This is a normal option!");
        });

        menu.AddOption("Vote Option", (p, o) =>
        {
            p.PrintToChat("You added 1 vote!");
            PlayerVotes++;
            menu.Title = $"Example Menu | Votes: {PlayerVotes}"; // call the title again and then refresh
            manager.Refresh(); // you can also add a repeat if you use manager.Refresh(1) when press it will refresh every second.
        });
        menu.AddBoolOption("Bool Option", defaultValue: true, (p, o) =>
        {
            if (o is IT3Option boolOption)
            {
                bool isEnabled = boolOption.OptionDisplay!.Contains("✔"); // this is how you check if the option is enabled or not.

                if (isEnabled)
                {
                    p.PrintToChat("Bool Option is enabled!");
                }
                else
                {
                    p.PrintToChat("Bool Option is disabled!");
                }
            }
        });

        // prepare a list of objects for the slider option
        List<object> intList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
        List<object> stringList = ["day", "week", "month", "year"];

        menu.AddSliderOption("Int List", values: intList, defaultValue: 1, displayItems: 3, (player, option, index) =>
        {
            if (option is IT3Option sliderOption && sliderOption.DefaultValue != null)
            {
                int selectedValue = (int)sliderOption.DefaultValue; // convert the default value to int, this is what player pressed in the slider.
                player.PrintToChat($"Selected int: {selectedValue}");
            }
        });
        menu.AddSliderOption("String List", values: stringList, defaultValue: stringList[0], displayItems: 3, (player, option, index) =>
        {
            if (option is IT3Option sliderOption && sliderOption.DefaultValue != null)
            {
                string selectedValue = (string)sliderOption.DefaultValue; // convert the default value to string, this is what player pressed in the slider.
                player.PrintToChat($"Selected string: {selectedValue}");
            }
        });

        manager.OpenMainMenu(player, menu); // open the menu using the manager.

    }
}

Current ButtonTypes:

Bool
Button
Text
Slider

Config

[Controls]           # Move/Select/Back/Exit will be shown in controls info at the bottom of the menu.
Move = "[W/S]"
Select = "[E]"
Back = "[Shift]"
Exit = "[R]"
LeftArrow = "\u25C4"
RightArrow = "\u25BA"
LeftBracket = "]"
RightBracket = "["

[Buttons]              # controls config
ScrollUpButton = "W"
ScrollDownButton = "S"
SelectButton = "E"
BackButton = "Shift"
SlideLeftButton = "A"
SlideRightButton = "D"
ExitButton = "R"

[Sounds]              # if you wanna use these sounds you don't need to add anything.
ScrollUp = "UI.ButtonRolloverLarge"
ScrollDown = "UI.ButtonRolloverLarge"
Select = "Buttons.snd9"
SlideRight = "UI.ButtonRolloverLarge"
SlideLeft = "UI.ButtonRolloverLarge"
Volume = 0.5          # menu sounds volume
SoundEventFiles = []  # if you have custom sounds, add the soundeventfile path here.

[Settings]
ShowDeveloperInfo = true

Credits to:

@interesting , took example from him with classes

@ssypchenko, arrows ideas from him.

@KitsuneLab Developments, inspired from their menu style

Video

https://imgur.com/ufu2dI9

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 76 6/6/2025