mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2024-11-28 10:24:20 +01:00
Improve CS2 support and S2 game detection
This commit is contained in:
parent
2e43b26539
commit
e1a81e3c06
@ -78,7 +78,7 @@ PossibleSDKs = {
|
|||||||
'mock': SDK('HL2SDK-MOCK', '2.mock', '999', 'MOCK', Mock, 'mock'),
|
'mock': SDK('HL2SDK-MOCK', '2.mock', '999', 'MOCK', Mock, 'mock'),
|
||||||
'pvkii': SDK('HL2SDKPVKII', '2.pvkii', '10', 'PVKII', WinLinux, 'pvkii'),
|
'pvkii': SDK('HL2SDKPVKII', '2.pvkii', '10', 'PVKII', WinLinux, 'pvkii'),
|
||||||
'dota': SDK('HL2SDKDOTA', '2.dota', '24', 'DOTA', Source2, 'dota'),
|
'dota': SDK('HL2SDKDOTA', '2.dota', '24', 'DOTA', Source2, 'dota'),
|
||||||
'cs2': SDK('HL2SDKCS2', '2.cs2', '25', 'CS2', [], 'cs2'),
|
'cs2': SDK('HL2SDKCS2', '2.cs2', '25', 'CS2', Source2, 'cs2'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def ResolveEnvPath(env, folder):
|
def ResolveEnvPath(env, folder):
|
||||||
@ -391,7 +391,7 @@ class MMSConfig(object):
|
|||||||
if compiler.target.arch == 'x86_64':
|
if compiler.target.arch == 'x86_64':
|
||||||
compiler.defines += ['X64BITS', 'PLATFORM_64BITS']
|
compiler.defines += ['X64BITS', 'PLATFORM_64BITS']
|
||||||
|
|
||||||
if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'dota', 'pvkii']:
|
if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'dota', 'cs2', 'pvkii']:
|
||||||
if compiler.target.platform in ['linux', 'mac']:
|
if compiler.target.platform in ['linux', 'mac']:
|
||||||
compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE']
|
compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE']
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ class MMSConfig(object):
|
|||||||
compiler.linkflags += ['-Wl,-z,origin']
|
compiler.linkflags += ['-Wl,-z,origin']
|
||||||
compiler.postlink += [tier1]
|
compiler.postlink += [tier1]
|
||||||
|
|
||||||
if sdk.name in ['blade', 'insurgency', 'doi', 'csgo', 'dota']:
|
if sdk.name in ['blade', 'insurgency', 'doi', 'csgo', 'cs2', 'dota']:
|
||||||
if compiler.target.arch == 'x86_64':
|
if compiler.target.arch == 'x86_64':
|
||||||
compiler.postlink += [os.path.join(lib_folder, 'interfaces.a')]
|
compiler.postlink += [os.path.join(lib_folder, 'interfaces.a')]
|
||||||
else:
|
else:
|
||||||
@ -494,7 +494,7 @@ class MMSConfig(object):
|
|||||||
dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so']
|
dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so']
|
||||||
elif compiler.target.arch == 'x86_64' and sdk.name in ['csgo', 'mock']:
|
elif compiler.target.arch == 'x86_64' and sdk.name in ['csgo', 'mock']:
|
||||||
dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so']
|
dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so']
|
||||||
elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo', 'dota', 'pvkii']:
|
elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo', 'cs2', 'dota', 'pvkii']:
|
||||||
dynamic_libs = ['libtier0.so']
|
dynamic_libs = ['libtier0.so']
|
||||||
if sdk.name not in ['dota', 'cs2']:
|
if sdk.name not in ['dota', 'cs2']:
|
||||||
dynamic_libs += ['libvstdlib.so']
|
dynamic_libs += ['libvstdlib.so']
|
||||||
@ -509,7 +509,7 @@ class MMSConfig(object):
|
|||||||
libs = ['tier0', 'tier1']
|
libs = ['tier0', 'tier1']
|
||||||
if sdk.name not in ['dota', 'cs2']:
|
if sdk.name not in ['dota', 'cs2']:
|
||||||
libs += ['vstdlib']
|
libs += ['vstdlib']
|
||||||
if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'mcv', 'csgo', 'dota']:
|
if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'mcv', 'csgo', 'cs2', 'dota']:
|
||||||
libs.append('interfaces')
|
libs.append('interfaces')
|
||||||
if sdk.name == 'bms':
|
if sdk.name == 'bms':
|
||||||
libs.append('mathlib')
|
libs.append('mathlib')
|
||||||
|
@ -215,7 +215,9 @@ const char* Source2Provider::GetEngineDescription() const
|
|||||||
|
|
||||||
void Source2Provider::GetGamePath(char* pszBuffer, int len)
|
void Source2Provider::GetGamePath(char* pszBuffer, int len)
|
||||||
{
|
{
|
||||||
ke::SafeSprintf(pszBuffer, len, "%s", Plat_GetGameDirectory());
|
CBufferStringGrowable<MAX_PATH> buf;
|
||||||
|
engine->GetGameDir(buf);
|
||||||
|
ke::SafeSprintf(pszBuffer, len, "%s", buf.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Source2Provider::GetGameDescription()
|
const char* Source2Provider::GetGameDescription()
|
||||||
|
@ -327,8 +327,15 @@ public:
|
|||||||
virtual void *QueryInterface(const char *pInterfaceName) { return nullptr; }
|
virtual void *QueryInterface(const char *pInterfaceName) { return nullptr; }
|
||||||
|
|
||||||
virtual InitReturnVal_t Init()
|
virtual InitReturnVal_t Init()
|
||||||
|
{
|
||||||
|
if (!stricmp("csgo", game_name))
|
||||||
|
{
|
||||||
|
mm_backend = MMBackend_CS2;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
mm_backend = MMBackend_DOTA;
|
mm_backend = MMBackend_DOTA;
|
||||||
|
}
|
||||||
|
|
||||||
char error[255];
|
char error[255];
|
||||||
if (!mm_LoadMetamodLibrary(mm_backend, error, sizeof(error)))
|
if (!mm_LoadMetamodLibrary(mm_backend, error, sizeof(error)))
|
||||||
@ -454,7 +461,7 @@ public:
|
|||||||
QueryValveInterface fileSystemFactory,
|
QueryValveInterface fileSystemFactory,
|
||||||
void *pGlobals)
|
void *pGlobals)
|
||||||
{
|
{
|
||||||
mm_backend = mm_DetermineBackend(engineFactory, gamedll_qvi, game_name);
|
mm_backend = mm_DetermineBackendS1(engineFactory, gamedll_qvi, game_name);
|
||||||
|
|
||||||
char error[255];
|
char error[255];
|
||||||
if (mm_backend == MMBackend_UNKNOWN)
|
if (mm_backend == MMBackend_UNKNOWN)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* vim: set ts=4 sw=4 tw=99 noet :
|
* vim: set ts=4 sw=4 tw=99 noet :
|
||||||
* ======================================================
|
* ======================================================
|
||||||
* Metamod:Source
|
* Metamod:Source
|
||||||
* Copyright (C) 2004-2015 AlliedModders LLC and authors.
|
* Copyright (C) 2004-2023 AlliedModders LLC and authors.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* ======================================================
|
* ======================================================
|
||||||
*
|
*
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <cstdint>
|
||||||
#include "loader.h"
|
#include "loader.h"
|
||||||
#include "serverplugin.h"
|
#include "serverplugin.h"
|
||||||
#include "gamedll.h"
|
#include "gamedll.h"
|
||||||
@ -93,7 +94,8 @@ static const char *backend_names[] =
|
|||||||
"2.doi",
|
"2.doi",
|
||||||
"2.mock",
|
"2.mock",
|
||||||
"2.pvkii",
|
"2.pvkii",
|
||||||
"2.mcv"
|
"2.mcv",
|
||||||
|
"2.cs2",
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined _WIN32
|
#if defined _WIN32
|
||||||
@ -198,6 +200,8 @@ mm_GetProcAddress(const char *name)
|
|||||||
return mm_GetLibAddress(mm_library, name);
|
return mm_GetLibAddress(mm_library, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef const char *(*GetGameInfoStringFn)(const char *pszKeyName, const char *pszDefaultValue, char *pszOut, uint64_t cbOut);
|
||||||
|
|
||||||
void
|
void
|
||||||
mm_GetGameName(char *buffer, size_t size)
|
mm_GetGameName(char *buffer, size_t size)
|
||||||
{
|
{
|
||||||
@ -283,24 +287,44 @@ mm_GetGameName(char *buffer, size_t size)
|
|||||||
|
|
||||||
if (buffer[0] == 0)
|
if (buffer[0] == 0)
|
||||||
{
|
{
|
||||||
// HackHackHack - Different engines have different defaults if -game isn't specified
|
char tier0_path[PLATFORM_MAX_PATH];
|
||||||
// we only use this for game detection, and not even in all cases. Old behavior was to
|
#ifdef _WIN32
|
||||||
// give back ".", which was only really accurate for Dark Messiah. We'll add a special
|
if (mm_ResolvePath("tier0.dll", tier0_path, sizeof(tier0_path), false))
|
||||||
// case for Source2 / Dota as well, since it only supports gameinfo loading, which relies
|
#elif defined __linux__
|
||||||
// on accuracy here more than VSP loading.
|
if (mm_ResolvePath("libtier0.so", tier0_path, sizeof(tier0_path), false))
|
||||||
if (bHasDedicated)
|
#elif defined __APPLE__
|
||||||
|
if (mm_ResolvePath("libtier0.dylib", tier0_path, sizeof(tier0_path), false))#else
|
||||||
|
#error unsupported platform
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
strncpy(buffer, "dota", size);
|
char err[1024];
|
||||||
|
void* pTier0 = mm_LoadLibrary(tier0_path, err, sizeof(err));
|
||||||
|
if (pTier0)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
GetGameInfoStringFn func = (GetGameInfoStringFn)mm_GetLibAddress(pTier0, "?GetGameInfoString@@YAPEBDPEBD0PEAD_K@Z");
|
||||||
|
#else
|
||||||
|
GetGameInfoStringFn func = (GetGameInfoStringFn)mm_GetLibAddress(pTier0, "__Z17GetGameInfoStringPKcS0_Pcm");
|
||||||
|
#endif
|
||||||
|
if (func != nullptr)
|
||||||
|
{
|
||||||
|
static char szTmp[260];
|
||||||
|
strncpy(buffer, func("FileSystem/SearchPaths/Mod", "", szTmp, sizeof(szTmp)), size);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
mm_UnloadLibrary(pTier0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer[0] == 0)
|
||||||
{
|
{
|
||||||
strncpy(buffer, ".", size);
|
strncpy(buffer, ".", size);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MetamodBackend
|
MetamodBackend
|
||||||
mm_DetermineBackend(QueryValveInterface engineFactory, QueryValveInterface serverFactory, const char *game_name)
|
mm_DetermineBackendS1(QueryValveInterface engineFactory, QueryValveInterface serverFactory, const char *game_name)
|
||||||
{
|
{
|
||||||
if (engineFactory("VEngineServer023", NULL) != NULL)
|
if (engineFactory("VEngineServer023", NULL) != NULL)
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* vim: set ts=4 sw=4 tw=99 noet :
|
* vim: set ts=4 sw=4 tw=99 noet :
|
||||||
* ======================================================
|
* ======================================================
|
||||||
* Metamod:Source
|
* Metamod:Source
|
||||||
* Copyright (C) 2004-2015 AlliedModders LLC and authors.
|
* Copyright (C) 2004-2023 AlliedModders LLC and authors.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* ======================================================
|
* ======================================================
|
||||||
*
|
*
|
||||||
@ -106,6 +106,7 @@ enum MetamodBackend
|
|||||||
MMBackend_Mock,
|
MMBackend_Mock,
|
||||||
MMBackend_PVKII,
|
MMBackend_PVKII,
|
||||||
MMBackend_MCV,
|
MMBackend_MCV,
|
||||||
|
MMBackend_CS2,
|
||||||
MMBackend_UNKNOWN
|
MMBackend_UNKNOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -125,7 +126,7 @@ extern void
|
|||||||
mm_GetGameName(char *buffer, size_t size);
|
mm_GetGameName(char *buffer, size_t size);
|
||||||
|
|
||||||
extern MetamodBackend
|
extern MetamodBackend
|
||||||
mm_DetermineBackend(QueryValveInterface engineFactory, QueryValveInterface serverFactory, const char *game_name);
|
mm_DetermineBackendS1(QueryValveInterface engineFactory, QueryValveInterface serverFactory, const char *game_name);
|
||||||
|
|
||||||
extern MetamodBackend mm_backend;
|
extern MetamodBackend mm_backend;
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ public:
|
|||||||
{
|
{
|
||||||
mm_GetGameName(game_name, sizeof(game_name));
|
mm_GetGameName(game_name, sizeof(game_name));
|
||||||
|
|
||||||
mm_backend = mm_DetermineBackend(engineFactory, gsFactory, game_name);
|
mm_backend = mm_DetermineBackendS1(engineFactory, gsFactory, game_name);
|
||||||
if (mm_backend == MMBackend_Mock)
|
if (mm_backend == MMBackend_Mock)
|
||||||
strcpy(game_name, "mock");
|
strcpy(game_name, "mock");
|
||||||
}
|
}
|
||||||
@ -139,8 +139,7 @@ public:
|
|||||||
&& mm_backend != MMBackend_Insurgency
|
&& mm_backend != MMBackend_Insurgency
|
||||||
&& mm_backend != MMBackend_DOI
|
&& mm_backend != MMBackend_DOI
|
||||||
&& mm_backend != MMBackend_CSGO
|
&& mm_backend != MMBackend_CSGO
|
||||||
&& mm_backend != MMBackend_MCV
|
&& mm_backend != MMBackend_MCV)
|
||||||
&& mm_backend != MMBackend_DOTA)
|
|
||||||
{
|
{
|
||||||
SourceHook::MemFuncInfo mfp_fconnect;
|
SourceHook::MemFuncInfo mfp_fconnect;
|
||||||
mfp_fconnect.isVirtual = false;
|
mfp_fconnect.isVirtual = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user