Revision Difference
Making_Gamemode#546326
<cat>Code.Game</cat>
<title>Creating A Game</title>
The easiest way to start creating a game is to download and rename the [minimal gamemode](https://github.com/Facepunch/sbox-minimal).
You should also have an adequate coding workspace setup by following one of the following guides:
* <page>Setting up Visual Studio</page> (Recommended)
* <page>Setting up VSCode</page>
* <page>Setting up Rider</page>
# Addon directory structure
<warning>A restart of the whole game is required after creating a new addon folder.</warning>
Every addon is self contained in its own folder in the addons directory. For example an addon called "myaddon" would be in the following path:
```
C:/Steam/steamapps/common/sbox/addons/myaddon/
Before creating a game you should have an adequate coding workspace setup, the easiest is <page>Setting up Visual Studio</page> but you can get others working with additional setup.
# Create addon
You create new addons from the editor, go to `Addons -> Create New...`, create a new game addon, you can place this wherever you want on your disk.
<upload src="a5727/8d9de839fcae5cd.png" size="1774" name="image.png" />
<upload src="a5727/8d9de8185198378.png" size="10526" name="image.png" />
# Code
Once you make your addon your code is accessible through your Visual Studio solution, the easiest way to open it is through your editor.
<upload src="a5727/8d9de7f4090be9e.png" size="4523" name="image.png" />
By default there is basic code for a game that spawns a pawn.
# Content
```
This folder should contain an .addon file (which is just json). This tells the game that the folder contains an addon. The .addon file doesn't need to contain anything except <page text="sharedassets">.addon_schema#sharedassetsfilter</page> otherwise your content won't be sent to clients:
```
{
"sharedassets": "*.*"
}
```
After you have your `.addon` file you can <page text="generate your solution file">Setting_up_Visual_Studio#generatingyoursolution</page> and dive into coding.
## Code
All your code should be contained inside a code folder within your addon folder.
```
addons/myaddon/code/
```
Any C# code within this folder is compiled and used for your game.
## Content
All your content can go in folders within your addon folder.
* `addons/myaddon/config` - for <page text="fgd">Linking Entities to Hammer</page> files or for defining custom asset types
* `addons/myaddon/fonts` - fonts here are automatically loaded and available for usage in UI
* `addons/myaddon/maps` - maps are added to the menu from here
* `addons/myaddon/materials`
* `addons/myaddon/models`
* `addons/myaddon/particles`
* `addons/myaddon/shaders` - shaders placed in here are compiled
* `addons/myaddon/sounds`
* `addons/myaddon/shaders` - shaders placed in here are automatically compiled
* `addons/myaddon/sounds`
# Initial Game code
Every game you make needs a <page text="Game">Sandbox.Game</page> class, this is the entry point for all your game logic.
Initially you need to make sure your game class is derived from <page>Sandbox.Game</page>.
This needs to be in a .cs file in your addon code folder, we recommend calling it `Game.cs`.
```csharp
public partial class MyGame : Sandbox.Game
{
public MyGame()
{
}
}
```
With this your game should now show up in the main menu and let you load into a map.
# Your first pawn
When a client joins a server, by default nothing happens. You need to create a Pawn for that client to control. A Pawn is just an Entity that is controlled by a Client.
To create a first person player you can derive a new entity from the <page>Sandbox.Player</page> and creating it from Game.ClientJoined like so:
```csharp
// MyPlayer.cs
using Sandbox;
partial class MyPlayer : Player
{
public override void Respawn()
{
SetModel( "models/citizen/citizen.vmdl" );
// Use WalkController for movement (you can make your own PlayerController for 100% control)
Controller = new WalkController();
// Use StandardPlayerAnimator (you can make your own PlayerAnimator for 100% control)
Animator = new StandardPlayerAnimator();
// Use ThirdPersonCamera (you can make your own Camera for 100% control)
Camera = new ThirdPersonCamera();
EnableAllCollisions = true;
EnableDrawing = true;
EnableHideInFirstPerson = true;
EnableShadowInFirstPerson = true;
base.Respawn();
}
}
// Game.cs
using Sandbox;
public partial class MyGame : Sandbox.Game
{
public override void ClientJoined( Client client )
{
base.ClientJoined( client );
// Create a pawn and assign it to the client.
var player = new MyPlayer();
client.Pawn = player;
player.Respawn();
}
}
```
# Footnotes
* The <page text="Game">Sandbox.Game</page> class is an <page text="Entity">Sandbox.Entity</page> like everything else, and as such can make use of <page>networked types</page> fully to keep clients in sync on the current game state.
* A good way to know what you can do with the Game is to use intellisense to see what you can override.