int SteamGlobal::init() { #if defined(CHOWDREN_FORCE_STEAM_OPEN) && defined(CHOWDREN_STEAM_APPID) if (SteamAPI_RestartAppIfNecessary(CHOWDREN_STEAM_APPID)) { return EXIT_FAILURE; } #endif initialized = SteamAPI_Init(); if (!initialized) { std::cout << "Could not initialize Steam API" << std::endl; #ifdef CHOWDREN_FORCE_STEAM_OPEN SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Steam error", "Could not initialize Steam API. " "Please make sure you are logged in to Steam " "before opening the game.", NULL); return EXIT_FAILURE; #endif return 0; } std::cout << "Initialized Steam API" << std::endl; bool debug_achievements = getenv("CHOWDREN_DEBUG_ACHIEVEMENTS") != NULL; if (debug_achievements) { if (!SteamUserStats()->ResetAllStats(true)) std::cout << "Could not reset stats" << std::endl; } if (!SteamUserStats()->RequestCurrentStats()) std::cout << "Could not request Steam stats" << std::endl; #ifdef CHOWDREN_STEAM_APPID ISteamApps * ownapp = SteamApps(); if (!ownapp->BIsSubscribedApp(CHOWDREN_STEAM_APPID)) { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Steam error", "Please purchase the Steam version of the " "game if you want to play it on Steam.", NULL); return EXIT_FAILURE; } #endif steam_language = SteamApps()->GetCurrentGameLanguage(); if (steam_language.empty()) steam_language = "english"; steam_language[0] = toupper(steam_language[0]); std::cout << "Detected Steam language: " << steam_language << std::endl; return 0; }
static int RealMain( const char *pchCmdLine, HINSTANCE hInstance, int nCmdShow ) { if ( SteamAPI_RestartAppIfNecessary( k_uAppIdInvalid ) ) { // if Steam is not running or the game wasn't started through Steam, SteamAPI_RestartAppIfNecessary starts the // local Steam client and also launches this game again. // Once you get a public Steam AppID assigned for this game, you need to replace k_uAppIdInvalid with it and // removed steam_appid.txt from the game depot. return EXIT_FAILURE; } // Init Steam CEG if ( !Steamworks_InitCEGLibrary() ) { OutputDebugString( "Steamworks_InitCEGLibrary() failed\n" ); Alert( "Fatal Error", "Steam must be running to play this game (InitDrmLibrary() failed).\n" ); return EXIT_FAILURE; } // Initialize SteamAPI, if this fails we bail out since we depend on Steam for lots of stuff. // You don't necessarily have to though if you write your code to check whether all the Steam // interfaces are NULL before using them and provide alternate paths when they are unavailable. // // This will also load the in-game steam overlay dll into your process. That dll is normally // injected by steam when it launches games, but by calling this you cause it to always load, // even when not launched via steam. if ( !SteamAPI_Init() ) { OutputDebugString( "SteamAPI_Init() failed\n" ); Alert( "Fatal Error", "Steam must be running to play this game (SteamAPI_Init() failed).\n" ); return EXIT_FAILURE; } // set our debug handler SteamClient()->SetWarningMessageHook( &SteamAPIDebugTextHook ); // Tell Steam where it's overlay should show notification dialogs, this can be top right, top left, // bottom right, bottom left. The default position is the bottom left if you don't call this. // Generally you should use the default and not call this as users will be most comfortable with // the default position. The API is provided in case the bottom right creates a serious conflict // with important UI in your game. SteamUtils()->SetOverlayNotificationPosition( k_EPositionTopRight ); // Ensure that the user has logged into Steam. This will always return true if the game is launched // from Steam, but if Steam is at the login prompt when you run your game from the debugger, it // will return false. if ( !SteamUser()->BLoggedOn() ) { OutputDebugString( "Steam user is not logged in\n" ); Alert( "Fatal Error", "Steam user must be logged in to play this game (SteamUser()->BLoggedOn() returned false).\n" ); return EXIT_FAILURE; } // We are going to use the controller interface, initialize it, which is a seperate step as it // create a new thread in the game proc and we don't want to force that on games that don't // have native Steam controller implementations char rgchCWD[1024]; _getcwd( rgchCWD, sizeof( rgchCWD ) ); char rgchFullPath[1024]; #if defined(_WIN32) _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s\\%s", rgchCWD, "controller.vdf" ); #elif defined(OSX) // hack for now, because we do not have utility functions available for finding the resource path // alternatively we could disable the SteamController init on OS X _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s/steamworksexample.app/Contents/Resources/%s", rgchCWD, "controller.vdf" ); #else _snprintf( rgchFullPath, sizeof( rgchFullPath ), "%s/%s", rgchCWD, "controller.vdf" ); #endif if( !SteamController()->Init( rgchFullPath ) ) { OutputDebugString( "SteamController()->Init() failed\n" ); Alert( "Fatal Error", "Steam Controller Init failed. Is controller.vdf in the current working directory?\n" ); return EXIT_FAILURE; } bool bUseVR = SteamUtils()->IsSteamRunningInVR(); const char *pchServerAddress, *pchLobbyID; ParseCommandLine( pchCmdLine, &pchServerAddress, &pchLobbyID, &bUseVR ); // do a DRM self check Steamworks_SelfCheck(); // init VR before we make the window // Construct a new instance of the game engine // bugbug jmccaskey - make screen resolution dynamic, maybe take it on command line? IGameEngine *pGameEngine = #if defined(_WIN32) new CGameEngineWin32( hInstance, nCmdShow, 1024, 768, bUseVR ); #elif defined(OSX) CreateGameEngineOSX(); #elif defined(SDL) CreateGameEngineSDL( bUseVR ); #else #error Need CreateGameEngine() #endif // This call will block and run until the game exits RunGameLoop( pGameEngine, pchServerAddress, pchLobbyID ); // Shutdown the SteamAPI SteamController()->Shutdown(); SteamAPI_Shutdown(); // Shutdown Steam CEG Steamworks_TermCEGLibrary(); // exit return EXIT_SUCCESS; }
SB_API bool S_CALLTYPE RestartAppIfNecessary(uint32 unOwnAppID) { return SteamAPI_RestartAppIfNecessary(unOwnAppID); }
int main(int argc, char *argv[]) { if (argc != 2) { std::cerr << "Usage: ./broiler dir_with_replays" << std::endl; return 1; } std::string directory(argv[1]); // init steam if (SteamAPI_RestartAppIfNecessary(k_uAppIdInvalid)) return 1; if (!SteamAPI_Init()) { Error("Fatal Error", "Steam must be running (SteamAPI_Init() failed).\n"); return 1; } if (!SteamUser()->BLoggedOn()) { Error("Fatal Error", "Steam user must be logged in (SteamUser()->BLoggedOn() returned false).\n"); return 1; } bool running = true; auto cbthread = std::thread([&running]() { while (running) { try { std::this_thread::sleep_for(std::chrono::milliseconds(50)); Steam_RunCallbacks(GetHSteamPipe(), false); } catch (BoilerException &e) { Error("Fatal Error", e.what()); exit(1); } }; }); int res = 0; try { // make sure we are connected to the gc CSGOClient::GetInstance()->WaitForGcConnect(); // refresh match list CSGOMatchList refresher; refresher.RefreshWait(); std::vector<CDataGCCStrike15_v2_MatchInfo> matches = refresher.Matches(); for (auto &match : matches) { CMsgGCCStrike15_v2_MatchmakingServerRoundStats* rs = getLegacyRoundStats(match); if (!rs) { std::cerr << "Cannot get info for match" << std::endl; continue; } std::string dotDemFile = directory + "/" + dotDem(match, *rs); std::string dotDemDotInfoFile = dotDemFile + ".info"; std::string link = rs->map(); if (!file_exists(dotDemDotInfoFile)) { rs->clear_map(); std::cerr << "Creating " << dotDemDotInfoFile << std::endl; std::ofstream myfile; myfile.open(dotDemDotInfoFile, std::ios::binary); if (!match.SerializeToOstream(&myfile)) Error("Error", std::string("Cannot serialize to file ") + dotDemDotInfoFile); myfile.close(); } if (!file_exists(dotDemFile)) std::cout << link << std::endl; } } catch (BoilerException &e) { Error("Fatal error", e.what()); res = 1; } // shutdown running = false; cbthread.join(); CSGOClient::Destroy(); SteamAPI_Shutdown(); return res; }
bool SteamVR::Init() { if (SteamAPI_RestartAppIfNecessary(k_uAppIdInvalid)) { // if Steam is not running or the game wasn't started through Steam, SteamAPI_RestartAppIfNecessary starts the // local Steam client and also launches this game again. // Once you get a public Steam AppID assigned for this game, you need to replace k_uAppIdInvalid with it and // removed steam_appid.txt from the game depot. return false; } if (!SteamAPI_Init()) { Log("SteamAPI_Init() failed\n"); return false; } // set our debug handler //SteamClient()->SetWarningMessageHook(&SteamAPIDebugTextHook); // Ensure that the user has logged into Steam. This will always return true if the game is launched // from Steam, but if Steam is at the login prompt when you run your game from the debugger, it // will return false. if (!SteamUser()->BLoggedOn()) { Log("Steam user is not logged in\n"); Log("Steam user must be logged in to play this game (SteamUser()->BLoggedOn() returned false).\n"); return false; } // Initialize steam controller if connected char rgchCWD[1024]; _getcwd(rgchCWD, sizeof(rgchCWD)); char rgchFullPath[1024]; _snprintf(rgchFullPath, sizeof(rgchFullPath), "%s\\%s", rgchCWD, "controller.vdf"); if (!SteamController()->Init(rgchFullPath)) { Log("SteamController()->Init() failed\n"); Log("Steam Controller Init failed. Is controller.vdf in the current working directory?\n"); return false; } // Need to run from Steam UI to work I think bool UseVR = SteamUtils()->IsSteamRunningInVR(); // Set UseVR to true for testing UseVR = true; // Init VR if (!UseVR) { mVRHmd = NULL; } else { vr::HmdError error; mVRHmd = vr::VR_Init(&error); if (!mVRHmd) { Log("Failed to initialize VR."); Log("Game will run without VR."); return false; } } Log("SteamVR Initialized"); return true; }
bool FOnlineSubsystemSteam::InitSteamworksClient(bool bRelaunchInSteam, int32 SteamAppId) { bSteamworksClientInitialized = false; // If the game was not launched from within Steam, but is supposed to, trigger a Steam launch and exit if (bRelaunchInSteam && SteamAppId != 0 && SteamAPI_RestartAppIfNecessary(SteamAppId)) { if (FPlatformProperties::IsGameOnly() || FPlatformProperties::IsServerOnly()) { UE_LOG_ONLINE(Log, TEXT("Game restarting within Steam client, exiting")); FPlatformMisc::RequestExit(false); } return bSteamworksClientInitialized; } // Otherwise initialize as normal else { // Steamworks needs to initialize as close to start as possible, so it can hook its overlay into Direct3D, etc. bSteamworksClientInitialized = (SteamAPI_Init() ? true : false); // Test all the Steam interfaces #define GET_STEAMWORKS_INTERFACE(Interface) \ if (Interface() == nullptr) \ { \ UE_LOG_ONLINE(Warning, TEXT("Steamworks: %s() failed!"), TEXT(#Interface)); \ bSteamworksClientInitialized = false; \ } \ // GSteamUtils GET_STEAMWORKS_INTERFACE(SteamUtils); // GSteamUser GET_STEAMWORKS_INTERFACE(SteamUser); // GSteamFriends GET_STEAMWORKS_INTERFACE(SteamFriends); // GSteamRemoteStorage GET_STEAMWORKS_INTERFACE(SteamRemoteStorage); // GSteamUserStats GET_STEAMWORKS_INTERFACE(SteamUserStats); // GSteamMatchmakingServers GET_STEAMWORKS_INTERFACE(SteamMatchmakingServers); // GSteamApps GET_STEAMWORKS_INTERFACE(SteamApps); // GSteamNetworking GET_STEAMWORKS_INTERFACE(SteamNetworking); // GSteamMatchmaking GET_STEAMWORKS_INTERFACE(SteamMatchmaking); #undef GET_STEAMWORKS_INTERFACE } if (bSteamworksClientInitialized) { bool bIsSubscribed = true; if (FPlatformProperties::IsGameOnly() || FPlatformProperties::IsServerOnly()) { bIsSubscribed = SteamApps()->BIsSubscribed(); } // Make sure the Steam user has valid access to the game if (bIsSubscribed) { UE_LOG_ONLINE(Log, TEXT("Steam User is subscribed %i"), bSteamworksClientInitialized); if (SteamUtils()) { SteamAppID = SteamUtils()->GetAppID(); SteamUtils()->SetWarningMessageHook(SteamworksWarningMessageHook); } } else { UE_LOG_ONLINE(Error, TEXT("Steam User is NOT subscribed, exiting.")); bSteamworksClientInitialized = false; FPlatformMisc::RequestExit(false); } } UE_LOG_ONLINE(Log, TEXT("[AppId: %d] Client API initialized %i"), GetSteamAppId(), bSteamworksClientInitialized); return bSteamworksClientInitialized; }
void init(const std::vector<AchievementInfo>& achievementInfos) //const char *pchCmdLine, HINSTANCE hInstance, int nCmdShow) { g_AchievementInfosCopy = achievementInfos; for (size_t i = 0; i < achievementInfos.size(); ++i) { Achievement_t achievementData; achievementData.m_eAchievementID = i; achievementData.m_pchAchievementID = g_AchievementInfosCopy[i].id.c_str(); strncpy(achievementData.m_rgchName, g_AchievementInfosCopy[i].name.c_str(), 128); strncpy(achievementData.m_rgchDescription, g_AchievementInfosCopy[i].description.c_str(), 128); achievementData.m_bAchieved = false; achievementData.m_iIconImage = 0; g_Achievements.push_back(achievementData); } if (SteamAPI_RestartAppIfNecessary(k_uAppIdInvalid)) { // if Steam is not running or the game wasn't started through Steam, SteamAPI_RestartAppIfNecessary starts the // local Steam client and also launches this game again. // Once you get a public Steam AppID assigned for this game, you need to replace k_uAppIdInvalid with it and // removed steam_appid.txt from the game depot. AssertMessage(false, "SteamAPI_RestartAppIfNecessary failed"); } // Init Steam CEG if (!Steamworks_InitCEGLibrary()) { Utils::sleepMs(1000); if (!Steamworks_InitCEGLibrary()) // try twice - it may be a glitch in the network? { AssertMessage(false, "Steam must be running to play this game (InitDrmLibrary() failed)."); } } // Initialize SteamAPI, if this fails we bail out since we depend on Steam for lots of stuff. // You don't necessarily have to though if you write your code to check whether all the Steam // interfaces are NULL before using them and provide alternate paths when they are unavailable. // // This will also load the in-game steam overlay dll into your process. That dll is normally // injected by steam when it launches games, but by calling this you cause it to always load, // even when not launched via steam. if (!SteamAPI_Init()) { Utils::sleepMs(1000); if (!SteamAPI_Init()) { AssertMessage(false, "Steam must be running to play this game (SteamAPI_Init() failed).\n"); } } // Create the SteamAchievements object if Steam was successfully initialized g_SteamAchievements = new CSteamAchievements(&g_Achievements[0], g_Achievements.size()); bool res = g_SteamAchievements->RequestStats(); if (!res) { Utils::sleepMs(1000); res = g_SteamAchievements->RequestStats(); if (!res) { AssertMessage(false, "Could not get stats from Steam.\nPlease check that your Internet connection is working correctly and that Steam is up.\n"); } } // set our debug handler SteamClient()->SetWarningMessageHook(&SteamAPIDebugTextHook); // Tell Steam where it's overlay should show notification dialogs, this can be top right, top left, // bottom right, bottom left. The default position is the bottom left if you don't call this. // Generally you should use the default and not call this as users will be most comfortable with // the default position. The API is provided in case the bottom right creates a serious conflict // with important UI in your game. SteamUtils()->SetOverlayNotificationPosition(k_EPositionTopRight); // Ensure that the user has logged into Steam. This will always return true if the game is launched // from Steam, but if Steam is at the login prompt when you run your game from the debugger, it // will return false. if (!SteamUser()->BLoggedOn()) { Utils::sleepMs(1000); if (!SteamUser()->BLoggedOn()) { AssertMessage(false, "Steam user must be logged in to play this game (SteamUser()->BLoggedOn() returned false).\n"); } } // We are going to use the controller interface, initialize it, which is a seperate step as it // create a new thread in the game proc and we don't want to force that on games that don't // have native Steam controller implementations #ifdef USES_LINUX std::string rgchCWDstr = Utils::convertWStringToString(Utils::getCurrentDirectoryUnicode(), true); const char* rgchCWD = rgchCWDstr.c_str(); #else char rgchCWD[1024]; _getcwd( rgchCWD, sizeof( rgchCWD ) ); #endif char rgchFullPath[1024]; #if defined(_WIN32) _snprintf(rgchFullPath, sizeof(rgchFullPath), "%s\\%s", rgchCWD, "controller.vdf");//.c_str() #elif defined(OSX) // hack for now, because we do not have utility functions available for finding the resource path // alternatively we could disable the SteamController init on OS X _snprintf(rgchFullPath, sizeof(rgchFullPath), "%s/steamworksexample.app/Contents/Resources/%s", rgchCWD, "controller.vdf"); #else _snprintf(rgchFullPath, sizeof(rgchFullPath), "%s/%s", rgchCWD, "controller.vdf"); #endif if (!SteamController()->Init(rgchFullPath)) { AssertMessage(false, "Steam Controller Init failed. Is controller.vdf in the current working directory?\n"); } /*bool bUseVR = SteamUtils()->IsSteamRunningInVR(); const char *pchServerAddress, *pchLobbyID; ParseCommandLine(pchCmdLine, &pchServerAddress, &pchLobbyID, &bUseVR);*/ // do a DRM self check Steamworks_SelfCheck(); // init VR before we make the window // Construct a new instance of the game engine // bugbug jmccaskey - make screen resolution dynamic, maybe take it on command line? /*IGameEngine *pGameEngine = #if defined(_WIN32) new CGameEngineWin32(hInstance, nCmdShow, 1024, 768, bUseVR); #elif defined(OSX) CreateGameEngineOSX(); #elif defined(SDL) CreateGameEngineSDL(bUseVR); #else #error Need CreateGameEngine() #endif*/ }
// Detects if your executable was launched through the Steam client, and restarts your game through // the client if necessary. The Steam client will be started if it is not running. // // Returns: true if your executable was NOT launched through the Steam client. This function will // then start your application through the client. Your current process should exit. // // false if your executable was started through the Steam client or a steam_appid.txt file // is present in your game's directory (for development). Your current process should continue. // // NOTE: This function should be used only if you are using CEG or not using Steam's DRM. Once applied // to your executable, Steam's DRM will handle restarting through Steam if necessary. bool System_RestartAppIfNecessary(uint32 OwnAppID){return SteamAPI_RestartAppIfNecessary(OwnAppID);};