Choosing Player Models
In Counter-Strike: Global Offensive , custom maps can be configured to use different player models, or a variety of player models, for the Terrorist and Counter-Terrorist teams. These models are specified in a
<mapname>.kv
file that lives in the csgo/maps/
directory.
Creating a .kv file
"de_example" { "t_models" { "tm_anarchist" "" "tm_anarchist_variantA" "" "tm_anarchist_variantB" "" "tm_anarchist_variantC" "" "tm_anarchist_variantD" "" } "ct_models" { "ctm_swat" "" "ctm_swat_variantA" "" "ctm_swat_variantB" "" "ctm_swat_variantC" "" "ctm_swat_variantD" "" } }If this is the content of csgo/maps/de_example.kv , then de_example.bsp will use Anarchist and Swat player models.
|
The .kv file is simply a text file that shares a name with the custom map, with the .txt
extension changed to .kv
.
For example, if there were a custom map called de_example.bsp
in the Counter-Strike Global Offensive\csgo\maps\
folder, then there should be a file called de_example.kv
in the same folder.
The .kv file contains a list of key/value pairs formatted similarly to other text files used by the source engine, such as VMT files for materials.
As can be seen in the example on the right, it is possible to configure a map to use a variety of world player models for each team. Unlike in previous Counter-Strike games, the player's model is chosen randomly from this list, instead of allowing the player to choose.

csgo/models/player/
. You can also see below for lists to copy-paste.


Relation to Gamemodes.txt
The information of this file will to some extent be merged with csgo/gamemodes.txt
. The official maps don't have a csgo/maps/<mapname>.kv
file as their content is already in gamemodes.txt
. The map list in that file can be extended with gamemodes_server.txt
according to the following example.

csgo/maps/<mapname>.kv
file!"GameModes_Server.txt" { "gameTypes" { // ... } "mapgroups" { // ... } "maps" { "<mapname1>" { "t_models" { "tm_professional""" // ... } "ct_models" { "ctm_fbi""" // ... } } "<mapname2>" { "t_models" { "tm_professional""" // ... } "ct_models" { "ctm_sas""" // ... } } // ... } }
t_models
and ct_models
. Apparently, the nameID
determines the displayed map name in the loading screen, however this KV does not seem to work in <mapname>.kv
? So where is the map specific file <mapname>.kv
read in code? Ideas:
void GameTypes::AddMapKVs( KeyValues* pKVMaps, const char* curMap )
void GameTypes::CheckShouldSetDefaultGameModeAndType( const char* szMapNameFull )

gametypes.cpp
. In both cases it should actually be possible to ship more KVs with this file but apparently it isn't.[Why?]Model List
These excerpts are set up so that one block represents a commonly used group of models.
The other custom player models can also be used. In the lists below, they are named but commented out (//
) to retain a commonly used group of models.


Counter-Terrorist Models
|
Terrorist Models
|
Other Models
Zombie | { "zombie""" } |
Heavy Phoenix | { "tm_phoenix_heavy""" } |
Heavy CT | { "ctm_heavy""" } |
Jumpsuit (Danger Zone) | { "tm_jumpsuit_varianta""" "tm_jumpsuit_variantb""" "tm_jumpsuit_variantc""" } |
Making CT vs CT or T vs T
The .kv can be set up to use models for the wrong team, e.g. SWAT vs FBI.
"name_of_the_map" { "name" "name_of_the_map" "t_arms" "models/weapons/ct_arms_swat.mdl" "ct_arms" "models/weapons/ct_arms_gign.mdl" "t_models" { "ctm_swat" "" "ctm_swat_varianta" "" "ctm_swat_variantb" "" "ctm_swat_variantc" "" "ctm_swat_variantd" "" } "ct_models" { "ctm_gign" "" "ctm_gign_varianta" "" "ctm_gign_variantb" "" "ctm_gign_variantc" "" "ctm_gign_variantd" "" } }
KV File Writer
A gui tool that streamlines setting up and saving a CT vs T .kv
External links
Web-based KV File Generator
A web-based utility that generates a .kv based on user input.