Choosing Player Models

From Valve Developer Community
Jump to navigation Jump to search
English (en)Deutsch (de)Polski (pl)Русский (ru)中文 (zh)Translate (Translate)
Icon-delisted.png
This page documents information about a game or software that is no longer available for purchase or download digitally.
It is covered here for historical and technical reference.
See KeyValues for the file format.

In Counter-Strike: Global Offensive 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 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.

Syntax

See the example on the right. The first word in quotes must be the map's filename.

The key of each KeyValue inside "t_models" and/or "ct_models" is supposed to be the path to a player model. If <model> is such a key, then the game will try to use the first of the following models that exists:

  1. csgo/models/player/custom_player/legacy/<model>.mdl
  2. csgo/models/player/<model>.mdl
  3. csgo/models/error.mdl

The value of each of these KeyValues is ignored, so it can be left empty.

Tip.pngTip:Use the Hammer model browser to see the available models at those places. You can also see below for lists to copy-paste.
Tip.pngTip:Generally, there can be any combination of player models in a list with a maximum number of ten models.
Tip.pngTip:If there are huge error boxes moving around the map, then you probably have misspelled at least one player model name, or listed too many models.
Note.pngNote:Since the glove update, it's unnecessary to define the arms model, the engine uses the sleeve model instead.

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.

Warning.pngWarning:Information in these files overrides any map specific 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"""
				// ...
			} 
		}

		// ...
	}
}
Clarify: The official maps use more KVs than just 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 )
Both are defined in 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.

Tip.pngTip:You can use T models for CTs and vice versa! The models have nothing to do with the team of a player with one of these models.
Note.pngNote:The model of a player also determines the arms seen for the viewmodel, as well as the radio command voice. However, it will not make the player use the appropriate radio voice of the assiciated agent (e.g. no female voice this way).

Counter-Terrorist Models

FBI English (en)
	{
		"ctm_fbi"""
		"ctm_fbi_variantA"""
		"ctm_fbi_variantB"""
		"ctm_fbi_variantC"""
		"ctm_fbi_variantD"""
//		"ctm_fbi_variantE"""
//		"ctm_fbi_variantF"""
//		"ctm_fbi_variantG"""
//		"ctm_fbi_variantH"""
	}
GIGN Français (fr)
	{
		"ctm_gign"""
		"ctm_gign_variantA"""
		"ctm_gign_variantB"""
		"ctm_gign_variantC"""
		"ctm_gign_variantD"""
	}
GSG9 Deutsch (de)
	{
		"ctm_gsg9"""
		"ctm_gsg9_variantA"""
		"ctm_gsg9_variantB"""
		"ctm_gsg9_variantC"""
		"ctm_gsg9_variantD"""
	}
IDF עברית (he)
	{
		"ctm_idf"""
		"ctm_idf_variantB"""
		"ctm_idf_variantC"""
		"ctm_idf_variantD"""
		"ctm_idf_variantE"""
		"ctm_idf_variantF"""
	}
SAS British English (en-GB)
	{
		"ctm_sas""" // identical to A-E?
		"ctm_sas_variantA"""
		"ctm_sas_variantB"""
		"ctm_sas_variantC"""
		"ctm_sas_variantD"""
		"ctm_sas_variantE"""
//		"ctm_sas_variantF"""
//		"ctm_sas_variantG"""
	}
SEAL Team 6 English (en)
(default)
	{
		"ctm_st6"""
		"ctm_st6_variantA"""
		"ctm_st6_variantB"""
		"ctm_st6_variantC"""
		"ctm_st6_variantD"""
//		"ctm_st6_variantE"""
//		"ctm_st6_variantG"""
//		"ctm_st6_variantI"""
//		"ctm_st6_variantJ"""
//		"ctm_st6_variantK""" // German
//		"ctm_st6_variantL"""
//		"ctm_st6_variantM"""
//		"ctm_st6_variantN""" // Brazilian
	}
SWAT English (en)
	{
		"ctm_swat"""
		"ctm_swat_variantA"""
		"ctm_swat_variantB"""
		"ctm_swat_variantC"""
		"ctm_swat_variantD"""
//		"ctm_swat_variantE"""
//		"ctm_swat_variantF"""
//		"ctm_swat_variantG"""
//		"ctm_swat_variantH"""
//		"ctm_swat_variantI"""
//		"ctm_swat_variantJ"""
//		"ctm_swat_variantK"""
	}

Terrorist Models

Anarchist English (en)
	{
		"tm_anarchist"""
		"tm_anarchist_variantA"""
		"tm_anarchist_variantB"""
		"tm_anarchist_variantC"""
		"tm_anarchist_variantD"""
	}
