Mounting multiple games: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Some extra clarification?)
 
(One intermediate revision by one other user not shown)
Line 3: Line 3:
This code extends the Orange Box's [[AdditionalContentId]] system to support '''mounting of multiple [[GCF|Game Cache Files]] via the [[gameinfo.txt]]'''. It can be used with the Ep1 codebase too.
This code extends the Orange Box's [[AdditionalContentId]] system to support '''mounting of multiple [[GCF|Game Cache Files]] via the [[gameinfo.txt]]'''. It can be used with the Ep1 codebase too.


{{warning|Your mod will run regardless of whether or not the user owns the game that you mount content for. If the game isn't owned the content will not be mounted, and error signs will appear everywhere instead!}}
{{warning|Your mod will run regardless of whether or not the user owns the game that you mount content for. If the game isn't owned the content will not be mounted, and error signs and missing textures will appear everywhere instead!}}


If the content you want to mount is required in order to play your mod properly, you may want to hard-code the ID instead of relying it to be in the [[gameinfo.txt]]. Remember when doing this that the int you pass to <code>filesystem->MountSteamContent()</code> must be negative!
If the content you want to mount is required in order to play your mod properly, you may want to hard-code the ID instead of relying it to be in the [[gameinfo.txt]]. Remember when doing this that the int you pass to <code>filesystem->MountSteamContent()</code> must be negative!
Line 10: Line 10:


== The code ==
== The code ==
This code needs to be added to both the client and the server.
This code needs to be added to both the client and the server.


; Client
; Client
: Search ''cdll_client_init.cpp'' for <code>MountAdditionalContent()</code> and replace it. If it didn't already exist, add the code above <code>CHLClient::Init</code>, then call it from that function right before <code>if ( CommandLine()->FindParm( "-textmode" ) )</code>.
: Search ''cdll_client_int.cpp'' for <code>MountAdditionalContent()</code> and replace it. If it didn't already exist, add the code above <code>CHLClient::Init</code>, then call it from that function right before <code>if ( CommandLine()->FindParm( "-textmode" ) )</code>.
; Server
; Server
: Search ''gameinterface.cpp'' for <code>MountAdditionalContent()</code> and replace it. If it didn't already exist, add the code above <code>CServerGameDLL::DLLInit</code> and call before the <code>gpGlobals = pGlobals;</code> line in that func.
: Search ''gameinterface.cpp'' for <code>MountAdditionalContent()</code> and replace it. If it didn't already exist, add the code above <code>CServerGameDLL::DLLInit</code> and call before the <code>gpGlobals = pGlobals;</code> line in that func.
Line 49: Line 48:


== Implementing in gameinfo.txt ==
== Implementing in gameinfo.txt ==
Now you can mount content by adding something like this after the ToolsAppId:
Now you can mount content by adding something like this after the ToolsAppId:


Line 65: Line 63:
Don't forget to add the relevant [[Gameinfo.txt#SearchPaths|SearchPaths]] too.
Don't forget to add the relevant [[Gameinfo.txt#SearchPaths|SearchPaths]] too.


{{note|With [[Left 4 Dead]] Valve switched from the [[GCF]] file system to the [[VPK]] format. GCF engine branches cannot mount VPK content, and the same vice versa.}}
{{note|With the {{l4dbranch|2}} Valve has switched from the [[GCF]] file system to the [[VPK]] format. GCF engine branches cannot mount VPK content, nor the other way around.}}


== Bugs ==
== Bugs ==
Really big numbers will crash the game with an Error-Dialog by Valve. You could check if the value is within a certain range to stop this from happening, but I think the user will get by himself that this value cannot be mounted.
Really big numbers will crash the game with an Error-Dialog by Valve. You could check if the value is within a certain range to stop this from happening, but I think the user will get by himself that this value cannot be mounted.



Latest revision as of 01:25, 10 March 2025

This code extends the Orange Box's AdditionalContentId system to support mounting of multiple Game Cache Files via the gameinfo.txt. It can be used with the Ep1 codebase too.

Warning.pngWarning:Your mod will run regardless of whether or not the user owns the game that you mount content for. If the game isn't owned the content will not be mounted, and error signs and missing textures will appear everywhere instead!

If the content you want to mount is required in order to play your mod properly, you may want to hard-code the ID instead of relying it to be in the gameinfo.txt. Remember when doing this that the int you pass to filesystem->MountSteamContent() must be negative!

Note.pngNote:The code below is version 2, and has ditched the previous subkey approach. It is not compatible with the AdditionalContentId { 220,380 } gameinfo.txt scheme.

The code

This code needs to be added to both the client and the server.

Client
Search cdll_client_int.cpp for MountAdditionalContent() and replace it. If it didn't already exist, add the code above CHLClient::Init, then call it from that function right before if ( CommandLine()->FindParm( "-textmode" ) ).
Server
Search gameinterface.cpp for MountAdditionalContent() and replace it. If it didn't already exist, add the code above CServerGameDLL::DLLInit and call before the gpGlobals = pGlobals; line in that func.
static void MountAdditionalContent()
{
	KeyValues *pMainFile = new KeyValues( "gameinfo.txt" );
#ifndef _WINDOWS
	// case sensitivity
	pMainFile->LoadFromFile( filesystem, "GameInfo.txt", "MOD" );
	if (!pMainFile)
#endif
	pMainFile->LoadFromFile( filesystem, "gameinfo.txt", "MOD" );
	
	if (pMainFile)
	{
		KeyValues* pFileSystemInfo = pMainFile->FindKey( "FileSystem" );
		if (pFileSystemInfo)
			for ( KeyValues *pKey = pFileSystemInfo->GetFirstSubKey(); pKey; pKey = pKey->GetNextKey() )
			{
				if ( strcmp(pKey->GetName(),"AdditionalContentId") == 0 )
				{
					int appid = abs(pKey->GetInt());
					if (appid)
						if( filesystem->MountSteamContent(-appid) != FILESYSTEM_MOUNT_OK )
							Warning("Unable to mount extra content with appId: %i\n", appid);
				}
			}
	}	
	pMainFile->deleteThis();
}

Implementing in gameinfo.txt

Now you can mount content by adding something like this after the ToolsAppId:

AdditionalContentId 220 //HL2
AdditionalContentId 240 //CS Source
AdditionalContentId 280 //HL Source
AdditionalContentId 320 //HL2 Deatmatch
AdditionalContentId 340 //HL2 Lost Coast
AdditionalContentId 360 //HL Deathmatch: Source
AdditionalContentId 380 //Ep1
AdditionalContentId 400 //Portal
AdditionalContentId 420 //Ep2
AdditionalContentId 440 //TF2

Don't forget to add the relevant SearchPaths too.

Note.pngNote:With the Left 4 Dead engine branch Left 4 Dead engine branch Valve has switched from the GCF file system to the VPK format. GCF engine branches cannot mount VPK content, nor the other way around.

Bugs

Really big numbers will crash the game with an Error-Dialog by Valve. You could check if the value is within a certain range to stop this from happening, but I think the user will get by himself that this value cannot be mounted.

Confirm:filesystem->MountSteamContent returns FILESYSTEM_MOUNT_OK, even if the content is not available. There's nothing you can do about it, apart from poking some guy from Valvesoftware.

See also