Choosing Player Models: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Removed redundant arms setting. Re-organized faction model groups. Added notes about gamemodes.txt.)
Line 1: Line 1:
{{otherlang2
{{lang|Choosing Player Models}}
|ru=Choosing Player Models:ru
{{note|''[[.kv file]] redirects here. See [[KeyValues]] for the file format.''}}
|zh-cn=Choosing Player Models:zh-cn
 
}}
 
{{note|.kv file redirects here}}
 
{{back|Counter-Strike: Global Offensive Level Creation}}


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 Counter-Strike: Global Offensive maps directory.
In {{game link|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 <code><mapname>.kv</code> file that lives in the <code>csgo/maps/</code> directory.


== Creating a .kv file ==
== Creating a .kv file ==
{| style=float:right
| <pre>
"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" ""
}
}</pre><small>If this is the content of <code>csgo/maps/de_example.kv</code>, then <code>de_example.[[bsp]]</code> will use Anarchist and Swat player models.</small>
|}
The .kv file is simply a text file that shares a name with the custom map, with the <code>.txt</code> extension changed to <code>.kv</code>.
For example, if there were a custom map called <code>de_example.bsp</code> in the <code>Counter-Strike Global Offensive\csgo\maps\</code> folder, then there should be a file called <code>de_example.kv</code> 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.


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.
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.
{{tip|Use the [[HLMV|model viewer]] or the Hammer model browser to browse the available models in <code>csgo/models/player/</code>. You can also see [[#Model List|below]] for lists to copy-paste.}}
{{tip|Generally, there can be '''any number''' and '''any combination''' of player models in a list.}}
{{tip|If there are huge error boxes moving around the map, then you probably have misspelled at least one player model name.}}
{{note|Since the glove update, it's unnecessary to define the arms model, the engine uses the sleeve model instead.}}
{{clr}}


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.
===Relation to Gamemodes.txt===
The information of this file will to some extent be merged with <code>csgo/gamemodes.txt</code>. The official maps don't have a <code>csgo/maps/<mapname>.kv</code> file as their content is already in <code>gamemodes.txt</code>. The map list in that file can be extended with <code>gamemodes_server.txt</code> according to the following example. {{warning|Information in these files overrides any map specific <code>csgo/maps/<mapname>.kv</code> file!}}
{{ExpandBox|
<pre>
"GameModes_Server.txt"
{
"gameTypes"
{
// ...
}


As can be seen in the below example, it is possible to configure a map to use a specific set of view model arms for each team, as well as 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.
"mapgroups"
{
// ...
}


<syntaxhighlight>
"maps"
"de_example"
{
{
"<mapname1>"
  "name" "Example"
{
  "t_arms" "models/weapons/t_arms_anarchist.mdl"
"t_models"
  "ct_arms" "models/weapons/ct_arms_fbi.mdl"
{
  "t_models"
"tm_professional"""
  {
// ...
      "tm_anarchist" ""
}
      "tm_anarchist_variantA" ""
      "tm_anarchist_variantB" ""
"ct_models"
      "tm_anarchist_variantC" ""
{
      "tm_anarchist_variantD" ""
"ctm_fbi"""
  }
// ...
  "ct_models"
}
  {
}
      "ctm_swat" ""
 
      "ctm_swat_variantA" ""
"<mapname2>"
      "ctm_swat_variantB" ""
{
      "ctm_swat_variantC" ""
"t_models"
      "ctm_swat_variantD" ""
{
  }
"tm_professional"""
}</syntaxhighlight>
// ...
}  
"ct_models"
{
"ctm_sas"""
// ...
}
}
 
// ...
}
}
 
</pre>
}}
 
{{todo|The official maps use more KVs than just <code>t_models</code> and <code>ct_models</code>. Apparently, the <code>nameID</code> determines the displayed map name in the loading screen, however this KV does not seem to work in <code><mapname>.kv</code>? So where is the map specific file <code><mapname>.kv</code> read in code? Ideas:
* <code>void GameTypes::AddMapKVs( KeyValues* pKVMaps, const char* curMap )</code>
* <code>void GameTypes::CheckShouldSetDefaultGameModeAndType( const char* szMapNameFull )</code>
Both are defined in {{cpp}} <code>gametypes.cpp</code>. In both cases it should actually be possible to ship more KVs with this file but apparently it isn't.{{why}}}}
{{clr}}


{{tip|Use the model viewer to browse the available models. It should be possible to mix and match as much as you like}}
==Model List==
{{tip|After the glove update, it's unnecessary to define the arms model, the engine uses the sleeve model instead.}}
These excerpts are set up so that one block represents a commonly used group of models.


==Model list==
The other custom player models can also be used. In the lists below, they are named but commented out (<code>//</code>) to retain a commonly used group of models.
<syntaxhighlight>
{{tip|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.}}
COUNTER-TERRORIST
{{note|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).}}
FBI "models/weapons/ct_arms_fbi.mdl"
{|
|- style=vertical-align:top
|
=== Counter-Terrorist Models ===
{| class=wikitable
| [https://counterstrike.fandom.com/wiki/FBI FBI] {{en}}
| <pre>
{
{
"ctm_fbi"""
"ctm_fbi"""
Line 52: Line 124:
"ctm_fbi_variantC"""
"ctm_fbi_variantC"""
"ctm_fbi_variantD"""
"ctm_fbi_variantD"""
// "ctm_fbi_variantE"""
// "ctm_fbi_variantF"""
// "ctm_fbi_variantG"""
// "ctm_fbi_variantH"""
}
}
GIGN "models/weapons/ct_arms_gign.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/GIGN GIGN] {{fr}}
| <pre>
{
{
"ctm_gign"""
"ctm_gign"""
Line 61: Line 140:
"ctm_gign_variantD"""
"ctm_gign_variantD"""
}
}
GSG "models/weapons/ct_arms_gsg9.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/GSG-9 GSG9] {{de}}
| <pre>
{
{
"ctm_gsg9"""
"ctm_gsg9"""
Line 69: Line 151:
"ctm_gsg9_variantD"""
"ctm_gsg9_variantD"""
}
}
IDF "models/weapons/ct_arms_idf.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/IDF IDF]
| <pre>
{
{
"ctm_idf"""
"ctm_idf"""
Line 78: Line 163:
"ctm_idf_variantF"""
"ctm_idf_variantF"""
}
}
SAS "models/weapons/ct_arms_sas.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/SAS SAS] {{en gb}}
| <pre>
{
{
"ctm_sas"""
"ctm_sas""" // identical to A-E?
"ctm_sas_variantA"""
"ctm_sas_variantA"""
"ctm_sas_variantB"""
"ctm_sas_variantB"""
Line 86: Line 174:
"ctm_sas_variantD"""
"ctm_sas_variantD"""
"ctm_sas_variantE"""
"ctm_sas_variantE"""
// "ctm_sas_variantF"""
}
}
SEALS "models/weapons/ct_arms_st6.mdl" or "models/weapons/ct_arms.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/SEAL_Team_6 SEAL Team 6] {{en}} (default)
| <pre>
{
{
"ctm_st6"""
"ctm_st6"""
Line 94: Line 186:
"ctm_st6_variantC"""
"ctm_st6_variantC"""
"ctm_st6_variantD"""
"ctm_st6_variantD"""
// "ctm_st6_variantE"""
// "ctm_st6_variantG"""
// "ctm_st6_variantI"""
// "ctm_st6_variantJ"""
// "ctm_st6_variantK"""
// "ctm_st6_variantL"""
// "ctm_st6_variantM"""
}
}
SWAT "models/weapons/ct_arms_swat.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/SWAT SWAT] {{en}}
| <pre>
{
{
"ctm_swat"""
"ctm_swat"""
Line 102: Line 204:
"ctm_swat_variantC"""
"ctm_swat_variantC"""
"ctm_swat_variantD"""
"ctm_swat_variantD"""
// "ctm_swat_variantE"""
// "ctm_swat_variantF"""
// "ctm_swat_variantG"""
// "ctm_swat_variantH"""
// "ctm_swat_variantI"""
// "ctm_swat_variantJ"""
}
}
 
</pre>
TERRORIST
|}
Anarchist "models/weapons/t_arms_anarchist.mdl"
|
=== Terrorist Models ===
{| class=wikitable
| [https://counterstrike.fandom.com/wiki/Anarchist Anarchist] {{en}}
| <pre>
{
{
"tm_anarchist"""
"tm_anarchist"""
Line 113: Line 225:
"tm_anarchist_variantD"""
"tm_anarchist_variantD"""
}
}
Balkan "models/weapons/t_arms_balkan.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Balkan Balkan]
| <pre>
{
{
"tm_balkan_variantA"""
"tm_balkan_variantA"""
Line 120: Line 235:
"tm_balkan_variantD"""
"tm_balkan_variantD"""
"tm_balkan_variantE"""
"tm_balkan_variantE"""
// "tm_balkan_variantF"""
// "tm_balkan_variantG"""
// "tm_balkan_variantH"""
// "tm_balkan_variantI"""
// "tm_balkan_variantJ"""
// "tm_balkan_variantK"""
// "tm_balkan_variantL"""
}
}
LEET "models/weapons/t_arms_leet.mdl" or "models/weapons/t_arms.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Elite_Crew Elite Crew]
| <pre>
{
{
"tm_leet_variantA"""
"tm_leet_variantA"""
Line 128: Line 253:
"tm_leet_variantD"""
"tm_leet_variantD"""
"tm_leet_variantE"""
"tm_leet_variantE"""
// "tm_leet_variantF"""
// "tm_leet_variantG"""
// "tm_leet_variantH"""
// "tm_leet_variantI"""
}
}
Phoenix "models/weapons/t_arms_phoenix.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Phoenix_Connexion Phoenix Connexion] (default)
| <pre>
{
{
"tm_phoenix"""
"tm_phoenix"""
Line 136: Line 268:
"tm_phoenix_variantC"""
"tm_phoenix_variantC"""
"tm_phoenix_variantD"""
"tm_phoenix_variantD"""
// "tm_phoenix_variantF"""
// "tm_phoenix_variantG"""
// "tm_phoenix_variantH"""
// "tm_phoenix_variantI"""
}
}
Pirate "models/weapons/t_arms_pirate.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Pirate Pirate]
| <pre>
{
{
"tm_pirate"""
"tm_pirate"""
Line 145: Line 284:
"tm_pirate_variantD"""
"tm_pirate_variantD"""
}
}
Professional "models/weapons/t_arms_professional.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Professional Professional] {{en}}
| <pre>
{
{
"tm_professional"""
"tm_professional"""
Line 152: Line 294:
"tm_professional_var3"""
"tm_professional_var3"""
"tm_professional_var4"""
"tm_professional_var4"""
// "tm_professional_varF"""
// "tm_professional_varF1"""
// "tm_professional_varF2"""
// "tm_professional_varF3"""
// "tm_professional_varF4"""
// "tm_professional_varG"""
// "tm_professional_varH"""
// "tm_professional_varI"""
// "tm_professional_varJ"""
}
}
Separatist "models/weapons/t_arms_separatist.mdl"
</pre>
|-
| [https://counterstrike.fandom.com/wiki/Separatist Separatist] {{fr}} {{es}}
| <pre>
{
{
"tm_separatist"""
"tm_separatist"""
Line 161: Line 315:
"tm_separatist_variantD"""
"tm_separatist_variantD"""
}
}
</pre>
|}
|}


OTHER MODELS
=== Other Models ===
Zombie
{| class=wikitable
| Zombie
| <pre>
         {
         {
"zombie"""
"zombie"""
         }
         }
Heavy Phoenix
</pre>
|-
| Heavy Phoenix
| <pre>
         {
         {
"tm_phoenix_heavy"""
"tm_phoenix_heavy"""
         }
         }
JUMPSUITE (New with DangerZone Update) "models/weapons/t_arms_leet.mdl" or "models/weapons/t_arms.mdl"
</pre>
|-
| Heavy CT
| <pre>
        {
"ctm_heavy"""
        }
</pre>
|-
| Jumpsuit (Danger Zone)
| <pre>
{
{
"tm_jumpsuit_varianta"""
"tm_jumpsuit_varianta"""
Line 177: Line 349:
"tm_jumpsuit_variantc"""
"tm_jumpsuit_variantc"""
}
}
</syntaxhighlight>
</pre>
|}


==Making CT vs CT '''or''' T vs T==
==Making CT vs CT '''or''' T vs T==
The .kv can be set up to use models for the wrong team, i.e. 'swat' vs 'fbi'
The .kv can be set up to use models for the wrong team, e.g. SWAT vs FBI.
 
{{ExpandBox|
<syntaxhighlight>
<pre>
"name_of_the_map"
"name_of_the_map"
  {
  {
Line 205: Line 378:
     }
     }
  }
  }
</syntaxhighlight>
</pre>
 
}}
== KV File Writer ==
== KV File Writer ==


Line 222: Line 395:
* [http://kvfilegen.appspot.com/ kvFileGen.appspot.com]
* [http://kvfilegen.appspot.com/ kvFileGen.appspot.com]


*{{todo|What else can the .kv do?  The .kv might be involved in setting up the overview for spectating.}}
[[Category:Counter-Strike: Global Offensive]]
[[Category:Counter-Strike: Global Offensive]]
[[Category:Level Design]]
[[Category:Level Design]]
[[Category:English]]
[[Category:English]]

Revision as of 19:27, 8 September 2021

English (en)Deutsch (de)Polski (pl)Русский (ru)中文 (zh)Translate (Translate)
Note.pngNote:.kv file redirects here. See KeyValues for the file format.


Counter-Strike: Global Offensive Level Creation

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 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.

Tip.pngTip:Use the model viewer or the Hammer model browser to browse the available models in csgo/models/player/. You can also see below for lists to copy-paste.
Tip.pngTip:Generally, there can be any number and any combination of player models in a list.
Tip.pngTip:If there are huge error boxes moving around the map, then you probably have misspelled at least one player model name.
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"""
				// ...
			} 
		}

		// ...
	}
}

Todo: 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 C++ 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
	{
		"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
	{
		"ctm_gign"""
		"ctm_gign_variantA"""
		"ctm_gign_variantB"""
		"ctm_gign_variantC"""
		"ctm_gign_variantD"""
	}
GSG9 Deutsch
	{
		"ctm_gsg9"""
		"ctm_gsg9_variantA"""
		"ctm_gsg9_variantB"""
		"ctm_gsg9_variantC"""
		"ctm_gsg9_variantD"""
	}
IDF
	{
		"ctm_idf"""
		"ctm_idf_variantB"""
		"ctm_idf_variantC"""
		"ctm_idf_variantD"""
		"ctm_idf_variantE"""
		"ctm_idf_variantF"""
	}
SAS Template: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"""
	}
SEAL Team 6 English (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"""
//		"ctm_st6_variantL"""
//		"ctm_st6_variantM"""
	}
SWAT English
	{
		"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"""
	}

Terrorist Models

Anarchist English
	{
		"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"""
	}
Phoenix Connexion (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
	{
		"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_varG"""
//		"tm_professional_varH"""
//		"tm_professional_varI"""
//		"tm_professional_varJ"""
	}
Separatist Français Español
	{
		"tm_separatist"""
		"tm_separatist_variantA"""
		"tm_separatist_variantB"""
		"tm_separatist_variantC"""
		"tm_separatist_variantD"""
	}

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.

External link