Addoninfo.txt: Difference between revisions
(Rewrite and reorganize basically everything) |
|||
Line 1: | Line 1: | ||
addoninfo[[. | The [[.txt|plain-text file]] {{Code|addoninfo.txt}} contains the ''[[KeyValues|KeyValues 1]]'' structure {{Code|AddonInfo}} specifying an [[VPK|addon]]’s metadata: its author, content flags, description, title, and version. | ||
This file and its functionality were introduced with the ''{{L4D|4}}'' [[Left 4 Dead engine branch|engine branch]]. | |||
{{ | Both the ''{{Source|4|nt=1}}'' and the deprecated external application {{Code|[[addoninstaller.exe]]}} will parse this file, though with significant differences. | ||
''{{Source|4}}'' will parse this file from all addons listed in {{Code|addonlist.txt}} when loading search paths from {{Code|[[gameinfo.txt]]}} at startup and with subsequent calls to ''[[ConCommand]]'' {{Command|update_addon_paths}}. | |||
''{{Source|4}}'' will retrieve metadata for all Steam Workshop addons from the Steam Workshop, overriding content in {{Code|addoninfo.txt}}. | |||
{{Code|addoninstaller.exe}} only parses {{Code|addoninfo.txt}} when staging addons during user-initialized installation. | |||
{{ModernWarning|You should {{Em|always}} ship your addons with {{Code|addoninfo.txt}}, {{Em|even if you distribute through the Steam Workshop}}. Otherwise, your users will encounter the following undesirable behavior: | |||
* your addon will load before all other correct addons specified in {{Code|addonlist.txt}}; and | |||
* your addon will never appearing in the {{Code|[[CBaseModFrame]]}} {{Code|Addons}} (the [[VGUI]] window for the addon manager), disallowing them from enabling or disabling it.}} | |||
{{ModernWarning| | {{ModernWarning|Avoid having your audience rely on {{Code|addoninstaller.exe}} to install addons. As of at least client version 2.2.2.6 of ''{{L4D2|4}}'', Valve has introduced a regression in its addon manager that effectively disables the {{Code|addoninstaller.exe}} association prompt. Many users will be unaware of {{Code|addoninstaller.exe}} or its appropriate usage unless they view [https://help.steampowered.com/en/faqs/view/7743-70E3-E1B4-8BB0 this page] on ''{{L4D|4}}'' addons.}} | ||
=== | == Specification == | ||
{{ | In the following specification, these terms will have the following meanings: | ||
* {{Em|shall}} indicates a mandatory requirement; and | |||
* {{Em|should}} indicates a recommendation. | |||
= | The ''{{Source|4|nt=1}}'' will expect a specific ''KeyValues 1'' structure in {{Code|addoninfo.txt}}, specified below: | ||
* You {{Em|shall}} save {{Code|addoninfo.txt}} with an [[wp:UTF-8|UTF-8]]-compatible encoding. | |||
* You {{Em|shall}} have at least one ''KeyValues'' block. | |||
* You {{Em|should}} define the name of the first ''KeyValues'' block as {{Kbd|AddonInfo}}. | |||
* You {{Em|should}} populate the first ''KeyValues'' block with at least one key-value entry from table [[#kv-addoninfo-keys|“Valid {{Code|AddonInfo}} Keys”]]: | |||
:* You {{Em|should}} provide a title, author, and version. | |||
:* You {{Em|should}} provide at least one content tag. | |||
=== | {| class="standard-table mw-collapsible" style="width: 100%" id="kv-addoninfo-keys" | ||
|+ style="text-align: left" | Valid {{Code|AddonInfo}} Keys | |||
|- | |||
! style="text-align: left" | Key | ! style="text-align: left" | Key | ||
! style="text-align: left" | Type | ! style="text-align: left" | [https://en.cppreference.com/w/cpp/language/types Type] | ||
! style="text-align: right" | Length | ! style="text-align: right" | Length | ||
! style="text-align: left" | Default Value | ! style="text-align: left" | Default Value | ||
Line 34: | Line 37: | ||
|- | |- | ||
| addontitle | | addontitle | ||
| {{ | | [https://en.cppreference.com/w/cpp/keyword/wchar_t {{Code|wchar_t}}] | ||
| style="text-align: right" | 127 | | style="text-align: right" | 127 | ||
| {{ | | {{Code|#L4D360UI_Addon_None_Specified}} | ||
| The addon’s title. | | The addon’s title. | ||
|- | |- | ||
| addonauthor | | addonauthor | ||
| {{ | | {{Code|wchar_t}} | ||
| style="text-align: right" | 119 | | style="text-align: right" | 119 | ||
| {{ | | {{Code|#L4D360UI_Addon_None_Specified}} | ||
| The addon’s author. | | The addon’s author. | ||
|- | |- | ||
| addonDescription | | addonDescription | ||
| {{ | | {{Code|wchar_t}} | ||
| style="text-align: right" | 1023 | | style="text-align: right" | 1023 | ||
| {{ | | {{Code|#L4D360UI_Addon_None_Specified}} | ||
| The addon’s description. {{L4D2|4}} will truncate those of Steam Workshop addons to 499 characters [{{ | | The addon’s description. ''{{L4D2|4}}'' will truncate those of Steam Workshop addons to 499 characters [{{Em|citation needed}} ]. | ||
|- | |- | ||
| addonversion | | addonversion | ||
| {{ | | {{Code|wchar_t}}<br />[https://en.cppreference.com/w/cpp/keyword/float {{Code|float}}] ({{Code|addoninstaller.exe}}) | ||
| style="text-align: right" | 31 | | style="text-align: right" | 31 | ||
| {{ | | {{Code|0.0}}<br />{{Code|1.0}} ({{Code|addoninstaller.exe}}) | ||
| The addon’s version | | The addon’s version. Conventionally a decimal number in the format {{Code|{{Var|major}}.{{Var|minor}}}}, but you may write any string. | ||
|- | |||
| addonContent_Campaign | |||
| [https://en.cppreference.com/w/cpp/keyword/int {{Code|int}}] | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom campaigns. If the value is {{Code|0}}, then the addon does not contain the specified content; otherwise, the addon contains the specified content. | |||
|- | |||
| addonContent_Map | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom campaigns or custom maps. | |||
|- | |||
| addonContent_Skin | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom skins. | |||
|- | |||
| addonContent_weapon | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom weapon skins. | |||
|- | |- | ||
| | | addonContent_BossInfected | ||
| {{ | | {{Code|int}} | ||
| style="text-align: right" | N/A | | style="text-align: right" | N/A | ||
| {{ | | {{Code|0}} | ||
| | | If the addon contains custom boss infected skins. | ||
|- | |- | ||
| {{ | | addonContent_CommonInfected | ||
| N/A | | {{Code|int}} | ||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom common infected skins. | |||
|- | |||
| addonContent_Survivor | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom survivor skins. | |||
|- | |||
| addonContent_Sound | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom sounds. | |||
|- | |||
| addonContent_Music | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | |||
| {{Code|0}} | |||
| If the addon contains custom music. | |||
|- | |||
| addonContent_Script | |||
| {{Code|int}} | |||
| style="text-align: right" | N/A | | style="text-align: right" | N/A | ||
| | | {{Code|0}} | ||
| If the addon contains custom scripts. | |||
|- | |- | ||
| {{ | | addonContent_prop | ||
| {{Code|int}} | |||
| style="text-align: right" | N/A | | style="text-align: right" | N/A | ||
| | | {{Code|0}} | ||
| If the addon contains custom props. | |||
|} | |} | ||
=== | === Non-existent or deprecated keys === | ||
{{ | {{em|Avoid writing these keys.}} | ||
All games ignore these keys. | |||
Valve provided these keys in the respective {{Code|addoninfo.txt}} copies packaged with the example campaigns [[#“DEADLINE”|“DEADLINE”]] and [[#“DEADLINE 2”|“DEADLINE 2”]]. | |||
{| class="standard-table" style="width: 100%" | |||
! style="text-align: left" | Key | |||
! style="text-align: left" | Description | |||
|- | |||
| addonSteamAppID | |||
{| class= | | The AppID of the addon’s target game. Only {{Code|addoninstaller.exe}} uses this. | ||
! Key ! | |||
|- | |- | ||
| | | addonTagline | ||
| The addon’s subtitle or tagline. May have had a similar purpose to key {{Code|poster/posterTagline}} in [[Mission Files|mission files]]. | |||
|- | |- | ||
| | | addonAuthorSteamID | ||
| The addon author’s [[SteamID]]. Supposedly used to construct a URL to the author’s Steam profile page. | |||
|- | |- | ||
| | | addonSteamGroupName | ||
| The addon’s Steam group. Supposedly used to construct a URL to the addon’s Steam group page. | |||
|- | |- | ||
| | | addonURL0 | ||
| The addon’s homepage. May have had a similar purpose to key {{Code|Website}} in [[Mission Files|mission files]]. | |||
|- | |- | ||
| | | addonContent_Survival<br />addonContent_Versus<br />addonContent_Scavenge | ||
| If the addon provides custom campaigns supporting the Survival, Versus, or Scavenge game modes. This functionality is provided by [[Mission Files|mission files]]. | |||
|- | |- | ||
| | | addonContent_Prefab | ||
| If the addon provides custom ''{{Hammer|4}}'' {{lc:[[Prefabs]]}}. | |||
|- | |- | ||
| | | addonContent_Spray | ||
| If the addon provides custom logos. | |||
|- | |- | ||
| | | addonContent_BackgroundMovie | ||
| If the addon provides custom background movies. | |||
|- | |- | ||
| | | Content_Weapon | ||
| If the addon provides custom weapons (e.g., “…a new weapon, i.e. guns, explosives, booby traps, hot tar, etc.”). | |||
|- | |- | ||
| | | Content_WeaponModel | ||
| If the addon provides custom weapon model. | |||
|- | |- | ||
| | | addonDescription_{{Var|locale}} | ||
| The addon’s description localized for locale {{Var|locale}}, where {{Var|locale}} is an [[wp:List of ISO 639-1 codes|ISO 639-1 code]] in ALL CAPS. | |||
|} | |} | ||
=== | == Content tag handling == | ||
An addon’s {{Code|AddonInfo}} [[#kv-addoninfo-keys|content keys]] provide an abstraction over ''{{Source|4}}''’s implementation-specific content tags. | |||
''{{Source|4}}'' will convert all keys into an internal representation (typically, a bitfield). | |||
A content key {{Em|may}} correspond to its internal tag; some keys provide redundant meaning useful only to authors and distributors. | |||
''{{Source|4}}'' will use these content tags to describe and filter addons in the {{Code|[[CBaseModFrame]]}} {{Code|Addons}}. | |||
{| class= | {{bug|A prop’s {{lc:[[Collision mesh|Collision mesh]]}} throughout the current session will be decided by whichever addon or pack-file loads first. | ||
The game will always load the effective first collision mesh until the current session ends. | |||
''This was tested on the propane tank model.'' {{todo|Move this to an appropriate page}}}} | |||
=== In ''{{L4D|4}}'' and ''{{AS|4}}'' === | |||
''{{L4D|4}}'' maintains a one-to-one correspondance between content keys and content tags. The handler closely resembles that found in the ''{{AS|4}}'' SDK. | |||
''{{Source|4}}'' will generate the content label by concatenating the VGUI localization strings corresponding to the given content tag followed into an array of 60 wide characters. | |||
The right-most comma will always be replaced with a {{Code|NULL}} terminator. | |||
The effective length of the label is 59 characters since the last character will always be a {{Code|NULL}} terminator. | |||
=== In ''{{L4D2|4}}'' === | |||
''{{L4D2|4}}'' stores the content keys for each addon as an {{Code|[https://en.cppreference.com/w/cpp/types/integer int16_t]}} representing the following bitfield (assume little-endian): | |||
<div style="overflow:auto"> | |||
{|class="standard-table mw-collapsible" style="overflow: auto" | |||
|+ style="text-align: left" | ''{{L4D2|4}} content tag bitfield'' | |||
|- | |- | ||
| | ! style="text-align: right" scope="row" | Bit | ||
| 15 | |||
| 14 | |||
| 13 | |||
| 12 | |||
| 11 | |||
| 10 | |||
| 9 | |||
| 8 | |||
| 7 | |||
| 6 | |||
| 5 | |||
| 4 | |||
| 3 | |||
| 2 | |||
| 1 | |||
| 0 | |||
|- | |- | ||
| | ! style="text-align: right" scope="row" | Tag | ||
| N/A | |||
| N/A | |||
| N/A | |||
| N/A | |||
| {{Code|CONTENT_ITEM}} | |||
| {{Code|CONTENT_UI}} | |||
| {{Code|CONTENT_SCRIPT}} | |||
| {{Code|CONTENT_SOUND}} | |||
| {{Code|CONTENT_SURVIVOR}} | |||
| {{Code|CONTENT_INFECTED}} | |||
| {{Code|CONTENT_MUTATION}} | |||
| {{Code|CONTENT_WEAPON}} | |||
| {{Code|CONTENT_SKIN}} | |||
| {{Code|CONTENT_MISCELLANEOUS}} | |||
| {{Code|CONTENT_CAMPAIGN}} | |||
| {{Code|CONTENT_RESERVED}} | |||
|- | |- | ||
| | ! style="text-align: right" scope="row" | [[#kv-addoninfo-keys|Key]] | ||
| | | N/A | ||
| | | N/A | ||
| | | N/A | ||
| | | N/A | ||
| | | {{Code|addonContent_prop}} | ||
| < | | N/A | ||
| | | {{Code|addonContent_Script}} | ||
| | | {{Code|addonContent_Sound}}<br />{{Code|addonContent_Music}} | ||
| | | {{Code|addonContent_Survivor}} | ||
| < | | {{Code|addonContent_BossInfected}}<br />{{Code|addonContent_CommonInfected}} | ||
| | | N/A | ||
| | | {{Code|addonContent_Weapon}} | ||
| | | {{Code|addonContent_Skin}} | ||
| | | N/A | ||
{{ | | {{Code|addonContent_Campaign}}<br />{{Code|addonContent_Map}} | ||
| N/A | |||
|} | |} | ||
</div> | |||
The content tags {{Code|CONTENT_MISCELLANEOUS}}, {{Code|CONTENT_MUTATION}}, and {{Code|CONTENT_UI}} can be set {{Em|only through the Steam Workshop}}. | |||
''{{Source|4}}'' will generate the content label by concatenating the VGUI localization strings corresponding to the given content tag followed into an array of 60 wide characters. | |||
The right-most comma will always be replaced with a {{Code|NULL}} terminator. | |||
The effective length of the label is 59 characters since the last character will always be a {{Code|NULL}} terminator. | |||
== Examples == | == Examples == | ||
The following are samples—both modern and historic—of {{Code|addoninfo.txt}}. | |||
Avoid using the [[#“DEADLINE”|“DEADLINE”]] or [[#“DEADLINE 2”|“DEADLINE 2”]] samples as templates: you will be shipping redundant keys. | |||
=== Minimal compliant {{Code|AddonInfo}} === | |||
<pre style="white-space: pre; overflow; auto; tab-size: 4; height: 25vh"> | |||
AddonInfo { | |||
addontitle "こんにちは、世界!" // Title is interpreted as a UTF8 string; | |||
// prefer codepoints in the Basic | |||
// Multilingual Plane. | |||
addonauthor ValveDeveloperWiki | |||
addonversion something // This can be anything and not just a float | |||
addonDescription "This is a sample. | |||
Note that the KeyValues parser will, in a quoted string, a) parse all | |||
whitespace literally and b) // ignore all C-style comments. You could | |||
probably use this to validate a KeyValues parser too. | |||
" | |||
addonContent_Campaign 1 | |||
addonContent_Survivor -1 | |||
addonContent_Sound 3.14159265 | |||
} | |||
</pre> | |||
=== “DEADLINE” === | |||
Download Valve’s “DEADLINE” campaign from [http://media.steampowered.com/apps/513/deadline.html here]. | |||
The following snippet matches the original exactly as of April 30, 2023. | |||
<pre style="white-space: pre; overflow: auto; height: 25vh"> | |||
// The addoninfo.txt file is a metadata file that is required by all Left 4 Dead Add-ons. | |||
"AddonInfo" | "AddonInfo" | ||
{ | { | ||
addontitle "Dead Line" // Add-on title that shows up in Add-ons list. ~20 chars max | |||
addonversion 1.3 // Add-on version. | |||
addontagline "Catch the last subway... out of hell." // Add-on tagline or wrap-up- a short description. ~100 chars max | |||
addonauthor "Valve" // Name/alias of the author | |||
addonauthorSteamID "http://steamcommunity.com/groups/Valve" // Steam Profile URL of author or group | |||
addonContent_Campaign 1 //This addon provides muliple connected maps with a finale | |||
" | addonURL0 "http://media.steampowered.com/apps/513/deadline.html" //An html home page for the add-on that includes a download link. | ||
// short description that appears in the Add-on list screen... | |||
addonDescription "Survivors must escape on a subway train in this short tutorial example campaign. Get source files and tools for creating your own campaigns by downloading the Left 4 Dead Authoring tools SDK, which is available under the 'Tools' tab in Steam." | |||
// Authors can add localized descriptions here. (Not yet supported) | |||
" | addonDescription_FR "Les survivants doivent s'échapper en métro dans cette carte du tutoriel. Obtenez les fichiers et les outils pour créer vos propres cartes en chargeant les outils de création SDK Left 4 Dead qui sont disponibles sous l'onglet "Outils" sur Steam." | ||
" | |||
}</pre> | |||
=== “DEADLINE 2” === | |||
Download Valve’s “DEADLINE 2” campaign from [http://media.steampowered.com/apps/513/deadline2.html here]. | |||
The following snippet matches the original exactly as of April 30, 2023. | |||
<pre style="white-space: pre; overflow: auto; height: 25vh"> | |||
// The addoninfo.txt file is a metadata file that is required by all Source Engine Add-ons. | |||
"AddonInfo" | |||
{ | |||
addonSteamAppID 550 // 500 is the app ID for Left 4 Dead, 550 for Left 4 Dead 2 | |||
addontitle "Dead Line 2" // Add-on title that shows up in Add-ons list. ~20 chars max | |||
addonversion 1.0 // Add-on version. | |||
addontagline "Catch the last subway... out of hell... Again!" // Add-on tagline or wrap-up- a short description. ~100 chars max | |||
addonauthor "Valve" // Name/alias of the author | |||
addonSteamGroupName "deadline2add-on" // (Optional) Steam group related to the add-on. We use this to construct a URL to the group page. | |||
addonauthorSteamID "YasserMalaika" // (Optional) Steam ID of author. We use this to construct a URL to the author's page. | |||
addonContent_Campaign 1 //This addon provides muliple connected maps with a finale | |||
addonURL0 "http://media.steampowered.com/apps/513/deadline2.html" //An html home page for the add-on that includes a download link. | |||
// short description that appears in the Add-on list screen... | |||
addonDescription "Survivors must escape on a subway train in this short tutorial example campaign. Get source files and tools for creating your own campaigns by downloading the Left 4 Dead 2 Authoring tools SDK, which is available under the 'Tools' tab in Steam." | |||
// Authors can add localized descriptions here. (Not yet supported) | |||
addonDescription_FR "Les survivants doivent s'échapper en métro dans cette carte du tutoriel. Obtenez les fichiers et les outils pour créer vos propres cartes en chargeant les outils de création SDK Left 4 Dead 2 qui sont disponibles sous l'onglet "Outils" sur Steam." | |||
}</pre> | |||
} | |||
</pre> | |||
== See also == | == See also == | ||
* [[L4D Campaign Add-on Tutorial]] | * [[L4D Campaign Add-on Tutorial]] | ||
* [[L4D 2 Campaign Add-on Tutorial]] | * [[L4D 2 Campaign Add-on Tutorial]] | ||
Line 279: | Line 351: | ||
[[Category:Source]] | [[Category:Source]] | ||
[[Category:Left 4 Dead]] | [[Category:Left 4 Dead]] | ||
[[Category:Left 4 Dead 2]] | [[Category:Left 4 Dead 2]] | ||
[[Category:Plain text files]] | |||
[[Category:Plain text files]] |
Revision as of 14:15, 29 April 2023
The plain-text file addoninfo.txt contains the KeyValues 1 structure AddonInfo specifying an addon’s metadata: its author, content flags, description, title, and version.
This file and its functionality were introduced with the Left 4 Dead engine branch.
Both the Source Engine and the deprecated external application addoninstaller.exe will parse this file, though with significant differences.
Source will parse this file from all addons listed in addonlist.txt when loading search paths from gameinfo.txt at startup and with subsequent calls to ConCommand update_addon_paths.
Source will retrieve metadata for all Steam Workshop addons from the Steam Workshop, overriding content in addoninfo.txt.
addoninstaller.exe only parses addoninfo.txt when staging addons during user-initialized installation.
Specification
In the following specification, these terms will have the following meanings:
- shall indicates a mandatory requirement; and
- should indicates a recommendation.
The Source Engine will expect a specific KeyValues 1 structure in addoninfo.txt, specified below:
- You shall save addoninfo.txt with an UTF-8-compatible encoding.
- You shall have at least one KeyValues block.
- You should define the name of the first KeyValues block as AddonInfo.
- You should populate the first KeyValues block with at least one key-value entry from table “Valid AddonInfo Keys”:
- You should provide a title, author, and version.
- You should provide at least one content tag.
Key | Type | Length | Default Value | Description |
---|---|---|---|---|
addontitle | wchar_t | 127 |
|
The addon’s title. |
addonauthor | wchar_t | 119 |
|
The addon’s author. |
addonDescription | wchar_t | 1023 |
|
The addon’s description. ![]() |
addonversion | wchar_t float (addoninstaller.exe) |
31 | 0.0 1.0 (addoninstaller.exe) |
The addon’s version. Conventionally a decimal number in the format major.minor, but you may write any string. |
addonContent_Campaign | int | N/A | 0 | If the addon contains custom campaigns. If the value is 0, then the addon does not contain the specified content; otherwise, the addon contains the specified content. |
addonContent_Map | int | N/A | 0 | If the addon contains custom campaigns or custom maps. |
addonContent_Skin | int | N/A | 0 | If the addon contains custom skins. |
addonContent_weapon | int | N/A | 0 | If the addon contains custom weapon skins. |
addonContent_BossInfected | int | N/A | 0 | If the addon contains custom boss infected skins. |
addonContent_CommonInfected | int | N/A | 0 | If the addon contains custom common infected skins. |
addonContent_Survivor | int | N/A | 0 | If the addon contains custom survivor skins. |
addonContent_Sound | int | N/A | 0 | If the addon contains custom sounds. |
addonContent_Music | int | N/A | 0 | If the addon contains custom music. |
addonContent_Script | int | N/A | 0 | If the addon contains custom scripts. |
addonContent_prop | int | N/A | 0 | If the addon contains custom props. |
Non-existent or deprecated keys
Avoid writing these keys. All games ignore these keys. Valve provided these keys in the respective addoninfo.txt copies packaged with the example campaigns “DEADLINE” and “DEADLINE 2”.
Key | Description |
---|---|
addonSteamAppID | The AppID of the addon’s target game. Only addoninstaller.exe uses this. |
addonTagline | The addon’s subtitle or tagline. May have had a similar purpose to key poster/posterTagline in mission files. |
addonAuthorSteamID | The addon author’s SteamID. Supposedly used to construct a URL to the author’s Steam profile page. |
addonSteamGroupName | The addon’s Steam group. Supposedly used to construct a URL to the addon’s Steam group page. |
addonURL0 | The addon’s homepage. May have had a similar purpose to key Website in mission files. |
addonContent_Survival addonContent_Versus addonContent_Scavenge |
If the addon provides custom campaigns supporting the Survival, Versus, or Scavenge game modes. This functionality is provided by mission files. |
addonContent_Prefab | If the addon provides custom ![]() |
addonContent_Spray | If the addon provides custom logos. |
addonContent_BackgroundMovie | If the addon provides custom background movies. |
Content_Weapon | If the addon provides custom weapons (e.g., “…a new weapon, i.e. guns, explosives, booby traps, hot tar, etc.”). |
Content_WeaponModel | If the addon provides custom weapon model. |
addonDescription_locale | The addon’s description localized for locale locale, where locale is an ISO 639-1 code in ALL CAPS. |
Content tag handling
An addon’s AddonInfo content keys provide an abstraction over Source’s implementation-specific content tags.
Source will convert all keys into an internal representation (typically, a bitfield).
A content key may correspond to its internal tag; some keys provide redundant meaning useful only to authors and distributors.
Source will use these content tags to describe and filter addons in the CBaseModFrame Addons.

The game will always load the effective first collision mesh until the current session ends.
This was tested on the propane tank model.In
Left 4 Dead and
Alien Swarm
Left 4 Dead maintains a one-to-one correspondance between content keys and content tags. The handler closely resembles that found in the
Alien Swarm SDK.
Source will generate the content label by concatenating the VGUI localization strings corresponding to the given content tag followed into an array of 60 wide characters.
The right-most comma will always be replaced with a NULL terminator.
The effective length of the label is 59 characters since the last character will always be a NULL terminator.
In
Left 4 Dead 2
Left 4 Dead 2 stores the content keys for each addon as an int16_t representing the following bitfield (assume little-endian):
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Tag | N/A | N/A | N/A | N/A | CONTENT_ITEM | CONTENT_UI | CONTENT_SCRIPT | CONTENT_SOUND | CONTENT_SURVIVOR | CONTENT_INFECTED | CONTENT_MUTATION | CONTENT_WEAPON | CONTENT_SKIN | CONTENT_MISCELLANEOUS | CONTENT_CAMPAIGN | CONTENT_RESERVED |
Key | N/A | N/A | N/A | N/A | addonContent_prop | N/A | addonContent_Script | addonContent_Sound addonContent_Music |
addonContent_Survivor | addonContent_BossInfected addonContent_CommonInfected |
N/A | addonContent_Weapon | addonContent_Skin | N/A | addonContent_Campaign addonContent_Map |
N/A |
The content tags CONTENT_MISCELLANEOUS, CONTENT_MUTATION, and CONTENT_UI can be set only through the Steam Workshop.
Source will generate the content label by concatenating the VGUI localization strings corresponding to the given content tag followed into an array of 60 wide characters.
The right-most comma will always be replaced with a NULL terminator.
The effective length of the label is 59 characters since the last character will always be a NULL terminator.
Examples
The following are samples—both modern and historic—of addoninfo.txt. Avoid using the “DEADLINE” or “DEADLINE 2” samples as templates: you will be shipping redundant keys.
Minimal compliant AddonInfo
AddonInfo { addontitle "こんにちは、世界!" // Title is interpreted as a UTF8 string; // prefer codepoints in the Basic // Multilingual Plane. addonauthor ValveDeveloperWiki addonversion something // This can be anything and not just a float addonDescription "This is a sample. Note that the KeyValues parser will, in a quoted string, a) parse all whitespace literally and b) // ignore all C-style comments. You could probably use this to validate a KeyValues parser too. " addonContent_Campaign 1 addonContent_Survivor -1 addonContent_Sound 3.14159265 }
“DEADLINE”
Download Valve’s “DEADLINE” campaign from here. The following snippet matches the original exactly as of April 30, 2023.
// The addoninfo.txt file is a metadata file that is required by all Left 4 Dead Add-ons. "AddonInfo" { addontitle "Dead Line" // Add-on title that shows up in Add-ons list. ~20 chars max addonversion 1.3 // Add-on version. addontagline "Catch the last subway... out of hell." // Add-on tagline or wrap-up- a short description. ~100 chars max addonauthor "Valve" // Name/alias of the author addonauthorSteamID "http://steamcommunity.com/groups/Valve" // Steam Profile URL of author or group addonContent_Campaign 1 //This addon provides muliple connected maps with a finale addonURL0 "http://media.steampowered.com/apps/513/deadline.html" //An html home page for the add-on that includes a download link. // short description that appears in the Add-on list screen... addonDescription "Survivors must escape on a subway train in this short tutorial example campaign. Get source files and tools for creating your own campaigns by downloading the Left 4 Dead Authoring tools SDK, which is available under the 'Tools' tab in Steam." // Authors can add localized descriptions here. (Not yet supported) addonDescription_FR "Les survivants doivent s'échapper en métro dans cette carte du tutoriel. Obtenez les fichiers et les outils pour créer vos propres cartes en chargeant les outils de création SDK Left 4 Dead qui sont disponibles sous l'onglet "Outils" sur Steam." }
“DEADLINE 2”
Download Valve’s “DEADLINE 2” campaign from here. The following snippet matches the original exactly as of April 30, 2023.
// The addoninfo.txt file is a metadata file that is required by all Source Engine Add-ons. "AddonInfo" { addonSteamAppID 550 // 500 is the app ID for Left 4 Dead, 550 for Left 4 Dead 2 addontitle "Dead Line 2" // Add-on title that shows up in Add-ons list. ~20 chars max addonversion 1.0 // Add-on version. addontagline "Catch the last subway... out of hell... Again!" // Add-on tagline or wrap-up- a short description. ~100 chars max addonauthor "Valve" // Name/alias of the author addonSteamGroupName "deadline2add-on" // (Optional) Steam group related to the add-on. We use this to construct a URL to the group page. addonauthorSteamID "YasserMalaika" // (Optional) Steam ID of author. We use this to construct a URL to the author's page. addonContent_Campaign 1 //This addon provides muliple connected maps with a finale addonURL0 "http://media.steampowered.com/apps/513/deadline2.html" //An html home page for the add-on that includes a download link. // short description that appears in the Add-on list screen... addonDescription "Survivors must escape on a subway train in this short tutorial example campaign. Get source files and tools for creating your own campaigns by downloading the Left 4 Dead 2 Authoring tools SDK, which is available under the 'Tools' tab in Steam." // Authors can add localized descriptions here. (Not yet supported) addonDescription_FR "Les survivants doivent s'échapper en métro dans cette carte du tutoriel. Obtenez les fichiers et les outils pour créer vos propres cartes en chargeant les outils de création SDK Left 4 Dead 2 qui sont disponibles sous l'onglet "Outils" sur Steam." }