Addoninfo.txt: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (→‎Content tag handling: Use {{ModernBug}})
m (→‎Non-existent or deprecated keys: They may still be useful as metainformation)
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
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.
The AddonInfo.txt is a [[.txt|plain-text file]] which contains an [[VPK|addon]]’s metadata. It resides in the Root folder of addons. ''The folder containing "materials", "Models", "Sound", ect.''<br>
This file and its functionality were introduced with the ''{{L4D|4}}'' [[Left 4 Dead engine branch|engine branch]].
This file and its functionality were introduced with the {{l4dbranch|4|nt=4}}, and is written in the ''[[KeyValues|KeyValues 1]]'' structure.<br>
In case you upload the addon to the Steam Workshop, the workshop submission's metadata (name, version, author, and description) will be used instead, but the AddonContent flags will still be read from the addoninfo.txt.<br>


Both the ''{{Source|4|nt=1}}'' and the deprecated external application {{Code|[[addoninstaller.exe]]}} will parse this file, though with significant differences.
Both the {{Source|4|nt=1}} and the deprecated external application [[addoninstaller.exe]] will parse this file, though with significant differences.<br>
''{{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 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]]'' {{Command|update_addon_paths}}.<br>
''{{Source|4}}'' will retrieve metadata for all Steam Workshop addons from the Steam Workshop, overriding content in {{Code|addoninfo.txt}}.
Addoninstaller.exe only parses addoninfo.txt when staging addons during user-initialized installation.<br>
{{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:
{{warning|Avoid using addoninstaller.exe to install addons. As of at least client version 2.2.2.6 of {{L4D2|4}}, the addoninstaller no longer functions as intended and actually breaks the addons that it is supposed to install.}}
* your addon will load before all other correct addons specified in {{Code|addonlist.txt}}; and
{{warning|You should {{Em|always}} ship your addons with addoninfo.txt, {{Em|even if you distribute through the Steam Workshop}}. Otherwise, your users will encounter the following undesirable behavior:
* 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.}}
* Your addon will load before all other addons specified in addonlist.txt.
 
* Your addon will never appear in the Addons menu, stopping you from enabling/disabling the addon. Although this only happens when the user takes the mod from the "Addons/Workshop" folder and installs it into "Addons".}}
{{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 ==
== Specification ==
AddonInfo.txt is a text files that determine the addon's name, version number, description and some content tags.<br>
You can copy this template into a text file, edit the data according to what you need and save it as "Addoninfo.txt" in the Root folder of your addon. ''The folder containing "materials", "Models", "Sound", ect.''


In the following specification, these terms will have the following meanings:
<source>
* {{Em|shall}} indicates a mandatory requirement; and
"AddonInfo"
* {{Em|should}} indicates a recommendation.
{
 
addonversion "1.0" //Max 31 characters. Allows decimals.
The ''{{Source|4|nt=1}}'' will expect a specific ''KeyValues 1'' structure in {{Code|addoninfo.txt}}, specified below:
addontitle "Addon_Name_Here" //Max 127 characters.
* You {{Em|shall}} save {{Code|addoninfo.txt}} with an [[wp:UTF-8|UTF-8]]-compatible encoding.
addonauthor "Author_Name_Here" //Max 119 characters.
* You {{Em|shall}} have at least one ''KeyValues'' block.
addonDescription "Description_Here" //Max 1023 characters.
* 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”]]:
// These booleans act as content descriptors, showing up as tags ingame.
:* You {{Em|should}} provide a title, author, and version.
// Users can filter addons by these tags and see what's inside without reading the description.
:* You {{Em|should}} provide at least one content tag.
// Set to 1 where applicable. You can use multiple, such as "Weapons" and "skins".
 
addonContent_Campaign 0 //Has multiple maps that string into a campaign. Represented ingame as: Campaigns
{| class="standard-table mw-collapsible" style="width: 100%" id="kv-addoninfo-keys"
addonContent_Map 0 //Has at least one map. Represented ingame as: Campaigns
|+ style="text-align: left" | Valid {{Code|AddonInfo}} Keys
addonContent_Skin 0 //Modifies an existing model or texture. Represented ingame as: Skins
|-
addonContent_weapon 0 //Modifies a weapon in some way. (or adds melee weapons) Represented ingame as: Weapons
! style="text-align: left"  | Key
addonContent_BossInfected 0 //Modifies the Tank or the Witch. Represented ingame as: Infected
! style="text-align: left" | [https://en.cppreference.com/w/cpp/language/types Type]
addonContent_CommonInfected 0 //Modifies CI . Represented ingame as: Infected
! style="text-align: right" | Length
addonContent_Survivor 0 //Modifies Survivors. Represented ingame as: Survivors
! style="text-align: left"  | Default Value
addonContent_Sound 0 //Modifies a sound. (not for when a map is shipped with sounds) Represented ingame as: Sounds
! style="text-align: left"  | Description
addonContent_Music 0 //Modifies specifically music. Represented ingame as: Sounds
|-
addonContent_Script 0 //Modifies a script. Represented ingame as: Scripts
| addontitle
addonContent_prop 0 //Modifies a prop Represented ingame as: Items
| [https://en.cppreference.com/w/cpp/keyword/wchar_t {{Code|wchar_t}}]
}</source>
| style="text-align: right" | 127
| {{Code|#L4D360UI_Addon_None_Specified}}
| The addon’s title.
|-
| addonauthor
| {{Code|wchar_t}}
| style="text-align: right" | 119
| {{Code|#L4D360UI_Addon_None_Specified}}
| The addon’s author.
|-
| addonDescription
| {{Code|wchar_t}}
| 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 [{{Em|citation needed}}&#x200A;].
|-
| addonversion
| {{Code|wchar_t}}<br />[https://en.cppreference.com/w/cpp/keyword/float {{Code|float}}] ({{Code|addoninstaller.exe}})
| style="text-align: right" | 31
| {{Code|0.0}}<br />{{Code|1.0}} ({{Code|addoninstaller.exe}})
| 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
| {{Code|0}}
| If the addon contains custom boss infected skins.
|-
| addonContent_CommonInfected
| {{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
| {{Code|0}}
| If the addon contains custom scripts.
|-
| addonContent_prop
| {{Code|int}}
| style="text-align: right" | N/A
| {{Code|0}}
| If the addon contains custom props.
|}


=== Non-existent or deprecated keys ===
=== Non-existent or deprecated keys ===


{{em|Avoid writing these keys.}}
The following keys either used to exist at one point or were never properly implemented in the first place.<br>
All games ignore these keys.
Some of these can still be seen in the [[#“DEADLINE”|“DEADLINE”]] and [[#“DEADLINE 2”|“DEADLINE 2”]] AddonInfo.txt files, which were supposed to be an example, but they aren't used in-game.
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%"
{| class="standard-table" style="width: 100%"
Line 138: Line 50:
|-
|-
| addonSteamAppID
| addonSteamAppID
| The AppID of the addon’s target game. Only {{Code|addoninstaller.exe}} uses this.
| The AppID of the addon’s target game. Only addoninstaller.exe uses this.
|-
|-
| addonTagline
| addonTagline
| The addon’s subtitle or tagline. May have had a similar purpose to key {{Code|poster/posterTagline}} in [[Mission Files|mission files]].
| The addon’s subtitle or tagline. May have had a similar purpose to key poster/posterTagline in [[Mission Files|mission files]].
|-
|-
| addonAuthorSteamID
| addonAuthorSteamID
Line 150: Line 62:
|-
|-
| addonURL0
| addonURL0
| The addon’s homepage. May have had a similar purpose to key {{Code|Website}} in [[Mission Files|mission files]].
| The addon’s homepage. May have had a similar purpose to key Website in [[Mission Files|mission files]].
|-
|-
| addonContent_Survival<br />addonContent_Versus<br />addonContent_Scavenge  
| 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]].
| 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
| addonContent_Prefab
| If the addon provides custom ''{{Hammer|4}}'' {{lc:[[Prefabs]]}}.
| If the addon provides custom {{Hammer|4}} {{lc:[[Prefabs]]}}.
|-
|-
| addonContent_Spray
| addonContent_Spray
Line 176: Line 88:
== Content tag handling ==
== Content tag handling ==


An addon’s {{Code|AddonInfo}} [[#kv-addoninfo-keys|content keys]] provide an abstraction over ''{{Source|4}}''’s implementation-specific content tags.
An addon’s addoninfo [[#kv-addoninfo-keys|content keys]] provide an abstraction over {{Source|4}}’s implementation-specific content tags.<br>
''{{Source|4}}'' will convert all keys into an internal representation (typically, a bitfield).
{{Source|4}} will convert all keys into an internal representation (typically, a bitfield).<br>
A content key {{Em|may}} correspond to its internal tag; some keys provide redundant meaning useful only to authors and distributors.
A content key {{Em|may}} correspond to its internal tag; some keys provide redundant meaning useful only to authors and distributors.<br>
''{{Source|4}}'' will use these content tags to describe and filter addons in the {{Code|[[CBaseModFrame]]}} {{Code|Addons}}.
{{Source|4}} will use these content tags to describe and filter addons in the [[CBaseModFrame]] Addons.<br>
 
 
=== In {{L4D|4}} and {{AS|4}} ===


{{ModernBug|A prop’s {{lc:[[Collision mesh|Collision mesh]]}} throughout the current session will be decided by whichever addon or pack-file loads first.
{{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.<br>
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}}'' ===
{{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.<br>
The right-most comma will always be replaced with a NULL terminator.<br>
The effective length of the label is 59 characters since the last character will always be a NULL terminator.<br>


''{{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}}'' ===
=== 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):
{{L4D2|4}} stores the content keys for each addon as an [[integer|int16_t]] representing the following bitfield (assume little-endian):
<div style="overflow:auto">
<div style="overflow:auto">
{|class="standard-table mw-collapsible" style="overflow: auto"
{|class="standard-table mw-collapsible" style="overflow: auto"
|+ style="text-align: left" | ''{{L4D2|4}} content tag bitfield''
|+ style="text-align: left" | {{L4D2|4}} content tag bitfield''
|-
|-
! style="text-align: right" scope="row" | Bit  
! style="text-align: right" scope="row" | Bit  
Line 224: Line 134:
| N/A
| N/A
| N/A
| N/A
| {{Code|CONTENT_ITEM}}
| CONTENT_ITEM
| {{Code|CONTENT_UI}}
| CONTENT_UI
| {{Code|CONTENT_SCRIPT}}
| CONTENT_SCRIPT
| {{Code|CONTENT_SOUND}}
| CONTENT_SOUND
| {{Code|CONTENT_SURVIVOR}}
| CONTENT_SURVIVOR
| {{Code|CONTENT_INFECTED}}
| CONTENT_INFECTED
| {{Code|CONTENT_MUTATION}}
| CONTENT_MUTATION
| {{Code|CONTENT_WEAPON}}
| CONTENT_WEAPON
| {{Code|CONTENT_SKIN}}
| CONTENT_SKIN
| {{Code|CONTENT_MISCELLANEOUS}}
| CONTENT_MISCELLANEOUS
| {{Code|CONTENT_CAMPAIGN}}
| CONTENT_CAMPAIGN
| {{Code|CONTENT_RESERVED}}
| CONTENT_RESERVED
|-
|-
! style="text-align: right" scope="row" | [[#kv-addoninfo-keys|Key]]  
! style="text-align: right" scope="row" | [[#kv-addoninfo-keys|Key]]  
Line 242: Line 152:
| N/A
| N/A
| N/A
| N/A
| {{Code|addonContent_prop}}
| addonContent_prop
| N/A
| N/A
| {{Code|addonContent_Script}}
| addonContent_Script
| {{Code|addonContent_Sound}}<br />{{Code|addonContent_Music}}
| addonContent_Sound<br>addonContent_Music
| {{Code|addonContent_Survivor}}
| addonContent_Survivor
| {{Code|addonContent_BossInfected}}<br />{{Code|addonContent_CommonInfected}}
| addonContent_BossInfected<br>addonContent_CommonInfected
| N/A
| N/A
| {{Code|addonContent_Weapon}}
| addonContent_Weapon
| {{Code|addonContent_Skin}}
| addonContent_Skin
| N/A
| N/A
| {{Code|addonContent_Campaign}}<br />{{Code|addonContent_Map}}
| addonContent_Campaign<br>addonContent_Map
| N/A
| N/A
|}
|}
</div>
</div>
The content tags {{Code|CONTENT_MISCELLANEOUS}}, {{Code|CONTENT_MUTATION}}, and {{Code|CONTENT_UI}} can be set {{Em|only through the Steam Workshop}}.
The content tags CONTENT_MISCELLANEOUS, CONTENT_MUTATION, and 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.
{{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 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 {{Code|NULL}} terminator.
The effective length of the label is 59 characters since the last character will always be a NULL terminator.


== Examples ==
== Examples ==
 
The following are outdated examples of old "Example campaigns". They hold now deprecated strings, but they're still useful as a basic example of what an addoninfo would look like.
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. Use the one above.
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” ===
=== “DEADLINE” ===


Line 293: Line 180:
The following snippet matches the original exactly as of April 30, 2023.
The following snippet matches the original exactly as of April 30, 2023.


<pre style="white-space: pre; overflow: auto; height: 25vh">
<source>
// The addoninfo.txt file is a metadata file that is required by all Left 4 Dead Add-ons.  
// 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
addontitle "Dead Line"                                    // Add-on title that shows up in Add-ons list. ~20 chars max
        addonversion         1.3                                            // Add-on version.
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
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
addonauthor "Valve"                                        // Name/alias of the author
addonauthorSteamID "http://steamcommunity.com/groups/Valve"        // Steam Profile URL of author or group
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
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.
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...
// 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."
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."
Line 314: Line 199:
// Authors can add localized descriptions here. (Not yet supported)
// 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."
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."
 
}</source>
}</pre>


=== “DEADLINE 2” ===
=== “DEADLINE 2” ===
Line 322: Line 206:
The following snippet matches the original exactly as of April 30, 2023.
The following snippet matches the original exactly as of April 30, 2023.


<pre style="white-space: pre; overflow: auto; height: 25vh">
<source>
// The addoninfo.txt file is a metadata file that is required by all Source Engine Add-ons.
// The addoninfo.txt file is a metadata file that is required by all Source Engine Add-ons.
"AddonInfo"
"AddonInfo"
{
{
    addonSteamAppID        550                                                    // 500 is the app ID for Left 4 Dead, 550 for Left 4 Dead 2
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
addontitle              "Dead Line 2"                                          // Add-on title that shows up in Add-ons list. ~20 chars max
    addonversion     1.0                                                    // Add-on version.
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
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
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.
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.
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
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.
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...
// 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."
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)
// 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."
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."
}</source>
}</pre>


== See also ==
== See also ==

Latest revision as of 14:15, 4 September 2025

The AddonInfo.txt is a plain-text file which contains an addon’s metadata. It resides in the Root folder of addons. The folder containing "materials", "Models", "Sound", ect.
This file and its functionality were introduced with the Left 4 Dead engine branch Left 4 Dead engine branch, and is written in the KeyValues 1 structure.
In case you upload the addon to the Steam Workshop, the workshop submission's metadata (name, version, author, and description) will be used instead, but the AddonContent flags will still be read from the addoninfo.txt.

Both the Source Source Engine and the deprecated external application addoninstaller.exe will parse this file, though with significant differences.
Source 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.
Addoninstaller.exe only parses addoninfo.txt when staging addons during user-initialized installation.

Warning.pngWarning:Avoid using addoninstaller.exe to install addons. As of at least client version 2.2.2.6 of Left 4 Dead 2 Left 4 Dead 2, the addoninstaller no longer functions as intended and actually breaks the addons that it is supposed to install.
Warning.pngWarning:You should always ship your addons with addoninfo.txt, even if you distribute through the Steam Workshop. Otherwise, your users will encounter the following undesirable behavior:
  • Your addon will load before all other addons specified in addonlist.txt.
  • Your addon will never appear in the Addons menu, stopping you from enabling/disabling the addon. Although this only happens when the user takes the mod from the "Addons/Workshop" folder and installs it into "Addons".

Specification

AddonInfo.txt is a text files that determine the addon's name, version number, description and some content tags.
You can copy this template into a text file, edit the data according to what you need and save it as "Addoninfo.txt" in the Root folder of your addon. The folder containing "materials", "Models", "Sound", ect.

"AddonInfo"
{
	addonversion		"1.0"				//Max 31 	characters. Allows decimals.
	addontitle			"Addon_Name_Here"	//Max 127 	characters.
	addonauthor			"Author_Name_Here"	//Max 119 	characters.
	addonDescription	"Description_Here"	//Max 1023 	characters.
	
	// These booleans act as content descriptors, showing up as tags ingame.
	// Users can filter addons by these tags and see what's inside without reading the description.
	// Set to 1 where applicable. You can use multiple, such as "Weapons" and "skins".
	addonContent_Campaign		0	//Has multiple maps that string into a campaign.				Represented ingame as: Campaigns
	addonContent_Map			0 	//Has at least one map.											Represented ingame as: Campaigns
	addonContent_Skin			0 	//Modifies an existing model or texture.						Represented ingame as: Skins
	addonContent_weapon			0 	//Modifies a weapon in some way. (or adds melee weapons)		Represented ingame as: Weapons
	addonContent_BossInfected	0 	//Modifies the Tank or the Witch.								Represented ingame as: Infected
	addonContent_CommonInfected	0 	//Modifies CI	.												Represented ingame as: Infected
	addonContent_Survivor		0 	//Modifies Survivors.											Represented ingame as: Survivors
	addonContent_Sound			0 	//Modifies a sound. (not for when a map is shipped with sounds)	Represented ingame as: Sounds
	addonContent_Music			0 	//Modifies specifically music.									Represented ingame as: Sounds
	addonContent_Script			0 	//Modifies a script.											Represented ingame as: Scripts
	addonContent_prop			0 	//Modifies a prop												Represented ingame as: Items
}

Non-existent or deprecated keys

The following keys either used to exist at one point or were never properly implemented in the first place.
Some of these can still be seen in the “DEADLINE” and “DEADLINE 2” AddonInfo.txt files, which were supposed to be an example, but they aren't used in-game.

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 Hammer Hammer 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_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 Source’s implementation-specific content tags.
Source 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 Source will use these content tags to describe and filter addons in the CBaseModFrame Addons.


In Left 4 Dead Left 4 Dead and Alien Swarm Alien Swarm

Left 4 Dead 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 Alien Swarm SDK.

Source 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

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):

Left 4 Dead 2 Left 4 Dead 2 content tag bitfield
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 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 outdated examples of old "Example campaigns". They hold now deprecated strings, but they're still useful as a basic example of what an addoninfo would look like. Avoid using the “DEADLINE” or “DEADLINE 2” samples as templates. Use the one above.

“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."	
}

See also