Protagonist System
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
SetProtagonistinput on the player with the protagonist as the parameter. - Adding
player_default_protagonist "<protagonist name>"togameinfo.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
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 |