Balkan
	{
		"tm_balkan_variantA"""
		"tm_balkan_variantB"""
		"tm_balkan_variantC"""
		"tm_balkan_variantD"""
		"tm_balkan_variantE"""
//		"tm_balkan_variantF"""
//		"tm_balkan_variantG"""
//		"tm_balkan_variantH"""
//		"tm_balkan_variantI"""
//		"tm_balkan_variantJ"""
//		"tm_balkan_variantK"""
//		"tm_balkan_variantL"""
	}
Elite Crew
	{
		"tm_leet_variantA"""
		"tm_leet_variantB"""
		"tm_leet_variantC"""
		"tm_leet_variantD"""
		"tm_leet_variantE"""
//		"tm_leet_variantF"""
//		"tm_leet_variantG"""
//		"tm_leet_variantH"""
//		"tm_leet_variantI"""
//		"tm_leet_variantJ"""
//		"tm_leet_variantK"""
	}
Phoenix Connexion Русский (ru)
(default)
	{
		"tm_phoenix"""
		"tm_phoenix_variantA"""
		"tm_phoenix_variantB"""
		"tm_phoenix_variantC"""
		"tm_phoenix_variantD"""
//		"tm_phoenix_variantF"""
//		"tm_phoenix_variantG"""
//		"tm_phoenix_variantH"""
//		"tm_phoenix_variantI"""
	}
Pirate
	{
		"tm_pirate"""
		"tm_pirate_variantA"""
		"tm_pirate_variantB"""
		"tm_pirate_variantC"""
		"tm_pirate_variantD"""
	}
Professional English (en)
	{
		"tm_professional"""
		"tm_professional_var1"""
		"tm_professional_var2"""
		"tm_professional_var3"""
		"tm_professional_var4"""
//		"tm_professional_varF"""
//		"tm_professional_varF1"""
//		"tm_professional_varF2"""
//		"tm_professional_varF3"""
//		"tm_professional_varF4"""
//		"tm_professional_varF5"""
//		"tm_professional_varG"""
//		"tm_professional_varH"""
//		"tm_professional_varI"""
//		"tm_professional_varJ"""
	}
Separatist Français (fr) Español (es)
	{
		"tm_separatist"""
		"tm_separatist_variantA"""
		"tm_separatist_variantB"""
		"tm_separatist_variantC"""
		"tm_separatist_variantD"""
	}

Other Models

Note.pngNote:Giving players the model of a Heavy Phoenix or a Heavy CT changes only their appearance; it does not give them an item_heavyassaultsuit.
Heavy Phoenix Русский (ru)
        {
		"tm_phoenix_heavy"""
        }
Heavy CT
(CS:GO Co-op Strike Co-op Strike)
        {
		"ctm_heavy"""
        }
Jumpsuit
(CS:GO Danger Zone Danger Zone)
	{
		"tm_jumpsuit_variantA"""
		"tm_jumpsuit_variantB"""
		"tm_jumpsuit_variantC"""
	}
SEAL Frogman English (en)
(OpRiptide.pngOperation Riptide)
	{
		"ctm_diver_variantA"""
		"ctm_diver_variantB"""
		"ctm_diver_variantC"""
	}
Gendarmerie Nationale Français (fr)
(OpRiptide.pngOperation Riptide)
	{
		"ctm_gendarmerie_variantA"""
		"ctm_gendarmerie_variantB"""
		"ctm_gendarmerie_variantC"""
		"ctm_gendarmerie_variantD"""
		"ctm_gendarmerie_variantE"""
	}
Guerrilla Warfare Português do Brasil (pt-br)
(OpRiptide.pngOperation Riptide)
	{
		"tm_jungle_raider_variantA"""
		"tm_jungle_raider_variantB"""
		"tm_jungle_raider_variantB2"""
		"tm_jungle_raider_variantC"""
		"tm_jungle_raider_variantD"""
		"tm_jungle_raider_variantE"""
		"tm_jungle_raider_variantF"""
		"tm_jungle_raider_variantF2"""
	}
Zombie
        {
		"zombie"""
        }
Georgian Riot Police Ქართული (ka)
(Obsolete)
	{
		"ctm_georgian"
	}
Military Police Special Services Company 中文(臺灣) (zh-tw)
(Obsolete)
	{
		"ctm_mpssc"
	}
Yakuza 日本語 (ja)
(Obsolete)
	{
		"tm_yakuza"
	}
Heavy Riot
(Obsolete)
	{
		"tm_heavy_riot"
	}

External links

KV File Writer: A gui tool that streamlines setting up and saving a CT vs T .kv

Web-based KV File Generator: A web-based utility that generates a .kv based on user input.