S&box Wiki

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`