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/⤶
```⤶
⤶
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⤶
⤶
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⤶
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`⤶
⤶
# 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.* `addons/myaddon/shaders` - shaders placed in here are automatically compiled
* `addons/myaddon/sounds`