S&box Wiki

Revision Difference

Making_Gamemode#545886

<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 <bug issue="710">Addon folder names need to be entirely lowercase. https://github.com/Facepunch/sbox-issues/issues/710</bug> <warning>A restart of the whole game is required after creating a new addon folder.</warning> <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 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.