S&box Wiki

Event System

Event System

The event system is like the Hook system in Garry's Mod. It allows you to register functions on classes to receive a callback on certain global events.

Registering a callback

Adding an [Event] attribute will add it to the list to be called.

[Event( "server.tick" )] public void MyCallback() { // will get called every server tick }

Engine events

The various events called from the engine currently:


Called clientside every frame to process input and encode outputs into a user command.

[Event.BuildInput] public void MyBuildInput( InputBuilder input ) { }


Called when a client disconnects.

[Event( "client.disconnected" )]

Called from GameLoop.ClientDisconnected


Called just before the beginning of a rendering frame.


Called from GameLoop.PreRender


Called every server or client tick (60 times a second by default).

[Event.Tick] [Event( "server.tick" )] [Event( "client.tick" )]

Called from GameLoop.ServerFrame_Think and GameLoop.ClientFrame_Think.


Called after each physics step, this is usually every tick but can be more depending on PhysicsSubSteps.

[Event( "physics.step" )]

Called from GameLoop.PostPhysicsStep.


Called each time your C# is hotloaded after successful recompile.


Called from HotloadManager.DoSwap.

Custom Events

You can register your own custom event callbacks and call them.

[Event( "mygame.gameover" )] public void OnGameOver() { } public void DoGameOver() { Event.Run( "mygame.gameover" ) }

Event arguments

Events can pass any amount of arguments too.

[Event( "mygame.gameover" )] public void OnGameOver( Player winner ) { } public void DoGameOver( Player winner ) { Event.Run( "mygame.gameover", winner ) }


If you want, you can also make your own custom EventAttributes (like [Event.Tick]) and use them to register handlers. The behavior is the same as raw event names but they have all the benefits of a type (picked up by IntelliSense, checked at compile time, etc.)

// Defining the event type public static class GameEvent { public const string Custom = "custom"; public class CustomAttribute : EventAttribute { public CustomAttribute() : base(Custom) { } } } // Register it like this [GameEvent.Custom] public void OnCustomEvent() { // do something } // Fire it like this Event.Run(GameEvent.Custom);

Special Pages



Render Time: 59ms

DB GetPage 47
Generate Html 2
SaveChanges (1) 7
Render Body 0
Render Sidebar 0