void CMumbleSystem::PostRender() { #ifndef NO_STEAM if ( !g_pMumbleMemory || !sv_mumble_positionalaudio.GetBool() ) return; if ( g_pMumbleMemory->uiVersion != 2 ) { V_wcscpy_safe( g_pMumbleMemory->name, L"Source engine: " ); wchar_t wcsGameDir[MAX_PATH]; Q_UTF8ToUnicode( COM_GetModDirectory(), wcsGameDir, sizeof(wcsGameDir) ); V_wcscat_safe( g_pMumbleMemory->name, wcsGameDir ); V_wcscpy_safe( g_pMumbleMemory->description, L"Links Source engine games to Mumble." ); g_pMumbleMemory->uiVersion = 2; } g_pMumbleMemory->uiTick++; Vector vecOriginPlayer, vecOriginCamera = MainViewOrigin(); QAngle anglesPlayer, anglesCamera = MainViewAngles(); C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer ) { vecOriginPlayer = pPlayer->EyePosition(); anglesPlayer = pPlayer->GetAbsAngles(); } else { vecOriginPlayer = vecOriginCamera; anglesPlayer = anglesCamera; } anglesPlayer.x = 0; Vector vecPlayerForward, vecPlayerUp, vecCameraForward, vecCameraUp; AngleVectors( anglesPlayer, &vecPlayerForward, NULL, &vecPlayerUp ); AngleVectors( anglesCamera, &vecCameraForward, NULL, &vecCameraUp ); // 1 Source unit is about one inch // 1 mumble unit = 1 meter vecOriginPlayer *= METERS_PER_INCH; vecOriginCamera *= METERS_PER_INCH; VectorToMumbleFloatArray( vecPlayerForward, g_pMumbleMemory->fAvatarFront ); VectorToMumbleFloatArray( vecPlayerUp, g_pMumbleMemory->fAvatarTop ); VectorToMumbleFloatArray( vecOriginPlayer, g_pMumbleMemory->fAvatarPosition ); VectorToMumbleFloatArray( vecCameraForward, g_pMumbleMemory->fCameraFront ); VectorToMumbleFloatArray( vecCameraUp, g_pMumbleMemory->fCameraTop ); VectorToMumbleFloatArray( vecOriginCamera, g_pMumbleMemory->fCameraPosition ); if ( pPlayer && m_bHasSetPlayerUniqueId && m_nTeamSetInUniqueId != pPlayer->GetTeamNumber() ) { // Player changed team since we set the unique ID. Set it again. m_bHasSetPlayerUniqueId = false; } if ( !m_bHasSetPlayerUniqueId && steamapicontext && steamapicontext->SteamUser() ) { CSteamID steamid = steamapicontext->SteamUser()->GetSteamID(); if ( steamid.IsValid() ) { int unTeam = pPlayer ? pPlayer->GetTeamNumber() : 0; char szSteamId[256]; V_sprintf_safe( szSteamId, "universe:%u;account_type:%u;id:%u;instance:%u;team:%d", steamid.GetEUniverse(), steamid.GetEAccountType(), steamid.GetAccountID(), steamid.GetUnAccountInstance(), unTeam ); wchar_t wcsSteamId[256]; Q_UTF8ToUnicode( szSteamId, wcsSteamId, sizeof(wcsSteamId) ); // Identifier which uniquely identifies a certain player in a context. V_wcscpy_safe( g_pMumbleMemory->identity, wcsSteamId ); m_bHasSetPlayerUniqueId = true; m_nTeamSetInUniqueId = unTeam; } } // Context should be equal for players which should be able to hear each other positional and // differ for those who shouldn't (e.g. it could contain the server+port and team) memcpy( g_pMumbleMemory->context, &m_szSteamIDCurrentServer, m_cubSteamIDCurrentServer ); g_pMumbleMemory->context_len = m_cubSteamIDCurrentServer; #endif // NO_STEAM }
void CServerGameDLL::ApplyGameSettings( KeyValues *pKV ) { if ( !pKV ) return; // Fix the game settings request when a generic request for // map launch comes in (it might be nested under reservation // processing) bool bAlreadyLoadingMap = false; char const *szBspName = NULL; const char *pGameDir = COM_GetModDirectory(); if ( !Q_stricmp( pKV->GetName(), "::ExecGameTypeCfg" ) ) { if ( !engine ) return; char const *szNewMap = pKV->GetString( "map/mapname", "" ); if ( !szNewMap || !*szNewMap ) return; KeyValues *pLaunchOptions = engine->GetLaunchOptions(); if ( !pLaunchOptions ) return; if ( FindLaunchOptionByValue( pLaunchOptions, "changelevel" ) || FindLaunchOptionByValue( pLaunchOptions, "changelevel2" ) ) return; if ( FindLaunchOptionByValue( pLaunchOptions, "map_background" ) ) { return; } bAlreadyLoadingMap = true; if ( FindLaunchOptionByValue( pLaunchOptions, "reserved" ) ) { // We are already reserved, but we still need to let the engine // baseserver know how many human slots to allocate pKV->SetInt( "members/numSlots", g_bOfflineGame ? 1 : 8 ); return; } pKV->SetName( pGameDir ); } if ( Q_stricmp( pKV->GetName(), pGameDir ) || bAlreadyLoadingMap ) return; //g_bOfflineGame = pKV->GetString( "map/offline", NULL ) != NULL; g_bOfflineGame = !Q_stricmp( pKV->GetString( "system/network", "LIVE" ), "offline" ); //Msg( "GameInterface reservation payload:\n" ); //KeyValuesDumpAsDevMsg( pKV ); // Vitaliy: Disable cheats as part of reservation in case they were enabled (unless we are on Steam Beta) if ( sv_force_transmit_ents.IsFlagSet( FCVAR_DEVELOPMENTONLY ) && // any convar with FCVAR_DEVELOPMENTONLY flag will be sufficient here sv_cheats && sv_cheats->GetBool() ) { sv_cheats->SetValue( 1 ); } // Between here and the last part: apply settings... char const *szMapCommand = pKV->GetString( "map/mapcommand", "map" ); const char *szMode = pKV->GetString( "game/mode", "sdk" ); #if 0 char const *szGameMode = pKV->GetString( "game/mode", "" ); if ( szGameMode && *szGameMode ) { extern ConVar mp_gamemode; mp_gamemode.SetValue( szGameMode ); } #endif // 0 // LAUNCH GAME if ( !Q_stricmp( szMode, "sdk" ) ) { szBspName = pKV->GetString( "game/mission", NULL ); if ( !szBspName ) return; engine->ServerCommand( CFmtStr( "%s %s reserved\n", szMapCommand, szBspName ) ); } else { bool bSuccess = false; #ifndef DISABLE_PYTHON try { bSuccess = bp::extract<bool>(gamemgr.attr("_ApplyGameSettings")( PyKeyValuesToDict( pKV ) )); } catch( boost::python::error_already_set & ) { Warning("ApplyGameSettings: Error occurred while letting Python apply game settings\n"); PyErr_Print(); } #endif // DISABLE_PYTHON if( !bSuccess ) Warning( "ApplyGameSettings: Unknown game mode!\n" ); } }