Revision Difference
EventSystem#544162
<cat>Code.Misc</cat>
<title>Event System</title>
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:
### buildinput
Called clientside every frame to process input and encode outputs into a user command.
```csharp
[Event.BuildInput]
public void MyBuildInput( InputBuilder input )
{
}
```
### client.disconnect
Called when a client disconnects.
```csharp
[Event( "client.disconnected" )]
```
Called from `GameLoop.ClientDisconnected`
### frame
Called just before the beginning of a rendering frame.
```csharp
[Event.Frame]
```
Called from `GameLoop.PreRender`
### tick
Called every <page text="server or client tick">GameLoop#everytick</page> (60 times a second by default).
```csharp
[Event.Tick]
[Event( "server.tick" )]
[Event( "client.tick" )]
```
Called from `GameLoop.ServerFrame_Think` and `GameLoop.ClientFrame_Think`.
### physics.step
Called after each physics step, this is usually every tick but can be more depending on <page text="Global.PhysicsSubSteps">Sandbox.Global.PhysicsSubSteps</page>.
```csharp
[Event( "physics.step" )]
```
Called from `GameLoop.PostPhysicsStep`.
### hotloaded
Called each time your C# is hotloaded after successful recompile.
```csharp
[Event.Hotload]
```
Called from `HotloadManager.DoSwap`.
## Custom Events
You can register your own custom event callbacks and call them.
```csharp
[Event( "mygame.gameover" )]
public void OnGameOver()
{
}
public void DoGameOver()
{
Event.Run( "mygame.gameover" )
}
```
### Event arguments
Events can pass any amount of arguments too.
```csharp
[Event( "mygame.gameover" )]
public void OnGameOver( Player winner )
{
}
public void DoGameOver( Player winner )
{
Event.Run( "mygame.gameover", winner )
}
```
⤶
### EventAttributes⤶
⤶
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.)⤶
⤶
```csharp⤶
// 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);⤶
```⤶