예제 #1
0
SteamWorksGSDetours::SteamWorksGSDetours()
{
	const char *pLibSteamPath = g_SteamWorks.pSWGameServer->GetLibraryPath();

	void *pSteamSafeInitAddress = NULL;
	void *pSteamShutdownAddress = NULL;

	const char *pInitSafeFuncName = "SteamGameServer_InitSafe";
	const char *pShutdownFuncName = "SteamGameServer_Shutdown";

	IGameConfig *pConfig = NULL;
	if (g_SteamWorks.pSWGameData)
	{
		pConfig = g_SteamWorks.pSWGameData->GetGameData();
		if (pConfig != NULL)
		{
			pConfig->GetMemSig(pShutdownFuncName, &pSteamShutdownAddress);
			pConfig->GetMemSig(pInitSafeFuncName, &pSteamSafeInitAddress);
		}
	}

	ILibrary *pLibrary = libsys->OpenLibrary(pLibSteamPath, NULL, 0);
	if (pLibrary != NULL)
	{
		if (pSteamShutdownAddress == NULL)
		{
			pSteamShutdownAddress = pLibrary->GetSymbolAddress(pShutdownFuncName);
		}
		
		if (pSteamSafeInitAddress == NULL)
		{
			pSteamSafeInitAddress = pLibrary->GetSymbolAddress(pInitSafeFuncName);
		}
		
		pLibrary->CloseLibrary();
	}

	CDetourManager::Init(g_pSM->GetScriptingEngine(), pConfig);
	if (pSteamShutdownAddress != NULL)
	{
		this->m_pShutdownDetour = DETOUR_CREATE_STATIC_FIXED(SteamAPIShutdown, pSteamShutdownAddress);
		this->m_pShutdownDetour->EnableDetour();
	}
	else
	{
		this->m_pShutdownDetour = NULL;
	}

	if (pSteamSafeInitAddress != NULL)
	{
		this->m_pSafeInitDetour = DETOUR_CREATE_STATIC_FIXED(SteamGameServer_InitSafeDetour, pSteamSafeInitAddress);
		this->m_pSafeInitDetour->EnableDetour();
	}
	else
	{
		this->m_pSafeInitDetour = NULL;
	}
}
예제 #2
0
void InitLogicBridge()
{
	serverGlobals.universalTime = g_pUniversalTime;
	serverGlobals.frametime = &gpGlobals->frametime;
	serverGlobals.interval_per_tick = &gpGlobals->interval_per_tick;

	core_bridge.engineFactory = (void *)g_SMAPI->GetEngineFactory(false);
	core_bridge.serverFactory = (void *)g_SMAPI->GetServerFactory(false);
	core_bridge.listeners = SMGlobalClass::head;

	ILibrary *mmlib;
	char path[PLATFORM_MAX_PATH];

	g_LibSys.PathFormat(path, sizeof(path), "%s/bin/matchmaking_ds%s.%s", g_SMAPI->GetBaseDir(), MATCHMAKINGDS_SUFFIX, MATCHMAKINGDS_EXT);

	if ((mmlib = g_LibSys.OpenLibrary(path, NULL, 0)))
	{
		core_bridge.matchmakingDSFactory = mmlib->GetSymbolAddress("CreateInterface");
		mmlib->CloseLibrary();
	}
	
	logic_init_fn(&core_bridge, &logicore);

	/* Add SMGlobalClass instances */
	SMGlobalClass* glob = SMGlobalClass::head;
	while (glob->m_pGlobalClassNext != NULL)
	{
		glob = glob->m_pGlobalClassNext;
	}
	assert(glob->m_pGlobalClassNext == NULL);
	glob->m_pGlobalClassNext = logicore.head;

	g_pThreader = logicore.threader;
	translator = logicore.translator;
	scripts = logicore.scripts;
	sharesys = logicore.sharesys;
	extsys = logicore.extsys;
	g_pCoreIdent = logicore.core_ident;
	handlesys = logicore.handlesys;
	forwardsys = logicore.forwardsys;
	adminsys = logicore.adminsys;
	logger = logicore.logger;
}
예제 #3
0
void CHalfLife2::InitCommandLine()
{
    char path[PLATFORM_MAX_PATH];
    char error[256];

    g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" TIER0_NAME);

    if (!g_LibSys.IsPathFile(path))
    {
        g_Logger.LogError("Could not find path for: " TIER0_NAME);
        return;
    }

    ILibrary *lib = g_LibSys.OpenLibrary(path, error, sizeof(error));
    m_pGetCommandLine = lib->GetSymbolAddress("CommandLine_Tier0");

    /* '_Tier0' dropped on Alien Swarm version */
    if (m_pGetCommandLine == NULL)
    {
        m_pGetCommandLine = lib->GetSymbolAddress("CommandLine");
    }

    if (m_pGetCommandLine == NULL)
    {
        /* We probably have a Ship engine. */
        lib->CloseLibrary();
        g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" VSTDLIB_NAME);
        if (!g_LibSys.IsPathFile(path))
        {
            g_Logger.LogError("Could not find path for: " VSTDLIB_NAME);
            return;
        }

        if ((lib = g_LibSys.OpenLibrary(path, error, sizeof(error))) == NULL)
        {
            g_Logger.LogError("Could not load %s: %s", path, error);
            return;
        }

        m_pGetCommandLine = lib->GetSymbolAddress("CommandLine");

        if (m_pGetCommandLine == NULL)
        {
            g_Logger.LogError("Could not locate any command line functionality");
        }

        lib->CloseLibrary();
    }
}