The Protagonist System is a dedicated controller for the player’s model, viewmodel arms, and other properties. It’s intended to allow mappers to quickly and easily change the player’s “identity” without requiring several disconnected inputs. For example, setting the player’s protagonist to alyx will make the player take on the appearance of Alyx Vance, changing their model and viewmodels accordingly.

You can set the player’s protagonist name through one of the following methods:

  • Using the “Protagonist Name” keyvalue on logic_playerproxy.
  • Using the SetProtagonist input on the player with the protagonist as the parameter.
  • Adding player_default_protagonist "<protagonist name>" to gameinfo.txt, with <protagonist name> being the name of the protagonist.

Mapbase comes with several default protagonists that can be used in any HL2 mod. A list can be found at the bottom of this page. Protagonists can also be listed in-game by using the protagonist_dump command.

Here’s a short video demonstrating its use in-game:

Defining a new protagonist

New protagonists are defined through external scripts, which by default include most HL2 characters. You can find these scripts in mapbase_hl2/content/hl2_mapbase_content.vpk under scripts/protagonists. While new files can be added through the manifest, a protagonists_mod.txt file is provided to easily add custom protagonists. Protagonists can also be mounted on a map-by-map basis by adding a maps/%mapname%_protagonists.txt file.

This is the format for defining a new protagonist in one of these files, with labels for what each key does:

	"[protagonist name]"		- The name used to select the protagonist.
	{
		"inherits_from"			- Existing protagonists to inherit keyvalues from. Separated by semicolon.

		"playermodel"			- The model the player should be set to.
		"playermodel_skin"		- The playermodel's skin value.
		"playermodel_body"		- The playermodel's bodygroup value. This is currently a direct body integer.

		"hands"					- The hand viewmodel used when c_arms are supported.
		"hands_skin"			- The hand model's skin value.
		"hands_body"			- The hand model's bodygroup value. This is currently a direct body integer.

		"hands_..."				- Using "hands_blender" or "hands_css" will set them as different hand models for different rigs.
								  The default protagonists do not use this and it is only important if you have viewmodels with
								  different rigs.

		"response_contexts"		- Response contexts appended to the player, separated by comma.
		"team"					- HL2:DM only: Which team the protagonist should be on.
								  Accepts "combine", "rebels", or a direct integer.

		"wpn_data"				- A list of weapons to override the data for while this protagonist is active.
								  This is mostly used to add c_arms support.
		{
			"[weapon name]"			- The classname of the weapon to override. (e.g. "weapon_smg1")
			{
					"viewmodel"				- The viewmodel the weapon should use.
					"viewmodel_fov"			- The FOV the viewmodel should use.
					"uses_hands"			- Whether or not this viewmodel uses c_arms.
					"hand_rig"				- Which hand rig this viewmodel uses, if relevant.
			}
		}

		"wpn_viewmodels"		- A shortcut for "wpn_data" which only sets the viewmodel on the listed weapons.
		{
			"[weapon name]"		"[viewmodel path]"
		}

		"wpn_viewmodels_c"		- The same as "wpn_viewmodels", but it also turns on "uses_hands" automatically.
		{
			"[weapon name]"		"[viewmodel path]"
		}
	}

By default, most HL2 protagonists override viewmodels by inheriting BASE_hl2_c_arms, which is defined in protagonists_hl2_base.txt and uses wpn_viewmodels_c to draw from Inaki’s c_arms-compatible viewmodels. If you have custom weapons, you can make them support c_arms without defining them in the Protagonist System by changing the weapon script directly, but if that isn’t possible/convenient, then you can override this file and add your weapons with c_arms-capable viewmodels to this list.

Since uses_hands is a general weapon script keyvalue, HL2’s weapon scripts could be made to support c_arms instead of being done through the Protagonist System, but Inaki’s viewmodels differ slightly and some mods may override the default viewmodels or their scripts. By default, the Protagonist System enables c_arms on its own, and only when a protagonist with defined c_arms viewmodel(s) is selected. This also allows specific characters to use different viewmodels for the same weapons if needed.

