Garry's Mod Wiki

Revision Difference

Player_Classes#515807

<cat>Dev.GameModes</cat> Player classes can be changed and swapped at runtime. They change things like the player's speed, height, the weapons the player spawns with, what happens when they die, what happens when they spawn etc. Imagine a Team Fortress 2 gamemode. You want the Scout to run faster than the HWG. So you would design different classes for them. When a player spawns you set their class - and they have those attributes. Player classes can be derived. So your gamemode can define a shared common class for all of your players and derive different classes from there. You can find a list of default fields [here](/gmod/Structures/PLAYER). ## Why Traditionally if you wanted to do this in your gamemode you would either code a system similar to this, or you would end up with a bunch of if/else blocks in your spawn functions. This system cleans that up by making it unified and object orientated. ## Setting a player's class Setting a player's class is done easily. You only need to do it serverside. ``` player_manager.SetPlayerClass( ply, "player_sandbox" ) ``` This is commonly done in the PlayerSpawn gamemode hook - but you can call it anywhere you want. ## A Player Class The player class itself doesn't need much comment. It should be mostly self explanatory. The class below creates a new player class called "player_custom", which is derived from "player_default". The player spawns with a pistol. ``` DEFINE_BASECLASS( "player_default" ) ```⤶ ```⤶ ⤶ local PLAYER = {} ⤶ ```⤶ ⤶ ⤶ ```⤶ ⤶ --⤶ local PLAYER = {} --⤶ -- See gamemodes/base/player_class/player_default.lua for all overridable variables -- PLAYER.WalkSpeed = 200 PLAYER.RunSpeed = 400 ```⤶ function PLAYER:Loadout()⤶ self.Player:RemoveAllAmmo()⤶ ``` function PLAYER:Loadout() ``` ```⤶ ⤶ self.Player:RemoveAllAmmo()⤶ ⤶ self.Player:GiveAmmo( 256, "Pistol", true )⤶ self.Player:GiveAmmo( 256, "Pistol", true ) self.Player:Give( "weapon_pistol" ) ```⤶ ⤶ ⤶ ```⤶ end⤶ ```⤶ ⤶ ⤶ ```⤶ ⤶ player_manager.RegisterClass( "player_custom", PLAYER, "player_default" )⤶ end⤶ player_manager.RegisterClass( "player_custom", PLAYER, "player_default" ) ``` These player class functions are usually housed in gamemode/player_class/ - and they do not get loaded automatically. You should load it in your shared.lua gamemode file. And they should be loaded in the right order - so that base classes get loaded before their children.