diff --git a/Readme.txt b/Readme.txt index bf15384..01cd409 100644 --- a/Readme.txt +++ b/Readme.txt @@ -1,6 +1,6 @@ ================================================================ -Copyright © 1996-2019, Valve Corporation, All rights reserved. +Copyright © 1996-2020, Valve Corporation, All rights reserved. ================================================================ @@ -9,6 +9,15 @@ Welcome to the Steamworks SDK. For documentation please see our partner website at: http://partner.steamgames.com +---------------------------------------------------------------- +v1.49 12th June 2020 +---------------------------------------------------------------- +* Added ISteamApps::BIsTimedTrial() which allows a game to check if user only has limited playtime +* Added ISteamFriends::RegisterProtocolInOverlayBrowser() which will enable dispatching callbacks when the overlay web browser navigates to a registered custom protocol, such as “mygame://” +* Added ISteamuserStats::GetAchievementProgressLimits() which lets the game query at run-time the progress-based achievement’s bounds as set by the developers in the Steamworks application settings +* Added tool to demonstrate processing the steam.signatures file that comes in the steam client package. + + ---------------------------------------------------------------- v1.48a 26th March 2020 ---------------------------------------------------------------- diff --git a/SteamworksExample/SpaceWarClient.cpp b/SteamworksExample/SpaceWarClient.cpp index 7ce3c27..f7055e4 100644 --- a/SteamworksExample/SpaceWarClient.cpp +++ b/SteamworksExample/SpaceWarClient.cpp @@ -251,6 +251,10 @@ void CSpaceWarClient::DisconnectFromServer() MsgClientLeavingServer_t msg; BSendServerData( &msg, sizeof(msg) ); + + // tell steam china duration control system that we are no longer in a match + SteamUser()->BSetDurationControlOnlineState( k_EDurationControlOnlineState_Offline ); + m_eConnectedStatus = k_EClientNotConnected; } if ( m_pP2PAuthedGame ) @@ -337,6 +341,9 @@ void CSpaceWarClient::OnReceiveServerAuthenticationResponse( bool bSuccess, uint // set information so our friends can join the lobby UpdateRichPresenceConnectionInfo(); + // tell steam china duration control system that we are in a match and not to be interrupted + SteamUser()->BSetDurationControlOnlineState( k_EDurationControlOnlineState_OnlineHighPri ); + // send a ping, to measure round-trip time m_ulPingSentTime = m_pGameEngine->GetGameTickCount(); MsgClientPing_t msg; diff --git a/public/steam/isteamapps.h b/public/steam/isteamapps.h index 550cb8f..299b95d 100644 --- a/public/steam/isteamapps.h +++ b/public/steam/isteamapps.h @@ -105,6 +105,9 @@ public: // Check if user borrowed this game via Family Sharing, If true, call GetAppOwner() to get the lender SteamID virtual bool BIsSubscribedFromFamilySharing() = 0; + + // check if game is a timed trial with limited playtime + virtual bool BIsTimedTrial( uint32* punSecondsAllowed, uint32* punSecondsPlayed ) = 0; }; #define STEAMAPPS_INTERFACE_VERSION "STEAMAPPS_INTERFACE_VERSION008" @@ -198,5 +201,17 @@ struct FileDetailsResult_t }; +//----------------------------------------------------------------------------- +// Purpose: called for games in Timed Trial mode +//----------------------------------------------------------------------------- +struct TimedTrialStatus_t +{ + enum { k_iCallback = k_iSteamAppsCallbacks + 30 }; + AppId_t m_unAppID; // appID + bool m_bIsOffline; // if true, time allowed / played refers to offline time, not total time + uint32 m_unSecondsAllowed; // how many seconds the app can be played in total + uint32 m_unSecondsPlayed; // how many seconds the app was already played +}; + #pragma pack( pop ) #endif // ISTEAMAPPS_H diff --git a/public/steam/isteamfriends.h b/public/steam/isteamfriends.h index 220e959..520a67f 100644 --- a/public/steam/isteamfriends.h +++ b/public/steam/isteamfriends.h @@ -127,17 +127,6 @@ enum EUserRestriction k_nUserRestrictionTrading = 64, // user cannot participate in trading (console, mobile) }; -//----------------------------------------------------------------------------- -// Purpose: information about user sessions -//----------------------------------------------------------------------------- -struct FriendSessionStateInfo_t -{ - uint32 m_uiOnlineSessionInstances; - uint8 m_uiPublishedToFriendsSessionInstance; -}; - - - // size limit on chat room or member metadata const uint32 k_cubChatMetadataMax = 8192; @@ -425,6 +414,11 @@ public: // activates game overlay to open the remote play together invite dialog. Invitations will be sent for remote play together virtual void ActivateGameOverlayRemotePlayTogetherInviteDialog( CSteamID steamIDLobby ) = 0; + + // Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations + // to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation_t callback to your game. + // ActivateGameOverlayToWebPage() must have been called with k_EActivateGameOverlayToWebPageMode_Modal + virtual bool RegisterProtocolInOverlayBrowser( const char *pchProtocol ) = 0; }; #define STEAMFRIENDS_INTERFACE_VERSION "SteamFriends017" @@ -680,6 +674,17 @@ struct UnreadChatMessagesChanged_t enum { k_iCallback = k_iSteamFriendsCallbacks + 48 }; }; + +//----------------------------------------------------------------------------- +// Purpose: Dispatched when an overlay browser instance is navigated to a protocol/scheme registered by RegisterProtocolInOverlayBrowser() +//----------------------------------------------------------------------------- +struct OverlayBrowserProtocolNavigation_t +{ + enum { k_iCallback = k_iSteamFriendsCallbacks + 49 }; + char rgchURI[ 1024 ]; +}; + + #pragma pack( pop ) #endif // ISTEAMFRIENDS_H diff --git a/public/steam/isteaminventory.h b/public/steam/isteaminventory.h index a3e7dd9..4d19cc9 100644 --- a/public/steam/isteaminventory.h +++ b/public/steam/isteaminventory.h @@ -366,6 +366,8 @@ public: // Submit the update request by handle virtual bool SubmitUpdateProperties( SteamInventoryUpdateHandle_t handle, SteamInventoryResult_t * pResultHandle ) = 0; + STEAM_METHOD_DESC(Look up the given token and return a pseudo-Inventory item.) + virtual bool InspectItem( SteamInventoryResult_t *pResultHandle, const char *pchItemToken ) = 0; }; #define STEAMINVENTORY_INTERFACE_VERSION "STEAMINVENTORY_INTERFACE_V003" diff --git a/public/steam/isteamnetworkingutils.h b/public/steam/isteamnetworkingutils.h index 284c4e8..2640c48 100644 --- a/public/steam/isteamnetworkingutils.h +++ b/public/steam/isteamnetworkingutils.h @@ -231,6 +231,10 @@ public: /// value means more important, and the value you pass is the lowest priority (highest /// numeric value) you wish to receive callbacks for. /// + /// The value here controls the detail level for most messages. You can control the + /// detail level for various subsystems (perhaps only for certain connections) by + /// adjusting the configuration values k_ESteamNetworkingConfig_LogLevel_Xxxxx. + /// /// Except when debugging, you should only use k_ESteamNetworkingSocketsDebugOutputType_Msg /// or k_ESteamNetworkingSocketsDebugOutputType_Warning. For best performance, do NOT /// request a high detail level and then filter out messages in your callback. This incurs @@ -364,6 +368,24 @@ struct SteamRelayNetworkStatus_t char m_debugMsg[ 256 ]; }; +/// Utility class for printing a SteamNetworkingIdentity. +/// E.g. printf( "Identity is '%s'\n", SteamNetworkingIdentityRender( identity ).c_str() ); +struct SteamNetworkingIdentityRender +{ + SteamNetworkingIdentityRender( const SteamNetworkingIdentity &x ) { x.ToString( buf, sizeof(buf) ); } + inline const char *c_str() const { return buf; } +private: + char buf[ SteamNetworkingIdentity::k_cchMaxString ]; +}; + +/// Utility class for printing a SteamNetworkingIPAddrRender. +struct SteamNetworkingIPAddrRender +{ + SteamNetworkingIPAddrRender( const SteamNetworkingIPAddr &x, bool bWithPort = true ) { x.ToString( buf, sizeof(buf), bWithPort ); } + inline const char *c_str() const { return buf; } +private: + char buf[ SteamNetworkingIPAddr::k_cchMaxString ]; +}; /////////////////////////////////////////////////////////////////////////////// // diff --git a/public/steam/isteamuser.h b/public/steam/isteamuser.h index 1077cbe..83f2e26 100644 --- a/public/steam/isteamuser.h +++ b/public/steam/isteamuser.h @@ -197,9 +197,14 @@ public: STEAM_CALL_RESULT( DurationControl_t ) virtual SteamAPICall_t GetDurationControl() = 0; + // Advise steam china duration control system about the online state of the game. + // This will prevent offline gameplay time from counting against a user's + // playtime limits. + virtual bool BSetDurationControlOnlineState( EDurationControlOnlineState eNewState ) = 0; + }; -#define STEAMUSER_INTERFACE_VERSION "SteamUser020" +#define STEAMUSER_INTERFACE_VERSION "SteamUser021" // Global interface accessor inline ISteamUser *SteamUser(); diff --git a/public/steam/isteamuserstats.h b/public/steam/isteamuserstats.h index e699169..af37148 100644 --- a/public/steam/isteamuserstats.h +++ b/public/steam/isteamuserstats.h @@ -293,28 +293,18 @@ public: STEAM_FLAT_NAME( GetGlobalStatHistoryDouble ) virtual int32 GetGlobalStatHistory( const char *pchStatName, STEAM_ARRAY_COUNT(cubData) double *pData, uint32 cubData ) = 0; -#ifdef _PS3 - // Call to kick off installation of the PS3 trophies. This call is asynchronous, and the results will be returned in a PS3TrophiesInstalled_t - // callback. - virtual bool InstallPS3Trophies() = 0; + // For achievements that have related Progress stats, use this to query what the bounds of that progress are. + // You may want this info to selectively call IndicateAchievementProgress when appropriate milestones of progress + // have been made, to show a progress notification to the user. + STEAM_FLAT_NAME( GetAchievementProgressLimitsInt32 ) + virtual bool GetAchievementProgressLimits( const char *pchName, int32 *pnMinProgress, int32 *pnMaxProgress ) = 0; - // Returns the amount of space required at boot to install trophies. This value can be used when comparing the amount of space needed - // by the game to the available space value passed to the game at boot. The value is set during InstallPS3Trophies(). - virtual uint64 GetTrophySpaceRequiredBeforeInstall() = 0; + STEAM_FLAT_NAME( GetAchievementProgressLimitsFloat ) + virtual bool GetAchievementProgressLimits( const char *pchName, float *pfMinProgress, float *pfMaxProgress ) = 0; - // On PS3, user stats & achievement progress through Steam must be stored with the user's saved game data. - // At startup, before calling RequestCurrentStats(), you must pass the user's stats data to Steam via this method. - // If you do not have any user data, call this function with pvData = NULL and cubData = 0 - virtual bool SetUserStatsData( const void *pvData, uint32 cubData ) = 0; - - // Call to get the user's current stats data. You should retrieve this data after receiving successful UserStatsReceived_t & UserStatsStored_t - // callbacks, and store the data with the user's save game data. You can call this method with pvData = NULL and cubData = 0 to get the required - // buffer size. - virtual bool GetUserStatsData( void *pvData, uint32 cubData, uint32 *pcubWritten ) = 0; -#endif }; -#define STEAMUSERSTATS_INTERFACE_VERSION "STEAMUSERSTATS_INTERFACE_VERSION011" +#define STEAMUSERSTATS_INTERFACE_VERSION "STEAMUSERSTATS_INTERFACE_VERSION012" // Global interface accessor inline ISteamUserStats *SteamUserStats(); diff --git a/public/steam/lib/linux32/libsdkencryptedappticket.so b/public/steam/lib/linux32/libsdkencryptedappticket.so index 06810b0..edb756f 100644 Binary files a/public/steam/lib/linux32/libsdkencryptedappticket.so and b/public/steam/lib/linux32/libsdkencryptedappticket.so differ diff --git a/public/steam/lib/linux64/libsdkencryptedappticket.so b/public/steam/lib/linux64/libsdkencryptedappticket.so index 9110ce2..2493576 100644 Binary files a/public/steam/lib/linux64/libsdkencryptedappticket.so and b/public/steam/lib/linux64/libsdkencryptedappticket.so differ diff --git a/public/steam/lib/osx/libsdkencryptedappticket.dylib b/public/steam/lib/osx/libsdkencryptedappticket.dylib index 328e430..8fca3aa 100644 Binary files a/public/steam/lib/osx/libsdkencryptedappticket.dylib and b/public/steam/lib/osx/libsdkencryptedappticket.dylib differ diff --git a/public/steam/lib/win32/sdkencryptedappticket.dll b/public/steam/lib/win32/sdkencryptedappticket.dll index defd075..8a12c44 100644 Binary files a/public/steam/lib/win32/sdkencryptedappticket.dll and b/public/steam/lib/win32/sdkencryptedappticket.dll differ diff --git a/public/steam/lib/win32/sdkencryptedappticket.lib b/public/steam/lib/win32/sdkencryptedappticket.lib index ac46815..8a9c032 100644 Binary files a/public/steam/lib/win32/sdkencryptedappticket.lib and b/public/steam/lib/win32/sdkencryptedappticket.lib differ diff --git a/public/steam/lib/win64/sdkencryptedappticket64.dll b/public/steam/lib/win64/sdkencryptedappticket64.dll index 5efae85..9df34eb 100644 Binary files a/public/steam/lib/win64/sdkencryptedappticket64.dll and b/public/steam/lib/win64/sdkencryptedappticket64.dll differ diff --git a/public/steam/lib/win64/sdkencryptedappticket64.lib b/public/steam/lib/win64/sdkencryptedappticket64.lib index 56374e2..25216dc 100644 Binary files a/public/steam/lib/win64/sdkencryptedappticket64.lib and b/public/steam/lib/win64/sdkencryptedappticket64.lib differ diff --git a/public/steam/steam_api.json b/public/steam/steam_api.json index e162b7b..4473515 100644 --- a/public/steam/steam_api.json +++ b/public/steam/steam_api.json @@ -283,6 +283,13 @@ "fields": [], "struct": "UnreadChatMessagesChanged_t" }, + { + "callback_id": 349, + "fields": [ + { "fieldname":"rgchURI", "fieldtype":"char [1024]" } + ], + "struct": "OverlayBrowserProtocolNavigation_t" + }, { "callback_id": 701, "fields": [], @@ -996,6 +1003,16 @@ ], "struct": "FileDetailsResult_t" }, + { + "callback_id": 1030, + "fields": [ + { "fieldname":"m_unAppID", "fieldtype":"AppId_t" }, + { "fieldname":"m_bIsOffline", "fieldtype":"bool" }, + { "fieldname":"m_unSecondsAllowed", "fieldtype":"uint32" }, + { "fieldname":"m_unSecondsPlayed", "fieldtype":"uint32" } + ], + "struct": "TimedTrialStatus_t" + }, { "callback_id": 1202, "fields": [ @@ -1607,20 +1624,6 @@ ], "struct": "GetOPFSettingsResult_t" }, - { - "callback_id": 4604, - "fields": [ - { "fieldname":"m_bIsRTMP", "fieldtype":"bool" } - ], - "struct": "BroadcastUploadStart_t" - }, - { - "callback_id": 4605, - "fields": [ - { "fieldname":"m_eResult", "fieldtype":"EBroadcastUploadResult" } - ], - "struct": "BroadcastUploadStop_t" - }, { "callback_id": 5001, "fields": [], @@ -1866,6 +1869,12 @@ { "constname":"k_cchMaxSteamNetworkingPingLocationString", "consttype":"int", "constval":"1024" }, { "constname":"k_nSteamNetworkingPing_Failed", "consttype":"int", "constval":"- 1" }, { "constname":"k_nSteamNetworkingPing_Unknown", "consttype":"int", "constval":"- 2" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Default", "consttype":"int", "constval":"- 1" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Disable", "consttype":"int", "constval":"0" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Relay", "consttype":"int", "constval":"1" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Private", "consttype":"int", "constval":"2" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Public", "consttype":"int", "constval":"4" }, + { "constname":"k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_All", "consttype":"int", "constval":"0x7fffffff" }, { "constname":"k_SteamDatagramPOPID_dev", "consttype":"SteamNetworkingPOPID", "constval":"( ( uint32 ) 'd' << 16U ) | ( ( uint32 ) 'e' << 8U ) | ( uint32 ) 'v'" }, { "constname":"k_unServerFlagNone", "consttype":"uint32", "constval":"0x00" }, { "constname":"k_unServerFlagActive", "consttype":"uint32", "constval":"0x01" }, @@ -2014,7 +2023,8 @@ { "name":"k_EResultLimitedUserAccount", "value":"112" }, { "name":"k_EResultCantRemoveItem", "value":"113" }, { "name":"k_EResultAccountDeleted", "value":"114" }, - { "name":"k_EResultExistingUserCancelledLicense", "value":"115" } + { "name":"k_EResultExistingUserCancelledLicense", "value":"115" }, + { "name":"k_EResultCommunityCooldown", "value":"116" } ] }, { @@ -2138,7 +2148,8 @@ { "name":"k_EAppOwnershipFlags_Rental", "value":"131072" }, { "name":"k_EAppOwnershipFlags_SiteLicense", "value":"262144" }, { "name":"k_EAppOwnershipFlags_LegacyFreeSub", "value":"524288" }, - { "name":"k_EAppOwnershipFlags_InvalidOSType", "value":"1048576" } + { "name":"k_EAppOwnershipFlags_InvalidOSType", "value":"1048576" }, + { "name":"k_EAppOwnershipFlags_TimedTrial", "value":"2097152" } ] }, { @@ -2376,6 +2387,15 @@ { "name":"k_EDurationControlNotification_ExitSoon_Night", "value":"7" } ] }, + { + "enumname": "EDurationControlOnlineState", + "values": [ + { "name":"k_EDurationControlOnlineState_Invalid", "value":"0" }, + { "name":"k_EDurationControlOnlineState_Offline", "value":"1" }, + { "name":"k_EDurationControlOnlineState_Online", "value":"2" }, + { "name":"k_EDurationControlOnlineState_OnlineHighPri", "value":"3" } + ] + }, { "enumname": "EGameSearchErrorCode_t", "values": [ @@ -2859,6 +2879,7 @@ { "name":"k_EHTTPStatusCode417ExpectationFailed", "value":"417" }, { "name":"k_EHTTPStatusCode4xxUnknown", "value":"418" }, { "name":"k_EHTTPStatusCode429TooManyRequests", "value":"429" }, + { "name":"k_EHTTPStatusCode444ConnectionClosed", "value":"444" }, { "name":"k_EHTTPStatusCode500InternalServerError", "value":"500" }, { "name":"k_EHTTPStatusCode501NotImplemented", "value":"501" }, { "name":"k_EHTTPStatusCode502BadGateway", "value":"502" }, @@ -3611,15 +3632,6 @@ { "name":"k_ESteamItemConsumed", "value":"512" } ] }, - { - "enumname": "ESteamTVRegionBehavior", - "values": [ - { "name":"k_ESteamVideoRegionBehaviorInvalid", "value":"-1" }, - { "name":"k_ESteamVideoRegionBehaviorHover", "value":"0" }, - { "name":"k_ESteamVideoRegionBehaviorClickPopup", "value":"1" }, - { "name":"k_ESteamVideoRegionBehaviorClickSurroundingRegion", "value":"2" } - ] - }, { "enumname": "EParentalFeature", "values": [ @@ -3709,6 +3721,7 @@ { "name":"k_ESteamNetConnectionEnd_Local_HostedServerPrimaryRelay", "value":"3003" }, { "name":"k_ESteamNetConnectionEnd_Local_NetworkConfig", "value":"3004" }, { "name":"k_ESteamNetConnectionEnd_Local_Rights", "value":"3005" }, + { "name":"k_ESteamNetConnectionEnd_Local_P2P_ICE_NoPublicAddresses", "value":"3006" }, { "name":"k_ESteamNetConnectionEnd_Local_Max", "value":"3999" }, { "name":"k_ESteamNetConnectionEnd_Remote_Min", "value":"4000" }, { "name":"k_ESteamNetConnectionEnd_Remote_Timeout", "value":"4001" }, @@ -3717,6 +3730,7 @@ { "name":"k_ESteamNetConnectionEnd_Remote_NotLoggedIn", "value":"4004" }, { "name":"k_ESteamNetConnectionEnd_Remote_NotRunningApp", "value":"4005" }, { "name":"k_ESteamNetConnectionEnd_Remote_BadProtocolVersion", "value":"4006" }, + { "name":"k_ESteamNetConnectionEnd_Remote_P2P_ICE_NoPublicAddresses", "value":"4007" }, { "name":"k_ESteamNetConnectionEnd_Remote_Max", "value":"4999" }, { "name":"k_ESteamNetConnectionEnd_Misc_Min", "value":"5000" }, { "name":"k_ESteamNetConnectionEnd_Misc_Generic", "value":"5001" }, @@ -3725,10 +3739,26 @@ { "name":"k_ESteamNetConnectionEnd_Misc_RelayConnectivity", "value":"5004" }, { "name":"k_ESteamNetConnectionEnd_Misc_SteamConnectivity", "value":"5005" }, { "name":"k_ESteamNetConnectionEnd_Misc_NoRelaySessionsToClient", "value":"5006" }, + { "name":"k_ESteamNetConnectionEnd_Misc_P2P_Rendezvous", "value":"5008" }, + { "name":"k_ESteamNetConnectionEnd_Misc_P2P_NAT_Firewall", "value":"5009" }, { "name":"k_ESteamNetConnectionEnd_Misc_Max", "value":"5999" }, { "name":"k_ESteamNetConnectionEnd__Force32Bit", "value":"2147483647" } ] }, + { + "enumname": "ESteamNetTransportKind", + "values": [ + { "name":"k_ESteamNetTransport_Unknown", "value":"0" }, + { "name":"k_ESteamNetTransport_LoopbackBuffers", "value":"1" }, + { "name":"k_ESteamNetTransport_LocalHost", "value":"2" }, + { "name":"k_ESteamNetTransport_UDP", "value":"3" }, + { "name":"k_ESteamNetTransport_UDPProbablyLocal", "value":"4" }, + { "name":"k_ESteamNetTransport_TURN", "value":"5" }, + { "name":"k_ESteamNetTransport_SDRP2P", "value":"6" }, + { "name":"k_ESteamNetTransport_SDRHostedServer", "value":"7" }, + { "name":"k_ESteamNetTransport_Force32Bit", "value":"2147483647" } + ] + }, { "enumname": "ESteamNetworkingConfigScope", "values": [ @@ -3775,6 +3805,10 @@ { "name":"k_ESteamNetworkingConfig_MTU_DataSize", "value":"33" }, { "name":"k_ESteamNetworkingConfig_Unencrypted", "value":"34" }, { "name":"k_ESteamNetworkingConfig_EnumerateDevVars", "value":"35" }, + { "name":"k_ESteamNetworkingConfig_P2P_STUN_ServerList", "value":"103" }, + { "name":"k_ESteamNetworkingConfig_P2P_Transport_ICE_Enable", "value":"104" }, + { "name":"k_ESteamNetworkingConfig_P2P_Transport_ICE_Penalty", "value":"105" }, + { "name":"k_ESteamNetworkingConfig_P2P_Transport_SDR_Penalty", "value":"106" }, { "name":"k_ESteamNetworkingConfig_SDRClient_ConsecutitivePingTimeoutsFailInitial", "value":"19" }, { "name":"k_ESteamNetworkingConfig_SDRClient_ConsecutitivePingTimeoutsFail", "value":"20" }, { "name":"k_ESteamNetworkingConfig_SDRClient_MinPingsBeforePingAccurate", "value":"21" }, @@ -4178,7 +4212,7 @@ { "kind": "user", "name": "SteamUser", - "name_flat": "SteamAPI_SteamUser_v020" + "name_flat": "SteamAPI_SteamUser_v021" } ], "classname": "ISteamUser", @@ -4443,9 +4477,17 @@ "methodname_flat": "SteamAPI_ISteamUser_GetDurationControl", "params": [], "returntype": "SteamAPICall_t" + }, + { + "methodname": "BSetDurationControlOnlineState", + "methodname_flat": "SteamAPI_ISteamUser_BSetDurationControlOnlineState", + "params": [ + { "paramname":"eNewState", "paramtype":"EDurationControlOnlineState" } + ], + "returntype": "bool" } ], - "version_string": "SteamUser020" + "version_string": "SteamUser021" }, { "accessors": [ @@ -5098,6 +5140,14 @@ { "paramname":"steamIDLobby", "paramtype":"CSteamID", "paramtype_flat":"uint64_steamid" } ], "returntype": "void" + }, + { + "methodname": "RegisterProtocolInOverlayBrowser", + "methodname_flat": "SteamAPI_ISteamFriends_RegisterProtocolInOverlayBrowser", + "params": [ + { "paramname":"pchProtocol", "paramtype":"const char *" } + ], + "returntype": "bool" } ], "version_string": "SteamFriends017" @@ -6862,7 +6912,7 @@ { "kind": "user", "name": "SteamUserStats", - "name_flat": "SteamAPI_SteamUserStats_v011" + "name_flat": "SteamAPI_SteamUserStats_v012" } ], "classname": "ISteamUserStats", @@ -7277,9 +7327,29 @@ { "paramname":"cubData", "paramtype":"uint32" } ], "returntype": "int32" + }, + { + "methodname": "GetAchievementProgressLimits", + "methodname_flat": "SteamAPI_ISteamUserStats_GetAchievementProgressLimitsInt32", + "params": [ + { "paramname":"pchName", "paramtype":"const char *" }, + { "paramname":"pnMinProgress", "paramtype":"int32 *" }, + { "paramname":"pnMaxProgress", "paramtype":"int32 *" } + ], + "returntype": "bool" + }, + { + "methodname": "GetAchievementProgressLimits", + "methodname_flat": "SteamAPI_ISteamUserStats_GetAchievementProgressLimitsFloat", + "params": [ + { "paramname":"pchName", "paramtype":"const char *" }, + { "paramname":"pfMinProgress", "paramtype":"float *" }, + { "paramname":"pfMaxProgress", "paramtype":"float *" } + ], + "returntype": "bool" } ], - "version_string": "STEAMUSERSTATS_INTERFACE_VERSION011" + "version_string": "STEAMUSERSTATS_INTERFACE_VERSION012" }, { "accessors": [ @@ -7510,6 +7580,15 @@ "methodname_flat": "SteamAPI_ISteamApps_BIsSubscribedFromFamilySharing", "params": [], "returntype": "bool" + }, + { + "methodname": "BIsTimedTrial", + "methodname_flat": "SteamAPI_ISteamApps_BIsTimedTrial", + "params": [ + { "paramname":"punSecondsAllowed", "paramtype":"uint32 *" }, + { "paramname":"punSecondsPlayed", "paramtype":"uint32 *" } + ], + "returntype": "bool" } ], "version_string": "STEAMAPPS_INTERFACE_VERSION008" @@ -10873,6 +10952,16 @@ { "paramname":"pResultHandle", "paramtype":"SteamInventoryResult_t *" } ], "returntype": "bool" + }, + { + "desc": "Look up the given token and return a pseudo-Inventory item.", + "methodname": "InspectItem", + "methodname_flat": "SteamAPI_ISteamInventory_InspectItem", + "params": [ + { "paramname":"pResultHandle", "paramtype":"SteamInventoryResult_t *" }, + { "paramname":"pchItemToken", "paramtype":"const char *" } + ], + "returntype": "bool" } ], "version_string": "STEAMINVENTORY_INTERFACE_V003" @@ -10926,82 +11015,6 @@ ], "version_string": "STEAMVIDEO_INTERFACE_V002" }, - { - "accessors": [ - { - "kind": "user", - "name": "SteamTV", - "name_flat": "SteamAPI_SteamTV_v001" - } - ], - "classname": "ISteamTV", - "fields": [], - "methods": [ - { - "methodname": "IsBroadcasting", - "methodname_flat": "SteamAPI_ISteamTV_IsBroadcasting", - "params": [ - { "paramname":"pnNumViewers", "paramtype":"int *" } - ], - "returntype": "bool" - }, - { - "methodname": "AddBroadcastGameData", - "methodname_flat": "SteamAPI_ISteamTV_AddBroadcastGameData", - "params": [ - { "paramname":"pchKey", "paramtype":"const char *" }, - { "paramname":"pchValue", "paramtype":"const char *" } - ], - "returntype": "void" - }, - { - "methodname": "RemoveBroadcastGameData", - "methodname_flat": "SteamAPI_ISteamTV_RemoveBroadcastGameData", - "params": [ - { "paramname":"pchKey", "paramtype":"const char *" } - ], - "returntype": "void" - }, - { - "methodname": "AddTimelineMarker", - "methodname_flat": "SteamAPI_ISteamTV_AddTimelineMarker", - "params": [ - { "paramname":"pchTemplateName", "paramtype":"const char *" }, - { "paramname":"bPersistent", "paramtype":"bool" }, - { "paramname":"nColorR", "paramtype":"uint8" }, - { "paramname":"nColorG", "paramtype":"uint8" }, - { "paramname":"nColorB", "paramtype":"uint8" } - ], - "returntype": "void" - }, - { - "methodname": "RemoveTimelineMarker", - "methodname_flat": "SteamAPI_ISteamTV_RemoveTimelineMarker", - "params": [], - "returntype": "void" - }, - { - "methodname": "AddRegion", - "methodname_flat": "SteamAPI_ISteamTV_AddRegion", - "params": [ - { "paramname":"pchElementName", "paramtype":"const char *" }, - { "paramname":"pchTimelineDataSection", "paramtype":"const char *" }, - { "paramname":"pSteamTVRegion", "paramtype":"const SteamTVRegion_t *" }, - { "paramname":"eSteamTVRegionBehavior", "paramtype":"ESteamTVRegionBehavior" } - ], - "returntype": "uint32" - }, - { - "methodname": "RemoveRegion", - "methodname_flat": "SteamAPI_ISteamTV_RemoveRegion", - "params": [ - { "paramname":"unRegionHandle", "paramtype":"uint32" } - ], - "returntype": "void" - } - ], - "version_string": "STEAMTV_INTERFACE_V001" - }, { "accessors": [ { @@ -12337,13 +12350,6 @@ ], "struct": "FriendGameInfo_t" }, - { - "fields": [ - { "fieldname":"m_uiOnlineSessionInstances", "fieldtype":"uint32" }, - { "fieldname":"m_uiPublishedToFriendsSessionInstance", "fieldtype":"uint8" } - ], - "struct": "FriendSessionStateInfo_t" - }, { "fields": [ { "fieldname":"m_szKey", "fieldtype":"char [256]" }, @@ -12624,15 +12630,6 @@ ], "struct": "SteamItemDetails_t" }, - { - "fields": [ - { "fieldname":"unMinX", "fieldtype":"uint32" }, - { "fieldname":"unMinY", "fieldtype":"uint32" }, - { "fieldname":"unMaxX", "fieldtype":"uint32" }, - { "fieldname":"unMaxY", "fieldtype":"uint32" } - ], - "struct": "SteamTVRegion_t" - }, { "consts": [ { "constname":"k_cchMaxString", "consttype":"int", "constval":"48" } @@ -12731,7 +12728,7 @@ "consts": [ { "constname":"k_cchMaxString", "consttype":"int", "constval":"128" }, { "constname":"k_cchMaxGenericString", "consttype":"int", "constval":"32" }, - { "constname":"k_cchMaxXboxPairwiseID", "consttype":"int", "constval":"32" }, + { "constname":"k_cchMaxXboxPairwiseID", "consttype":"int", "constval":"33" }, { "constname":"k_cbMaxGenericBytes", "consttype":"int", "constval":"32" } ], "fields": [ @@ -12893,7 +12890,8 @@ { "fieldname":"m_eEndReason", "fieldtype":"int" }, { "fieldname":"m_szEndDebug", "fieldtype":"char [128]" }, { "fieldname":"m_szConnectionDescription", "fieldtype":"char [128]" }, - { "fieldname":"reserved", "fieldtype":"uint32 [64]" } + { "fieldname":"m_eTransportKind", "fieldtype":"ESteamNetTransportKind" }, + { "fieldname":"reserved", "fieldtype":"uint32 [63]" } ], "struct": "SteamNetConnectionInfo_t" }, @@ -12955,6 +12953,60 @@ ], "struct": "SteamNetworkingConfigValue_t" }, + { + "fields": [ + { + "fieldname": "buf", + "fieldtype": "char [8]", + "private": true + } + ], + "methods": [ + { + "methodname": "c_str", + "methodname_flat": "SteamAPI_SteamNetworkingPOPIDRender_c_str", + "params": [], + "returntype": "const char *" + } + ], + "struct": "SteamNetworkingPOPIDRender" + }, + { + "fields": [ + { + "fieldname": "buf", + "fieldtype": "char [128]", + "private": true + } + ], + "methods": [ + { + "methodname": "c_str", + "methodname_flat": "SteamAPI_SteamNetworkingIdentityRender_c_str", + "params": [], + "returntype": "const char *" + } + ], + "struct": "SteamNetworkingIdentityRender" + }, + { + "fields": [ + { + "fieldname": "buf", + "fieldtype": "char [48]", + "private": true + } + ], + "methods": [ + { + "methodname": "c_str", + "methodname_flat": "SteamAPI_SteamNetworkingIPAddrRender_c_str", + "params": [], + "returntype": "const char *" + } + ], + "struct": "SteamNetworkingIPAddrRender" + }, { "fields": [ { "fieldname":"m_cbSize", "fieldtype":"int" }, diff --git a/public/steam/steam_api_flat.h b/public/steam/steam_api_flat.h index 5a9125d..d03f1b1 100644 --- a/public/steam/steam_api_flat.h +++ b/public/steam/steam_api_flat.h @@ -56,7 +56,7 @@ S_API ISteamParties * SteamAPI_ISteamClient_GetISteamParties( ISteamClient* self S_API ISteamRemotePlay * SteamAPI_ISteamClient_GetISteamRemotePlay( ISteamClient* self, HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char * pchVersion ); // ISteamUser -S_API ISteamUser *SteamAPI_SteamUser_v020(); +S_API ISteamUser *SteamAPI_SteamUser_v021(); S_API HSteamUser SteamAPI_ISteamUser_GetHSteamUser( ISteamUser* self ); S_API bool SteamAPI_ISteamUser_BLoggedOn( ISteamUser* self ); S_API uint64_steamid SteamAPI_ISteamUser_GetSteamID( ISteamUser* self ); @@ -88,6 +88,7 @@ S_API bool SteamAPI_ISteamUser_BIsPhoneIdentifying( ISteamUser* self ); S_API bool SteamAPI_ISteamUser_BIsPhoneRequiringVerification( ISteamUser* self ); S_API SteamAPICall_t SteamAPI_ISteamUser_GetMarketEligibility( ISteamUser* self ); S_API SteamAPICall_t SteamAPI_ISteamUser_GetDurationControl( ISteamUser* self ); +S_API bool SteamAPI_ISteamUser_BSetDurationControlOnlineState( ISteamUser* self, EDurationControlOnlineState eNewState ); // ISteamFriends S_API ISteamFriends *SteamAPI_SteamFriends_v017(); @@ -165,6 +166,7 @@ S_API bool SteamAPI_ISteamFriends_IsClanPublic( ISteamFriends* self, uint64_stea S_API bool SteamAPI_ISteamFriends_IsClanOfficialGameGroup( ISteamFriends* self, uint64_steamid steamIDClan ); S_API int SteamAPI_ISteamFriends_GetNumChatsWithUnreadPriorityMessages( ISteamFriends* self ); S_API void SteamAPI_ISteamFriends_ActivateGameOverlayRemotePlayTogetherInviteDialog( ISteamFriends* self, uint64_steamid steamIDLobby ); +S_API bool SteamAPI_ISteamFriends_RegisterProtocolInOverlayBrowser( ISteamFriends* self, const char * pchProtocol ); // ISteamUtils S_API ISteamUtils *SteamAPI_SteamUtils_v009(); @@ -374,7 +376,7 @@ S_API SteamAPICall_t SteamAPI_ISteamRemoteStorage_EnumeratePublishedWorkshopFile S_API SteamAPICall_t SteamAPI_ISteamRemoteStorage_UGCDownloadToLocation( ISteamRemoteStorage* self, UGCHandle_t hContent, const char * pchLocation, uint32 unPriority ); // ISteamUserStats -S_API ISteamUserStats *SteamAPI_SteamUserStats_v011(); +S_API ISteamUserStats *SteamAPI_SteamUserStats_v012(); S_API bool SteamAPI_ISteamUserStats_RequestCurrentStats( ISteamUserStats* self ); S_API bool SteamAPI_ISteamUserStats_GetStatInt32( ISteamUserStats* self, const char * pchName, int32 * pData ); S_API bool SteamAPI_ISteamUserStats_GetStatFloat( ISteamUserStats* self, const char * pchName, float * pData ); @@ -418,6 +420,8 @@ S_API bool SteamAPI_ISteamUserStats_GetGlobalStatInt64( ISteamUserStats* self, c S_API bool SteamAPI_ISteamUserStats_GetGlobalStatDouble( ISteamUserStats* self, const char * pchStatName, double * pData ); S_API int32 SteamAPI_ISteamUserStats_GetGlobalStatHistoryInt64( ISteamUserStats* self, const char * pchStatName, int64 * pData, uint32 cubData ); S_API int32 SteamAPI_ISteamUserStats_GetGlobalStatHistoryDouble( ISteamUserStats* self, const char * pchStatName, double * pData, uint32 cubData ); +S_API bool SteamAPI_ISteamUserStats_GetAchievementProgressLimitsInt32( ISteamUserStats* self, const char * pchName, int32 * pnMinProgress, int32 * pnMaxProgress ); +S_API bool SteamAPI_ISteamUserStats_GetAchievementProgressLimitsFloat( ISteamUserStats* self, const char * pchName, float * pfMinProgress, float * pfMaxProgress ); // ISteamApps S_API ISteamApps *SteamAPI_SteamApps_v008(); @@ -450,6 +454,7 @@ S_API void SteamAPI_ISteamApps_RequestAllProofOfPurchaseKeys( ISteamApps* self ) S_API SteamAPICall_t SteamAPI_ISteamApps_GetFileDetails( ISteamApps* self, const char * pszFileName ); S_API int SteamAPI_ISteamApps_GetLaunchCommandLine( ISteamApps* self, char * pszCommandLine, int cubCommandLine ); S_API bool SteamAPI_ISteamApps_BIsSubscribedFromFamilySharing( ISteamApps* self ); +S_API bool SteamAPI_ISteamApps_BIsTimedTrial( ISteamApps* self, uint32 * punSecondsAllowed, uint32 * punSecondsPlayed ); // ISteamNetworking S_API ISteamNetworking *SteamAPI_SteamNetworking_v006(); @@ -811,6 +816,7 @@ S_API bool SteamAPI_ISteamInventory_SetPropertyBool( ISteamInventory* self, Stea S_API bool SteamAPI_ISteamInventory_SetPropertyInt64( ISteamInventory* self, SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char * pchPropertyName, int64 nValue ); S_API bool SteamAPI_ISteamInventory_SetPropertyFloat( ISteamInventory* self, SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char * pchPropertyName, float flValue ); S_API bool SteamAPI_ISteamInventory_SubmitUpdateProperties( ISteamInventory* self, SteamInventoryUpdateHandle_t handle, SteamInventoryResult_t * pResultHandle ); +S_API bool SteamAPI_ISteamInventory_InspectItem( ISteamInventory* self, SteamInventoryResult_t * pResultHandle, const char * pchItemToken ); // ISteamVideo S_API ISteamVideo *SteamAPI_SteamVideo_v002(); @@ -819,16 +825,6 @@ S_API bool SteamAPI_ISteamVideo_IsBroadcasting( ISteamVideo* self, int * pnNumVi S_API void SteamAPI_ISteamVideo_GetOPFSettings( ISteamVideo* self, AppId_t unVideoAppID ); S_API bool SteamAPI_ISteamVideo_GetOPFStringForApp( ISteamVideo* self, AppId_t unVideoAppID, char * pchBuffer, int32 * pnBufferSize ); -// ISteamTV -S_API ISteamTV *SteamAPI_SteamTV_v001(); -S_API bool SteamAPI_ISteamTV_IsBroadcasting( ISteamTV* self, int * pnNumViewers ); -S_API void SteamAPI_ISteamTV_AddBroadcastGameData( ISteamTV* self, const char * pchKey, const char * pchValue ); -S_API void SteamAPI_ISteamTV_RemoveBroadcastGameData( ISteamTV* self, const char * pchKey ); -S_API void SteamAPI_ISteamTV_AddTimelineMarker( ISteamTV* self, const char * pchTemplateName, bool bPersistent, uint8 nColorR, uint8 nColorG, uint8 nColorB ); -S_API void SteamAPI_ISteamTV_RemoveTimelineMarker( ISteamTV* self ); -S_API uint32 SteamAPI_ISteamTV_AddRegion( ISteamTV* self, const char * pchElementName, const char * pchTimelineDataSection, const SteamTVRegion_t * pSteamTVRegion, ESteamTVRegionBehavior eSteamTVRegionBehavior ); -S_API void SteamAPI_ISteamTV_RemoveRegion( ISteamTV* self, uint32 unRegionHandle ); - // ISteamParentalSettings S_API ISteamParentalSettings *SteamAPI_SteamParentalSettings_v001(); S_API bool SteamAPI_ISteamParentalSettings_BIsParentalLockEnabled( ISteamParentalSettings* self ); @@ -1053,6 +1049,15 @@ S_API bool SteamAPI_SteamNetworkingIdentity_ParseString( SteamNetworkingIdentity // SteamNetworkingMessage_t S_API void SteamAPI_SteamNetworkingMessage_t_Release( SteamNetworkingMessage_t* self ); +// SteamNetworkingPOPIDRender +S_API const char * SteamAPI_SteamNetworkingPOPIDRender_c_str( SteamNetworkingPOPIDRender* self ); + +// SteamNetworkingIdentityRender +S_API const char * SteamAPI_SteamNetworkingIdentityRender_c_str( SteamNetworkingIdentityRender* self ); + +// SteamNetworkingIPAddrRender +S_API const char * SteamAPI_SteamNetworkingIPAddrRender_c_str( SteamNetworkingIPAddrRender* self ); + // SteamDatagramHostedAddress S_API void SteamAPI_SteamDatagramHostedAddress_Clear( SteamDatagramHostedAddress* self ); S_API SteamNetworkingPOPID SteamAPI_SteamDatagramHostedAddress_GetPopID( SteamDatagramHostedAddress* self ); diff --git a/public/steam/steam_api_internal.h b/public/steam/steam_api_internal.h index f8bf38e..16657ac 100644 --- a/public/steam/steam_api_internal.h +++ b/public/steam/steam_api_internal.h @@ -242,7 +242,6 @@ class ISteamParentalSettings; class ISteamGameSearch; class ISteamInput; class ISteamParties; -class ISteamTV; class ISteamRemotePlay; //----------------------------------------------------------------------------- @@ -310,6 +309,7 @@ enum { k_iSteamSTARCallbacks = 5500 }; enum { k_iClientSTARCallbacks = 5600 }; enum { k_iSteamRemotePlayCallbacks = 5700 }; enum { k_iClientCompatCallbacks = 5800 }; +enum { k_iSteamChatCallbacks = 5900 }; #ifdef _MSVC_VER #pragma warning( pop ) @@ -348,7 +348,6 @@ public: ISteamHTMLSurface* SteamHTMLSurface() const { return m_pSteamHTMLSurface; } ISteamInventory* SteamInventory() const { return m_pSteamInventory; } ISteamVideo* SteamVideo() const { return m_pSteamVideo; } - ISteamTV* SteamTV() const { return m_pSteamTV; } ISteamParentalSettings* SteamParentalSettings() const { return m_pSteamParentalSettings; } ISteamInput* SteamInput() const { return m_pSteamInput; } private: @@ -373,7 +372,6 @@ private: ISteamHTMLSurface *m_pSteamHTMLSurface; ISteamInventory *m_pSteamInventory; ISteamVideo *m_pSteamVideo; - ISteamTV *m_pSteamTV; ISteamParentalSettings *m_pSteamParentalSettings; ISteamInput *m_pSteamInput; }; diff --git a/public/steam/steamclientpublic.h b/public/steam/steamclientpublic.h index f568ec7..f744263 100644 --- a/public/steam/steamclientpublic.h +++ b/public/steam/steamclientpublic.h @@ -141,6 +141,7 @@ enum EResult k_EResultCantRemoveItem = 113, // item can't be removed k_EResultAccountDeleted = 114, // account has been deleted k_EResultExistingUserCancelledLicense = 115, // A license for this already exists, but cancelled + k_EResultCommunityCooldown = 116, // access is denied because of a community cooldown (probably from support profile data resets) }; // Error codes for use with the voice functions @@ -246,9 +247,9 @@ enum EAccountType enum EAppReleaseState { k_EAppReleaseState_Unknown = 0, // unknown, required appinfo or license info is missing - k_EAppReleaseState_Unavailable = 1, // even if user 'just' owns it, can see game at all - k_EAppReleaseState_Prerelease = 2, // can be purchased and is visible in games list, nothing else. Common appInfo section released - k_EAppReleaseState_PreloadOnly = 3, // owners can preload app, not play it. AppInfo fully released. + k_EAppReleaseState_Unavailable = 1, // even owners can't see game in library yet, no AppInfo released + k_EAppReleaseState_Prerelease = 2, // app can be purchased and is visible in library, nothing else. Only Common AppInfo section released + k_EAppReleaseState_PreloadOnly = 3, // owners can preload app, but not play it. All AppInfo sections fully released k_EAppReleaseState_Released = 4, // owners can download and play app. }; @@ -280,6 +281,7 @@ enum EAppOwnershipFlags k_EAppOwnershipFlags_SiteLicense = 0x40000, // Is from a site license k_EAppOwnershipFlags_LegacyFreeSub = 0x80000, // App only owned through Steam's legacy free sub k_EAppOwnershipFlags_InvalidOSType = 0x100000, // app not supported on current OS version, used to indicate a game is 32-bit on post-catalina. Currently it's own flag so the library will display a notice. + k_EAppOwnershipFlags_TimedTrial = 0x200000, // App is playable only for limited time }; @@ -504,6 +506,18 @@ static inline bool BIsVRLaunchOptionType( const ELaunchOptionType eType ) } +//----------------------------------------------------------------------------- +// Purpose: true if this launch option is any of the vr launching types +//----------------------------------------------------------------------------- +static inline bool BIsLaunchOptionTypeExemptFromGameTheater( const ELaunchOptionType eType ) +{ + return eType == k_ELaunchOptionType_Config + || eType == k_ELaunchOptionType_Server + || eType == k_ELaunchOptionType_Editor + || eType == k_ELaunchOptionType_Manual; +} + + //----------------------------------------------------------------------------- // Purpose: code points for VR HMD vendors and models // WARNING: DO NOT RENUMBER EXISTING VALUES - STORED IN A DATABASE @@ -693,6 +707,18 @@ enum EDurationControlNotification }; +// +// Specifies a game's online state in relation to duration control +// +enum EDurationControlOnlineState +{ + k_EDurationControlOnlineState_Invalid = 0, // nil value + k_EDurationControlOnlineState_Offline = 1, // currently in offline play - single-player, offline co-op, etc. + k_EDurationControlOnlineState_Online = 2, // currently in online play + k_EDurationControlOnlineState_OnlineHighPri = 3, // currently in online play and requests not to be interrupted +}; + + #pragma pack( push, 1 ) #define CSTEAMID_DEFINED diff --git a/public/steam/steamencryptedappticket.h b/public/steam/steamencryptedappticket.h index ca900ea..4419a0b 100644 --- a/public/steam/steamencryptedappticket.h +++ b/public/steam/steamencryptedappticket.h @@ -34,3 +34,7 @@ S_API bool SteamEncryptedAppTicket_BGetAppDefinedValue( uint8 *rgubTicketDecrypt S_API const uint8 *SteamEncryptedAppTicket_GetUserVariableData( uint8 *rgubTicketDecrypted, uint32 cubTicketDecrypted, uint32 *pcubUserData ); S_API bool SteamEncryptedAppTicket_BIsTicketSigned( uint8 *rgubTicketDecrypted, uint32 cubTicketDecrypted, const uint8 *pubRSAKey, uint32 cubRSAKey ); + +S_API bool SteamEncryptedAppTicket_BIsLicenseBorrowed( uint8 *rgubTicketDecrypted, uint32 cubTicketDecrypted ); + +S_API bool SteamEncryptedAppTicket_BIsLicenseTemporary( uint8 *rgubTicketDecrypted, uint32 cubTicketDecrypted ); diff --git a/public/steam/steamhttpenums.h b/public/steam/steamhttpenums.h index d95f195..056b0e5 100644 --- a/public/steam/steamhttpenums.h +++ b/public/steam/steamhttpenums.h @@ -84,6 +84,7 @@ enum EHTTPStatusCode k_EHTTPStatusCode417ExpectationFailed = 417, k_EHTTPStatusCode4xxUnknown = 418, // 418 is reserved, so we'll use it to mean unknown k_EHTTPStatusCode429TooManyRequests = 429, + k_EHTTPStatusCode444ConnectionClosed = 444, // nginx only? // Server error codes k_EHTTPStatusCode500InternalServerError = 500, diff --git a/public/steam/steamnetworkingtypes.h b/public/steam/steamnetworkingtypes.h index 54383c0..5f92c38 100644 --- a/public/steam/steamnetworkingtypes.h +++ b/public/steam/steamnetworkingtypes.h @@ -22,7 +22,6 @@ #endif #define STEAMNETWORKINGSOCKETS_STEAMCLIENT #define STEAMNETWORKINGSOCKETS_ENABLE_SDR -#define STEAMNETWORKINGSOCKETS_ENABLE_P2P #include "steam_api_common.h" // //---------------------------------------- @@ -180,6 +179,8 @@ struct SteamNetworkingIPAddr /// form according to RFC5952. If you include the port, IPv6 will be surrounded by /// brackets, e.g. [::1:2]:80. Your buffer should be at least k_cchMaxString bytes /// to avoid truncation + /// + /// See also SteamNetworkingIdentityRender inline void ToString( char *buf, size_t cbBuf, bool bWithPort ) const; /// Parse an IP address and optional port. If a port is not present, it is set to 0. @@ -248,11 +249,13 @@ struct SteamNetworkingIdentity /// or any other time you need to encode the identity as a string. It has a /// URL-like format (type:). Your buffer should be at least /// k_cchMaxString bytes big to avoid truncation. + /// + /// See also SteamNetworkingIPAddrRender void ToString( char *buf, size_t cbBuf ) const; /// Parse back a string that was generated using ToString. If we don't understand the /// string, but it looks "reasonable" (it matches the pattern type: and doesn't - /// have any funcky characters, etc), then we will return true, and the type is set to + /// have any funky characters, etc), then we will return true, and the type is set to /// k_ESteamNetworkingIdentityType_UnknownType. false will only be returned if the string /// looks invalid. bool ParseString( const char *pszStr ); @@ -463,7 +466,7 @@ enum ESteamNetConnectionEnd // on our end k_ESteamNetConnectionEnd_Local_HostedServerPrimaryRelay = 3003, - // We're not able to get the network config. This is + // We're not able to get the SDR network config. This is // *almost* always a local issue, since the network config // comes from the CDN, which is pretty darn reliable. k_ESteamNetConnectionEnd_Local_NetworkConfig = 3004, @@ -472,6 +475,14 @@ enum ESteamNetConnectionEnd // to do this. k_ESteamNetConnectionEnd_Local_Rights = 3005, + // ICE P2P rendezvous failed because we were not able to + // determine our "public" address (e.g. reflexive address via STUN) + // + // If relay fallback is available (it always is on Steam), then + // this is only used internally and will not be returned as a high + // level failure. + k_ESteamNetConnectionEnd_Local_P2P_ICE_NoPublicAddresses = 3006, + k_ESteamNetConnectionEnd_Local_Max = 3999, // 4xxx: Connection failed or ended, and it appears that the @@ -514,6 +525,15 @@ enum ESteamNetConnectionEnd // (Probably the code you are running is too old.) k_ESteamNetConnectionEnd_Remote_BadProtocolVersion = 4006, + // NAT punch failed failed because we never received any public + // addresses from the remote host. (But we did receive some + // signals form them.) + // + // If relay fallback is available (it always is on Steam), then + // this is only used internally and will not be returned as a high + // level failure. + k_ESteamNetConnectionEnd_Remote_P2P_ICE_NoPublicAddresses = 4007, + k_ESteamNetConnectionEnd_Remote_Max = 4999, // 5xxx: Connection failed for some other reason. @@ -546,6 +566,21 @@ enum ESteamNetConnectionEnd // job to open and maintain those sessions.) k_ESteamNetConnectionEnd_Misc_NoRelaySessionsToClient = 5006, + // While trying to initiate a connection, we never received + // *any* communication from the peer. + //k_ESteamNetConnectionEnd_Misc_ServerNeverReplied = 5007, + + // P2P rendezvous failed in a way that we don't have more specific + // information + k_ESteamNetConnectionEnd_Misc_P2P_Rendezvous = 5008, + + // NAT punch failed, probably due to NAT/firewall configuration. + // + // If relay fallback is available (it always is on Steam), then + // this is only used internally and will not be returned as a high + // level failure. + k_ESteamNetConnectionEnd_Misc_P2P_NAT_Firewall = 5009, + k_ESteamNetConnectionEnd_Misc_Max = 5999, k_ESteamNetConnectionEnd__Force32Bit = 0x7fffffff @@ -1055,6 +1090,39 @@ enum ESteamNetworkingConfigValue /// (This flag is itself a dev variable.) k_ESteamNetworkingConfig_EnumerateDevVars = 35, + // + // P2P settings + // + +// /// [listen socket int32] When you create a P2P listen socket, we will automatically +// /// open up a UDP port to listen for LAN connections. LAN connections can be made +// /// without any signaling: both sides can be disconnected from the Internet. +// /// +// /// This value can be set to zero to disable the feature. +// k_ESteamNetworkingConfig_P2P_Discovery_Server_LocalPort = 101, +// +// /// [connection int32] P2P connections can perform broadcasts looking for the peer +// /// on the LAN. +// k_ESteamNetworkingConfig_P2P_Discovery_Client_RemotePort = 102, + + /// [connection string] Comma-separated list of STUN servers that can be used + /// for NAT piercing. If you set this to an empty string, NAT piercing will + /// not be attempted. Also if "public" candidates are not allowed for + /// P2P_Transport_ICE_Enable, then this is ignored. + k_ESteamNetworkingConfig_P2P_STUN_ServerList = 103, + + /// [connection int32] What types of ICE candidates to share with the peer. + /// See k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_xxx values + k_ESteamNetworkingConfig_P2P_Transport_ICE_Enable = 104, + + /// [connection int32] When selecting P2P transport, add various + /// penalties to the scores for selected transports. (Route selection + /// scores are on a scale of milliseconds. The score begins with the + /// route ping time and is then adjusted.) + k_ESteamNetworkingConfig_P2P_Transport_ICE_Penalty = 105, + k_ESteamNetworkingConfig_P2P_Transport_SDR_Penalty = 106, + //k_ESteamNetworkingConfig_P2P_Transport_LANBeacon_Penalty = 107, + // // Settings for SDR relayed connections // @@ -1105,11 +1173,15 @@ enum ESteamNetworkingConfigValue k_ESteamNetworkingConfig_SDRClient_FakeClusterPing = 36, // - // Log levels for debuging information. A higher priority - // (lower numeric value) will cause more stuff to be printed. + // Log levels for debugging information of various subsystems. + // Higher numeric values will cause more stuff to be printed. + // See ISteamNetworkingUtils::SetDebugOutputFunction for more + // information + // + // The default for all values is k_ESteamNetworkingSocketsDebugOutputType_Warning. // k_ESteamNetworkingConfig_LogLevel_AckRTT = 13, // [connection int32] RTT calculations for inline pings and replies - k_ESteamNetworkingConfig_LogLevel_PacketDecode = 14, // [connection int32] log SNP packets send + k_ESteamNetworkingConfig_LogLevel_PacketDecode = 14, // [connection int32] log SNP packets send/recv k_ESteamNetworkingConfig_LogLevel_Message = 15, // [connection int32] log each message send/recv k_ESteamNetworkingConfig_LogLevel_PacketGaps = 16, // [connection int32] dropped packets k_ESteamNetworkingConfig_LogLevel_P2PRendezvous = 17, // [connection int32] P2P rendezvous messages @@ -1118,6 +1190,14 @@ enum ESteamNetworkingConfigValue k_ESteamNetworkingConfigValue__Force32Bit = 0x7fffffff }; +// Bitmask of types to share +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Default = -1; // Special value - use user defaults +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Disable = 0; // Do not do any ICE work at all or share any IP addresses with peer +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Relay = 1; // Relayed connection via TURN server. +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Private = 2; // host addresses that appear to be link-local or RFC1918 addresses +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Public = 4; // STUN reflexive addresses, or host address that isn't a "private" address +const int k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_All = 0x7fffffff; + /// In a few places we need to set configuration options on listen sockets and connections, and /// have them take effect *before* the listen socket or connection really starts doing anything. /// Creating the object and then setting the options "immediately" after creation doesn't work @@ -1214,6 +1294,8 @@ inline SteamNetworkingPOPID CalculateSteamNetworkingPOPIDFromString( const char } /// Unpack integer to string representation, including terminating '\0' +/// +/// See also SteamNetworkingPOPIDRender template inline void GetSteamNetworkingLocationPOPStringFromID( SteamNetworkingPOPID id, char (&szCode)[N] ) { @@ -1228,6 +1310,16 @@ inline void GetSteamNetworkingLocationPOPStringFromID( SteamNetworkingPOPID id, /// The POPID "dev" is used in non-production environments for testing. const SteamNetworkingPOPID k_SteamDatagramPOPID_dev = ( (uint32)'d' << 16U ) | ( (uint32)'e' << 8U ) | (uint32)'v'; +/// Utility class for printing a SteamNetworkingPOPID. +struct SteamNetworkingPOPIDRender +{ + SteamNetworkingPOPIDRender( SteamNetworkingPOPID x ) { GetSteamNetworkingLocationPOPStringFromID( x, buf ); } + inline const char *c_str() const { return buf; } +private: + char buf[ 8 ]; +}; + + /////////////////////////////////////////////////////////////////////////////// // // Internal stuff @@ -1268,14 +1360,14 @@ inline bool SteamNetworkingIdentity::operator==(const SteamNetworkingIdentity &x inline void SteamNetworkingMessage_t::Release() { (*m_pfnRelease)( this ); } #if defined( STEAMNETWORKINGSOCKETS_STATIC_LINK ) || !defined( STEAMNETWORKINGSOCKETS_STEAMCLIENT ) -STEAMNETWORKINGSOCKETS_INTERFACE void SteamAPI_SteamNetworkingIPAddr_ToString( const SteamNetworkingIPAddr *pAddr, char *buf, size_t cbBuf, bool bWithPort ); -STEAMNETWORKINGSOCKETS_INTERFACE bool SteamAPI_SteamNetworkingIPAddr_ParseString( SteamNetworkingIPAddr *pAddr, const char *pszStr ); -STEAMNETWORKINGSOCKETS_INTERFACE void SteamAPI_SteamNetworkingIdentity_ToString( const SteamNetworkingIdentity &identity, char *buf, size_t cbBuf ); -STEAMNETWORKINGSOCKETS_INTERFACE bool SteamAPI_SteamNetworkingIdentity_ParseString( SteamNetworkingIdentity *pIdentity, size_t sizeofIdentity, const char *pszStr ); -inline void SteamNetworkingIPAddr::ToString( char *buf, size_t cbBuf, bool bWithPort ) const { SteamAPI_SteamNetworkingIPAddr_ToString( this, buf, cbBuf, bWithPort ); } -inline bool SteamNetworkingIPAddr::ParseString( const char *pszStr ) { return SteamAPI_SteamNetworkingIPAddr_ParseString( this, pszStr ); } -inline void SteamNetworkingIdentity::ToString( char *buf, size_t cbBuf ) const { SteamAPI_SteamNetworkingIdentity_ToString( *this, buf, cbBuf ); } -inline bool SteamNetworkingIdentity::ParseString( const char *pszStr ) { return SteamAPI_SteamNetworkingIdentity_ParseString( this, sizeof(*this), pszStr ); } +STEAMNETWORKINGSOCKETS_INTERFACE void SteamNetworkingIPAddr_ToString( const SteamNetworkingIPAddr *pAddr, char *buf, size_t cbBuf, bool bWithPort ); +STEAMNETWORKINGSOCKETS_INTERFACE bool SteamNetworkingIPAddr_ParseString( SteamNetworkingIPAddr *pAddr, const char *pszStr ); +STEAMNETWORKINGSOCKETS_INTERFACE void SteamNetworkingIdentity_ToString( const SteamNetworkingIdentity *pIdentity, char *buf, size_t cbBuf ); +STEAMNETWORKINGSOCKETS_INTERFACE bool SteamNetworkingIdentity_ParseString( SteamNetworkingIdentity *pIdentity, size_t sizeofIdentity, const char *pszStr ); +inline void SteamNetworkingIPAddr::ToString( char *buf, size_t cbBuf, bool bWithPort ) const { SteamNetworkingIPAddr_ToString( this, buf, cbBuf, bWithPort ); } +inline bool SteamNetworkingIPAddr::ParseString( const char *pszStr ) { return SteamNetworkingIPAddr_ParseString( this, pszStr ); } +inline void SteamNetworkingIdentity::ToString( char *buf, size_t cbBuf ) const { SteamNetworkingIdentity_ToString( this, buf, cbBuf ); } +inline bool SteamNetworkingIdentity::ParseString( const char *pszStr ) { return SteamNetworkingIdentity_ParseString( this, sizeof(*this), pszStr ); } #endif #endif // #ifndef API_GEN diff --git a/redistributable_bin/linux32/libsteam_api.so b/redistributable_bin/linux32/libsteam_api.so index 7c42e16..7c296c3 100644 Binary files a/redistributable_bin/linux32/libsteam_api.so and b/redistributable_bin/linux32/libsteam_api.so differ diff --git a/redistributable_bin/linux64/libsteam_api.so b/redistributable_bin/linux64/libsteam_api.so index 33762a7..97801bd 100644 Binary files a/redistributable_bin/linux64/libsteam_api.so and b/redistributable_bin/linux64/libsteam_api.so differ diff --git a/redistributable_bin/osx/libsteam_api.dylib b/redistributable_bin/osx/libsteam_api.dylib index 97b6446..8b4a95a 100644 Binary files a/redistributable_bin/osx/libsteam_api.dylib and b/redistributable_bin/osx/libsteam_api.dylib differ diff --git a/redistributable_bin/steam_api.dll b/redistributable_bin/steam_api.dll index 6e0f440..8a9939b 100644 Binary files a/redistributable_bin/steam_api.dll and b/redistributable_bin/steam_api.dll differ diff --git a/redistributable_bin/steam_api.lib b/redistributable_bin/steam_api.lib index 66182e3..6e7ba1d 100644 Binary files a/redistributable_bin/steam_api.lib and b/redistributable_bin/steam_api.lib differ diff --git a/redistributable_bin/win64/steam_api64.dll b/redistributable_bin/win64/steam_api64.dll index ad13f2b..a0ded9f 100644 Binary files a/redistributable_bin/win64/steam_api64.dll and b/redistributable_bin/win64/steam_api64.dll differ diff --git a/redistributable_bin/win64/steam_api64.lib b/redistributable_bin/win64/steam_api64.lib index 9be697b..79b2a15 100644 Binary files a/redistributable_bin/win64/steam_api64.lib and b/redistributable_bin/win64/steam_api64.lib differ diff --git a/steamworksexample/gameenginewin32.cpp b/steamworksexample/gameenginewin32.cpp index 222197a..69fb60c 100644 --- a/steamworksexample/gameenginewin32.cpp +++ b/steamworksexample/gameenginewin32.cpp @@ -214,8 +214,7 @@ CGameEngineWin32::CGameEngineWin32( HINSTANCE hInstance, int nShowCommand, int32 // Create a mastering voice if( FAILED( m_pXAudio2->CreateMasteringVoice( &m_pMasteringVoice, XAUDIO2_DEFAULT_CHANNELS, VOICE_OUTPUT_SAMPLE_RATE ) ) ) { - ::MessageBoxA( NULL, "Failed to create mastering voice", "SteamworksExample - Fatal error", MB_OK | MB_ICONERROR ); - return; + ::MessageBoxA( NULL, "Failed to create mastering voice", "SteamworksExample", MB_OK | MB_ICONERROR ); } diff --git a/steamworksexample/steamworksexample.xcodeproj/project.pbxproj b/steamworksexample/steamworksexample.xcodeproj/project.pbxproj index b50f47c..a30e454 100644 --- a/steamworksexample/steamworksexample.xcodeproj/project.pbxproj +++ b/steamworksexample/steamworksexample.xcodeproj/project.pbxproj @@ -51,6 +51,9 @@ 50E77DF61362190C000FC072 /* mathlite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50E77DE91362190C000FC072 /* mathlite.cpp */; }; 50E77DF813621991000FC072 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50E77DF713621991000FC072 /* IOKit.framework */; }; 840B387019BB91C50084B9F1 /* htmlsurface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 840B386E19BB91C50084B9F1 /* htmlsurface.cpp */; }; + A4B5A0FD24906974000E9151 /* RemotePlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A4B5A0FC24906974000E9151 /* RemotePlay.cpp */; }; + A4B5A101249069C9000E9151 /* remotestoragesync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A4B5A0FF249069C9000E9151 /* remotestoragesync.cpp */; }; + A4B5A10424906A0E000E9151 /* SimpleProtobuf.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A4B5A10324906A0E000E9151 /* SimpleProtobuf.cpp */; }; BA60B6B81A82EDD200F4AC4F /* Friends.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA60B6B41A82EDD200F4AC4F /* Friends.cpp */; }; BA60B6B91A82EDD200F4AC4F /* Inventory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA60B6B61A82EDD200F4AC4F /* Inventory.cpp */; }; F803305119087F9200344590 /* musicplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F803305019087F9200344590 /* musicplayer.cpp */; }; @@ -160,6 +163,12 @@ 50E77DF713621991000FC072 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 840B386E19BB91C50084B9F1 /* htmlsurface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = htmlsurface.cpp; sourceTree = ""; }; 840B386F19BB91C50084B9F1 /* htmlsurface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = htmlsurface.h; sourceTree = ""; }; + A4B5A0FC24906974000E9151 /* RemotePlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemotePlay.cpp; sourceTree = ""; }; + A4B5A0FE2490698A000E9151 /* RemotePlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemotePlay.h; sourceTree = ""; }; + A4B5A0FF249069C9000E9151 /* remotestoragesync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remotestoragesync.cpp; sourceTree = ""; }; + A4B5A100249069C9000E9151 /* remotestoragesync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remotestoragesync.h; sourceTree = ""; }; + A4B5A10224906A0E000E9151 /* SimpleProtobuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleProtobuf.h; sourceTree = ""; }; + A4B5A10324906A0E000E9151 /* SimpleProtobuf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleProtobuf.cpp; sourceTree = ""; }; BA60B6B41A82EDD200F4AC4F /* Friends.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Friends.cpp; sourceTree = ""; }; BA60B6B51A82EDD200F4AC4F /* Friends.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Friends.h; sourceTree = ""; }; BA60B6B61A82EDD200F4AC4F /* Inventory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Inventory.cpp; sourceTree = ""; }; @@ -228,6 +237,9 @@ 503C6CE71268F49F00B66E3B /* Main.cpp */, 503C6CE81268F49F00B66E3B /* MainMenu.cpp */, F803305019087F9200344590 /* musicplayer.cpp */, + A4B5A0FC24906974000E9151 /* RemotePlay.cpp */, + A4B5A0FF249069C9000E9151 /* remotestoragesync.cpp */, + A4B5A10324906A0E000E9151 /* SimpleProtobuf.cpp */, ); name = Source; sourceTree = ""; @@ -297,6 +309,9 @@ 503C6CE91268F49F00B66E3B /* MainMenu.h */, 503C6CEA1268F49F00B66E3B /* Messages.h */, F803304F19087DA600344590 /* musicplayer.h */, + A4B5A0FE2490698A000E9151 /* RemotePlay.h */, + A4B5A100249069C9000E9151 /* remotestoragesync.h */, + A4B5A10224906A0E000E9151 /* SimpleProtobuf.h */, ); name = Headers; sourceTree = ""; @@ -403,6 +418,7 @@ 503C6D131268F49F00B66E3B /* glstringosx.mm in Sources */, 503C6D141268F49F00B66E3B /* Leaderboards.cpp in Sources */, 503C6D151268F49F00B66E3B /* Lobby.cpp in Sources */, + A4B5A0FD24906974000E9151 /* RemotePlay.cpp in Sources */, 503C6D161268F49F00B66E3B /* Main.cpp in Sources */, 503C6D171268F49F00B66E3B /* MainMenu.cpp in Sources */, 503C6D191268F49F00B66E3B /* p2pauth.cpp in Sources */, @@ -426,12 +442,14 @@ BA60B6B91A82EDD200F4AC4F /* Inventory.cpp in Sources */, 50E77DEE1362190C000FC072 /* cglmquery.cpp in Sources */, 50E77DEF1362190C000FC072 /* cglmtex.cpp in Sources */, + A4B5A10424906A0E000E9151 /* SimpleProtobuf.cpp in Sources */, 50E77DF01362190C000FC072 /* dx9asmtogl2.cpp in Sources */, 50E77DF11362190C000FC072 /* dxabstract.cpp in Sources */, 50E77DF21362190C000FC072 /* glmgr.cpp in Sources */, 50E77DF31362190C000FC072 /* glmgrbasics.cpp in Sources */, 50E77DF41362190C000FC072 /* glmgrcocoa.mm in Sources */, 50E77DF51362190C000FC072 /* glmgrext.cpp in Sources */, + A4B5A101249069C9000E9151 /* remotestoragesync.cpp in Sources */, BA60B6B81A82EDD200F4AC4F /* Friends.cpp in Sources */, 50E77DF61362190C000FC072 /* mathlite.cpp in Sources */, 50D642871461EF3200A5739B /* clanchatroom.cpp in Sources */, @@ -455,8 +473,9 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = NO; + OTHER_CODE_SIGN_FLAGS = "--deep"; PREBINDING = NO; SDKROOT = macosx10.9; USER_HEADER_SEARCH_PATHS = ../public; @@ -475,8 +494,9 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = NO; + OTHER_CODE_SIGN_FLAGS = "--deep"; PREBINDING = NO; SDKROOT = macosx10.9; USER_HEADER_SEARCH_PATHS = ../public; @@ -504,7 +524,6 @@ "\"$(SRCROOT)/../lib/osx/release\"", ../redistributable_bin/osx/, ); - MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = steamworksexample; SDKROOT = macosx10.9; WRAPPER_EXTENSION = app; @@ -533,7 +552,6 @@ "\"$(SRCROOT)/../lib/osx/release\"", ../redistributable_bin/osx/, ); - MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = steamworksexample; SDKROOT = macosx10.9; WRAPPER_EXTENSION = app; diff --git a/tools/ContentBuilder/builder/steamcmd.exe b/tools/ContentBuilder/builder/steamcmd.exe index 14b5c5b..eab93fb 100644 Binary files a/tools/ContentBuilder/builder/steamcmd.exe and b/tools/ContentBuilder/builder/steamcmd.exe differ diff --git a/tools/ContentBuilder/builder_osx/crashhandler.dylib b/tools/ContentBuilder/builder_osx/crashhandler.dylib new file mode 100644 index 0000000..20cf99e Binary files /dev/null and b/tools/ContentBuilder/builder_osx/crashhandler.dylib differ diff --git a/tools/ContentBuilder/builder_osx/osx/crashhandler.dylib b/tools/ContentBuilder/builder_osx/osx/crashhandler.dylib deleted file mode 100644 index 1b3cc80..0000000 Binary files a/tools/ContentBuilder/builder_osx/osx/crashhandler.dylib and /dev/null differ diff --git a/tools/ContentBuilder/builder_osx/osx/steamcmd b/tools/ContentBuilder/builder_osx/steamcmd similarity index 52% rename from tools/ContentBuilder/builder_osx/osx/steamcmd rename to tools/ContentBuilder/builder_osx/steamcmd index 827a29a..44abf88 100644 Binary files a/tools/ContentBuilder/builder_osx/osx/steamcmd and b/tools/ContentBuilder/builder_osx/steamcmd differ diff --git a/tools/ContentBuilder/builder_osx/steamcmd.sh b/tools/ContentBuilder/builder_osx/steamcmd.sh index 345b2d7..76530a2 100644 --- a/tools/ContentBuilder/builder_osx/steamcmd.sh +++ b/tools/ContentBuilder/builder_osx/steamcmd.sh @@ -1,15 +1,20 @@ #!/usr/bin/env bash STEAMROOT="$(cd "${0%/*}" && echo $PWD)" -STEAMEXE=`basename "$0" .sh` +STEAMCMD=`basename "$0" .sh` UNAME=`uname` if [ "$UNAME" == "Linux" ]; then - PLATFORM=linux32 - export LD_LIBRARY_PATH="$STEAMROOT/$PLATFORM:$LD_LIBRARY_PATH" + STEAMEXE="${STEAMROOT}/linux32/${STEAMCMD}" + PLATFORM="linux32" + export LD_LIBRARY_PATH="$STEAMROOT/$PLATFORM:$LD_LIBRARY_PATH" else # if [ "$UNAME" == "Darwin" ]; then - PLATFORM=osx - export DYLD_LIBRARY_PATH="$STEAMROOT/$PLATFORM:$DYLD_LIBRARY_PATH" + STEAMEXE="${STEAMROOT}/${STEAMCMD}" + if [ ! -x ${STEAMEXE} ]; then + STEAMEXE="${STEAMROOT}/Steam.AppBundle/Steam/Contents/MacOS/${STEAMCMD}" + fi + export DYLD_LIBRARY_PATH="$STEAMROOT:$DYLD_LIBRARY_PATH" + export DYLD_FRAMEWORK_PATH="$STEAMROOT:$DYLD_FRAMEWORK_PATH" fi ulimit -n 2048 @@ -17,19 +22,19 @@ ulimit -n 2048 MAGIC_RESTART_EXITCODE=42 if [ "$DEBUGGER" == "gdb" ] || [ "$DEBUGGER" == "cgdb" ]; then - ARGSFILE=$(mktemp $USER.steam.gdb.XXXX) + ARGSFILE=$(mktemp $USER.steam.gdb.XXXX) - # Set the LD_PRELOAD varname in the debugger, and unset the global version. - if [ "$LD_PRELOAD" ]; then - echo set env LD_PRELOAD=$LD_PRELOAD >> "$ARGSFILE" - echo show env LD_PRELOAD >> "$ARGSFILE" - unset LD_PRELOAD - fi + # Set the LD_PRELOAD varname in the debugger, and unset the global version. + if [ "$LD_PRELOAD" ]; then + echo set env LD_PRELOAD=$LD_PRELOAD >> "$ARGSFILE" + echo show env LD_PRELOAD >> "$ARGSFILE" + unset LD_PRELOAD + fi - $DEBUGGER -x "$ARGSFILE" "$STEAMROOT/$PLATFORM/$STEAMEXE" "$@" - rm "$ARGSFILE" + $DEBUGGER -x "$ARGSFILE" "$STEAMEXE" "$@" + rm "$ARGSFILE" else - $DEBUGGER "$STEAMROOT/$PLATFORM/$STEAMEXE" "$@" + $DEBUGGER "$STEAMEXE" "$@" fi STATUS=$? diff --git a/tools/codesigning/build_steam_signatures_file.py b/tools/codesigning/build_steam_signatures_file.py new file mode 100644 index 0000000..1daf18a --- /dev/null +++ b/tools/codesigning/build_steam_signatures_file.py @@ -0,0 +1,241 @@ +import os +import io +import sys +import re + +# wrapper for print +def printw( message ): + print( message ) + +try: + import Crypto + from Crypto.Signature import PKCS1_v1_5 + from Crypto.Hash import SHA + from Crypto.PublicKey import RSA +except Exception as e: + printw( "Missing required module: "+str(e) ) + sys.exit( -1 ) + +try: + import zlib +except Exception as e: + printw( "Missing required module: "+str(e) ) + sys.exit( -1 ) + +try: + import hashlib +except Exception as e: + printw( "Missing required module: "+str(e) ) + sys.exit( -1 ) + +try: + import ctypes +except Exception as e: + printw( "Missing required module: "+str(e) ) + sys.exit( -1 ) + + +def usage(): + printw( "usage to verify a signaturefile:"+ sys.argv[0]+ " signaturefile publickeyfile" ) + printw( "usage to write a new signaturefile:"+ sys.argv[0]+ " signaturefile publickeyfile privatekeyfile newfilename" ) + printw( "" ) + +def readkeyfile( publickeyfilename ): + # read the public key file. + rawkey = open(publickeyfilename, mode='rb').read() + # import as an RSA key + key = RSA.importKey(rawkey) + return key + +def signmessage_add_digest( message, privatekeyfile ): + key = RSA.importKey(open( privatekeyfile, mode='rb' ).read()) + h = SHA.new(message) + signer = PKCS1_v1_5.new(key) + signature = signer.sign(h) + sighex = signature.encode("hex") + return "DIGEST:"+sighex.upper()+"\r\n" + +def checkdigest( signaturefilename, key ): + with open(signaturefilename, mode='rb') as file: + fileContent = file.read() + + # find the start of the digest + idxtodigest = fileContent.find('DIGEST:') + if idxtodigest == 0: + return 0 + + # the message is everything else + message = fileContent[0:idxtodigest] + + digestpart = fileContent[idxtodigest+7:] + digestpart = digestpart.replace("\r\n","") + signature = digestpart.decode("hex") + + try: + h = SHA.new(message) + verifier = PKCS1_v1_5.new(key) + if not verifier.verify(h, signature): + return 0 + except Exception as e: + printw( "could not verify signature: "+str(e) ) + return message + +def crchex( crc32 ): + crc32b = ctypes.c_uint32(crc32).value + crc32hex = hex(crc32b).upper().replace("0X","").replace("L","") + lenhex = len(crc32hex) + # pad to 8 chars with leading 0s + padding = 8 - lenhex + while padding: + crc32hex = "0"+crc32hex + padding = padding - 1 + # byte swap + crc32hex_reverse = crc32hex[6:8]+crc32hex[4:6]+crc32hex[2:4]+crc32hex[0:2] + return crc32hex_reverse + +def parsehashes( message, pathto ): + # now verify all the file hashes + newmessage = "" + lines = message.split("\r\n") + for line in lines: + if len(line) == 0: + break + # parse the line, should be 5 parts + # filename "~SHA1" sha1 ";CRC:" crc32 + parts=re.split(';|:|~',line) + if len(parts) != 5: + printw( "The file format is unexpected line:"+line ) + break + if parts[1] != "SHA1" or parts[3] != "CRC": + printw( "The file format is unexpected line:"+line ) + break + + hashprovided = parts[2] + crcprovided = parts[4] + onefile = parts[0] + onefile = onefile.replace("...\\","") + onefilepath = os.path.join( pathto, onefile ) + try: + with open(onefilepath, mode='rb') as file: + targetcontent = file.read() + except: + printw( "could not open: "+onefilepath ) + continue + + # compute sha1 of file + mm = hashlib.sha1() + mm.update(targetcontent) + newhash = mm.hexdigest().upper() + # compute crc32 of file + crc32 = zlib.crc32(targetcontent) + crc32hex = crchex(crc32) + if ( newhash == hashprovided.upper() and + crc32hex == crcprovided.upper() ): + printw( "The hashes are correct for "+onefile ) + else: + printw( "The hashes are different for "+onefile+" sha: "+newhash+" "+hashprovided.upper()+" CRC "+crc32hex+" "+crcprovided.upper() ) + # accumulate new hashes + linenew = "...\\"+onefile+"~SHA1:"+newhash+";CRC:"+crc32hex+"\r\n" + newmessage += linenew + + return newmessage + +def signatures_need_update( signaturefilename, publickeyfilename ): + + if not os.path.exists( signaturefilename ): + printw( "Signature file does not exist" ) + sys.stdout.flush() + return False + + pathto = os.path.split(signaturefilename)[0] + + if not os.path.exists( publickeyfilename ): + printw( "Public key file does not exist" ) + sys.stdout.flush() + return False + + key = readkeyfile( publickeyfilename ) + + message = checkdigest( signaturefilename, key ) + if len(message) == 0: + printw( "failed to parse signature file " ) + return False + + newmessage = parsehashes( message, pathto ) + if len(newmessage) == 0: + printw( "failed to parse hashes in signature data " ) + return False + return newmessage != message + + +def write_new_signature_file( signaturefilename, publickeyfilename, privatekeyfilename, newsignaturefilename ): + + if not os.path.exists( signaturefilename ): + printw( "Signature file does not exist" ) + sys.stdout.flush() + return -1 + + pathto = os.path.split(signaturefilename)[0] + + if not os.path.exists( publickeyfilename ): + printw( "Public key file does not exist" ) + sys.stdout.flush() + return -2 + + if not os.path.exists( privatekeyfilename ): + printw( "Private key file does not exist" ) + sys.stdout.flush() + return -3 + + if os.path.exists( newsignaturefilename ) and not os.access( newsignaturefilename, os.W_OK ): + printw( "new signatures file not writeable " ) + sys.stdout.flush() + return -4 + + key = readkeyfile( publickeyfilename ) + + message = checkdigest( signaturefilename, key ) + if len(message) == 0: + printw( "failed to parse old signature file " ) + return -5 + + newmessage = parsehashes( message, pathto ) + if len(newmessage) == 0: + printw( "failed to create new signature data " ) + return -6 + + with open( newsignaturefilename, mode='wb') as file: + file.write( newmessage ) + hexdigest = signmessage_add_digest( newmessage, privatekeyfilename ) + file.write( hexdigest ) + + printw( "new signatures file written successfully " ) + sys.stdout.flush() + return 0 + + +def main(): + + if len( sys.argv ) != 5 and len( sys.argv ) != 3: + usage() + sys.exit(2) + + # common args + signaturefilename = sys.argv[1] + publickeyfilename = sys.argv[2] + + if len( sys.argv ) == 5: + # only if writing a new file + privatekeyfilename = sys.argv[3] + newsignaturefilename = sys.argv[4] + write_new_signature_file( signaturefilename, publickeyfilename, privatekeyfilename, newsignaturefilename ) + else: + if signatures_need_update( signaturefilename, publickeyfilename ): + printw( "Some signatures did not match" ) + else: + printw( "All signatures matched" ) + + +if __name__ == '__main__': + main() + diff --git a/tools/codesigning/steam_modulesigning.public b/tools/codesigning/steam_modulesigning.public new file mode 100644 index 0000000..9c901a2 Binary files /dev/null and b/tools/codesigning/steam_modulesigning.public differ diff --git a/tools/drm/drmtool.exe b/tools/drm/drmtool.exe index f8c2f56..176021d 100644 Binary files a/tools/drm/drmtool.exe and b/tools/drm/drmtool.exe differ diff --git a/tools/drm/drmtoolp.exe b/tools/drm/drmtoolp.exe index 01ab153..7577016 100644 Binary files a/tools/drm/drmtoolp.exe and b/tools/drm/drmtoolp.exe differ diff --git a/tools/drm/ubuntu12_32/drmtoolp b/tools/drm/ubuntu12_32/drmtoolp index 7bba5ae..6e11fe6 100644 Binary files a/tools/drm/ubuntu12_32/drmtoolp and b/tools/drm/ubuntu12_32/drmtoolp differ diff --git a/tools/drm/ubuntu12_32/steamdrmp.so b/tools/drm/ubuntu12_32/steamdrmp.so index 413c695..e18a862 100644 Binary files a/tools/drm/ubuntu12_32/steamdrmp.so and b/tools/drm/ubuntu12_32/steamdrmp.so differ diff --git a/tools/drm/ubuntu12_64/drmtoolp b/tools/drm/ubuntu12_64/drmtoolp index cf80fd9..736752c 100644 Binary files a/tools/drm/ubuntu12_64/drmtoolp and b/tools/drm/ubuntu12_64/drmtoolp differ diff --git a/tools/drm/ubuntu12_64/steamdrmp.so b/tools/drm/ubuntu12_64/steamdrmp.so index e8928a3..d5b8426 100644 Binary files a/tools/drm/ubuntu12_64/steamdrmp.so and b/tools/drm/ubuntu12_64/steamdrmp.so differ