If you would like to explicitly enable these values in the weapon scripts, see Weapon Script Changes.

Default protagonists

Main Characters
Name Player Model Arms Model
gordon gordon/gordon.mdl v_hands.mdl
gordon_citizen gordon/gordon_citizen.mdl c_arms_m_citizen1.mdl
alyx alyx.mdl c_arms_alyx.mdl
barney barney.mdl c_arms_police.mdl
eli eli.mdl c_arms_eli.mdl
kleiner kleiner.mdl c_arms_kleiner.mdl
monk monk.mdl c_arms_monk.mdl
magnusson magnusson.mdl c_arms_magnusson.mdl
mossman_ep1 mossman.mdl c_arms_mossman_ep1.mdl
breen breen.mdl c_arms_breen.mdl
Citizens
📄 Note: Female citizens currently use male citizen arms.
Downtrodden
Name Player Model Arms Model
citizen_male_01 humans/group01/male_01.mdl c_arms_m_citizen1.mdl
citizen_male_02 humans/group01/male_02.mdl c_arms_m_citizen2.mdl
citizen_male_03 humans/group01/male_03.mdl c_arms_m_citizen1.mdl
citizen_male_04 humans/group01/male_04.mdl c_arms_m_citizen2.mdl
citizen_male_05 humans/group01/male_05.mdl c_arms_m_citizen1.mdl
citizen_male_06 humans/group01/male_06.mdl c_arms_m_citizen2.mdl
citizen_male_07 humans/group01/male_07.mdl c_arms_m_citizen1.mdl
citizen_male_08 humans/group01/male_08.mdl c_arms_m_citizen2.mdl
citizen_male_09 humans/group01/male_09.mdl c_arms_m_citizen1.mdl
citizen_female_01 humans/group01/female_01.mdl c_arms_m_citizen1.mdl
citizen_female_02 humans/group01/female_02.mdl c_arms_m_citizen2.mdl
citizen_female_03 humans/group01/female_03.mdl c_arms_m_citizen1.mdl
citizen_female_04 humans/group01/female_04.mdl c_arms_m_citizen2.mdl
citizen_female_06 humans/group01/female_06.mdl c_arms_m_citizen1.mdl
citizen_female_07 humans/group01/female_07.mdl c_arms_m_citizen2.mdl
Refugee
Name Player Model Arms Model
refugee_male_01 humans/group02/male_01.mdl c_arms_m_refugee1.mdl
refugee_male_02 humans/group02/male_02.mdl c_arms_m_refugee2.mdl
refugee_male_03 humans/group02/male_03.mdl c_arms_m_refugee1.mdl
refugee_male_04 humans/group02/male_04.mdl c_arms_m_refugee2.mdl
refugee_male_05 humans/group02/male_05.mdl c_arms_m_refugee1.mdl
refugee_male_06 humans/group02/male_06.mdl c_arms_m_refugee2.mdl
refugee_male_07 humans/group02/male_07.mdl c_arms_m_refugee1.mdl
refugee_male_08 humans/group02/male_08.mdl c_arms_m_refugee2.mdl
refugee_male_09 humans/group02/male_09.mdl c_arms_m_refugee1.mdl
refugee_female_01 humans/group02/female_01.mdl c_arms_m_refugee1.mdl
refugee_female_02 humans/group02/female_02.mdl c_arms_m_refugee2.mdl
refugee_female_03 humans/group02/female_03.mdl c_arms_m_refugee1.mdl
refugee_female_04 humans/group02/female_04.mdl c_arms_m_refugee2.mdl
refugee_female_06 humans/group02/female_06.mdl c_arms_m_refugee1.mdl
refugee_female_07 humans/group02/female_07.mdl c_arms_m_refugee2.mdl
Rebel
Name Player Model Arms Model
rebel_male_01 humans/group03/male_01.mdl c_arms_m_rebel1.mdl
rebel_male_02 humans/group03/male_02.mdl c_arms_m_rebel2.mdl
rebel_male_03 humans/group03/male_03.mdl c_arms_m_rebel2.mdl
rebel_male_04 humans/group03/male_04.mdl c_arms_m_rebel1.mdl
rebel_male_05 humans/group03/male_05.mdl c_arms_m_rebel2.mdl
rebel_male_06 humans/group03/male_06.mdl c_arms_m_rebel1.mdl
rebel_male_07 humans/group03/male_07.mdl c_arms_m_rebel2.mdl
rebel_male_08 humans/group03/male_08.mdl c_arms_m_rebel1.mdl
rebel_male_09 humans/group03/male_09.mdl c_arms_m_rebel1.mdl
rebel_female_01 humans/group03/female_01.mdl c_arms_m_rebel1.mdl
rebel_female_02 humans/group03/female_02.mdl c_arms_m_rebel2.mdl
rebel_female_03 humans/group03/female_03.mdl c_arms_m_rebel1.mdl
rebel_female_04 humans/group03/female_04.mdl c_arms_m_rebel2.mdl
rebel_female_06 humans/group03/female_06.mdl c_arms_m_rebel1.mdl
rebel_female_07 humans/group03/female_07.mdl c_arms_m_rebel1.mdl
Medic
Name Player Model Arms Model
medic_male_01 humans/group03m/male_01.mdl c_arms_m_medic1.mdl
medic_male_02 humans/group03m/male_02.mdl c_arms_m_medic2.mdl
medic_male_03 humans/group03m/male_03.mdl c_arms_m_medic1.mdl
medic_male_04 humans/group03m/male_04.mdl c_arms_m_medic2.mdl
medic_male_05 humans/group03m/male_05.mdl c_arms_m_medic1.mdl
medic_male_06 humans/group03m/male_06.mdl c_arms_m_medic2.mdl
medic_male_07 humans/group03m/male_07.mdl c_arms_m_medic1.mdl
medic_male_08 humans/group03m/male_08.mdl c_arms_m_medic2.mdl
medic_male_09 humans/group03m/male_09.mdl c_arms_m_medic1.mdl
medic_female_01 humans/group03m/female_01.mdl c_arms_m_medic1.mdl
medic_female_02 humans/group03m/female_02.mdl c_arms_m_medic2.mdl
medic_female_03 humans/group03m/female_03.mdl c_arms_m_medic1.mdl
medic_female_04 humans/group03m/female_04.mdl c_arms_m_medic2.mdl
medic_female_06 humans/group03m/female_06.mdl c_arms_m_medic2.mdl
medic_female_07 humans/group03m/female_07.mdl c_arms_m_medic1.mdl
Enemies
Name Player Model Skin Arms Model
police police.mdl 0 c_arms_police.mdl
combine_soldier combine_soldier.mdl 0 c_arms_combine.mdl
combine_soldier_sg combine_soldier_sg.mdl 1 c_arms_combine.mdl
combine_prisonguard combine_soldier_prisonguard.mdl 0 c_arms_combine.mdl
combine_prisonguard_sg combine_soldier_prisonguard.mdl 1 c_arms_combine.mdl
combine_elite combine_super_soldier.mdl 0 c_arms_combine.mdl
combine_soldier_dirty combine_soldirt.mdl 0 c_arms_combine_dirty.mdl
combine_soldier_dirty_sg combine_soldirt.mdl 1 c_arms_combine_dirty.mdl
combine_prisonguard_dirty combine_soldirt_prisonguard.mdl 0 c_arms_combine_dirty.mdl
combine_prisonguard_dirty_sg combine_soldirt_prisonguard.mdl 1 c_arms_combine_dirty.mdl
combine_elite_dirty combine_super_soldirt.mdl 0 c_arms_combine_dirty.mdl