From bb3b2296dfb723fb6cedad212af0dd22eacaa4ab Mon Sep 17 00:00:00 2001 From: William Venner Date: Sat, 5 Aug 2023 16:52:37 +0100 Subject: [PATCH] Fixed Think hook not being removed, refactored cell stuff, fixed x86-64 branch builds, removed steamworks 1.50 --- lib/steamworks_150/Readme.txt | 1059 -- .../public/steam/isteamapplist.h | 67 - lib/steamworks_150/public/steam/isteamapps.h | 217 - .../public/steam/isteamappticket.h | 28 - .../public/steam/isteamclient.h | 179 - .../public/steam/isteamcontroller.h | 576 - .../public/steam/isteamfriends.h | 690 - .../public/steam/isteamgamecoordinator.h | 74 - .../public/steam/isteamgameserver.h | 391 - .../public/steam/isteamgameserverstats.h | 114 - .../public/steam/isteamhtmlsurface.h | 480 - lib/steamworks_150/public/steam/isteamhttp.h | 219 - lib/steamworks_150/public/steam/isteaminput.h | 609 - .../public/steam/isteaminventory.h | 448 - .../public/steam/isteammasterserverupdater.h | 1 - .../public/steam/isteammatchmaking.h | 1087 -- lib/steamworks_150/public/steam/isteammusic.h | 71 - .../public/steam/isteammusicremote.h | 133 - .../public/steam/isteamnetworking.h | 339 - .../public/steam/isteamnetworkingmessages.h | 189 - .../public/steam/isteamnetworkingsockets.h | 771 - .../public/steam/isteamnetworkingutils.h | 441 - .../public/steam/isteamparentalsettings.h | 63 - .../public/steam/isteamps3overlayrenderer.h | 91 - .../public/steam/isteamremoteplay.h | 88 - .../public/steam/isteamremotestorage.h | 688 - .../public/steam/isteamscreenshots.h | 120 - lib/steamworks_150/public/steam/isteamugc.h | 569 - lib/steamworks_150/public/steam/isteamuser.h | 410 - .../public/steam/isteamuserstats.h | 488 - lib/steamworks_150/public/steam/isteamutils.h | 305 - lib/steamworks_150/public/steam/isteamvideo.h | 68 - .../lib/linux32/libsdkencryptedappticket.so | Bin 1130574 -> 0 bytes .../lib/linux64/libsdkencryptedappticket.so | Bin 1024182 -> 0 bytes .../lib/osx/libsdkencryptedappticket.dylib | Bin 1755472 -> 0 bytes .../steam/lib/win32/sdkencryptedappticket.dll | Bin 631072 -> 0 bytes .../steam/lib/win32/sdkencryptedappticket.lib | Bin 5956 -> 0 bytes .../lib/win64/sdkencryptedappticket64.dll | Bin 796960 -> 0 bytes .../lib/win64/sdkencryptedappticket64.lib | Bin 5954 -> 0 bytes .../public/steam/matchmakingtypes.h | 251 - lib/steamworks_150/public/steam/steam_api.h | 297 - .../public/steam/steam_api.json | 13300 ---------------- .../public/steam/steam_api_common.h | 235 - .../public/steam/steam_api_flat.h | 1081 -- .../public/steam/steam_api_internal.h | 408 - .../public/steam/steam_gameserver.h | 110 - .../public/steam/steamclientpublic.h | 1515 -- .../public/steam/steamdatagram_tickets.h | 286 - .../public/steam/steamencryptedappticket.h | 40 - .../public/steam/steamhttpenums.h | 99 - .../public/steam/steamnetworkingtypes.h | 1616 -- .../public/steam/steamps3params.h | 112 - lib/steamworks_150/public/steam/steamtypes.h | 263 - .../public/steam/steamuniverse.h | 27 - .../linux32/libsteam_api.so | Bin 405224 -> 0 bytes .../linux64/libsteam_api.so | Bin 404222 -> 0 bytes .../osx/libsteam_api.dylib | Bin 448400 -> 0 bytes .../redistributable_bin/steam_api.dll | Bin 239392 -> 0 bytes .../redistributable_bin/steam_api.lib | Bin 352036 -> 0 bytes .../redistributable_bin/win64/steam_api64.dll | Bin 264480 -> 0 bytes .../redistributable_bin/win64/steam_api64.lib | Bin 349016 -> 0 bytes src/callbacks.rs | 18 +- src/lib.rs | 18 +- src/util.rs | 32 - src/workshop.rs | 13 +- steamworks-rs/src/lib.rs | 7 +- steamworks-rs/src/server.rs | 2 +- steamworks-rs/src/user.rs | 2 +- steamworks-rs/steamworks-sys/build.rs | 6 +- .../steamworks-sys/src/bindings_linux64.rs | 4539 ++++-- .../steamworks-sys/src/bindings_win64.rs | 4539 ++++-- 71 files changed, 6397 insertions(+), 33492 deletions(-) delete mode 100644 lib/steamworks_150/Readme.txt delete mode 100644 lib/steamworks_150/public/steam/isteamapplist.h delete mode 100644 lib/steamworks_150/public/steam/isteamapps.h delete mode 100644 lib/steamworks_150/public/steam/isteamappticket.h delete mode 100644 lib/steamworks_150/public/steam/isteamclient.h delete mode 100644 lib/steamworks_150/public/steam/isteamcontroller.h delete mode 100644 lib/steamworks_150/public/steam/isteamfriends.h delete mode 100644 lib/steamworks_150/public/steam/isteamgamecoordinator.h delete mode 100644 lib/steamworks_150/public/steam/isteamgameserver.h delete mode 100644 lib/steamworks_150/public/steam/isteamgameserverstats.h delete mode 100644 lib/steamworks_150/public/steam/isteamhtmlsurface.h delete mode 100644 lib/steamworks_150/public/steam/isteamhttp.h delete mode 100644 lib/steamworks_150/public/steam/isteaminput.h delete mode 100644 lib/steamworks_150/public/steam/isteaminventory.h delete mode 100644 lib/steamworks_150/public/steam/isteammasterserverupdater.h delete mode 100644 lib/steamworks_150/public/steam/isteammatchmaking.h delete mode 100644 lib/steamworks_150/public/steam/isteammusic.h delete mode 100644 lib/steamworks_150/public/steam/isteammusicremote.h delete mode 100644 lib/steamworks_150/public/steam/isteamnetworking.h delete mode 100644 lib/steamworks_150/public/steam/isteamnetworkingmessages.h delete mode 100644 lib/steamworks_150/public/steam/isteamnetworkingsockets.h delete mode 100644 lib/steamworks_150/public/steam/isteamnetworkingutils.h delete mode 100644 lib/steamworks_150/public/steam/isteamparentalsettings.h delete mode 100644 lib/steamworks_150/public/steam/isteamps3overlayrenderer.h delete mode 100644 lib/steamworks_150/public/steam/isteamremoteplay.h delete mode 100644 lib/steamworks_150/public/steam/isteamremotestorage.h delete mode 100644 lib/steamworks_150/public/steam/isteamscreenshots.h delete mode 100644 lib/steamworks_150/public/steam/isteamugc.h delete mode 100644 lib/steamworks_150/public/steam/isteamuser.h delete mode 100644 lib/steamworks_150/public/steam/isteamuserstats.h delete mode 100644 lib/steamworks_150/public/steam/isteamutils.h delete mode 100644 lib/steamworks_150/public/steam/isteamvideo.h delete mode 100644 lib/steamworks_150/public/steam/lib/linux32/libsdkencryptedappticket.so delete mode 100644 lib/steamworks_150/public/steam/lib/linux64/libsdkencryptedappticket.so delete mode 100644 lib/steamworks_150/public/steam/lib/osx/libsdkencryptedappticket.dylib delete mode 100644 lib/steamworks_150/public/steam/lib/win32/sdkencryptedappticket.dll delete mode 100644 lib/steamworks_150/public/steam/lib/win32/sdkencryptedappticket.lib delete mode 100644 lib/steamworks_150/public/steam/lib/win64/sdkencryptedappticket64.dll delete mode 100644 lib/steamworks_150/public/steam/lib/win64/sdkencryptedappticket64.lib delete mode 100644 lib/steamworks_150/public/steam/matchmakingtypes.h delete mode 100644 lib/steamworks_150/public/steam/steam_api.h delete mode 100644 lib/steamworks_150/public/steam/steam_api.json delete mode 100644 lib/steamworks_150/public/steam/steam_api_common.h delete mode 100644 lib/steamworks_150/public/steam/steam_api_flat.h delete mode 100644 lib/steamworks_150/public/steam/steam_api_internal.h delete mode 100644 lib/steamworks_150/public/steam/steam_gameserver.h delete mode 100644 lib/steamworks_150/public/steam/steamclientpublic.h delete mode 100644 lib/steamworks_150/public/steam/steamdatagram_tickets.h delete mode 100644 lib/steamworks_150/public/steam/steamencryptedappticket.h delete mode 100644 lib/steamworks_150/public/steam/steamhttpenums.h delete mode 100644 lib/steamworks_150/public/steam/steamnetworkingtypes.h delete mode 100644 lib/steamworks_150/public/steam/steamps3params.h delete mode 100644 lib/steamworks_150/public/steam/steamtypes.h delete mode 100644 lib/steamworks_150/public/steam/steamuniverse.h delete mode 100644 lib/steamworks_150/redistributable_bin/linux32/libsteam_api.so delete mode 100644 lib/steamworks_150/redistributable_bin/linux64/libsteam_api.so delete mode 100644 lib/steamworks_150/redistributable_bin/osx/libsteam_api.dylib delete mode 100644 lib/steamworks_150/redistributable_bin/steam_api.dll delete mode 100644 lib/steamworks_150/redistributable_bin/steam_api.lib delete mode 100644 lib/steamworks_150/redistributable_bin/win64/steam_api64.dll delete mode 100644 lib/steamworks_150/redistributable_bin/win64/steam_api64.lib delete mode 100644 src/util.rs diff --git a/lib/steamworks_150/Readme.txt b/lib/steamworks_150/Readme.txt deleted file mode 100644 index 23b0c33..0000000 --- a/lib/steamworks_150/Readme.txt +++ /dev/null @@ -1,1059 +0,0 @@ -================================================================ - -Copyright © 1996-2020, Valve Corporation, All rights reserved. - -================================================================ - - -Welcome to the Steamworks SDK. For documentation please see our partner -website at: http://partner.steamgames.com - - ----------------------------------------------------------------- -v1.50 29th August 2020 ----------------------------------------------------------------- -* Added ISteamUtils::InitFilterText() and ISteamUtils::FilterText() which allow a game to filter content and user-generated text to comply with China legal requirements, and reduce profanity and slurs based on user settings. -* Added ISteamNetworkingMessages, a new non-connection-oriented API, similar to UDP. This interface is intended to make it easy to port existing UDP code while taking advantage of the features provided by ISteamNetworkingSockets, especially Steam Datagram Relay (SDR). -* Added poll groups to ISteamNetworkingSockets. Poll groups are a way to receive messages from many different connections at a time. -* ISteamNetworkingSockets::ReceiveMessagesOnListenSocket has been removed. (Use poll groups instead.) -* Added symmetric connect mode to ISteamNetworkingSockets. This can be used to solve the coordination problem of establishing a single connection between two peers, when both peers may initiating the connection at the same time and neither peer is the “server” or “client”. -* ISteamNetworking is deprecated and may be removed in a future version of the SDK. Please use ISteamNetworkingSockets or ISteamNetworkingMessages instead. - - ----------------------------------------------------------------- -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 ----------------------------------------------------------------- - -macOS -* Fixed notarization issues caused by missing code signature of libsdkencryptedappticket.dylib - - ----------------------------------------------------------------- -v1.48 12th February 2020 ----------------------------------------------------------------- - -ISteamNetworkingSockets -* Added the concept of a "poll group", which is a way to receive messages from many connections at once, efficiently. -* ReceiveMessagesOnListenSocket was deleted. To get the same functionality, create a poll group, and then add connections to this poll group when accepting the connection. - -Flat interface redesign -* Fixed many missing interfaces and types. -* All versions of overloaded functions are now available, using distinct names. -* There are now simple, global versioned functions to fetch the interfaces. No more need to mess with HSteamPipes or HSteamUsers directly. -* The json file now has much more detailed information and several errors have been fixed. -* steam_api_interop.cs has been removed and will no longer be supported. -* There is a new manual dispatch API for callbacks, which works similarly to a windows event loop. This is a replacement for the existing callback registeration and dispatch mechanisms, which which are nice in C++ but awkward to use outside of C++. - - ----------------------------------------------------------------- -v1.47 3rd December 2019 ----------------------------------------------------------------- - -macOS -* Updated steamcmd binaries to be 64-bit - -ISteamNetworkingSockets -* Added API to set configuration options atomically, at time of creation of the listen socket or connection -* Added API to send multiple messages efficiently, without copying the message payload -* Added API for relayed P2P connections where signaling/rendezvous goes through your own custom backend instead of the Steam servers - -ISteamRemotePlay -* Added a function to invite friends to play via Remote Play Together - - ----------------------------------------------------------------- -v1.46 26th July 2019 ----------------------------------------------------------------- - -ISteamRemotePlay -* Added a new interface to get information about Steam Remote Play sessions - -ISteamInput -* Added the GetRemotePlaySessionID function to find out whether a controller is associated with a Steam Remote Play session - - ----------------------------------------------------------------- -v1.45 25th June 2019 ----------------------------------------------------------------- - -Steam Input and Steam Controller Interfaces -* Added the GetDeviceBindingRevision function which allows developers of Steam Input API games to detect out of date user configurations. Configurations w/ out of date major revisions should be automatically updated by Steam to the latest official configuration, but configurations w/ out of date minor revisions will be left in-place. - -ISteamUser -* Add duration control APIs to support anti-indulgence regulations in some territories. This includes callbacks when gameplay time thresholds have been passed, and an API to fetch the same data on the fly. - -ISteamUtils -* Add basic text filtering API. - ----------------------------------------------------------------- -v1.44 13th March 2019 ----------------------------------------------------------------- - -ISteamNetworkingSockets -* Socket-style API that relays traffic on the Valve network - -ISteamNetworkingUtils -* Tools for instantly estimating ping time between two network hosts - ----------------------------------------------------------------- -v1.43 20th February 2019 ----------------------------------------------------------------- - -ISteamParties -* This API can be used to selectively advertise your multiplayer game session in a Steam chat room group. Tell Steam the number of player spots that are available for your party, and a join-game string, and it will show a beacon in the selected group and allow that many users to “follow” the beacon to your party. Adjust the number of open slots if other players join through alternate matchmaking methods. - -ISteamController -* This interface will be deprecated and replaced with ISteamInput. For ease in upgrading the SDK ISteamController currently has feature parity with ISteamInput, but future features may not be ported back. Please use ISteamInput for new projects. -* Added GetActionOriginFromXboxOrigin, GetStringForXboxOrigin and GetGlyphForXboxOrigin to allow Xinput games to easily query glyphs for devices coming in through Steam Input’s Xinput emulation, ex: “A button”->”Cross button” on a PS4 controller. This is a simple translation of the button and does not take user remapping into account – the full action based API is required for that. -* Added TranslateActionOrigin which allows Steam Input API games to which are using look up tables to translate action origins from an recognized device released after the game was last built into origins they recognize. -* Added count and max_possible fields to current enums to make using lookup tables easier - -ISteamInput -* This new interface replaces ISteamController to better reflect the fact this API supports not just the Steam Controller but every controller connected to Steam – including Xbox Controllers, Playstation Controllers and Nintendo Switch controllers. ISteamController currently has feature parity with the new features added in ISteamInput but new feature may not be ported back. Please use this interface instead of ISteamController for any new projects. -* Migrating to ISteamInput from ISteamController should mostly be a search-replace operation but any action origin look up tables will need to be adjusted as some of the enum orders have changed. -* Added GetActionOriginFromXboxOrigin, GetStringForXboxOrigin and GetGlyphForXboxOrigin to allow Xinput games to easily query glyphs for devices coming in through Steam Input’s Xinput emulation, ex: “A button”->”Cross button” on a PS4 controller. This is a simple translation of the button and does not take user remapping into account – the full action based API is required for that. -* Added TranslateActionOrigin which allows Steam Input API games to which are using look up tables to translate action origins from an recognized device released after the game was last built into origins they recognize. -* Added count and max_possible fields to current enums to make using lookup tables easier - -ISteamFriends -* ActivateGameOverlayToWebPage – Added a new parameter to control how the created web browser window is displayed within the Steam Overlay. The default mode will create a new browser tab next to all other overlay windows that the user already has open. The new modal mode will create a new browser window and activate the Steam Overlay, showing only that window. When the browser window is closed, the Steam Overlay is automatically closed as well. - -ISteamInventory -* GetItemsWithPrices and GetItemPrice - Added the ability to get the “base price” for a set of items, which you can use to markup in your own UI that items are “on sale” - -ISteamUGC -* SetAllowLegacyUpload - Call to force the use of Steam Cloud for back-end storage (instead of Steam Pipe), which is faster and more efficient for uploading and downloading small files (less than 100MB). -* CreateQueryAllUGCRequest - Added ability to page through query results using a “cursor” instead of a page number. This is more efficient and supports “deep paging” beyond page 1000. The old version of CreateQueryAllUGCRequest() that takes a page parameter is deprecated and cannot query beyond page 1000. Note that you will need to keep track of the “previous” cursor in order to go to a previous page. - -ISteamApps -* GetLaunchCommandLine - Get command line if game was launched via Steam URL, e.g. steam://run////. If you get NewUrlLaunchParameters_t callback while running, call again to get new command line -* BIsSubscribedFromFamilySharing - Check if subscribed app is temporarily borrowed via Steam Family Sharing - -Steam API -* Refactored headers to minimize the number of headers that need to be included to use a single ISteam interface. -* Renamed some macros with STEAM_ prefix to minimize conflicts in the global namespace - - - ----------------------------------------------------------------- -v1.42 3rd January 2018 ----------------------------------------------------------------- - -ISteamInventory -* Added ability to start a purchase process through the Steam Client via the StartPurchase call and a given set of item definition ids and quantities. Users will be prompted in the Steam Client overlay to complete the purchase, including funding their Steam Wallet if necessary. Returns a SteamInventoryStartPurchaseResult_t call result if the user authorizes the purchase. -* Added ability to retrieve item definition prices via the RequestPrices call. Once the call result SteamInventoryRequestPricesResult_t is returned, GetNumItemsWithPrices, GetItemsWithPrices, and GetItemPrice can be called to retrieve the item definition prices in the user's local currency. -* Added ability to modify whitelisted per item dynamic properties. The usage pattern is to call StartUpdateProperties, SetProperty or RemoveProperty, and finally SubmitUpdateProperties. The SteamInventoryCallback_t will be fired with the appropriate result handle on success or failure. -* Deprecated TradeItems - -ISteamController -* Added Action Set Layers – Action Set Layers are optional sets of action bindings which can be overlaid upon an existing set of controls. In contrast to Action Sets, layers draw their actions from the Action Set they exist within and do not wholesale replace what is already active when applied, but apply small modifications. These can consist of setting changes as well as adding or removing bindings from the base action set. More than one layer can be applied at a time and will be applied consecutively, so an example might be the Sniper Class layer which includes tweaks or bindings specific to snipers in addition to the Scoped-In layer which alters look sensitivity. -* Added ActivateActionSetLayer – Activates the specified Layer. -* Added DeactivateActionSetLayer – Deactivates the specified Layer. -* Added DeactivateAllActionSetLayers – Deactivates all layers, resetting the mapping to the action base Action Set. -* Added GetActiveActionSetLayers – Returns all currently active Action Set Layers. -* Added GetInputTypeForHandle - Returns the input type for a particular handle, such as Steam Controller, PS4 Controller, Xbox One or 360. - -ISteamHTMLSurface -* Added HTML_BrowserRestarted_t callback which is fired when the browser has restarted due to an internal failure - -ISteamFriends -* Added IsClanPublic -* Added IsClanOfficialGameGroup - -Steam API -* Removed the ISteamUnifiedMessages interface. It is no longer intended for public usage. - - ----------------------------------------------------------------- -v1.41 13th July 2017 ----------------------------------------------------------------- - -ISteamClient -* Exposed ISteamParentalSettings interface. You can use this to determine if the user has parental settings turned on and for what high-level Steam features. - -* ISteamHTMLSurface -* Added SetDPIScalingFactor - Scale the output display space by this factor, this is useful when displaying content on high dpi devices. - -ISteamUGC -* Added ability to mark a piece of UGC as requiring a set of DLC (AppID). These relationships are managed via new AddAppDependency, RemoveAppDependency, and GetAppDependencies calls. -* Ported over ability to delete UGC from ISteamRemoteStorage and called it DeleteItem. Note that this does *not* prompt the user in any way. -* Added m_nPublishedFileId to SubmitItemUpdateResult_t so that it is easier to keep track of what item was updated. - - ----------------------------------------------------------------- -v1.40 25th April 2017 ----------------------------------------------------------------- - -ISteamInventory -* Update API documentation -* GetResultItemProperty - Retrieve dynamic properties for a given item returned in the result set. - -ISteamUtils -* IsVRHeadsetStreamingEnabled - Returns true if the HMD content will be streamed via Steam In-Home Streaming -* SetVRHeadsetStreamingEnabled - Set whether the HMD content will be streamed via Steam In-Home Streaming - -ISteamUser -* GetAvailableVoice and GetVoice - Some parameters have become deprecated and now have default values. - -ISteamUGC -* SetReturnPlaytimeStats - Set the number of days of playtime stats to return for a piece of UGC. -* AddDependency and RemoveDependency - Useful for parent-child relationship or dependency management - -ISteamVideo -* Added GetOPFSettings and GetOPFStringForApp for retrieving Open Projection Format data used in Steam 360 Video playback. -* GetOPFSettings - Handle the GetOPFSettingsResult_t callback which is called when the OPF related data for the passed in AppID is ready for retrieval. -* GetOPFStringForApp - Using the AppID returned in GetOPFSettingsResult_t pass in an allocated string buffer to get the OPF data. - -SteamPipe GUI Tool -* A simple GUI wrapper for Steamcmd/SteamPipe has been added to the SDK in the tools\ContentBuilder folder. More details can be found here: http://steamcommunity.com/groups/steamworks/discussions/0/412449508292646864 - - ----------------------------------------------------------------- -v1.39 6th January 2017 ----------------------------------------------------------------- - -ISteamController - -The two new Origin helper functions in this interface allow you to query a description and a glyph for types of controllers and inputs that are in the current SDK header, but also any type of controller that might be supported by the Steam client in the future. To achieve this, pass origin values directly returned from Get*ActionOrigin() functions into GetStringForActionOrigin() and GetGlyphForActionOrigin() and display the results programmatically without checking against the range of the Origin enumerations. - -* TriggerVibration - Trigger a vibration event on supported controllers -* SetLEDColor - Set the controller LED color on supported controllers -* GetStringForActionOrigin - Returns a localized string (from Steam's language setting) for the specified origin -* GetGlyphForActionOrigin - Get a local path to art for on-screen glyph for a particular origin -* Updated Spacewar example to include example usage - -ISteamFriends -* Removed k_EFriendFlagSuggested, since it was unused - -ISteamInventory -* Updated and corrected documentation in the API -* RequestEligiblePromoItemDefinitionsIDs - Request the list of "eligible" promo items that can be manually granted to the given user. These are promo items of type "manual" that won't be granted automatically. An example usage of this is an item that becomes available every week. -* GetEligiblePromoItemDefinitionIDs - After handling a SteamInventoryEligiblePromoItemDefIDs_t call result, use this function to pull out the list of item definition ids that the user can be manually granted via the AddPromoItems() call. - - ----------------------------------------------------------------- -v1.38 14th October 2016 ----------------------------------------------------------------- - -ISteamUGC -* Added ability to track the playtime of Workshop items. Call StartPlaytimeTracking() and StopPlaytimeTracking() when appropriate. On application shutdown all playtime tracking will stop, but StopPlaytimeTrackingForAllItems() can also be used. -* Added ability to query Workshop items by total playtime in a given period, total lifetime playtime, average playtime in a given period, lifetime average playtime, number of play sessions in a given period, and number of lifetime play sessions. -* Added ability to retrieve item statistics for number of seconds played, number of play sessions, and number of comments. -* Added SetReturnOnlyIDs() for queries. This is useful for retrieving the list of items a user has subscribed to or favorited without having to get all the details for those items. -* Modified GetQueryUGCStatistic() to take in a uint64 instead of a uint32 to support larger values - -ISteamUser -* Added BIsPhoneIdentifying() -* Added BIsPhoneRequiringVerification() - -ISteamScreenshots -* Added IsScreenshotsHooked() if the application has hooked the screenshot -* Added ability to add a VR screenshot that was saved to disk to the user's library - -ISteamRemoteStorage -* Modified GetQuota() to take in uint64 from int32, since Steam Cloud can now support quotas above 2GB -* Removed RemoteStorageConflictResolution_t callback - -ISteamApps -* Added GetFileDetails() which will return FileDetailsResult_t through a call result. The FileDetailsResult_t struct contains information on the original file's size, SHA1, etc. - -ISteamFriends -* Deprecated k_EFriendRelationshipSuggested relationship type that was originally used by Facebook linking feature - ----------------------------------------------------------------- -v1.37 23rd May 2016 ----------------------------------------------------------------- - -Starting with this release, SDK forward-compatibility has been improved. All executables and libraries built using the official C++ headers from this SDK will continue to work even when paired with runtime DLLs from future SDKs. This will eventually allow for the mixing of dynamic libraries (such as third-party plug-ins) built with different versions of Steamworks. - -The VERSION_SAFE_STEAM_API_INTERFACES compile-time flag is no longer necessary for cross-version compatibility, and the SteamAPI_InitSafe and SteamGameServer_InitSafe functions have been removed. Applications which currently use these InitSafe functions should be changed to use the normal Init functions instead. - - -ISteamRemoteStorage -* Removed unsed UGCHandle_t m_hFile from RemoteStoragePublishedFileUpdated_t - -ISteamUGC -* Added ability to add additional preview types to UGC such as standard images, YouTube videos, Sketchfab models, etc. - -ISteamUser -* Added BIsPhoneVerified() -* Added BIsTwoFactorEnabled() - -ISteamUtils -* Added IsSteamInBigPictureMode() -* Added StartVRDashboard(), which asks Steam to create and render the OpenVR Dashboard - -ISteamApps -* Added RequestAllProofOfPurchaseKeys - - ----------------------------------------------------------------- -v1.36 9th February 2016 ----------------------------------------------------------------- - -ISteamController: -* added new function TriggerRepeatedHapticPulse() - - -Revision History: - ----------------------------------------------------------------- -v1.35 21st September 2015 ----------------------------------------------------------------- - -ISteamController: - * The controller API has been redesigned to work with production Steam Controllers and take advantage of the configuration panel inside of Steam. The documentation on the partner site has a full overview of the new API. - -ISteamRemoteStorage: - * Added asynchronous file read and write methods. These methods will not block your calling thread for the duration of the disk IO. Additionally, the IO is performed in a worker thread in the Steam engine, so they will not impact other Steam API calls. - - FileWriteAsync: Similar in use to FileWrite, however it returns a SteamAPICall_t handle. Use the RemoteStorageFileWriteAsyncComplete_t structure with your asynchronous Steam API handler, and that will indicate the results of the write. The data buffer passed in to FileWriteAsync is immediately copied, so you do not have to ensure it is valid throughout the entire asynchronous process. - - FileReadAsync: This function queues an asynchronous read on the file specified, and also returns a SteamAPICall_t handle. The completion event uses the new RemoteStorageFileReadAsyncComplete_t structure. Upon successful completion, you can use the new FileReadAsyncComplete function to read the data -- passing in the original call handle, a pointer to a buffer for the data, and the amount to read (which generally should be equal to the amount read as specified by the callback structure, which generally will be equal to the amount requested). Additionally, the FileReadAsync function lets you specify an offset to read at, so it is no longer necessary to read the entire file in one call. - - ----------------------------------------------------------------- -v1.34 28th July 2015 ----------------------------------------------------------------- -ISteamUGC: - -* Added ability to set and retrieve key-value tags on an item. There can be multiple values for each key. -* Added ability to query all UGC that have matching key-value tags. -* Added ability to specify a title and description on an item for a specific language (defaults to English). -* Added ability to query for items and return the title and description in a preferred language. -* Added ability to vote on an item and retrieve the current user's vote on a given item (duplicated from ISteamRemoteStorage). - - ----------------------------------------------------------------- -v1.33 6th May 2015 ----------------------------------------------------------------- - -UGC: -* Added DownloadItem(), which will force download a piece of UGC (it will be cached based on usage). This can be used by stand-alone game servers. -* Renamed GetItemUpdateInfo() => GetItemDownloadInfo() and added GetItemState() which can be used to determine whether an item is currently being downloaded, has already been downloaded, etc. -* Added ability to set and retrieve developer metadata for an item -* Added ability to modify a user's favorites list -* Added ability to retrieve preview image & video URLs -* Added ability to retrieve "children" for an item (e.g. for collections) -* Added ability to retrieve stats, such as current number of subscribers, lifetime unique subscribers, etc. - -SteamVR -* steamvr.h has been removed. You can use the OpenVR SDK to access those interfaces: https://github.com/ValveSoftware/openvr - -SteamVideo -* Added ability to check if a user is currently broadcasting - - ----------------------------------------------------------------- -v1.32 5th February 2015 ----------------------------------------------------------------- - -General: -* Added an auto-generated "flat" C-style API for common Steamworks features (steam_api_flat.h) -* Added an auto-generated C# binding for common Steamworks features (steam_api_interop.cs) -* Expanded the ISteamFriends interface to include steam levels and friends groups -* Expanded the ISteamHTTP interface to include cookie handling, SSL certificate verification, and network timeouts -* Fixed typos in ISteamHTMLSurface interface constants - -Inventory: -* Added the initial version of ISteamInventory, a developer-preview release of our new Steam Inventory Service for managing and tracking a Steam-compatible inventory of in-game items. Please see the documentation for the Inventory Service on the partner website for more details. - - - ----------------------------------------------------------------- -v1.31 8th September 2014 ----------------------------------------------------------------- - -UGC: -* The Workshop item content API in ISteamUGC now supports legacy workshop items uploaded via the ISteamRemoteStorage interface. ISteamUGC::GetItemInstallInfo(). This will return whether the item was a legacy item or a new item. If it is a legacy item, then the pchFolder variable will be the full path to the file. - -HTML: -* Added initial version of ISteamHTMLSurface API, which allows games to get textures for html pages and interact with them. There is also a sample implementation in the SteamworksExample. - -Virtual Reality: -* Added VR_IsHmdPresent, which returns true if an HMD appears to be present but does not initialize the VR API. This is useful when enabling/disabling UI elements to offer VR mode to a user. -* Added VR_GetStringForHmdError which turns an HmdError enum value into a string. - -SteamPipe -* The example Steampipe batch file (run_build.bat) now uses run_app_build_http instead of run_app_build by default. - -ContentPrep.app -* Updated wxPython requirements for this app (version 2.7 and 2.8 supported). App will prompt with updated URL to download compatible packages if necessary. - - - ----------------------------------------------------------------- -v1.30 10th July 2014 ----------------------------------------------------------------- - -General: -* Added a new Workshop item content API in ISteamUGC that is easy to use and allows multiple files per item without any size limits. It uses the same - content system that handles regular content depots, resulting in faster and smaller downloads due to delta patching. Subscribed workshop items will - be placed in unique subfolders in the install folder, so the game doesn't need to fetch them using ISteamRemoteStorage anymore. The new API is not - backwards compatible with old items created with ISteamRemoteStorage. Added Workshop feature to steamworksexample using ISteamUGC. - - -Steam VR: -* VR_Init now requires that you call SteamAPI_Init first. - - ----------------------------------------------------------------- -v1.29 24th April 2014 ----------------------------------------------------------------- - -General: -* Adjust game server login to use a token instead of username/password. Tokens are randomly generated at account creation time and can be reset. -* Added existing text param to ISteamUtils::ShowGamepadTextInput() so games can prepopulate control before displaying to user. -* Updated retail disc installer to use a single multi-language steamsetup.exe replacing all Steam install MSI packages. -* Removed redistributable Steam libraries for dedicated servers. Standalone dedicated server should use shared "Steamworks SDK Redist" depots. -* steamcmd is now included for Linux and OSX. - -Music: -* Introducing API to control the Steam Music Player from external software. As an example this gives games the opportunity to pause the music or lower the volume, when an important cut scene is shown, and start playing afterwards. -* Added menu and code to the Steamworks Example to demonstrate this API. -* This feature is currently limited to users in the Steam Music Player Beta. It will have no effect on other users. - -UGC: -* ISteamUGC - Add m_bCachedData to SteamUGCQueryCompleted_t and SteamUGCRequestUGCDetailsResult_t which can be used to determine if the data was retrieved from the cache. -* ISteamUGC - Allow clients to get cached responses for ISteamUGC queries. This is so client code doesn't have to build their own caching layer on top of ISteamUGC. -* ISteamRemoteStorage - add the name of the shared file to RemoteStorageFileShareResult_t so it can be matched up to the request if a game has multiple outstanding FileShare requests going on at the same time - -Steam VR: -* Renamed GetEyeMatrix to GetHeadFromEyePose and made it return an HmdMatrix34t. This doesn't actually change the values it was returning, it just updates the name to match the values that were already being returned. Changed the driver interface too. -* Renamed GetWorldFromHeadPose to GetTrackerFromHeadPose to avoid confusion about the game's world space vs. the tracker's coordinate system. -* Also renamed GetLastWorldFromHeadPose to GetLastTrackerFromHeadPose. -* Added GetTrackerZeroPose method to get the tracker zero pose. -* Added VR support to the Linux/SDL version of the Steamworks Example. - ----------------------------------------------------------------- -v1.28 28th January 2014 ----------------------------------------------------------------- - -* Added Steamworks Virtual Reality API via steamvr.h. -* Added ISteamUtils::IsSteamRunningInVRMode, which returns true if the Steam Client is running in VR mode. -* Deprecated ISteamGameserver::GetGameplayStats and ISteamGameserver::GetServerReputation. These calls already return no data and will be removed in a future SDK update. -* Added result code k_EResultRateLimitExceeded, which can now be returned if a user has too many outstanding friend requests. - ----------------------------------------------------------------- -v1.26a 14th November 2013 ----------------------------------------------------------------- - -* Fix missing accessor function in steam_api.h for SteamUGC() - ----------------------------------------------------------------- -v1.26 6th November 2013 ----------------------------------------------------------------- -* Includes libsteam_api.so for 64-bit Linux. -* Callbacks ValidateAuthTicketResponse_t and GSClientApprove_t now contain the SteamID of the owner of current game. If the game is borrowed, this is different than the player's SteamID. -* Added ISteamFriends::GetPlayerNickname, which returns the nickname the current user has set for the specified player. -* Fix p2p networking apis on Linux so they work with dedicated servers -* Fix command line argument handling bug in SteamAPI_RestartAppIfNecessary on Linux and OSX. -* Added ISteamApps::GetLaunchQueryParam, which will get the value associated with the given key if a game is launched via a url with query paramaters, such as steam://run///?param1=value1;param2=value2;param3=value3. If the game is already running when such a url is executed, instead it will receive a NewLaunchQueryParameters_t callback. -* Added EUGCReadAction parameter to ISteamRemoteStorage:UGCRead that allows the game to keep the file open if it needs to seek around the file for arbitrary data, rather than always closing the file when the last byte is read. -* Added new ISteamUGC interface that is used for querying for lists of UGC details (e.g. Workshop items, screenshots, videos, artwork, guides, etc.). The ISteamUGC interface should be used instead of ISteamRemoteStorage, which contains similar, but less flexible and powerful functionality. -* Removed tools for deprecated content system - - ----------------------------------------------------------------- -v1.25 1st October 2013 ----------------------------------------------------------------- -* Fixed a crash in the 1.24 SDK update when attempting to call ISteamRemoteStorage::GetPublishedFileDetails by adding a missing parameter unMaxSecondsOld, which allows a game to request potentially-cached details (passing a value of 0 retains the previous behavior). - ----------------------------------------------------------------- -v1.24 17th July 2013 ----------------------------------------------------------------- - -User: -* Added ISteamUser::GetBadgeLevel and ISteamUser::GetPlayerSteamLevel functions - -Friends: -* Games can now initiate Steam Friend requests, removals, request -accepts and request-ignores via ISteamFriends’ ActivateGameOverlayToUser API. This prompts the user for confirmation before action is taken. - -Mac: -* Updated the OS X Content Prep tool and game wrapper for improved compatibility with OS X 10.8 (Mountain Lion). - -Linux: -* Added install script for the Steam Linux Runtime tools (run "bash tools/linux/setup.sh" to install), see tools/linux/README.txt for details. -* SteamworksExample is now available on Linux - ----------------------------------------------------------------- -v1.23a 25th February 2013 ----------------------------------------------------------------- - -Windows: -* Fix passing command-line parameters across SteamApi_RestartAppIfNeccessary() - ----------------------------------------------------------------- -v1.23 19th February 2013 ----------------------------------------------------------------- - -Cloud: -* Added ISteamScreenshots::TagPublishedFile() which allows tagging workshop content that is visible or active when a screenshot is taken. -* Added ISteamRemoteStorage::UGCDownloadToLocation() which allows a developer to specify a location on disk to download workshop content. - -Setup tool: -* Added Arabic to the supported languages for the PC Gold Master Setup Tool -* Fixed regression in localized EULA support in Mac OS X Gold Master Setup Tool - -Windows: -* Fix SteamAPI_RestartAppIfNecessary() on 64 bit Windows -* When launching a game's development build from outside of Steam, fixed using steam_appid.txt in the Steam Overlay and for authorizing microtransactions (broken in the SDK 1.22) - -Mac: -* Fixed many Steam callbacks not working for 64 bit OS X games due to mismatched structure alignment between the SDK and the Steam client -* Implemented SteamAPI_RestartAppIfNecessary() - -Linux: -* Removed the need to redistribute libtier0_s.so and libvstdlib_s.so -* Fixed finding and loading steamclient.so, so LD_LIBRARY_PATH does not need to be set for game to talk with Steam -* Implemented SteamAPI_RestartAppIfNecessary() - - ----------------------------------------------------------------- -v1.22 12th December 2012 ----------------------------------------------------------------- - -Apps -* Added new API call ISteamApps::MarkContentCorrupt() so a game can hint Steam that some of it's local content seems corrupt. Steam will verify the content next time the game is started. -* Added new API call ISteamApps::GetCurrentBetaName() so a game can get the current content beta branch name if the user chose to opt-in to a content beta. - -Cloud -* Added an offset parameter to ISteamRemoteStorage::UGCRead() to allow reading files in chunks, and increased the limit from 100MB to 200MB when downloading files this way. - -HTTP -* Added support for streaming HTTP requests with ISteamHTTP::SendHTTPRequestAndStreamResponse() and ISteamHTTP::GetHTTPStreamingResponseBodyData() - -Linux -* Updated libsteam_api.so to find Steam in its new install location - - ----------------------------------------------------------------- -v1.21 25th October 2012 ----------------------------------------------------------------- - -Big Picture -* Added ISteamUtils::ShowGamepadTextInput() to enable usage of the Big Picture gamepad text input control in-game. UI is rendered by the Steam Overlay. -* Added ISteamUtils::GetEnteredGamepadTextLength() and ISteamUtils::GetEnteredGamepadTextInput() to retrieve entered gamepad text. -* Added GamepadTextInputDismissed_t callback to detect when the user has entered gamepad data. - - ----------------------------------------------------------------- -v1.20 30th August 2012 ----------------------------------------------------------------- - -SteamPipe -* Added local server and builder tools for new content system. - -Mac -* OSX Supports 64 bit build targets. -* Spacewar has been updated to be buildable as a 64 bit OSX sample application. - -Friends -* Added a callback for the result of ISteamFriends::SetPersonaName(). -* Changed ISteamFriends::ActivateGameOverlayToStore() to take an additional parameter so app can be directly added to the cart. - -Cloud -* Added ISteamRemoteStorage::FileWriteStreamOpen(), FileWriteStreamWriteChunk(), FileWriteStreamClose() and FileWriteStreamCancel() for streaming operations. -* Changed parameters to ISteamRemoteStorage::PublisheVideo(). -* Added file type to ISteamRemoteStorage::GetPublishedFileDetails() callback result (RemoteStorageGetPublishedFileDetailsResult_t). -* Added a callback to indicate that a published file that a user owns was deleted (RemoteStoragePublishedFileDeleted_t). - -ISteamUserStats -* Added ISteamUserStats::GetNumAchievements() and ISteamUserStats::GetAchievementName(). - - ----------------------------------------------------------------- -v1.19 22nd March 2012 ----------------------------------------------------------------- - -Friends -* Added ISteamFriends::GetFollowerCount() -* Added ISteamFriends::IsFollowing() -* Added ISteamFriends::EnumerateFollowingList() - -Cloud -* Added ISteamRemoteStorage::UpdatePublishedFileSetChangeDescription() -* Added ISteamRemoteStorage::GetPublishedItemVoteDetails() -* Added ISteamRemoteStorage::UpdateUserPublishedItemVote() -* Added ISteamRemoteStorage::GetUserPublishedItemVoteDetails() -* Added ISteamRemoteStorage::EnumerateUserSharedWorkshopFiles() -* Added ISteamRemoteStorage::PublishVideo() -* Added ISteamRemoteStorage::SetUserPublishedFileAction() -* Added ISteamRemoteStorage::EnumeratePublishedFilesByUserAction() -* Added ISteamRemoteStorage::EnumeratePublishedWorkshopFiles() - -ISteamGameServer -* Updated callback for SteamGameServer::ComputeNewPlayerCompatibility to include the steam id the compatibility was calculated for - - ----------------------------------------------------------------- -v1.18 7th February 2012 ----------------------------------------------------------------- - -Cloud -* Removed ISteamRemoteStorage::PublishFile() and consolidated the API to PublishWorkshopFile() -* Updated ISteamRemoteStorage::PublishWorkshopFile() to better define the type of workshop file being published -* Replaced ISteamRemoteStorage::UpdatePublishedFile() with a new mechanism to update existing files through CreatePublishedFileUpdateRequest() UpdatePublishedFile[Property](), and CommitPublishedFileUpdate() -* Increased the description field for a workshop file from 256 -> 8000 characters -* Added ISteamRemoteStorage::GetUGCDownloadProgress() -* Added file size limit of 100MB to ISteamRemoteStorage::FileWrite() - -Apps: -* Added ISteamApps::RequestAppProofOfPurchaseKey - ----------------------------------------------------------------- -v1.17 2nd November 2011 ----------------------------------------------------------------- - -Cloud -* Added ISteamRemoteStorage::PublishFile(), PublishWorkshopFile(), UpdatePublishedFile(), DeletePublishedFile() which enables sharing, updating, and unsharing of cloud content with the Steam community -* Added ISteamRemoteStorage::EnumerateUserPublishedFiles to enumerate content that a user has shared with the Steam community -* Added ISteamRemoteStorage::GetPublishedFileDetails() which gets the metadata associated with a piece of community shared content -* Added ISteamRemoteStorage::SubscribePublishedFile(), EnumerateUserSubscribedFiles(), and UnsubscribePublishedFiles() which allow for management of community content that a user is interested in and marked as a favorite - -User -* Updated ISteamUser::GetAuthSessionTicket(), When creating a ticket for use by the AuthenticateUserTicket Web API, the calling application should wait for the callback GetAuthSessionTicketResponse_t generated by the API call before attempting to use the ticket to ensure that the ticket has been communicated to the server. If this callback does not come in a timely fashion ( 10 - 20 seconds ), your client is not connected to Steam, and the AuthenticeUserTicket will fail because it can not authenticate the user. - -Friends -* Added ISteamFriends::RequestFriendRichPresence, which allows requesting rich presence keys for any Steam user playing the same game as you -* Added a set of functions to ISteamFriends which allow games to integrate with Steam Chat. Games can both join group chats, as well as get friends chats and show them in-line in the game. This API isn’t currently used in a game, so there may be some rough edges around the user experience to work out, and some experimentation is required. - -Game Servers -* Removed the ISteamMasterServerUpdater interface. It has been merged into the ISteamGameServer interface, which is used to communicate all game server state changes. -* Significant changes to the game server init sequence. (See the comments for SteamGameServer_Init and the ISteamGameServer interface.) -* Removed interface to legacy master server mode -* Groundwork for implementing named steam accounts for game servers -* Old player auth system is deprecated. It may be removed in a future version of the SDK. - -Tools -* Added tool for automated DRM submissions in /sdk/tools/drm/ - ----------------------------------------------------------------- -v1.16 29th July 2011 ----------------------------------------------------------------- - -HTTP -* added ISteamHTTP::SetHTTPRequestRawPostBody() to set the raw body of a POST request -Screenshots -* added ISteamScreenshots interface, which enables adding screenshots to the user's screenshot library and tagging them with location data or relevant players that are visible in the screenshot. A game can provide screenshots based on game events using WriteScreenshot, AddScreenshotToLibrary, or TriggerScreenshot. A game can also choose to provide its own screenshots when the Steam screenshot hotkey is pressed by calling HookScreenshots() and listening for the ScreenshotRequested_t callback. - ----------------------------------------------------------------- -v1.15 1st June 2011 ----------------------------------------------------------------- - -Bug fixes -* Fixed exposing HTTP interface -* Fixed setting AppID for game processes started outside of Steam or which require administrative privileges - - ----------------------------------------------------------------- -v1.14 16th May 2011 ----------------------------------------------------------------- - -Stats and Achievements -* Added a set of functions for accessing global achievement unlock percentages -** RequestGlobalAchievementPercentages() to request the completion percentages from the backend -** GetMostAchievedAchievementInfo() and GetNextMostAchievedAchievementInfo() to iterate achievement completion percentages -** GetAchievementAchievedPercent() to query the global unlock percentage for a specific achievement -* Added a set of functions for accessing global stats values. To enable a global stats set stats as "aggregated" from the Steamworks admin page. -** RequestGlobalStats() to request the global stats data from the backend -** GetGlobalStat() to get the global total for a stat -** GetGlobalStatHistory() to get per day totals for a stat - -HTTP -* added ISteamHTTP::GetHTTPDownloadProgressPct() get the progress of an HTTP request - - ----------------------------------------------------------------- -v1.13 26th April 2011 ----------------------------------------------------------------- - -Rich Presence -* added a new Rich Presence system to allow for sharing game specific per user data between users -* ISteamFriends::SetRichPresense() can be used to set key/value presence data for the current user -* ISteamFriends::GetFriendRichPresence() and related functions can be used to retrieve presence data for a particular user -* Two special presence keys exist: -** the "connect" key can be set to specify a custom command line used by friends when joining that user -** the "status" key can be set to specify custom text that will show up in the 'view game info' dialog in the Steam friends list - -HTTP -* added ISteamHTTP, which exposes methods for making HTTP requests - -Downloadable Content -* added ISteamApps::GetDLCCount() and ISteamApps::BGetDLCDataByIndex() to allow for enumerating DLC content for the current title -* added ISteamApps::InstallDLC() and ISteamApps::UninstallDLC() to control installing optional content - -P2P Networking -* added ISteamNetworking::CloseP2PChannelWithUser(), to allow for closing a single channel to a user. When all channels are closed, the connection to that user is automatically closed. -* added ISteamNetworking::AllowP2PPacketRelay(), which can be used to prevent allowing P2P connections from falling back to relay - -Voice -* ISteamUser::GetAvailableVoice() & ISteamUser::GetVoice() now take the desired sample rate to determine the number of uncompressed bytes to return -* added ISteamUser::GetVoiceOptimalSampleRate() to return the frequency of the voice data as it's stored internally - -Friends -* added ISteamFriends methods to retrieve the list of users the player has recently played with - -Content Tool -* all files are now encrypted by default -* add command line option to app creation wizard -* add command line edit option by right clicking on app -* update cache size in CDDB after each build -* look for install scripts at build time and automatically add CDDB flag -* fix language names for chinese -* add menu button to easily rev version -* warn if rebuilding existing version -* allow specifying subfolder when ftp-ing depots to valve -* better error messaging if ftp fails -* clean up various small display bugs -* don't trash ValidOSList tag when updating CDDB - -OSX DirectX to OpenGL -* added the graphics layer used to port Valve games to OSX which can now be used by all Steamworks developers -* included in the Steamworks Example application. Can be enabled by building with DX9MODE=1 - - ----------------------------------------------------------------- -v1.12 10th November 2010 ----------------------------------------------------------------- - -Cloud -* added a set of function to handle publishing User Generated Content (UGC) files to the backend, and to download others users UGC files. This enables games to have users easily publish & share content with each other. -* Added ISteamRemoteStorage::FileForget() which tells a file to remain on disk but to be removed from the backend. This can be used to manage which files should be synchronized if you have more files to store than your quota allows. -* Added ISteamRemoteStorage::FilePersisted() to tell if the file is set to be synchronized with the backend. -* Added ISteamRemoteStorage::FileDelete() which tells a file to be deleted locally, from cloud, and from other clients that have the file. This can be used to properly delete a save file rather than writing a 1-byte file as a sentinel. -* Added ISteamRemoteStorage::SetSyncPlatforms(), GetSyncPlatforms() to tell steam which platforms a file should be synchronized to. This allows OSX not to download PC-specific files, or vice-versa. -* Added ISteamRemoteStorage::IsCloudEnabledForAccount(), IsCloudEnabledForApp(), and SetCloudEnabledForApp(). When cloud is disabled the APIs still work as normal and an alternate location on disk is not needed. It just means the files will not be synchronized with the backend. - -Leaderboards -* added ISteamUserStats::DownloadLeaderboardEntriesForUsers(), which downloads scores for an arbitrary set of users -* added ISteamUserStats::AttachLeaderboardUGC(), to attach a clouded file to a leaderboard entry - -Friends -* added ISteamFriends::RequestUserInformation(), to asynchronously request a users persona name & avatar by steamID -* added ISteamFriends::RequestClanOfficerList(), to asynchronously download the set of officers for a clan. GetClanOwner(), GetClanOfficerCount(), and GetClanOfficerByIndex() can then be used to access the data. - -Matchmaking -* added k_ELobbyTypePrivate option to creating lobbies - this means that the lobby won't show up to friends or be returned in searches -* added LobbyDataUpdate_t::m_bSuccess, to easily check if a RequestLobbyData() call failed to find the specified lobby - -Authentication -* added ISteamApps::GetEarliestPurchaseUnixTime(), for games that want to reward users who have played for a long time -* added ISteamApps::BIsSubscribedFromFreeWeekend(), so games can show different offers or information for users who currently only have rights to play the game due to a free weekend promotion -* added ISteamGameServer::GetAuthSessionTicket(), BeginAuthSession(), EndAuthSession(), and CancelAuthTicket(), matching what exists in ISteamUser. This allows game servers and clients to authenticate each other in a unified manner. - -OSX -* The Steamworks Spacewar example now builds/runs on OS X -* The OSX retail install setup application is now contained in goldmaster\disk_assets\SteamRetailInstaller.dmg - -PS3 -* added several functions regarding PS3 support. This is still a work in progress, and no PS3 binaries are included. - - ----------------------------------------------------------------- -v1.11 23rd August 2010 ----------------------------------------------------------------- - -Networking -* added virtual ports to the P2P networking API to help with routing messages to different systems -* added ISteamUser::BIsBehindNAT() to detect when a user is behind a NAT - -Friends / Matchmaking -* added support for retrieving large (184x184) avatars -* added ISteamUser::AdvertiseGame() which can be used send join game info to friends without using the game server APIs - -64-bit support -* 64-bit windows binaries are included in the sdk/redistributable_bin/ folder -* VAC and CEG are not yet supported - -Authentication -* added ticket based remote authentication library - -Other -* added ISteamUser::CheckFileSignature which can be used in conjunction with the signing tab on the partner site to verify that an executable has not been modified - - ----------------------------------------------------------------- -v1.10 20th July 2010 ----------------------------------------------------------------- - -Friends / Matchmaking -* added function ISteamFriends::GetClanTag(), which returns the abbreviation set for a group -* added "stats" and "achievements" options to ISteamFriends::ActivateGameOverlayToUser() -* added function ISteamFriends::ActivateGameOverlayInviteDialog() to open the invite dialog for a specific lobby -* renamed ISteamMatchmaking::SetGameType() to the more correct SetGameTags() - -Authentication -* added ISteamUtils::CheckFileSignature(), which can be used to verify that a binary has a valid signature - -Other -* added #pragma pack() in several places around structures in headers - - ----------------------------------------------------------------- -v1.09 12th May 2010 ----------------------------------------------------------------- - -Mac Steamworks! -* new binaries in the sdk/redistributable_bin/osx/ folder - -Other -* explicit pragma( pack, 8 ) added around all callbacks and structures, for devs who have use a different default packing -* renamed function ISteamGameServer::SetGameType() to the more accurate ISteamGameServer::SetGameTags() - - ----------------------------------------------------------------- -v1.08 27st January 2010 ----------------------------------------------------------------- - -Matchmaking -* added function ISteamMatching::AddRequestLobbyListDistanceFilter(), to specify how far geographically you want to search for other lobbies -* added function ISteamMatching::AddRequestLobbyListResultCountFilter(), to specify how the maximum number of lobby you results you need (less is faster) - -Stats & Achievements -* added interface ISteamGameServerStats, which enables access to stats and achievements for users to the game server -* removed function ISteamGameServer::BGetUserAchievementStatus(), now handled by ISteamGameServerStats -* added ISteamUserStats::GetAchievementAndUnlockTime(), which returns if and when a user unlocked an achievement - -Other -* added new constant k_cwchPersonaNameMax (32), which is the maximum number of unicode characters a users name can be -* removed ISteamRemoteStorage::FileDelete() - NOTE: it will be back, it's only removed since it hadn't been implemented on the back-end yet -* added function ISteamGameServer::GetServerReputation(), gives returns a game server reputation score based on how long users typically play on the server - - ----------------------------------------------------------------- -v1.07 16th December 2009 ----------------------------------------------------------------- - -* Replaced SteamAPI_RestartApp() with SteamAPI_RestartAppIfNecessary(). This new function detects if the process was started through Steam, and starts the current game through Steam if necessary. -* Added ISteamUtils::BOverlayNeedsPresent() so games with event driven rendering can determine when the Steam overlay needs to draw - - ----------------------------------------------------------------- -v1.06 30th September 2009 ----------------------------------------------------------------- - -Voice -* ISteamUser::GetCompressedVoice() has been replaced with ISteamUser::GetVoice which can be used to retrieve compressed and uncompressed voice data -* Added ISteamUser::GetAvailableVoice() to retrieve the amount of captured audio data that is available - -Matchmaking -* Added a new callback LobbyKicked_t that is sent when a user has been disconnected from a lobby -* Through ISteamMatchmakingServers, multiple server list requests of the same type can now be outstanding at the same time - -Steamworks Setup Application: -* Streamlined configuration process -* Now supports EULAs greater than 32k bytes - -Content Tool -* Added DLC checkbox to depot creation wizard - -Other -* Added SteamAPI_IsSteamRunning() -* Added SteamAPI_RestartApp() so CEG users can restart their game through Steam if launched through Windows Games Explorer - - - ----------------------------------------------------------------- -v1.05 11th June 2009 ----------------------------------------------------------------- - -Matchmaking -* Added the SteamID of the gameserver to the gameserveritem_t structure (returned only by newer game servers) -* Added ISteamUserStats::GetNumberOfCurrentPlayers(), asyncronously returns the number users currently running this game -* Added k_ELobbyComparisonNotEqual comparision functions for filters -* Added option to use comparison functions for string filters -* Added ISteamMatchmaking::AddRequestLobbyListFilterSlotsAvailable( int nSlotsAvailable ) filter function, so you can find a lobby for a group of users to join -* Extended ISteamMatchmaking::CreateLobby() to take the max number of users in the lobby -* Added ISteamMatchmaking::GetLobbyDataCount(), ISteamMatchmaking::GetLobbyDataByIndex() so you can iterate all the data set on a lobby -* Added ISteamMatchmaking::DeleteLobbyData() so you can clear a key from a lobby -* Added ISteamMatchmaking::SetLobbyOwner() so that ownership of a lobby can be transferred -* Added ISteamMatchmaking::SetLobbyJoinable() -* Added ISteamGameServer::SetGameData(), so game server can set more information that can be filtered for in the server pinging API - -Networking -* Added a set of connectionless networking functions for easy use for making peer-to-peer (NAT traversal) connections. Includes supports for windowed reliable sendsand fragementation/re-assembly of large packets. See ISteamNetworking.h for more details. - -Leaderboards -* Added enum ELeaderboardUploadScoreMethod and changed ISteamUserStats::UploadLeaderboardScore() to take this - lets you force a score to be changed even if it's worse than the prior score - -Callbacks -* Added CCallbackManual<> class to steam_api.h, a version of CCallback<> that doesn't register itself automatically in it's the constructor - -Downloadable Content -* Added ISteamUser::UserHasLicenseForApp() and ISteamGameServer::UserHasLicenseForApp() to enable checking if a user owns DLC in multiplayer. See the DLC documentation for more info. - -Game Overlay -* ISteamFriends::ActivateGameOverlay() now accepts "Stats" and "Achievements" - - - ----------------------------------------------------------------- -v1.04 9th Mar 2009 ----------------------------------------------------------------- - -Added Peer To Peer Multi-Player Authentication/Authorization: -* Allows each peer to verify the unique identity of the peers ( by steam account id ) in their game and determine if that user is allowed access to the game. -* Added to the ISteamUser interface: GetAuthSessionTicket(), BeginAuthSession(), EndAuthSession() and CancelAuthTicket() -* Additional information can be found in the API Overview on the Steamworks site - -Added support for purchasing downloadable content in game: -* Added ISteamApps::BIsDlcInstalled() and the DlcInstalled_t callback, which enable a game to check if downloadable content is owned and installed -* Added ISteamFriends::ActivateGameOverlayToStore(), which opens the Steam game overlay to the store page for an appID (can be a game or DLC) - -Gold Master Creation: -* It is no longer optional to encrypt depots on a GM -* The GM configuration file now supports an included_depots key, which along with the excluded_depots key, allows you to specify exactly which depots are placed on a GM -* Simplified the configuration process for the setup application -* The documentation for creating a Gold Master has been rewritten and extended. See the Steamworks site for more information. - -Added Leaderboards: -* 10k+ leaderboards can now be created programmatically per game, and queried globally or compared to friends -* Added to ISteamUserStats interface -* See SteamworksExample for a usage example - -Other: -* Added SteamShutdown_t callback, which will alert the game when Steam wants to shut down -* Added ISteamUtils::IsOverlayEnabled(), which can be used to detect if the user has disabled the overlay in the Steam settings -* Added ISteamUserStats::ResetAllStats(), which can be used to reset all stats (and optionally achievements) for a user -* Moved SetWarningMessageHook() from ISteamClient to ISteamUtils -* Added SteamAPI_SetTryCatchCallbacks, sets whether or not Steam_RunCallbacks() should do a try {} catch (...) {} around calls to issuing callbacks -* In CCallResult callback, CCallResult::IsActive() will return false and can now reset the CCallResult -* Added support for zero-size depots -* Properly strip illegal characters from depot names - - - ----------------------------------------------------------------- -v1.03 16th Jan 2009 ----------------------------------------------------------------- - -Major changes: -* ISteamRemoteStorage interface has been added, which contains functions to store per-user data in the Steam Cloud back-end. -** To use this, you must first use the partner web site to enable Cloud for your game. -** The current setting is allowing 1MB of storage per-game per-user (we hope to increase this over time). - -Lobby & Matchmaking related changes: -* ISteamFriends::GetFriendGamePlayed() now also return the steamID of the lobby the friend is in, if any. It now takes a pointer to a new FriendGameInfo_t struct, which it fills -* Removed ISteamFriends::GetFriendsLobbies(), since this is now redundant to ISteamFriends::GetFriendGamePlayed() -* Added enum ELobbyComparison, to set the comparison operator in ISteamMatchmaking::AddRequestLobbyListNumericalFilter() -* Changed ISteamMatchmaking::CreateLobby(), JoinLobby() and RequestLobbyList() to now return SteamAPICall_t handles, so you can easily track if a particular call has completed (see below) -* Added ISteamMatchmaking::SetLobbyType(), which can switch a lobby between searchable (public) and friends-only -* Added ISteamMatchmaking::GetLobbyOwner(), which returns the steamID of the user who is currently the owner of the lobby. The back-end ensures that one and only one user is ever the owner. If that user leaves the lobby, another user will become the owner. - -Steam game-overlay interaction: -* Added a new callback GameLobbyJoinRequested_t, which is sent to the game if the user selects 'Join friends game' from the Steam friends list, and that friend is in a lobby. The game should initiate connection to that lobby. -* Changed ISteamFriends::ActivateGameOverlay() can now go to "Friends", "Community", "Players", "Settings", "LobbyInvite", "OfficialGameGroup" -* Added ISteamFriends::ActivateGameOverlayToUser(), which can open a either a chat dialog or another users Steam community profile -* Added ISteamFriends::ActivateGameOverlayToWebPage(), which opens the Steam game-overlay web browser to the specified url - -Stats system changes: -* Added ISteamUserStats::RequestUserStats(), to download the current game stats of another user -* Added ISteamUserStats::GetUserStat() and ISteamUserStats::GetUserAchievement() to access the other users stats, once they've been downloaded - -Callback system changes: -* Added new method for handling asynchronous call results, currently used by CreateLobby(), JoinLobby(), RequestLobbyList(), and RequestUserStats(). Each of these functions returns a handle, SteamAPICall_t, that can be used to track the completion state of a call. -* Added new object CCallResult<>, which can map the completion of a SteamAPICall_t to a function, and include the right data. See SteamworksExample for a usage example. -* Added ISteamUtils::IsAPICallCompleted(), GetAPICallFailureReason(), and GetAPICallResult(), which can be used to track the state of a SteamAPICall_t (although it is recommended to use CCallResult<>, which wraps these up nicely) - -Other: -* Added ISteamGameServer::GetPublicIP(), which is the IP address of a game server as seen by the Steam back-end -* Added "allow relay" parameter to ISteamNetworking::CreateP2PConnectionSocket() and CreateListenSocket(), which specified if being bounced through Steam relay servers is OK if a direct p2p connection fails (will have a much higher latency, but increases chance of making a connection) -* Added IPCFailure_t callback, which will be posted to the game if Steam itself has crashed, or if Steam_RunCallbacks() hasn't been called in a long time - - - ----------------------------------------------------------------- -v1.02 4th Sep 2008 ----------------------------------------------------------------- - -The following interfaces have been updated: - -ISteamUser - - // Starts voice recording. Once started, use GetCompressedVoice() to get the data - virtual void StartVoiceRecording( ) = 0; - - // Stops voice recording. Because people often release push-to-talk keys early, the system will keep recording for - // a little bit after this function is called. GetCompressedVoice() should continue to be called until it returns - // k_eVoiceResultNotRecording - virtual void StopVoiceRecording( ) = 0; - - // Gets the latest voice data. It should be called as often as possible once recording has started. - // nBytesWritten is set to the number of bytes written to pDestBuffer. - virtual EVoiceResult GetCompressedVoice( void *pDestBuffer, uint32 cbDestBufferSize, uint32 *nBytesWritten ) = 0; - - // Decompresses a chunk of data produced by GetCompressedVoice(). nBytesWritten is set to the - // number of bytes written to pDestBuffer. The output format of the data is 16-bit signed at - // 11025 samples per second. - virtual EVoiceResult DecompressVoice( void *pCompressed, uint32 cbCompressed, void *pDestBuffer, uint32 cbDestBufferSize, uint32 *nBytesWritten ) = 0; - -virtual int InitiateGameConnection( void *pAuthBlob, int cbMaxAuthBlob, CSteamID steamIDGameServer, uint32 unIPServer, uint16 usPortServer, bool bSecure ) = 0; - -This has been extended to be usable for games that don't use the other parts of Steamworks matchmaking. This allows any multiplayer game to easily notify the Steam client of the IP:Port of the game server the user is connected to, so that their friends can join them via the Steam friends list. Empty values are taken for auth blob. - - virtual bool GetUserDataFolder( char *pchBuffer, int cubBuffer ) = 0; - -This function returns a hint as a good place to store per- user per-game data. - - - -ISteamMatchmaking - -Added a set of server-side lobby filters, as well as voice chat, lobby member limits, and a way of quickly accessing the list of lobbies a users friends are in. - - // filters for lobbies - // this needs to be called before RequestLobbyList() to take effect - // these are cleared on each call to RequestLobbyList() - virtual void AddRequestLobbyListFilter( const char *pchKeyToMatch, const char *pchValueToMatch ) = 0; - // numerical comparison - 0 is equal, -1 is the lobby value is less than nValueToMatch, 1 is the lobby value is greater than nValueToMatch - virtual void AddRequestLobbyListNumericalFilter( const char *pchKeyToMatch, int nValueToMatch, int nComparisonType /* 0 is equal, -1 is less than, 1 is greater than */ ) = 0; - // sets RequestLobbyList() to only returns lobbies which aren't yet full - needs SetLobbyMemberLimit() called on the lobby to set an initial limit - virtual void AddRequestLobbyListSlotsAvailableFilter() = 0; - - // returns the details of a game server set in a lobby - returns false if there is no game server set, or that lobby doesn't exist - virtual bool GetLobbyGameServer( CSteamID steamIDLobby, uint32 *punGameServerIP, uint16 *punGameServerPort, CSteamID *psteamIDGameServer ) = 0; - - // set the limit on the # of users who can join the lobby - virtual bool SetLobbyMemberLimit( CSteamID steamIDLobby, int cMaxMembers ) = 0; - // returns the current limit on the # of users who can join the lobby; returns 0 if no limit is defined - virtual int GetLobbyMemberLimit( CSteamID steamIDLobby ) = 0; - - // asks the Steam servers for a list of lobbies that friends are in - // returns results by posting one RequestFriendsLobbiesResponse_t callback per friend/lobby pair - // if no friends are in lobbies, RequestFriendsLobbiesResponse_t will be posted but with 0 results - // filters don't apply to lobbies (currently) - virtual bool RequestFriendsLobbies() = 0; - - -ISteamUtils - // Sets the position where the overlay instance for the currently calling game should show notifications. - // This position is per-game and if this function is called from outside of a game context it will do nothing. - virtual void SetOverlayNotificationPosition( ENotificationPosition eNotificationPosition ) = 0; - - -ISteamFriends - virtual int GetFriendAvatar( CSteamID steamIDFriend, int eAvatarSize ) = 0; - -This function now takes an eAvatarSize parameter, which can be k_EAvatarSize32x32 or k_EAvatarSize64x64 (previously it always just returned a handle to the 32x32 image) - - ----------------------------------------------------------------- -v1.01 8th Aug 2008 ----------------------------------------------------------------- - -The Steamworks SDK has been updated to simplfy game server authentication and better expose application state - - ----------------------------------------------------------------- -v1.0: ----------------------------------------------------------------- - -- Initial Steamworks SDK release diff --git a/lib/steamworks_150/public/steam/isteamapplist.h b/lib/steamworks_150/public/steam/isteamapplist.h deleted file mode 100644 index 45441bb..0000000 --- a/lib/steamworks_150/public/steam/isteamapplist.h +++ /dev/null @@ -1,67 +0,0 @@ -//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to app data in Steam -// -//============================================================================= - -#ifndef ISTEAMAPPLIST_H -#define ISTEAMAPPLIST_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "steamtypes.h" - -//----------------------------------------------------------------------------- -// Purpose: This is a restricted interface that can only be used by previously approved apps, -// contact your Steam Account Manager if you believe you need access to this API. -// This interface lets you detect installed apps for the local Steam client, useful for debugging tools -// to offer lists of apps to debug via Steam. -//----------------------------------------------------------------------------- -class ISteamAppList -{ -public: - virtual uint32 GetNumInstalledApps() = 0; - virtual uint32 GetInstalledApps( AppId_t *pvecAppID, uint32 unMaxAppIDs ) = 0; - - virtual int GetAppName( AppId_t nAppID, STEAM_OUT_STRING() char *pchName, int cchNameMax ) = 0; // returns -1 if no name was found - virtual int GetAppInstallDir( AppId_t nAppID, char *pchDirectory, int cchNameMax ) = 0; // returns -1 if no dir was found - - virtual int GetAppBuildId( AppId_t nAppID ) = 0; // return the buildid of this app, may change at any time based on backend updates to the game -}; - -#define STEAMAPPLIST_INTERFACE_VERSION "STEAMAPPLIST_INTERFACE_VERSION001" - -// Global interface accessor -inline ISteamAppList *SteamAppList(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamAppList *, SteamAppList, STEAMAPPLIST_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -//--------------------------------------------------------------------------------- -// Purpose: Sent when a new app is installed -//--------------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( SteamAppInstalled_t, k_iSteamAppListCallbacks + 1 ); - STEAM_CALLBACK_MEMBER( 0, AppId_t, m_nAppID ) // ID of the app that installs -STEAM_CALLBACK_END(1) - - -//--------------------------------------------------------------------------------- -// Purpose: Sent when an app is uninstalled -//--------------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( SteamAppUninstalled_t, k_iSteamAppListCallbacks + 2 ); - STEAM_CALLBACK_MEMBER( 0, AppId_t, m_nAppID ) // ID of the app that installs -STEAM_CALLBACK_END(1) - - -#pragma pack( pop ) -#endif // ISTEAMAPPLIST_H diff --git a/lib/steamworks_150/public/steam/isteamapps.h b/lib/steamworks_150/public/steam/isteamapps.h deleted file mode 100644 index 299b95d..0000000 --- a/lib/steamworks_150/public/steam/isteamapps.h +++ /dev/null @@ -1,217 +0,0 @@ -//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to app data in Steam -// -//============================================================================= - -#ifndef ISTEAMAPPS_H -#define ISTEAMAPPS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -const int k_cubAppProofOfPurchaseKeyMax = 240; // max supported length of a legacy cd key - - -//----------------------------------------------------------------------------- -// Purpose: interface to app data -//----------------------------------------------------------------------------- -class ISteamApps -{ -public: - virtual bool BIsSubscribed() = 0; - virtual bool BIsLowViolence() = 0; - virtual bool BIsCybercafe() = 0; - virtual bool BIsVACBanned() = 0; - virtual const char *GetCurrentGameLanguage() = 0; - virtual const char *GetAvailableGameLanguages() = 0; - - // only use this member if you need to check ownership of another game related to yours, a demo for example - virtual bool BIsSubscribedApp( AppId_t appID ) = 0; - - // Takes AppID of DLC and checks if the user owns the DLC & if the DLC is installed - virtual bool BIsDlcInstalled( AppId_t appID ) = 0; - - // returns the Unix time of the purchase of the app - virtual uint32 GetEarliestPurchaseUnixTime( AppId_t nAppID ) = 0; - - // Checks if the user is subscribed to the current app through a free weekend - // This function will return false for users who have a retail or other type of license - // Before using, please ask your Valve technical contact how to package and secure your free weekened - virtual bool BIsSubscribedFromFreeWeekend() = 0; - - // Returns the number of DLC pieces for the running app - virtual int GetDLCCount() = 0; - - // Returns metadata for DLC by index, of range [0, GetDLCCount()] - virtual bool BGetDLCDataByIndex( int iDLC, AppId_t *pAppID, bool *pbAvailable, char *pchName, int cchNameBufferSize ) = 0; - - // Install/Uninstall control for optional DLC - virtual void InstallDLC( AppId_t nAppID ) = 0; - virtual void UninstallDLC( AppId_t nAppID ) = 0; - - // Request legacy cd-key for yourself or owned DLC. If you are interested in this - // data then make sure you provide us with a list of valid keys to be distributed - // to users when they purchase the game, before the game ships. - // You'll receive an AppProofOfPurchaseKeyResponse_t callback when - // the key is available (which may be immediately). - virtual void RequestAppProofOfPurchaseKey( AppId_t nAppID ) = 0; - - virtual bool GetCurrentBetaName( char *pchName, int cchNameBufferSize ) = 0; // returns current beta branch name, 'public' is the default branch - virtual bool MarkContentCorrupt( bool bMissingFilesOnly ) = 0; // signal Steam that game files seems corrupt or missing - virtual uint32 GetInstalledDepots( AppId_t appID, DepotId_t *pvecDepots, uint32 cMaxDepots ) = 0; // return installed depots in mount order - - // returns current app install folder for AppID, returns folder name length - virtual uint32 GetAppInstallDir( AppId_t appID, char *pchFolder, uint32 cchFolderBufferSize ) = 0; - virtual bool BIsAppInstalled( AppId_t appID ) = 0; // returns true if that app is installed (not necessarily owned) - - // returns the SteamID of the original owner. If this CSteamID is different from ISteamUser::GetSteamID(), - // the user has a temporary license borrowed via Family Sharing - virtual CSteamID GetAppOwner() = 0; - - // Returns the associated launch param if the game is run via steam://run///?param1=value1¶m2=value2¶m3=value3 etc. - // Parameter names starting with the character '@' are reserved for internal use and will always return and empty string. - // Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game, - // but it is advised that you not param names beginning with an underscore for your own features. - // Check for new launch parameters on callback NewUrlLaunchParameters_t - virtual const char *GetLaunchQueryParam( const char *pchKey ) = 0; - - // get download progress for optional DLC - virtual bool GetDlcDownloadProgress( AppId_t nAppID, uint64 *punBytesDownloaded, uint64 *punBytesTotal ) = 0; - - // return the buildid of this app, may change at any time based on backend updates to the game - virtual int GetAppBuildId() = 0; - - // Request all proof of purchase keys for the calling appid and asociated DLC. - // A series of AppProofOfPurchaseKeyResponse_t callbacks will be sent with - // appropriate appid values, ending with a final callback where the m_nAppId - // member is k_uAppIdInvalid (zero). - virtual void RequestAllProofOfPurchaseKeys() = 0; - - STEAM_CALL_RESULT( FileDetailsResult_t ) - virtual SteamAPICall_t GetFileDetails( const char* pszFileName ) = 0; - - // Get command line if game was launched via Steam URL, e.g. steam://run////. - // This method of passing a connect string (used when joining via rich presence, accepting an - // invite, etc) is preferable to passing the connect string on the operating system command - // line, which is a security risk. In order for rich presence joins to go through this - // path and not be placed on the OS command line, you must set a value in your app's - // configuration on Steam. Ask Valve for help with this. - // - // If game was already running and launched again, the NewUrlLaunchParameters_t will be fired. - virtual int GetLaunchCommandLine( char *pszCommandLine, int cubCommandLine ) = 0; - - // 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" - -// Global interface accessor -inline ISteamApps *SteamApps(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamApps *, SteamApps, STEAMAPPS_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamApps *SteamGameServerApps(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamApps *, SteamGameServerApps, STEAMAPPS_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif -//----------------------------------------------------------------------------- -// Purpose: posted after the user gains ownership of DLC & that DLC is installed -//----------------------------------------------------------------------------- -struct DlcInstalled_t -{ - enum { k_iCallback = k_iSteamAppsCallbacks + 5 }; - AppId_t m_nAppID; // AppID of the DLC -}; - - -//----------------------------------------------------------------------------- -// Purpose: possible results when registering an activation code -//----------------------------------------------------------------------------- -enum ERegisterActivationCodeResult -{ - k_ERegisterActivationCodeResultOK = 0, - k_ERegisterActivationCodeResultFail = 1, - k_ERegisterActivationCodeResultAlreadyRegistered = 2, - k_ERegisterActivationCodeResultTimeout = 3, - k_ERegisterActivationCodeAlreadyOwned = 4, -}; - - -//----------------------------------------------------------------------------- -// Purpose: response to RegisterActivationCode() -//----------------------------------------------------------------------------- -struct RegisterActivationCodeResponse_t -{ - enum { k_iCallback = k_iSteamAppsCallbacks + 8 }; - ERegisterActivationCodeResult m_eResult; - uint32 m_unPackageRegistered; // package that was registered. Only set on success -}; - - -//--------------------------------------------------------------------------------- -// Purpose: posted after the user gains executes a Steam URL with command line or query parameters -// such as steam://run///-commandline/?param1=value1¶m2=value2¶m3=value3 etc -// while the game is already running. The new params can be queried -// with GetLaunchQueryParam and GetLaunchCommandLine -//--------------------------------------------------------------------------------- -struct NewUrlLaunchParameters_t -{ - enum { k_iCallback = k_iSteamAppsCallbacks + 14 }; -}; - - -//----------------------------------------------------------------------------- -// Purpose: response to RequestAppProofOfPurchaseKey/RequestAllProofOfPurchaseKeys -// for supporting third-party CD keys, or other proof-of-purchase systems. -//----------------------------------------------------------------------------- -struct AppProofOfPurchaseKeyResponse_t -{ - enum { k_iCallback = k_iSteamAppsCallbacks + 21 }; - EResult m_eResult; - uint32 m_nAppID; - uint32 m_cchKeyLength; - char m_rgchKey[k_cubAppProofOfPurchaseKeyMax]; -}; - - -//----------------------------------------------------------------------------- -// Purpose: response to GetFileDetails -//----------------------------------------------------------------------------- -struct FileDetailsResult_t -{ - enum { k_iCallback = k_iSteamAppsCallbacks + 23 }; - EResult m_eResult; - uint64 m_ulFileSize; // original file size in bytes - uint8 m_FileSHA[20]; // original file SHA1 hash - uint32 m_unFlags; // -}; - - -//----------------------------------------------------------------------------- -// 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/lib/steamworks_150/public/steam/isteamappticket.h b/lib/steamworks_150/public/steam/isteamappticket.h deleted file mode 100644 index 21fb9e1..0000000 --- a/lib/steamworks_150/public/steam/isteamappticket.h +++ /dev/null @@ -1,28 +0,0 @@ -//====== Copyright 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: a private, but well versioned, interface to get at critical bits -// of a steam3 appticket - consumed by the simple drm wrapper to let it -// ask about ownership with greater confidence. -// -//============================================================================= - -#ifndef ISTEAMAPPTICKET_H -#define ISTEAMAPPTICKET_H -#pragma once - -//----------------------------------------------------------------------------- -// Purpose: hand out a reasonable "future proof" view of an app ownership ticket -// the raw (signed) buffer, and indices into that buffer where the appid and -// steamid are located. the sizes of the appid and steamid are implicit in -// (each version of) the interface - currently uin32 appid and uint64 steamid -//----------------------------------------------------------------------------- -class ISteamAppTicket -{ -public: - virtual uint32 GetAppOwnershipTicketData( uint32 nAppID, void *pvBuffer, uint32 cbBufferLength, uint32 *piAppId, uint32 *piSteamId, uint32 *piSignature, uint32 *pcbSignature ) = 0; -}; - -#define STEAMAPPTICKET_INTERFACE_VERSION "STEAMAPPTICKET_INTERFACE_VERSION001" - - -#endif // ISTEAMAPPTICKET_H diff --git a/lib/steamworks_150/public/steam/isteamclient.h b/lib/steamworks_150/public/steam/isteamclient.h deleted file mode 100644 index 8cd4589..0000000 --- a/lib/steamworks_150/public/steam/isteamclient.h +++ /dev/null @@ -1,179 +0,0 @@ -//====== Copyright Valve Corporation, All rights reserved. ==================== -// -// Internal low-level access to Steamworks interfaces. -// -// Most users of the Steamworks SDK do not need to include this file. -// You should only include this if you are doing something special. -//============================================================================= - -#ifndef ISTEAMCLIENT_H -#define ISTEAMCLIENT_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -//----------------------------------------------------------------------------- -// Purpose: Interface to creating a new steam instance, or to -// connect to an existing steam instance, whether it's in a -// different process or is local. -// -// For most scenarios this is all handled automatically via SteamAPI_Init(). -// You'll only need these APIs if you have a more complex versioning scheme, -// or if you want to implement a multiplexed gameserver where a single process -// is handling multiple games at once with independent gameserver SteamIDs. -//----------------------------------------------------------------------------- -class ISteamClient -{ -public: - // Creates a communication pipe to the Steam client. - // NOT THREADSAFE - ensure that no other threads are accessing Steamworks API when calling - virtual HSteamPipe CreateSteamPipe() = 0; - - // Releases a previously created communications pipe - // NOT THREADSAFE - ensure that no other threads are accessing Steamworks API when calling - virtual bool BReleaseSteamPipe( HSteamPipe hSteamPipe ) = 0; - - // connects to an existing global user, failing if none exists - // used by the game to coordinate with the steamUI - // NOT THREADSAFE - ensure that no other threads are accessing Steamworks API when calling - virtual HSteamUser ConnectToGlobalUser( HSteamPipe hSteamPipe ) = 0; - - // used by game servers, create a steam user that won't be shared with anyone else - // NOT THREADSAFE - ensure that no other threads are accessing Steamworks API when calling - virtual HSteamUser CreateLocalUser( HSteamPipe *phSteamPipe, EAccountType eAccountType ) = 0; - - // removes an allocated user - // NOT THREADSAFE - ensure that no other threads are accessing Steamworks API when calling - virtual void ReleaseUser( HSteamPipe hSteamPipe, HSteamUser hUser ) = 0; - - // retrieves the ISteamUser interface associated with the handle - virtual ISteamUser *GetISteamUser( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // retrieves the ISteamGameServer interface associated with the handle - virtual ISteamGameServer *GetISteamGameServer( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // set the local IP and Port to bind to - // this must be set before CreateLocalUser() - virtual void SetLocalIPBinding( const SteamIPAddress_t &unIP, uint16 usPort ) = 0; - - // returns the ISteamFriends interface - virtual ISteamFriends *GetISteamFriends( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the ISteamUtils interface - virtual ISteamUtils *GetISteamUtils( HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the ISteamMatchmaking interface - virtual ISteamMatchmaking *GetISteamMatchmaking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the ISteamMatchmakingServers interface - virtual ISteamMatchmakingServers *GetISteamMatchmakingServers( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the a generic interface - virtual void *GetISteamGenericInterface( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the ISteamUserStats interface - virtual ISteamUserStats *GetISteamUserStats( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns the ISteamGameServerStats interface - virtual ISteamGameServerStats *GetISteamGameServerStats( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns apps interface - virtual ISteamApps *GetISteamApps( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // networking - virtual ISteamNetworking *GetISteamNetworking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // remote storage - virtual ISteamRemoteStorage *GetISteamRemoteStorage( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // user screenshots - virtual ISteamScreenshots *GetISteamScreenshots( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // game search - virtual ISteamGameSearch *GetISteamGameSearch( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Deprecated. Applications should use SteamAPI_RunCallbacks() or SteamGameServer_RunCallbacks() instead. - STEAM_PRIVATE_API( virtual void RunFrame() = 0; ) - - // returns the number of IPC calls made since the last time this function was called - // Used for perf debugging so you can understand how many IPC calls your game makes per frame - // Every IPC call is at minimum a thread context switch if not a process one so you want to rate - // control how often you do them. - virtual uint32 GetIPCCallCount() = 0; - - // API warning handling - // 'int' is the severity; 0 for msg, 1 for warning - // 'const char *' is the text of the message - // callbacks will occur directly after the API function is called that generated the warning or message. - virtual void SetWarningMessageHook( SteamAPIWarningMessageHook_t pFunction ) = 0; - - // Trigger global shutdown for the DLL - virtual bool BShutdownIfAllPipesClosed() = 0; - - // Expose HTTP interface - virtual ISteamHTTP *GetISteamHTTP( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Deprecated - the ISteamUnifiedMessages interface is no longer intended for public consumption. - STEAM_PRIVATE_API( virtual void *DEPRECATED_GetISteamUnifiedMessages( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0 ; ) - - // Exposes the ISteamController interface - deprecated in favor of Steam Input - virtual ISteamController *GetISteamController( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Exposes the ISteamUGC interface - virtual ISteamUGC *GetISteamUGC( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // returns app list interface, only available on specially registered apps - virtual ISteamAppList *GetISteamAppList( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Music Player - virtual ISteamMusic *GetISteamMusic( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Music Player Remote - virtual ISteamMusicRemote *GetISteamMusicRemote(HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion) = 0; - - // html page display - virtual ISteamHTMLSurface *GetISteamHTMLSurface(HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion) = 0; - - // Helper functions for internal Steam usage - STEAM_PRIVATE_API( virtual void DEPRECATED_Set_SteamAPI_CPostAPIResultInProcess( void (*)() ) = 0; ) - STEAM_PRIVATE_API( virtual void DEPRECATED_Remove_SteamAPI_CPostAPIResultInProcess( void (*)() ) = 0; ) - STEAM_PRIVATE_API( virtual void Set_SteamAPI_CCheckCallbackRegisteredInProcess( SteamAPI_CheckCallbackRegistered_t func ) = 0; ) - - // inventory - virtual ISteamInventory *GetISteamInventory( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Video - virtual ISteamVideo *GetISteamVideo( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Parental controls - virtual ISteamParentalSettings *GetISteamParentalSettings( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Exposes the Steam Input interface for controller support - virtual ISteamInput *GetISteamInput( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Steam Parties interface - virtual ISteamParties *GetISteamParties( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - // Steam Remote Play interface - virtual ISteamRemotePlay *GetISteamRemotePlay( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) = 0; - - STEAM_PRIVATE_API( virtual void DestroyAllInterfaces() = 0; ) - -}; -#define STEAMCLIENT_INTERFACE_VERSION "SteamClient020" - -#ifndef STEAM_API_EXPORTS - -// Global ISteamClient interface accessor -inline ISteamClient *SteamClient(); -STEAM_DEFINE_INTERFACE_ACCESSOR( ISteamClient *, SteamClient, SteamInternal_CreateInterface( STEAMCLIENT_INTERFACE_VERSION ), "global", STEAMCLIENT_INTERFACE_VERSION ); - -// The internal ISteamClient used for the gameserver interface. -// (This is actually the same thing. You really shouldn't need to access any of this stuff directly.) -inline ISteamClient *SteamGameServerClient() { return SteamClient(); } - -#endif - -#endif // ISTEAMCLIENT_H diff --git a/lib/steamworks_150/public/steam/isteamcontroller.h b/lib/steamworks_150/public/steam/isteamcontroller.h deleted file mode 100644 index c332749..0000000 --- a/lib/steamworks_150/public/steam/isteamcontroller.h +++ /dev/null @@ -1,576 +0,0 @@ -//====== Copyright 1996-2018, Valve Corporation, All rights reserved. ======= -// Note: The older ISteamController interface has been deprecated in favor of ISteamInput - this interface -// was updated in this SDK but will be removed from future SDK's. The Steam Client will retain -// compatibility with the older interfaces so your any existing integrations should be unaffected. -// -// Purpose: Steam Input is a flexible input API that supports over three hundred devices including all -// common variants of Xbox, Playstation, Nintendo Switch Pro, and Steam Controllers. -// For more info including a getting started guide for developers -// please visit: https://partner.steamgames.com/doc/features/steam_controller -// -//============================================================================= - -#ifndef ISTEAMCONTROLLER_H -#define ISTEAMCONTROLLER_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "isteaminput.h" - -#define STEAM_CONTROLLER_MAX_COUNT 16 - -#define STEAM_CONTROLLER_MAX_ANALOG_ACTIONS 16 - -#define STEAM_CONTROLLER_MAX_DIGITAL_ACTIONS 128 - -#define STEAM_CONTROLLER_MAX_ORIGINS 8 - -#define STEAM_CONTROLLER_MAX_ACTIVE_LAYERS 16 - -// When sending an option to a specific controller handle, you can send to all controllers via this command -#define STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS UINT64_MAX - -#define STEAM_CONTROLLER_MIN_ANALOG_ACTION_DATA -1.0f -#define STEAM_CONTROLLER_MAX_ANALOG_ACTION_DATA 1.0f - -#ifndef ISTEAMINPUT_H -enum ESteamControllerPad -{ - k_ESteamControllerPad_Left, - k_ESteamControllerPad_Right -}; -#endif - -// Note: Please do not use action origins as a way to identify controller types. There is no -// guarantee that they will be added in a contiguous manner - use GetInputTypeForHandle instead -// Versions of Steam that add new controller types in the future will extend this enum if you're -// using a lookup table please check the bounds of any origins returned by Steam. -enum EControllerActionOrigin -{ - // Steam Controller - k_EControllerActionOrigin_None, - k_EControllerActionOrigin_A, - k_EControllerActionOrigin_B, - k_EControllerActionOrigin_X, - k_EControllerActionOrigin_Y, - k_EControllerActionOrigin_LeftBumper, - k_EControllerActionOrigin_RightBumper, - k_EControllerActionOrigin_LeftGrip, - k_EControllerActionOrigin_RightGrip, - k_EControllerActionOrigin_Start, - k_EControllerActionOrigin_Back, - k_EControllerActionOrigin_LeftPad_Touch, - k_EControllerActionOrigin_LeftPad_Swipe, - k_EControllerActionOrigin_LeftPad_Click, - k_EControllerActionOrigin_LeftPad_DPadNorth, - k_EControllerActionOrigin_LeftPad_DPadSouth, - k_EControllerActionOrigin_LeftPad_DPadWest, - k_EControllerActionOrigin_LeftPad_DPadEast, - k_EControllerActionOrigin_RightPad_Touch, - k_EControllerActionOrigin_RightPad_Swipe, - k_EControllerActionOrigin_RightPad_Click, - k_EControllerActionOrigin_RightPad_DPadNorth, - k_EControllerActionOrigin_RightPad_DPadSouth, - k_EControllerActionOrigin_RightPad_DPadWest, - k_EControllerActionOrigin_RightPad_DPadEast, - k_EControllerActionOrigin_LeftTrigger_Pull, - k_EControllerActionOrigin_LeftTrigger_Click, - k_EControllerActionOrigin_RightTrigger_Pull, - k_EControllerActionOrigin_RightTrigger_Click, - k_EControllerActionOrigin_LeftStick_Move, - k_EControllerActionOrigin_LeftStick_Click, - k_EControllerActionOrigin_LeftStick_DPadNorth, - k_EControllerActionOrigin_LeftStick_DPadSouth, - k_EControllerActionOrigin_LeftStick_DPadWest, - k_EControllerActionOrigin_LeftStick_DPadEast, - k_EControllerActionOrigin_Gyro_Move, - k_EControllerActionOrigin_Gyro_Pitch, - k_EControllerActionOrigin_Gyro_Yaw, - k_EControllerActionOrigin_Gyro_Roll, - - // PS4 Dual Shock - k_EControllerActionOrigin_PS4_X, - k_EControllerActionOrigin_PS4_Circle, - k_EControllerActionOrigin_PS4_Triangle, - k_EControllerActionOrigin_PS4_Square, - k_EControllerActionOrigin_PS4_LeftBumper, - k_EControllerActionOrigin_PS4_RightBumper, - k_EControllerActionOrigin_PS4_Options, //Start - k_EControllerActionOrigin_PS4_Share, //Back - k_EControllerActionOrigin_PS4_LeftPad_Touch, - k_EControllerActionOrigin_PS4_LeftPad_Swipe, - k_EControllerActionOrigin_PS4_LeftPad_Click, - k_EControllerActionOrigin_PS4_LeftPad_DPadNorth, - k_EControllerActionOrigin_PS4_LeftPad_DPadSouth, - k_EControllerActionOrigin_PS4_LeftPad_DPadWest, - k_EControllerActionOrigin_PS4_LeftPad_DPadEast, - k_EControllerActionOrigin_PS4_RightPad_Touch, - k_EControllerActionOrigin_PS4_RightPad_Swipe, - k_EControllerActionOrigin_PS4_RightPad_Click, - k_EControllerActionOrigin_PS4_RightPad_DPadNorth, - k_EControllerActionOrigin_PS4_RightPad_DPadSouth, - k_EControllerActionOrigin_PS4_RightPad_DPadWest, - k_EControllerActionOrigin_PS4_RightPad_DPadEast, - k_EControllerActionOrigin_PS4_CenterPad_Touch, - k_EControllerActionOrigin_PS4_CenterPad_Swipe, - k_EControllerActionOrigin_PS4_CenterPad_Click, - k_EControllerActionOrigin_PS4_CenterPad_DPadNorth, - k_EControllerActionOrigin_PS4_CenterPad_DPadSouth, - k_EControllerActionOrigin_PS4_CenterPad_DPadWest, - k_EControllerActionOrigin_PS4_CenterPad_DPadEast, - k_EControllerActionOrigin_PS4_LeftTrigger_Pull, - k_EControllerActionOrigin_PS4_LeftTrigger_Click, - k_EControllerActionOrigin_PS4_RightTrigger_Pull, - k_EControllerActionOrigin_PS4_RightTrigger_Click, - k_EControllerActionOrigin_PS4_LeftStick_Move, - k_EControllerActionOrigin_PS4_LeftStick_Click, - k_EControllerActionOrigin_PS4_LeftStick_DPadNorth, - k_EControllerActionOrigin_PS4_LeftStick_DPadSouth, - k_EControllerActionOrigin_PS4_LeftStick_DPadWest, - k_EControllerActionOrigin_PS4_LeftStick_DPadEast, - k_EControllerActionOrigin_PS4_RightStick_Move, - k_EControllerActionOrigin_PS4_RightStick_Click, - k_EControllerActionOrigin_PS4_RightStick_DPadNorth, - k_EControllerActionOrigin_PS4_RightStick_DPadSouth, - k_EControllerActionOrigin_PS4_RightStick_DPadWest, - k_EControllerActionOrigin_PS4_RightStick_DPadEast, - k_EControllerActionOrigin_PS4_DPad_North, - k_EControllerActionOrigin_PS4_DPad_South, - k_EControllerActionOrigin_PS4_DPad_West, - k_EControllerActionOrigin_PS4_DPad_East, - k_EControllerActionOrigin_PS4_Gyro_Move, - k_EControllerActionOrigin_PS4_Gyro_Pitch, - k_EControllerActionOrigin_PS4_Gyro_Yaw, - k_EControllerActionOrigin_PS4_Gyro_Roll, - - // XBox One - k_EControllerActionOrigin_XBoxOne_A, - k_EControllerActionOrigin_XBoxOne_B, - k_EControllerActionOrigin_XBoxOne_X, - k_EControllerActionOrigin_XBoxOne_Y, - k_EControllerActionOrigin_XBoxOne_LeftBumper, - k_EControllerActionOrigin_XBoxOne_RightBumper, - k_EControllerActionOrigin_XBoxOne_Menu, //Start - k_EControllerActionOrigin_XBoxOne_View, //Back - k_EControllerActionOrigin_XBoxOne_LeftTrigger_Pull, - k_EControllerActionOrigin_XBoxOne_LeftTrigger_Click, - k_EControllerActionOrigin_XBoxOne_RightTrigger_Pull, - k_EControllerActionOrigin_XBoxOne_RightTrigger_Click, - k_EControllerActionOrigin_XBoxOne_LeftStick_Move, - k_EControllerActionOrigin_XBoxOne_LeftStick_Click, - k_EControllerActionOrigin_XBoxOne_LeftStick_DPadNorth, - k_EControllerActionOrigin_XBoxOne_LeftStick_DPadSouth, - k_EControllerActionOrigin_XBoxOne_LeftStick_DPadWest, - k_EControllerActionOrigin_XBoxOne_LeftStick_DPadEast, - k_EControllerActionOrigin_XBoxOne_RightStick_Move, - k_EControllerActionOrigin_XBoxOne_RightStick_Click, - k_EControllerActionOrigin_XBoxOne_RightStick_DPadNorth, - k_EControllerActionOrigin_XBoxOne_RightStick_DPadSouth, - k_EControllerActionOrigin_XBoxOne_RightStick_DPadWest, - k_EControllerActionOrigin_XBoxOne_RightStick_DPadEast, - k_EControllerActionOrigin_XBoxOne_DPad_North, - k_EControllerActionOrigin_XBoxOne_DPad_South, - k_EControllerActionOrigin_XBoxOne_DPad_West, - k_EControllerActionOrigin_XBoxOne_DPad_East, - - // XBox 360 - k_EControllerActionOrigin_XBox360_A, - k_EControllerActionOrigin_XBox360_B, - k_EControllerActionOrigin_XBox360_X, - k_EControllerActionOrigin_XBox360_Y, - k_EControllerActionOrigin_XBox360_LeftBumper, - k_EControllerActionOrigin_XBox360_RightBumper, - k_EControllerActionOrigin_XBox360_Start, //Start - k_EControllerActionOrigin_XBox360_Back, //Back - k_EControllerActionOrigin_XBox360_LeftTrigger_Pull, - k_EControllerActionOrigin_XBox360_LeftTrigger_Click, - k_EControllerActionOrigin_XBox360_RightTrigger_Pull, - k_EControllerActionOrigin_XBox360_RightTrigger_Click, - k_EControllerActionOrigin_XBox360_LeftStick_Move, - k_EControllerActionOrigin_XBox360_LeftStick_Click, - k_EControllerActionOrigin_XBox360_LeftStick_DPadNorth, - k_EControllerActionOrigin_XBox360_LeftStick_DPadSouth, - k_EControllerActionOrigin_XBox360_LeftStick_DPadWest, - k_EControllerActionOrigin_XBox360_LeftStick_DPadEast, - k_EControllerActionOrigin_XBox360_RightStick_Move, - k_EControllerActionOrigin_XBox360_RightStick_Click, - k_EControllerActionOrigin_XBox360_RightStick_DPadNorth, - k_EControllerActionOrigin_XBox360_RightStick_DPadSouth, - k_EControllerActionOrigin_XBox360_RightStick_DPadWest, - k_EControllerActionOrigin_XBox360_RightStick_DPadEast, - k_EControllerActionOrigin_XBox360_DPad_North, - k_EControllerActionOrigin_XBox360_DPad_South, - k_EControllerActionOrigin_XBox360_DPad_West, - k_EControllerActionOrigin_XBox360_DPad_East, - - // SteamController V2 - k_EControllerActionOrigin_SteamV2_A, - k_EControllerActionOrigin_SteamV2_B, - k_EControllerActionOrigin_SteamV2_X, - k_EControllerActionOrigin_SteamV2_Y, - k_EControllerActionOrigin_SteamV2_LeftBumper, - k_EControllerActionOrigin_SteamV2_RightBumper, - k_EControllerActionOrigin_SteamV2_LeftGrip_Lower, - k_EControllerActionOrigin_SteamV2_LeftGrip_Upper, - k_EControllerActionOrigin_SteamV2_RightGrip_Lower, - k_EControllerActionOrigin_SteamV2_RightGrip_Upper, - k_EControllerActionOrigin_SteamV2_LeftBumper_Pressure, - k_EControllerActionOrigin_SteamV2_RightBumper_Pressure, - k_EControllerActionOrigin_SteamV2_LeftGrip_Pressure, - k_EControllerActionOrigin_SteamV2_RightGrip_Pressure, - k_EControllerActionOrigin_SteamV2_LeftGrip_Upper_Pressure, - k_EControllerActionOrigin_SteamV2_RightGrip_Upper_Pressure, - k_EControllerActionOrigin_SteamV2_Start, - k_EControllerActionOrigin_SteamV2_Back, - k_EControllerActionOrigin_SteamV2_LeftPad_Touch, - k_EControllerActionOrigin_SteamV2_LeftPad_Swipe, - k_EControllerActionOrigin_SteamV2_LeftPad_Click, - k_EControllerActionOrigin_SteamV2_LeftPad_Pressure, - k_EControllerActionOrigin_SteamV2_LeftPad_DPadNorth, - k_EControllerActionOrigin_SteamV2_LeftPad_DPadSouth, - k_EControllerActionOrigin_SteamV2_LeftPad_DPadWest, - k_EControllerActionOrigin_SteamV2_LeftPad_DPadEast, - k_EControllerActionOrigin_SteamV2_RightPad_Touch, - k_EControllerActionOrigin_SteamV2_RightPad_Swipe, - k_EControllerActionOrigin_SteamV2_RightPad_Click, - k_EControllerActionOrigin_SteamV2_RightPad_Pressure, - k_EControllerActionOrigin_SteamV2_RightPad_DPadNorth, - k_EControllerActionOrigin_SteamV2_RightPad_DPadSouth, - k_EControllerActionOrigin_SteamV2_RightPad_DPadWest, - k_EControllerActionOrigin_SteamV2_RightPad_DPadEast, - k_EControllerActionOrigin_SteamV2_LeftTrigger_Pull, - k_EControllerActionOrigin_SteamV2_LeftTrigger_Click, - k_EControllerActionOrigin_SteamV2_RightTrigger_Pull, - k_EControllerActionOrigin_SteamV2_RightTrigger_Click, - k_EControllerActionOrigin_SteamV2_LeftStick_Move, - k_EControllerActionOrigin_SteamV2_LeftStick_Click, - k_EControllerActionOrigin_SteamV2_LeftStick_DPadNorth, - k_EControllerActionOrigin_SteamV2_LeftStick_DPadSouth, - k_EControllerActionOrigin_SteamV2_LeftStick_DPadWest, - k_EControllerActionOrigin_SteamV2_LeftStick_DPadEast, - k_EControllerActionOrigin_SteamV2_Gyro_Move, - k_EControllerActionOrigin_SteamV2_Gyro_Pitch, - k_EControllerActionOrigin_SteamV2_Gyro_Yaw, - k_EControllerActionOrigin_SteamV2_Gyro_Roll, - - // Switch - Pro or Joycons used as a single input device. - // This does not apply to a single joycon - k_EControllerActionOrigin_Switch_A, - k_EControllerActionOrigin_Switch_B, - k_EControllerActionOrigin_Switch_X, - k_EControllerActionOrigin_Switch_Y, - k_EControllerActionOrigin_Switch_LeftBumper, - k_EControllerActionOrigin_Switch_RightBumper, - k_EControllerActionOrigin_Switch_Plus, //Start - k_EControllerActionOrigin_Switch_Minus, //Back - k_EControllerActionOrigin_Switch_Capture, - k_EControllerActionOrigin_Switch_LeftTrigger_Pull, - k_EControllerActionOrigin_Switch_LeftTrigger_Click, - k_EControllerActionOrigin_Switch_RightTrigger_Pull, - k_EControllerActionOrigin_Switch_RightTrigger_Click, - k_EControllerActionOrigin_Switch_LeftStick_Move, - k_EControllerActionOrigin_Switch_LeftStick_Click, - k_EControllerActionOrigin_Switch_LeftStick_DPadNorth, - k_EControllerActionOrigin_Switch_LeftStick_DPadSouth, - k_EControllerActionOrigin_Switch_LeftStick_DPadWest, - k_EControllerActionOrigin_Switch_LeftStick_DPadEast, - k_EControllerActionOrigin_Switch_RightStick_Move, - k_EControllerActionOrigin_Switch_RightStick_Click, - k_EControllerActionOrigin_Switch_RightStick_DPadNorth, - k_EControllerActionOrigin_Switch_RightStick_DPadSouth, - k_EControllerActionOrigin_Switch_RightStick_DPadWest, - k_EControllerActionOrigin_Switch_RightStick_DPadEast, - k_EControllerActionOrigin_Switch_DPad_North, - k_EControllerActionOrigin_Switch_DPad_South, - k_EControllerActionOrigin_Switch_DPad_West, - k_EControllerActionOrigin_Switch_DPad_East, - k_EControllerActionOrigin_Switch_ProGyro_Move, // Primary Gyro in Pro Controller, or Right JoyCon - k_EControllerActionOrigin_Switch_ProGyro_Pitch, // Primary Gyro in Pro Controller, or Right JoyCon - k_EControllerActionOrigin_Switch_ProGyro_Yaw, // Primary Gyro in Pro Controller, or Right JoyCon - k_EControllerActionOrigin_Switch_ProGyro_Roll, // Primary Gyro in Pro Controller, or Right JoyCon - // Switch JoyCon Specific - k_EControllerActionOrigin_Switch_RightGyro_Move, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EControllerActionOrigin_Switch_RightGyro_Pitch, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EControllerActionOrigin_Switch_RightGyro_Yaw, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EControllerActionOrigin_Switch_RightGyro_Roll, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EControllerActionOrigin_Switch_LeftGyro_Move, - k_EControllerActionOrigin_Switch_LeftGyro_Pitch, - k_EControllerActionOrigin_Switch_LeftGyro_Yaw, - k_EControllerActionOrigin_Switch_LeftGyro_Roll, - k_EControllerActionOrigin_Switch_LeftGrip_Lower, // Left JoyCon SR Button - k_EControllerActionOrigin_Switch_LeftGrip_Upper, // Left JoyCon SL Button - k_EControllerActionOrigin_Switch_RightGrip_Lower, // Right JoyCon SL Button - k_EControllerActionOrigin_Switch_RightGrip_Upper, // Right JoyCon SR Button - - // Added in SDK 1.45 - k_EControllerActionOrigin_PS4_DPad_Move, - k_EControllerActionOrigin_XBoxOne_DPad_Move, - k_EControllerActionOrigin_XBox360_DPad_Move, - k_EControllerActionOrigin_Switch_DPad_Move, - - k_EControllerActionOrigin_Count, // If Steam has added support for new controllers origins will go here. - k_EControllerActionOrigin_MaximumPossibleValue = 32767, // Origins are currently a maximum of 16 bits. -}; - -#ifndef ISTEAMINPUT_H -enum EXboxOrigin -{ - k_EXboxOrigin_A, - k_EXboxOrigin_B, - k_EXboxOrigin_X, - k_EXboxOrigin_Y, - k_EXboxOrigin_LeftBumper, - k_EXboxOrigin_RightBumper, - k_EXboxOrigin_Menu, //Start - k_EXboxOrigin_View, //Back - k_EXboxOrigin_LeftTrigger_Pull, - k_EXboxOrigin_LeftTrigger_Click, - k_EXboxOrigin_RightTrigger_Pull, - k_EXboxOrigin_RightTrigger_Click, - k_EXboxOrigin_LeftStick_Move, - k_EXboxOrigin_LeftStick_Click, - k_EXboxOrigin_LeftStick_DPadNorth, - k_EXboxOrigin_LeftStick_DPadSouth, - k_EXboxOrigin_LeftStick_DPadWest, - k_EXboxOrigin_LeftStick_DPadEast, - k_EXboxOrigin_RightStick_Move, - k_EXboxOrigin_RightStick_Click, - k_EXboxOrigin_RightStick_DPadNorth, - k_EXboxOrigin_RightStick_DPadSouth, - k_EXboxOrigin_RightStick_DPadWest, - k_EXboxOrigin_RightStick_DPadEast, - k_EXboxOrigin_DPad_North, - k_EXboxOrigin_DPad_South, - k_EXboxOrigin_DPad_West, - k_EXboxOrigin_DPad_East, -}; - -enum ESteamInputType -{ - k_ESteamInputType_Unknown, - k_ESteamInputType_SteamController, - k_ESteamInputType_XBox360Controller, - k_ESteamInputType_XBoxOneController, - k_ESteamInputType_GenericGamepad, // DirectInput controllers - k_ESteamInputType_PS4Controller, - k_ESteamInputType_AppleMFiController, // Unused - k_ESteamInputType_AndroidController, // Unused - k_ESteamInputType_SwitchJoyConPair, // Unused - k_ESteamInputType_SwitchJoyConSingle, // Unused - k_ESteamInputType_SwitchProController, - k_ESteamInputType_MobileTouch, // Steam Link App On-screen Virtual Controller - k_ESteamInputType_PS3Controller, // Currently uses PS4 Origins - k_ESteamInputType_Count, - k_ESteamInputType_MaximumPossibleValue = 255, -}; -#endif - -enum ESteamControllerLEDFlag -{ - k_ESteamControllerLEDFlag_SetColor, - k_ESteamControllerLEDFlag_RestoreUserDefault -}; - -// ControllerHandle_t is used to refer to a specific controller. -// This handle will consistently identify a controller, even if it is disconnected and re-connected -typedef uint64 ControllerHandle_t; - - -// These handles are used to refer to a specific in-game action or action set -// All action handles should be queried during initialization for performance reasons -typedef uint64 ControllerActionSetHandle_t; -typedef uint64 ControllerDigitalActionHandle_t; -typedef uint64 ControllerAnalogActionHandle_t; - -#pragma pack( push, 1 ) - -#ifdef ISTEAMINPUT_H -#define ControllerAnalogActionData_t InputAnalogActionData_t -#define ControllerDigitalActionData_t InputDigitalActionData_t -#define ControllerMotionData_t InputMotionData_t -#else -struct ControllerAnalogActionData_t -{ - // Type of data coming from this action, this will match what got specified in the action set - EControllerSourceMode eMode; - - // The current state of this action; will be delta updates for mouse actions - float x, y; - - // Whether or not this action is currently available to be bound in the active action set - bool bActive; -}; - -struct ControllerDigitalActionData_t -{ - // The current state of this action; will be true if currently pressed - bool bState; - - // Whether or not this action is currently available to be bound in the active action set - bool bActive; -}; - -struct ControllerMotionData_t -{ - // Sensor-fused absolute rotation; will drift in heading - float rotQuatX; - float rotQuatY; - float rotQuatZ; - float rotQuatW; - - // Positional acceleration - float posAccelX; - float posAccelY; - float posAccelZ; - - // Angular velocity - float rotVelX; - float rotVelY; - float rotVelZ; -}; -#endif -#pragma pack( pop ) - - -//----------------------------------------------------------------------------- -// Purpose: Steam Input API -//----------------------------------------------------------------------------- -class ISteamController -{ -public: - - // Init and Shutdown must be called when starting/ending use of this interface - virtual bool Init() = 0; - virtual bool Shutdown() = 0; - - // Synchronize API state with the latest Steam Controller inputs available. This - // is performed automatically by SteamAPI_RunCallbacks, but for the absolute lowest - // possible latency, you call this directly before reading controller state. This must - // be called from somewhere before GetConnectedControllers will return any handles - virtual void RunFrame() = 0; - - // Enumerate currently connected controllers - // handlesOut should point to a STEAM_CONTROLLER_MAX_COUNT sized array of ControllerHandle_t handles - // Returns the number of handles written to handlesOut - virtual int GetConnectedControllers( STEAM_OUT_ARRAY_COUNT( STEAM_CONTROLLER_MAX_COUNT, Receives list of connected controllers ) ControllerHandle_t *handlesOut ) = 0; - - //----------------------------------------------------------------------------- - // ACTION SETS - //----------------------------------------------------------------------------- - - // Lookup the handle for an Action Set. Best to do this once on startup, and store the handles for all future API calls. - virtual ControllerActionSetHandle_t GetActionSetHandle( const char *pszActionSetName ) = 0; - - // Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive') - // This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in - // your state loops, instead of trying to place it in all of your state transitions. - virtual void ActivateActionSet( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle ) = 0; - virtual ControllerActionSetHandle_t GetCurrentActionSet( ControllerHandle_t controllerHandle ) = 0; - - // ACTION SET LAYERS - virtual void ActivateActionSetLayer( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetLayerHandle ) = 0; - virtual void DeactivateActionSetLayer( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetLayerHandle ) = 0; - virtual void DeactivateAllActionSetLayers( ControllerHandle_t controllerHandle ) = 0; - // Enumerate currently active layers - // handlesOut should point to a STEAM_CONTROLLER_MAX_ACTIVE_LAYERS sized array of ControllerActionSetHandle_t handles. - // Returns the number of handles written to handlesOut - virtual int GetActiveActionSetLayers( ControllerHandle_t controllerHandle, STEAM_OUT_ARRAY_COUNT( STEAM_CONTROLLER_MAX_ACTIVE_LAYERS, Receives list of active layers ) ControllerActionSetHandle_t *handlesOut ) = 0; - - //----------------------------------------------------------------------------- - // ACTIONS - //----------------------------------------------------------------------------- - - // Lookup the handle for a digital action. Best to do this once on startup, and store the handles for all future API calls. - virtual ControllerDigitalActionHandle_t GetDigitalActionHandle( const char *pszActionName ) = 0; - - // Returns the current state of the supplied digital game action - virtual ControllerDigitalActionData_t GetDigitalActionData( ControllerHandle_t controllerHandle, ControllerDigitalActionHandle_t digitalActionHandle ) = 0; - - // Get the origin(s) for a digital action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action. - // originsOut should point to a STEAM_CONTROLLER_MAX_ORIGINS sized array of EControllerActionOrigin handles. The EControllerActionOrigin enum will get extended as support for new controller controllers gets added to - // the Steam client and will exceed the values from this header, please check bounds if you are using a look up table. - virtual int GetDigitalActionOrigins( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle, ControllerDigitalActionHandle_t digitalActionHandle, STEAM_OUT_ARRAY_COUNT( STEAM_CONTROLLER_MAX_ORIGINS, Receives list of aciton origins ) EControllerActionOrigin *originsOut ) = 0; - - // Lookup the handle for an analog action. Best to do this once on startup, and store the handles for all future API calls. - virtual ControllerAnalogActionHandle_t GetAnalogActionHandle( const char *pszActionName ) = 0; - - // Returns the current state of these supplied analog game action - virtual ControllerAnalogActionData_t GetAnalogActionData( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t analogActionHandle ) = 0; - - // Get the origin(s) for an analog action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action. - // originsOut should point to a STEAM_CONTROLLER_MAX_ORIGINS sized array of EControllerActionOrigin handles. The EControllerActionOrigin enum will get extended as support for new controller controllers gets added to - // the Steam client and will exceed the values from this header, please check bounds if you are using a look up table. - virtual int GetAnalogActionOrigins( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle, ControllerAnalogActionHandle_t analogActionHandle, STEAM_OUT_ARRAY_COUNT( STEAM_CONTROLLER_MAX_ORIGINS, Receives list of action origins ) EControllerActionOrigin *originsOut ) = 0; - - // Get a local path to art for on-screen glyph for a particular origin - this call is cheap - virtual const char *GetGlyphForActionOrigin( EControllerActionOrigin eOrigin ) = 0; - - // Returns a localized string (from Steam's language setting) for the specified origin - this call is serialized - virtual const char *GetStringForActionOrigin( EControllerActionOrigin eOrigin ) = 0; - - virtual void StopAnalogActionMomentum( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t eAction ) = 0; - - // Returns raw motion data from the specified controller - virtual ControllerMotionData_t GetMotionData( ControllerHandle_t controllerHandle ) = 0; - - //----------------------------------------------------------------------------- - // OUTPUTS - //----------------------------------------------------------------------------- - - // Trigger a haptic pulse on a controller - virtual void TriggerHapticPulse( ControllerHandle_t controllerHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec ) = 0; - - // Trigger a pulse with a duty cycle of usDurationMicroSec / usOffMicroSec, unRepeat times. - // nFlags is currently unused and reserved for future use. - virtual void TriggerRepeatedHapticPulse( ControllerHandle_t controllerHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec, unsigned short usOffMicroSec, unsigned short unRepeat, unsigned int nFlags ) = 0; - - // Trigger a vibration event on supported controllers. - virtual void TriggerVibration( ControllerHandle_t controllerHandle, unsigned short usLeftSpeed, unsigned short usRightSpeed ) = 0; - - // Set the controller LED color on supported controllers. - virtual void SetLEDColor( ControllerHandle_t controllerHandle, uint8 nColorR, uint8 nColorG, uint8 nColorB, unsigned int nFlags ) = 0; - - //----------------------------------------------------------------------------- - // Utility functions availible without using the rest of Steam Input API - //----------------------------------------------------------------------------- - - // Invokes the Steam overlay and brings up the binding screen if the user is using Big Picture Mode - // If the user is not in Big Picture Mode it will open up the binding in a new window - virtual bool ShowBindingPanel( ControllerHandle_t controllerHandle ) = 0; - - // Returns the input type for a particular handle - virtual ESteamInputType GetInputTypeForHandle( ControllerHandle_t controllerHandle ) = 0; - - // Returns the associated controller handle for the specified emulated gamepad - can be used with the above 2 functions - // to identify controllers presented to your game over Xinput. Returns 0 if the Xinput index isn't associated with Steam Input - virtual ControllerHandle_t GetControllerForGamepadIndex( int nIndex ) = 0; - - // Returns the associated gamepad index for the specified controller, if emulating a gamepad or -1 if not associated with an Xinput index - virtual int GetGamepadIndexForController( ControllerHandle_t ulControllerHandle ) = 0; - - // Returns a localized string (from Steam's language setting) for the specified Xbox controller origin. - virtual const char *GetStringForXboxOrigin( EXboxOrigin eOrigin ) = 0; - - // Get a local path to art for on-screen glyph for a particular Xbox controller origin. - virtual const char *GetGlyphForXboxOrigin( EXboxOrigin eOrigin ) = 0; - - // Get the equivalent ActionOrigin for a given Xbox controller origin this can be chained with GetGlyphForActionOrigin to provide future proof glyphs for - // non-Steam Input API action games. Note - this only translates the buttons directly and doesn't take into account any remapping a user has made in their configuration - virtual EControllerActionOrigin GetActionOriginFromXboxOrigin( ControllerHandle_t controllerHandle, EXboxOrigin eOrigin ) = 0; - - // Convert an origin to another controller type - for inputs not present on the other controller type this will return k_EControllerActionOrigin_None - virtual EControllerActionOrigin TranslateActionOrigin( ESteamInputType eDestinationInputType, EControllerActionOrigin eSourceOrigin ) = 0; - - // Get the binding revision for a given device. Returns false if the handle was not valid or if a mapping is not yet loaded for the device - virtual bool GetControllerBindingRevision( ControllerHandle_t controllerHandle, int *pMajor, int *pMinor ) = 0; -}; - -#define STEAMCONTROLLER_INTERFACE_VERSION "SteamController007" - -// Global interface accessor -inline ISteamController *SteamController(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamController *, SteamController, STEAMCONTROLLER_INTERFACE_VERSION ); - -#endif // ISTEAMCONTROLLER_H diff --git a/lib/steamworks_150/public/steam/isteamfriends.h b/lib/steamworks_150/public/steam/isteamfriends.h deleted file mode 100644 index 520a67f..0000000 --- a/lib/steamworks_150/public/steam/isteamfriends.h +++ /dev/null @@ -1,690 +0,0 @@ -//====== Copyright Valve Corporation, All rights reserved. ==================== -// -// Purpose: interface to both friends list data and general information about users -// -//============================================================================= - -#ifndef ISTEAMFRIENDS_H -#define ISTEAMFRIENDS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -//----------------------------------------------------------------------------- -// Purpose: set of relationships to other users -//----------------------------------------------------------------------------- -enum EFriendRelationship -{ - k_EFriendRelationshipNone = 0, - k_EFriendRelationshipBlocked = 1, // this doesn't get stored; the user has just done an Ignore on an friendship invite - k_EFriendRelationshipRequestRecipient = 2, - k_EFriendRelationshipFriend = 3, - k_EFriendRelationshipRequestInitiator = 4, - k_EFriendRelationshipIgnored = 5, // this is stored; the user has explicit blocked this other user from comments/chat/etc - k_EFriendRelationshipIgnoredFriend = 6, - k_EFriendRelationshipSuggested_DEPRECATED = 7, // was used by the original implementation of the facebook linking feature, but now unused. - - // keep this updated - k_EFriendRelationshipMax = 8, -}; - -// maximum length of friend group name (not including terminating nul!) -const int k_cchMaxFriendsGroupName = 64; - -// maximum number of groups a single user is allowed -const int k_cFriendsGroupLimit = 100; - -// friends group identifier type -typedef int16 FriendsGroupID_t; - -// invalid friends group identifier constant -const FriendsGroupID_t k_FriendsGroupID_Invalid = -1; - -const int k_cEnumerateFollowersMax = 50; - - -//----------------------------------------------------------------------------- -// Purpose: list of states a friend can be in -//----------------------------------------------------------------------------- -enum EPersonaState -{ - k_EPersonaStateOffline = 0, // friend is not currently logged on - k_EPersonaStateOnline = 1, // friend is logged on - k_EPersonaStateBusy = 2, // user is on, but busy - k_EPersonaStateAway = 3, // auto-away feature - k_EPersonaStateSnooze = 4, // auto-away for a long time - k_EPersonaStateLookingToTrade = 5, // Online, trading - k_EPersonaStateLookingToPlay = 6, // Online, wanting to play - k_EPersonaStateInvisible = 7, // Online, but appears offline to friends. This status is never published to clients. - k_EPersonaStateMax, -}; - - -//----------------------------------------------------------------------------- -// Purpose: flags for enumerating friends list, or quickly checking a the relationship between users -//----------------------------------------------------------------------------- -enum EFriendFlags -{ - k_EFriendFlagNone = 0x00, - k_EFriendFlagBlocked = 0x01, - k_EFriendFlagFriendshipRequested = 0x02, - k_EFriendFlagImmediate = 0x04, // "regular" friend - k_EFriendFlagClanMember = 0x08, - k_EFriendFlagOnGameServer = 0x10, - // k_EFriendFlagHasPlayedWith = 0x20, // not currently used - // k_EFriendFlagFriendOfFriend = 0x40, // not currently used - k_EFriendFlagRequestingFriendship = 0x80, - k_EFriendFlagRequestingInfo = 0x100, - k_EFriendFlagIgnored = 0x200, - k_EFriendFlagIgnoredFriend = 0x400, - // k_EFriendFlagSuggested = 0x800, // not used - k_EFriendFlagChatMember = 0x1000, - k_EFriendFlagAll = 0xFFFF, -}; - - -// friend game played information -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif -struct FriendGameInfo_t -{ - CGameID m_gameID; - uint32 m_unGameIP; - uint16 m_usGamePort; - uint16 m_usQueryPort; - CSteamID m_steamIDLobby; -}; -#pragma pack( pop ) - -// maximum number of characters in a user's name. Two flavors; one for UTF-8 and one for UTF-16. -// The UTF-8 version has to be very generous to accomodate characters that get large when encoded -// in UTF-8. -enum -{ - k_cchPersonaNameMax = 128, - k_cwchPersonaNameMax = 32, -}; - -//----------------------------------------------------------------------------- -// Purpose: user restriction flags -//----------------------------------------------------------------------------- -enum EUserRestriction -{ - k_nUserRestrictionNone = 0, // no known chat/content restriction - k_nUserRestrictionUnknown = 1, // we don't know yet (user offline) - k_nUserRestrictionAnyChat = 2, // user is not allowed to (or can't) send/recv any chat - k_nUserRestrictionVoiceChat = 4, // user is not allowed to (or can't) send/recv voice chat - k_nUserRestrictionGroupChat = 8, // user is not allowed to (or can't) send/recv group chat - k_nUserRestrictionRating = 16, // user is too young according to rating in current region - k_nUserRestrictionGameInvites = 32, // user cannot send or recv game invites (e.g. mobile) - k_nUserRestrictionTrading = 64, // user cannot participate in trading (console, mobile) -}; - -// size limit on chat room or member metadata -const uint32 k_cubChatMetadataMax = 8192; - -// size limits on Rich Presence data -enum { k_cchMaxRichPresenceKeys = 30 }; -enum { k_cchMaxRichPresenceKeyLength = 64 }; -enum { k_cchMaxRichPresenceValueLength = 256 }; - -// These values are passed as parameters to the store -enum EOverlayToStoreFlag -{ - k_EOverlayToStoreFlag_None = 0, - k_EOverlayToStoreFlag_AddToCart = 1, - k_EOverlayToStoreFlag_AddToCartAndShow = 2, -}; - - -//----------------------------------------------------------------------------- -// Purpose: Tells Steam where to place the browser window inside the overlay -//----------------------------------------------------------------------------- -enum EActivateGameOverlayToWebPageMode -{ - k_EActivateGameOverlayToWebPageMode_Default = 0, // Browser will open next to all other windows that the user has open in the overlay. - // The window will remain open, even if the user closes then re-opens the overlay. - - k_EActivateGameOverlayToWebPageMode_Modal = 1 // Browser will be opened in a special overlay configuration which hides all other windows - // that the user has open in the overlay. When the user closes the overlay, the browser window - // will also close. When the user closes the browser window, the overlay will automatically close. -}; - - -//----------------------------------------------------------------------------- -// Purpose: interface to accessing information about individual users, -// that can be a friend, in a group, on a game server or in a lobby with the local user -//----------------------------------------------------------------------------- -class ISteamFriends -{ -public: - // returns the local players name - guaranteed to not be NULL. - // this is the same name as on the users community profile page - // this is stored in UTF-8 format - // like all the other interface functions that return a char *, it's important that this pointer is not saved - // off; it will eventually be free'd or re-allocated - virtual const char *GetPersonaName() = 0; - - // Sets the player name, stores it on the server and publishes the changes to all friends who are online. - // Changes take place locally immediately, and a PersonaStateChange_t is posted, presuming success. - // - // The final results are available through the return value SteamAPICall_t, using SetPersonaNameResponse_t. - // - // If the name change fails to happen on the server, then an additional global PersonaStateChange_t will be posted - // to change the name back, in addition to the SetPersonaNameResponse_t callback. - STEAM_CALL_RESULT( SetPersonaNameResponse_t ) - virtual SteamAPICall_t SetPersonaName( const char *pchPersonaName ) = 0; - - // gets the status of the current user - virtual EPersonaState GetPersonaState() = 0; - - // friend iteration - // takes a set of k_EFriendFlags, and returns the number of users the client knows about who meet that criteria - // then GetFriendByIndex() can then be used to return the id's of each of those users - virtual int GetFriendCount( int iFriendFlags ) = 0; - - // returns the steamID of a user - // iFriend is a index of range [0, GetFriendCount()) - // iFriendsFlags must be the same value as used in GetFriendCount() - // the returned CSteamID can then be used by all the functions below to access details about the user - virtual CSteamID GetFriendByIndex( int iFriend, int iFriendFlags ) = 0; - - // returns a relationship to a user - virtual EFriendRelationship GetFriendRelationship( CSteamID steamIDFriend ) = 0; - - // returns the current status of the specified user - // this will only be known by the local user if steamIDFriend is in their friends list; on the same game server; in a chat room or lobby; or in a small group with the local user - virtual EPersonaState GetFriendPersonaState( CSteamID steamIDFriend ) = 0; - - // returns the name another user - guaranteed to not be NULL. - // same rules as GetFriendPersonaState() apply as to whether or not the user knowns the name of the other user - // note that on first joining a lobby, chat room or game server the local user will not known the name of the other users automatically; that information will arrive asyncronously - // - virtual const char *GetFriendPersonaName( CSteamID steamIDFriend ) = 0; - - // returns true if the friend is actually in a game, and fills in pFriendGameInfo with an extra details - virtual bool GetFriendGamePlayed( CSteamID steamIDFriend, STEAM_OUT_STRUCT() FriendGameInfo_t *pFriendGameInfo ) = 0; - // accesses old friends names - returns an empty string when their are no more items in the history - virtual const char *GetFriendPersonaNameHistory( CSteamID steamIDFriend, int iPersonaName ) = 0; - // friends steam level - virtual int GetFriendSteamLevel( CSteamID steamIDFriend ) = 0; - - // Returns nickname the current user has set for the specified player. Returns NULL if the no nickname has been set for that player. - // DEPRECATED: GetPersonaName follows the Steam nickname preferences, so apps shouldn't need to care about nicknames explicitly. - virtual const char *GetPlayerNickname( CSteamID steamIDPlayer ) = 0; - - // friend grouping (tag) apis - // returns the number of friends groups - virtual int GetFriendsGroupCount() = 0; - // returns the friends group ID for the given index (invalid indices return k_FriendsGroupID_Invalid) - virtual FriendsGroupID_t GetFriendsGroupIDByIndex( int iFG ) = 0; - // returns the name for the given friends group (NULL in the case of invalid friends group IDs) - virtual const char *GetFriendsGroupName( FriendsGroupID_t friendsGroupID ) = 0; - // returns the number of members in a given friends group - virtual int GetFriendsGroupMembersCount( FriendsGroupID_t friendsGroupID ) = 0; - // gets up to nMembersCount members of the given friends group, if fewer exist than requested those positions' SteamIDs will be invalid - virtual void GetFriendsGroupMembersList( FriendsGroupID_t friendsGroupID, STEAM_OUT_ARRAY_CALL(nMembersCount, GetFriendsGroupMembersCount, friendsGroupID ) CSteamID *pOutSteamIDMembers, int nMembersCount ) = 0; - - // returns true if the specified user meets any of the criteria specified in iFriendFlags - // iFriendFlags can be the union (binary or, |) of one or more k_EFriendFlags values - virtual bool HasFriend( CSteamID steamIDFriend, int iFriendFlags ) = 0; - - // clan (group) iteration and access functions - virtual int GetClanCount() = 0; - virtual CSteamID GetClanByIndex( int iClan ) = 0; - virtual const char *GetClanName( CSteamID steamIDClan ) = 0; - virtual const char *GetClanTag( CSteamID steamIDClan ) = 0; - // returns the most recent information we have about what's happening in a clan - virtual bool GetClanActivityCounts( CSteamID steamIDClan, int *pnOnline, int *pnInGame, int *pnChatting ) = 0; - - // for clans a user is a member of, they will have reasonably up-to-date information, but for others you'll have to download the info to have the latest - STEAM_CALL_RESULT( DownloadClanActivityCountsResult_t ) - virtual SteamAPICall_t DownloadClanActivityCounts( STEAM_ARRAY_COUNT(cClansToRequest) CSteamID *psteamIDClans, int cClansToRequest ) = 0; - - // iterators for getting users in a chat room, lobby, game server or clan - // note that large clans that cannot be iterated by the local user - // note that the current user must be in a lobby to retrieve CSteamIDs of other users in that lobby - // steamIDSource can be the steamID of a group, game server, lobby or chat room - virtual int GetFriendCountFromSource( CSteamID steamIDSource ) = 0; - virtual CSteamID GetFriendFromSourceByIndex( CSteamID steamIDSource, int iFriend ) = 0; - - // returns true if the local user can see that steamIDUser is a member or in steamIDSource - virtual bool IsUserInSource( CSteamID steamIDUser, CSteamID steamIDSource ) = 0; - - // User is in a game pressing the talk button (will suppress the microphone for all voice comms from the Steam friends UI) - virtual void SetInGameVoiceSpeaking( CSteamID steamIDUser, bool bSpeaking ) = 0; - - // activates the game overlay, with an optional dialog to open - // valid options include "Friends", "Community", "Players", "Settings", "OfficialGameGroup", "Stats", "Achievements", - // "chatroomgroup/nnnn" - virtual void ActivateGameOverlay( const char *pchDialog ) = 0; - - // activates game overlay to a specific place - // valid options are - // "steamid" - opens the overlay web browser to the specified user or groups profile - // "chat" - opens a chat window to the specified user, or joins the group chat - // "jointrade" - opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API - // "stats" - opens the overlay web browser to the specified user's stats - // "achievements" - opens the overlay web browser to the specified user's achievements - // "friendadd" - opens the overlay in minimal mode prompting the user to add the target user as a friend - // "friendremove" - opens the overlay in minimal mode prompting the user to remove the target friend - // "friendrequestaccept" - opens the overlay in minimal mode prompting the user to accept an incoming friend invite - // "friendrequestignore" - opens the overlay in minimal mode prompting the user to ignore an incoming friend invite - virtual void ActivateGameOverlayToUser( const char *pchDialog, CSteamID steamID ) = 0; - - // activates game overlay web browser directly to the specified URL - // full address with protocol type is required, e.g. http://www.steamgames.com/ - virtual void ActivateGameOverlayToWebPage( const char *pchURL, EActivateGameOverlayToWebPageMode eMode = k_EActivateGameOverlayToWebPageMode_Default ) = 0; - - // activates game overlay to store page for app - virtual void ActivateGameOverlayToStore( AppId_t nAppID, EOverlayToStoreFlag eFlag ) = 0; - - // Mark a target user as 'played with'. This is a client-side only feature that requires that the calling user is - // in game - virtual void SetPlayedWith( CSteamID steamIDUserPlayedWith ) = 0; - - // activates game overlay to open the invite dialog. Invitations will be sent for the provided lobby. - virtual void ActivateGameOverlayInviteDialog( CSteamID steamIDLobby ) = 0; - - // gets the small (32x32) avatar of the current user, which is a handle to be used in IClientUtils::GetImageRGBA(), or 0 if none set - virtual int GetSmallFriendAvatar( CSteamID steamIDFriend ) = 0; - - // gets the medium (64x64) avatar of the current user, which is a handle to be used in IClientUtils::GetImageRGBA(), or 0 if none set - virtual int GetMediumFriendAvatar( CSteamID steamIDFriend ) = 0; - - // gets the large (184x184) avatar of the current user, which is a handle to be used in IClientUtils::GetImageRGBA(), or 0 if none set - // returns -1 if this image has yet to be loaded, in this case wait for a AvatarImageLoaded_t callback and then call this again - virtual int GetLargeFriendAvatar( CSteamID steamIDFriend ) = 0; - - // requests information about a user - persona name & avatar - // if bRequireNameOnly is set, then the avatar of a user isn't downloaded - // - it's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them - // if returns true, it means that data is being requested, and a PersonaStateChanged_t callback will be posted when it's retrieved - // if returns false, it means that we already have all the details about that user, and functions can be called immediately - virtual bool RequestUserInformation( CSteamID steamIDUser, bool bRequireNameOnly ) = 0; - - // requests information about a clan officer list - // when complete, data is returned in ClanOfficerListResponse_t call result - // this makes available the calls below - // you can only ask about clans that a user is a member of - // note that this won't download avatars automatically; if you get an officer, - // and no avatar image is available, call RequestUserInformation( steamID, false ) to download the avatar - STEAM_CALL_RESULT( ClanOfficerListResponse_t ) - virtual SteamAPICall_t RequestClanOfficerList( CSteamID steamIDClan ) = 0; - - // iteration of clan officers - can only be done when a RequestClanOfficerList() call has completed - - // returns the steamID of the clan owner - virtual CSteamID GetClanOwner( CSteamID steamIDClan ) = 0; - // returns the number of officers in a clan (including the owner) - virtual int GetClanOfficerCount( CSteamID steamIDClan ) = 0; - // returns the steamID of a clan officer, by index, of range [0,GetClanOfficerCount) - virtual CSteamID GetClanOfficerByIndex( CSteamID steamIDClan, int iOfficer ) = 0; - // if current user is chat restricted, he can't send or receive any text/voice chat messages. - // the user can't see custom avatars. But the user can be online and send/recv game invites. - // a chat restricted user can't add friends or join any groups. - virtual uint32 GetUserRestrictions() = 0; - - // Rich Presence data is automatically shared between friends who are in the same game - // Each user has a set of Key/Value pairs - // Note the following limits: k_cchMaxRichPresenceKeys, k_cchMaxRichPresenceKeyLength, k_cchMaxRichPresenceValueLength - // There are five magic keys: - // "status" - a UTF-8 string that will show up in the 'view game info' dialog in the Steam friends list - // "connect" - a UTF-8 string that contains the command-line for how a friend can connect to a game - // "steam_display" - Names a rich presence localization token that will be displayed in the viewing user's selected language - // in the Steam client UI. For more info: https://partner.steamgames.com/doc/api/ISteamFriends#richpresencelocalization - // "steam_player_group" - When set, indicates to the Steam client that the player is a member of a particular group. Players in the same group - // may be organized together in various places in the Steam UI. - // "steam_player_group_size" - When set, indicates the total number of players in the steam_player_group. The Steam client may use this number to - // display additional information about a group when all of the members are not part of a user's friends list. - // GetFriendRichPresence() returns an empty string "" if no value is set - // SetRichPresence() to a NULL or an empty string deletes the key - // You can iterate the current set of keys for a friend with GetFriendRichPresenceKeyCount() - // and GetFriendRichPresenceKeyByIndex() (typically only used for debugging) - virtual bool SetRichPresence( const char *pchKey, const char *pchValue ) = 0; - virtual void ClearRichPresence() = 0; - virtual const char *GetFriendRichPresence( CSteamID steamIDFriend, const char *pchKey ) = 0; - virtual int GetFriendRichPresenceKeyCount( CSteamID steamIDFriend ) = 0; - virtual const char *GetFriendRichPresenceKeyByIndex( CSteamID steamIDFriend, int iKey ) = 0; - // Requests rich presence for a specific user. - virtual void RequestFriendRichPresence( CSteamID steamIDFriend ) = 0; - - // Rich invite support. - // If the target accepts the invite, a GameRichPresenceJoinRequested_t callback is posted containing the connect string. - // (Or you can configure yout game so that it is passed on the command line instead. This is a deprecated path; ask us if you really need this.) - virtual bool InviteUserToGame( CSteamID steamIDFriend, const char *pchConnectString ) = 0; - - // recently-played-with friends iteration - // this iterates the entire list of users recently played with, across games - // GetFriendCoplayTime() returns as a unix time - virtual int GetCoplayFriendCount() = 0; - virtual CSteamID GetCoplayFriend( int iCoplayFriend ) = 0; - virtual int GetFriendCoplayTime( CSteamID steamIDFriend ) = 0; - virtual AppId_t GetFriendCoplayGame( CSteamID steamIDFriend ) = 0; - - // chat interface for games - // this allows in-game access to group (clan) chats from in the game - // the behavior is somewhat sophisticated, because the user may or may not be already in the group chat from outside the game or in the overlay - // use ActivateGameOverlayToUser( "chat", steamIDClan ) to open the in-game overlay version of the chat - STEAM_CALL_RESULT( JoinClanChatRoomCompletionResult_t ) - virtual SteamAPICall_t JoinClanChatRoom( CSteamID steamIDClan ) = 0; - virtual bool LeaveClanChatRoom( CSteamID steamIDClan ) = 0; - virtual int GetClanChatMemberCount( CSteamID steamIDClan ) = 0; - virtual CSteamID GetChatMemberByIndex( CSteamID steamIDClan, int iUser ) = 0; - virtual bool SendClanChatMessage( CSteamID steamIDClanChat, const char *pchText ) = 0; - virtual int GetClanChatMessage( CSteamID steamIDClanChat, int iMessage, void *prgchText, int cchTextMax, EChatEntryType *peChatEntryType, STEAM_OUT_STRUCT() CSteamID *psteamidChatter ) = 0; - virtual bool IsClanChatAdmin( CSteamID steamIDClanChat, CSteamID steamIDUser ) = 0; - - // interact with the Steam (game overlay / desktop) - virtual bool IsClanChatWindowOpenInSteam( CSteamID steamIDClanChat ) = 0; - virtual bool OpenClanChatWindowInSteam( CSteamID steamIDClanChat ) = 0; - virtual bool CloseClanChatWindowInSteam( CSteamID steamIDClanChat ) = 0; - - // peer-to-peer chat interception - // this is so you can show P2P chats inline in the game - virtual bool SetListenForFriendsMessages( bool bInterceptEnabled ) = 0; - virtual bool ReplyToFriendMessage( CSteamID steamIDFriend, const char *pchMsgToSend ) = 0; - virtual int GetFriendMessage( CSteamID steamIDFriend, int iMessageID, void *pvData, int cubData, EChatEntryType *peChatEntryType ) = 0; - - // following apis - STEAM_CALL_RESULT( FriendsGetFollowerCount_t ) - virtual SteamAPICall_t GetFollowerCount( CSteamID steamID ) = 0; - STEAM_CALL_RESULT( FriendsIsFollowing_t ) - virtual SteamAPICall_t IsFollowing( CSteamID steamID ) = 0; - STEAM_CALL_RESULT( FriendsEnumerateFollowingList_t ) - virtual SteamAPICall_t EnumerateFollowingList( uint32 unStartIndex ) = 0; - - virtual bool IsClanPublic( CSteamID steamIDClan ) = 0; - virtual bool IsClanOfficialGameGroup( CSteamID steamIDClan ) = 0; - - /// Return the number of chats (friends or chat rooms) with unread messages. - /// A "priority" message is one that would generate some sort of toast or - /// notification, and depends on user settings. - /// - /// You can register for UnreadChatMessagesChanged_t callbacks to know when this - /// has potentially changed. - virtual int GetNumChatsWithUnreadPriorityMessages() = 0; - - // 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" - -// Global interface accessor -inline ISteamFriends *SteamFriends(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamFriends *, SteamFriends, STEAMFRIENDS_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: called when a friends' status changes -//----------------------------------------------------------------------------- -struct PersonaStateChange_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 4 }; - - uint64 m_ulSteamID; // steamID of the friend who changed - int m_nChangeFlags; // what's changed -}; - - -// used in PersonaStateChange_t::m_nChangeFlags to describe what's changed about a user -// these flags describe what the client has learned has changed recently, so on startup you'll see a name, avatar & relationship change for every friend -enum EPersonaChange -{ - k_EPersonaChangeName = 0x0001, - k_EPersonaChangeStatus = 0x0002, - k_EPersonaChangeComeOnline = 0x0004, - k_EPersonaChangeGoneOffline = 0x0008, - k_EPersonaChangeGamePlayed = 0x0010, - k_EPersonaChangeGameServer = 0x0020, - k_EPersonaChangeAvatar = 0x0040, - k_EPersonaChangeJoinedSource= 0x0080, - k_EPersonaChangeLeftSource = 0x0100, - k_EPersonaChangeRelationshipChanged = 0x0200, - k_EPersonaChangeNameFirstSet = 0x0400, - k_EPersonaChangeBroadcast = 0x0800, - k_EPersonaChangeNickname = 0x1000, - k_EPersonaChangeSteamLevel = 0x2000, - k_EPersonaChangeRichPresence = 0x4000, -}; - - -//----------------------------------------------------------------------------- -// Purpose: posted when game overlay activates or deactivates -// the game can use this to be pause or resume single player games -//----------------------------------------------------------------------------- -struct GameOverlayActivated_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 31 }; - uint8 m_bActive; // true if it's just been activated, false otherwise -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when the user tries to join a different game server from their friends list -// game client should attempt to connect to specified server when this is received -//----------------------------------------------------------------------------- -struct GameServerChangeRequested_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 32 }; - char m_rgchServer[64]; // server address ("127.0.0.1:27015", "tf2.valvesoftware.com") - char m_rgchPassword[64]; // server password, if any -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when the user tries to join a lobby from their friends list -// game client should attempt to connect to specified lobby when this is received -//----------------------------------------------------------------------------- -struct GameLobbyJoinRequested_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 33 }; - CSteamID m_steamIDLobby; - - // The friend they did the join via (will be invalid if not directly via a friend) - // - // On PS3, the friend will be invalid if this was triggered by a PSN invite via the XMB, but - // the account type will be console user so you can tell at least that this was from a PSN friend - // rather than a Steam friend. - CSteamID m_steamIDFriend; -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when an avatar is loaded in from a previous GetLargeFriendAvatar() call -// if the image wasn't already available -//----------------------------------------------------------------------------- -struct AvatarImageLoaded_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 34 }; - CSteamID m_steamID; // steamid the avatar has been loaded for - int m_iImage; // the image index of the now loaded image - int m_iWide; // width of the loaded image - int m_iTall; // height of the loaded image -}; - - -//----------------------------------------------------------------------------- -// Purpose: marks the return of a request officer list call -//----------------------------------------------------------------------------- -struct ClanOfficerListResponse_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 35 }; - CSteamID m_steamIDClan; - int m_cOfficers; - uint8 m_bSuccess; -}; - - -//----------------------------------------------------------------------------- -// Purpose: callback indicating updated data about friends rich presence information -//----------------------------------------------------------------------------- -struct FriendRichPresenceUpdate_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 36 }; - CSteamID m_steamIDFriend; // friend who's rich presence has changed - AppId_t m_nAppID; // the appID of the game (should always be the current game) -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when the user tries to join a game from their friends list -// rich presence will have been set with the "connect" key which is set here -//----------------------------------------------------------------------------- -struct GameRichPresenceJoinRequested_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 37 }; - CSteamID m_steamIDFriend; // the friend they did the join via (will be invalid if not directly via a friend) - char m_rgchConnect[k_cchMaxRichPresenceValueLength]; -}; - - -//----------------------------------------------------------------------------- -// Purpose: a chat message has been received for a clan chat the game has joined -//----------------------------------------------------------------------------- -struct GameConnectedClanChatMsg_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 38 }; - CSteamID m_steamIDClanChat; - CSteamID m_steamIDUser; - int m_iMessageID; -}; - - -//----------------------------------------------------------------------------- -// Purpose: a user has joined a clan chat -//----------------------------------------------------------------------------- -struct GameConnectedChatJoin_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 39 }; - CSteamID m_steamIDClanChat; - CSteamID m_steamIDUser; -}; - - -//----------------------------------------------------------------------------- -// Purpose: a user has left the chat we're in -//----------------------------------------------------------------------------- -struct GameConnectedChatLeave_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 40 }; - CSteamID m_steamIDClanChat; - CSteamID m_steamIDUser; - bool m_bKicked; // true if admin kicked - bool m_bDropped; // true if Steam connection dropped -}; - - -//----------------------------------------------------------------------------- -// Purpose: a DownloadClanActivityCounts() call has finished -//----------------------------------------------------------------------------- -struct DownloadClanActivityCountsResult_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 41 }; - bool m_bSuccess; -}; - - -//----------------------------------------------------------------------------- -// Purpose: a JoinClanChatRoom() call has finished -//----------------------------------------------------------------------------- -struct JoinClanChatRoomCompletionResult_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 42 }; - CSteamID m_steamIDClanChat; - EChatRoomEnterResponse m_eChatRoomEnterResponse; -}; - -//----------------------------------------------------------------------------- -// Purpose: a chat message has been received from a user -//----------------------------------------------------------------------------- -struct GameConnectedFriendChatMsg_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 43 }; - CSteamID m_steamIDUser; - int m_iMessageID; -}; - - -struct FriendsGetFollowerCount_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 44 }; - EResult m_eResult; - CSteamID m_steamID; - int m_nCount; -}; - - -struct FriendsIsFollowing_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 45 }; - EResult m_eResult; - CSteamID m_steamID; - bool m_bIsFollowing; -}; - - -struct FriendsEnumerateFollowingList_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 46 }; - EResult m_eResult; - CSteamID m_rgSteamID[ k_cEnumerateFollowersMax ]; - int32 m_nResultsReturned; - int32 m_nTotalResultCount; -}; - -//----------------------------------------------------------------------------- -// Purpose: reports the result of an attempt to change the user's persona name -//----------------------------------------------------------------------------- -struct SetPersonaNameResponse_t -{ - enum { k_iCallback = k_iSteamFriendsCallbacks + 47 }; - - bool m_bSuccess; // true if name change succeeded completely. - bool m_bLocalSuccess; // true if name change was retained locally. (We might not have been able to communicate with Steam) - EResult m_result; // detailed result code -}; - -//----------------------------------------------------------------------------- -// Purpose: Invoked when the status of unread messages changes -//----------------------------------------------------------------------------- -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/lib/steamworks_150/public/steam/isteamgamecoordinator.h b/lib/steamworks_150/public/steam/isteamgamecoordinator.h deleted file mode 100644 index 89b740d..0000000 --- a/lib/steamworks_150/public/steam/isteamgamecoordinator.h +++ /dev/null @@ -1,74 +0,0 @@ -//====== Copyright ©, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to the game coordinator for this application -// -//============================================================================= - -#ifndef ISTEAMGAMECOORDINATOR -#define ISTEAMGAMECOORDINATOR -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - - -// list of possible return values from the ISteamGameCoordinator API -enum EGCResults -{ - k_EGCResultOK = 0, - k_EGCResultNoMessage = 1, // There is no message in the queue - k_EGCResultBufferTooSmall = 2, // The buffer is too small for the requested message - k_EGCResultNotLoggedOn = 3, // The client is not logged onto Steam - k_EGCResultInvalidMessage = 4, // Something was wrong with the message being sent with SendMessage -}; - - -//----------------------------------------------------------------------------- -// Purpose: Functions for sending and receiving messages from the Game Coordinator -// for this application -//----------------------------------------------------------------------------- -class ISteamGameCoordinator -{ -public: - - // sends a message to the Game Coordinator - virtual EGCResults SendMessage( uint32 unMsgType, const void *pubData, uint32 cubData ) = 0; - - // returns true if there is a message waiting from the game coordinator - virtual bool IsMessageAvailable( uint32 *pcubMsgSize ) = 0; - - // fills the provided buffer with the first message in the queue and returns k_EGCResultOK or - // returns k_EGCResultNoMessage if there is no message waiting. pcubMsgSize is filled with the message size. - // If the provided buffer is not large enough to fit the entire message, k_EGCResultBufferTooSmall is returned - // and the message remains at the head of the queue. - virtual EGCResults RetrieveMessage( uint32 *punMsgType, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize ) = 0; - -}; -#define STEAMGAMECOORDINATOR_INTERFACE_VERSION "SteamGameCoordinator001" - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -// callback notification - A new message is available for reading from the message queue -struct GCMessageAvailable_t -{ - enum { k_iCallback = k_iSteamGameCoordinatorCallbacks + 1 }; - uint32 m_nMessageSize; -}; - -// callback notification - A message failed to make it to the GC. It may be down temporarily -struct GCMessageFailed_t -{ - enum { k_iCallback = k_iSteamGameCoordinatorCallbacks + 2 }; -}; - -#pragma pack( pop ) - -#endif // ISTEAMGAMECOORDINATOR diff --git a/lib/steamworks_150/public/steam/isteamgameserver.h b/lib/steamworks_150/public/steam/isteamgameserver.h deleted file mode 100644 index 8fbd9da..0000000 --- a/lib/steamworks_150/public/steam/isteamgameserver.h +++ /dev/null @@ -1,391 +0,0 @@ -//====== Copyright (c) 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to steam for game servers -// -//============================================================================= - -#ifndef ISTEAMGAMESERVER_H -#define ISTEAMGAMESERVER_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -#define MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE ((uint16)-1) - -//----------------------------------------------------------------------------- -// Purpose: Functions for authenticating users via Steam to play on a game server -//----------------------------------------------------------------------------- -class ISteamGameServer -{ -public: - -// -// Basic server data. These properties, if set, must be set before before calling LogOn. They -// may not be changed after logged in. -// - - /// This is called by SteamGameServer_Init, and you will usually not need to call it directly - STEAM_PRIVATE_API( virtual bool InitGameServer( uint32 unIP, uint16 usGamePort, uint16 usQueryPort, uint32 unFlags, AppId_t nGameAppId, const char *pchVersionString ) = 0; ) - - /// Game product identifier. This is currently used by the master server for version checking purposes. - /// It's a required field, but will eventually will go away, and the AppID will be used for this purpose. - virtual void SetProduct( const char *pszProduct ) = 0; - - /// Description of the game. This is a required field and is displayed in the steam server browser....for now. - /// This is a required field, but it will go away eventually, as the data should be determined from the AppID. - virtual void SetGameDescription( const char *pszGameDescription ) = 0; - - /// If your game is a "mod," pass the string that identifies it. The default is an empty string, meaning - /// this application is the original game, not a mod. - /// - /// @see k_cbMaxGameServerGameDir - virtual void SetModDir( const char *pszModDir ) = 0; - - /// Is this is a dedicated server? The default value is false. - virtual void SetDedicatedServer( bool bDedicated ) = 0; - -// -// Login -// - - /// Begin process to login to a persistent game server account - /// - /// You need to register for callbacks to determine the result of this operation. - /// @see SteamServersConnected_t - /// @see SteamServerConnectFailure_t - /// @see SteamServersDisconnected_t - virtual void LogOn( const char *pszToken ) = 0; - - /// Login to a generic, anonymous account. - /// - /// Note: in previous versions of the SDK, this was automatically called within SteamGameServer_Init, - /// but this is no longer the case. - virtual void LogOnAnonymous() = 0; - - /// Begin process of logging game server out of steam - virtual void LogOff() = 0; - - // status functions - virtual bool BLoggedOn() = 0; - virtual bool BSecure() = 0; - virtual CSteamID GetSteamID() = 0; - - /// Returns true if the master server has requested a restart. - /// Only returns true once per request. - virtual bool WasRestartRequested() = 0; - -// -// Server state. These properties may be changed at any time. -// - - /// Max player count that will be reported to server browser and client queries - virtual void SetMaxPlayerCount( int cPlayersMax ) = 0; - - /// Number of bots. Default value is zero - virtual void SetBotPlayerCount( int cBotplayers ) = 0; - - /// Set the name of server as it will appear in the server browser - /// - /// @see k_cbMaxGameServerName - virtual void SetServerName( const char *pszServerName ) = 0; - - /// Set name of map to report in the server browser - /// - /// @see k_cbMaxGameServerName - virtual void SetMapName( const char *pszMapName ) = 0; - - /// Let people know if your server will require a password - virtual void SetPasswordProtected( bool bPasswordProtected ) = 0; - - /// Spectator server. The default value is zero, meaning the service - /// is not used. - virtual void SetSpectatorPort( uint16 unSpectatorPort ) = 0; - - /// Name of the spectator server. (Only used if spectator port is nonzero.) - /// - /// @see k_cbMaxGameServerMapName - virtual void SetSpectatorServerName( const char *pszSpectatorServerName ) = 0; - - /// Call this to clear the whole list of key/values that are sent in rules queries. - virtual void ClearAllKeyValues() = 0; - - /// Call this to add/update a key/value pair. - virtual void SetKeyValue( const char *pKey, const char *pValue ) = 0; - - /// Sets a string defining the "gametags" for this server, this is optional, but if it is set - /// it allows users to filter in the matchmaking/server-browser interfaces based on the value - /// - /// @see k_cbMaxGameServerTags - virtual void SetGameTags( const char *pchGameTags ) = 0; - - /// Sets a string defining the "gamedata" for this server, this is optional, but if it is set - /// it allows users to filter in the matchmaking/server-browser interfaces based on the value - /// don't set this unless it actually changes, its only uploaded to the master once (when - /// acknowledged) - /// - /// @see k_cbMaxGameServerGameData - virtual void SetGameData( const char *pchGameData ) = 0; - - /// Region identifier. This is an optional field, the default value is empty, meaning the "world" region - virtual void SetRegion( const char *pszRegion ) = 0; - -// -// Player list management / authentication -// - - // Handles receiving a new connection from a Steam user. This call will ask the Steam - // servers to validate the users identity, app ownership, and VAC status. If the Steam servers - // are off-line, then it will validate the cached ticket itself which will validate app ownership - // and identity. The AuthBlob here should be acquired on the game client using SteamUser()->InitiateGameConnection() - // and must then be sent up to the game server for authentication. - // - // Return Value: returns true if the users ticket passes basic checks. pSteamIDUser will contain the Steam ID of this user. pSteamIDUser must NOT be NULL - // If the call succeeds then you should expect a GSClientApprove_t or GSClientDeny_t callback which will tell you whether authentication - // for the user has succeeded or failed (the steamid in the callback will match the one returned by this call) - virtual bool SendUserConnectAndAuthenticate( uint32 unIPClient, const void *pvAuthBlob, uint32 cubAuthBlobSize, CSteamID *pSteamIDUser ) = 0; - - // Creates a fake user (ie, a bot) which will be listed as playing on the server, but skips validation. - // - // Return Value: Returns a SteamID for the user to be tracked with, you should call HandleUserDisconnect() - // when this user leaves the server just like you would for a real user. - virtual CSteamID CreateUnauthenticatedUserConnection() = 0; - - // Should be called whenever a user leaves our game server, this lets Steam internally - // track which users are currently on which servers for the purposes of preventing a single - // account being logged into multiple servers, showing who is currently on a server, etc. - virtual void SendUserDisconnect( CSteamID steamIDUser ) = 0; - - // Update the data to be displayed in the server browser and matchmaking interfaces for a user - // currently connected to the server. For regular users you must call this after you receive a - // GSUserValidationSuccess callback. - // - // Return Value: true if successful, false if failure (ie, steamIDUser wasn't for an active player) - virtual bool BUpdateUserData( CSteamID steamIDUser, const char *pchPlayerName, uint32 uScore ) = 0; - - // New auth system APIs - do not mix with the old auth system APIs. - // ---------------------------------------------------------------- - - // Retrieve ticket to be sent to the entity who wishes to authenticate you ( using BeginAuthSession API ). - // pcbTicket retrieves the length of the actual ticket. - virtual HAuthTicket GetAuthSessionTicket( void *pTicket, int cbMaxTicket, uint32 *pcbTicket ) = 0; - - // Authenticate ticket ( from GetAuthSessionTicket ) from entity steamID to be sure it is valid and isnt reused - // Registers for callbacks if the entity goes offline or cancels the ticket ( see ValidateAuthTicketResponse_t callback and EAuthSessionResponse ) - virtual EBeginAuthSessionResult BeginAuthSession( const void *pAuthTicket, int cbAuthTicket, CSteamID steamID ) = 0; - - // Stop tracking started by BeginAuthSession - called when no longer playing game with this entity - virtual void EndAuthSession( CSteamID steamID ) = 0; - - // Cancel auth ticket from GetAuthSessionTicket, called when no longer playing game with the entity you gave the ticket to - virtual void CancelAuthTicket( HAuthTicket hAuthTicket ) = 0; - - // After receiving a user's authentication data, and passing it to SendUserConnectAndAuthenticate, use this function - // to determine if the user owns downloadable content specified by the provided AppID. - virtual EUserHasLicenseForAppResult UserHasLicenseForApp( CSteamID steamID, AppId_t appID ) = 0; - - // Ask if a user in in the specified group, results returns async by GSUserGroupStatus_t - // returns false if we're not connected to the steam servers and thus cannot ask - virtual bool RequestUserGroupStatus( CSteamID steamIDUser, CSteamID steamIDGroup ) = 0; - - - // these two functions s are deprecated, and will not return results - // they will be removed in a future version of the SDK - virtual void GetGameplayStats( ) = 0; - STEAM_CALL_RESULT( GSReputation_t ) - virtual SteamAPICall_t GetServerReputation() = 0; - - // Returns the public IP of the server according to Steam, useful when the server is - // behind NAT and you want to advertise its IP in a lobby for other clients to directly - // connect to - virtual SteamIPAddress_t GetPublicIP() = 0; - -// These are in GameSocketShare mode, where instead of ISteamGameServer creating its own -// socket to talk to the master server on, it lets the game use its socket to forward messages -// back and forth. This prevents us from requiring server ops to open up yet another port -// in their firewalls. -// -// the IP address and port should be in host order, i.e 127.0.0.1 == 0x7f000001 - - // These are used when you've elected to multiplex the game server's UDP socket - // rather than having the master server updater use its own sockets. - // - // Source games use this to simplify the job of the server admins, so they - // don't have to open up more ports on their firewalls. - - // Call this when a packet that starts with 0xFFFFFFFF comes in. That means - // it's for us. - virtual bool HandleIncomingPacket( const void *pData, int cbData, uint32 srcIP, uint16 srcPort ) = 0; - - // AFTER calling HandleIncomingPacket for any packets that came in that frame, call this. - // This gets a packet that the master server updater needs to send out on UDP. - // It returns the length of the packet it wants to send, or 0 if there are no more packets to send. - // Call this each frame until it returns 0. - virtual int GetNextOutgoingPacket( void *pOut, int cbMaxOut, uint32 *pNetAdr, uint16 *pPort ) = 0; - -// -// Control heartbeats / advertisement with master server -// - - // Call this as often as you like to tell the master server updater whether or not - // you want it to be active (default: off). - virtual void EnableHeartbeats( bool bActive ) = 0; - - // You usually don't need to modify this. - // Pass -1 to use the default value for iHeartbeatInterval. - // Some mods change this. - virtual void SetHeartbeatInterval( int iHeartbeatInterval ) = 0; - - // Force a heartbeat to steam at the next opportunity - virtual void ForceHeartbeat() = 0; - - // associate this game server with this clan for the purposes of computing player compat - STEAM_CALL_RESULT( AssociateWithClanResult_t ) - virtual SteamAPICall_t AssociateWithClan( CSteamID steamIDClan ) = 0; - - // ask if any of the current players dont want to play with this new player - or vice versa - STEAM_CALL_RESULT( ComputeNewPlayerCompatibilityResult_t ) - virtual SteamAPICall_t ComputeNewPlayerCompatibility( CSteamID steamIDNewPlayer ) = 0; - -}; - -#define STEAMGAMESERVER_INTERFACE_VERSION "SteamGameServer013" - -// Global accessor -inline ISteamGameServer *SteamGameServer(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamGameServer *, SteamGameServer, STEAMGAMESERVER_INTERFACE_VERSION ); - -// game server flags -const uint32 k_unServerFlagNone = 0x00; -const uint32 k_unServerFlagActive = 0x01; // server has users playing -const uint32 k_unServerFlagSecure = 0x02; // server wants to be secure -const uint32 k_unServerFlagDedicated = 0x04; // server is dedicated -const uint32 k_unServerFlagLinux = 0x08; // linux build -const uint32 k_unServerFlagPassworded = 0x10; // password protected -const uint32 k_unServerFlagPrivate = 0x20; // server shouldn't list on master server and - // won't enforce authentication of users that connect to the server. - // Useful when you run a server where the clients may not - // be connected to the internet but you want them to play (i.e LANs) - - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -// client has been approved to connect to this game server -struct GSClientApprove_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 1 }; - CSteamID m_SteamID; // SteamID of approved player - CSteamID m_OwnerSteamID; // SteamID of original owner for game license -}; - - -// client has been denied to connection to this game server -struct GSClientDeny_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 2 }; - CSteamID m_SteamID; - EDenyReason m_eDenyReason; - char m_rgchOptionalText[128]; -}; - - -// request the game server should kick the user -struct GSClientKick_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 3 }; - CSteamID m_SteamID; - EDenyReason m_eDenyReason; -}; - -// NOTE: callback values 4 and 5 are skipped because they are used for old deprecated callbacks, -// do not reuse them here. - - -// client achievement info -struct GSClientAchievementStatus_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 6 }; - uint64 m_SteamID; - char m_pchAchievement[128]; - bool m_bUnlocked; -}; - -// received when the game server requests to be displayed as secure (VAC protected) -// m_bSecure is true if the game server should display itself as secure to users, false otherwise -struct GSPolicyResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 15 }; - uint8 m_bSecure; -}; - -// GS gameplay stats info -struct GSGameplayStats_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 7 }; - EResult m_eResult; // Result of the call - int32 m_nRank; // Overall rank of the server (0-based) - uint32 m_unTotalConnects; // Total number of clients who have ever connected to the server - uint32 m_unTotalMinutesPlayed; // Total number of minutes ever played on the server -}; - -// send as a reply to RequestUserGroupStatus() -struct GSClientGroupStatus_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 8 }; - CSteamID m_SteamIDUser; - CSteamID m_SteamIDGroup; - bool m_bMember; - bool m_bOfficer; -}; - -// Sent as a reply to GetServerReputation() -struct GSReputation_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 9 }; - EResult m_eResult; // Result of the call; - uint32 m_unReputationScore; // The reputation score for the game server - bool m_bBanned; // True if the server is banned from the Steam - // master servers - - // The following members are only filled out if m_bBanned is true. They will all - // be set to zero otherwise. Master server bans are by IP so it is possible to be - // banned even when the score is good high if there is a bad server on another port. - // This information can be used to determine which server is bad. - - uint32 m_unBannedIP; // The IP of the banned server - uint16 m_usBannedPort; // The port of the banned server - uint64 m_ulBannedGameID; // The game ID the banned server is serving - uint32 m_unBanExpires; // Time the ban expires, expressed in the Unix epoch (seconds since 1/1/1970) -}; - -// Sent as a reply to AssociateWithClan() -struct AssociateWithClanResult_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 10 }; - EResult m_eResult; // Result of the call; -}; - -// Sent as a reply to ComputeNewPlayerCompatibility() -struct ComputeNewPlayerCompatibilityResult_t -{ - enum { k_iCallback = k_iSteamGameServerCallbacks + 11 }; - EResult m_eResult; // Result of the call; - int m_cPlayersThatDontLikeCandidate; - int m_cPlayersThatCandidateDoesntLike; - int m_cClanPlayersThatDontLikeCandidate; - CSteamID m_SteamIDCandidate; -}; - - -#pragma pack( pop ) - -#endif // ISTEAMGAMESERVER_H diff --git a/lib/steamworks_150/public/steam/isteamgameserverstats.h b/lib/steamworks_150/public/steam/isteamgameserverstats.h deleted file mode 100644 index 5019279..0000000 --- a/lib/steamworks_150/public/steam/isteamgameserverstats.h +++ /dev/null @@ -1,114 +0,0 @@ -//====== Copyright © Valve Corporation, All rights reserved. ======= -// -// Purpose: interface for game servers to steam stats and achievements -// -//============================================================================= - -#ifndef ISTEAMGAMESERVERSTATS_H -#define ISTEAMGAMESERVERSTATS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -//----------------------------------------------------------------------------- -// Purpose: Functions for authenticating users via Steam to play on a game server -//----------------------------------------------------------------------------- -class ISteamGameServerStats -{ -public: - // downloads stats for the user - // returns a GSStatsReceived_t callback when completed - // if the user has no stats, GSStatsReceived_t.m_eResult will be set to k_EResultFail - // these stats will only be auto-updated for clients playing on the server. For other - // users you'll need to call RequestUserStats() again to refresh any data - STEAM_CALL_RESULT( GSStatsReceived_t ) - virtual SteamAPICall_t RequestUserStats( CSteamID steamIDUser ) = 0; - - // requests stat information for a user, usable after a successful call to RequestUserStats() - STEAM_FLAT_NAME( GetUserStatInt32 ) - virtual bool GetUserStat( CSteamID steamIDUser, const char *pchName, int32 *pData ) = 0; - - STEAM_FLAT_NAME( GetUserStatFloat ) - virtual bool GetUserStat( CSteamID steamIDUser, const char *pchName, float *pData ) = 0; - - virtual bool GetUserAchievement( CSteamID steamIDUser, const char *pchName, bool *pbAchieved ) = 0; - - // Set / update stats and achievements. - // Note: These updates will work only on stats game servers are allowed to edit and only for - // game servers that have been declared as officially controlled by the game creators. - // Set the IP range of your official servers on the Steamworks page - - STEAM_FLAT_NAME( SetUserStatInt32 ) - virtual bool SetUserStat( CSteamID steamIDUser, const char *pchName, int32 nData ) = 0; - - STEAM_FLAT_NAME( SetUserStatFloat ) - virtual bool SetUserStat( CSteamID steamIDUser, const char *pchName, float fData ) = 0; - - virtual bool UpdateUserAvgRateStat( CSteamID steamIDUser, const char *pchName, float flCountThisSession, double dSessionLength ) = 0; - - virtual bool SetUserAchievement( CSteamID steamIDUser, const char *pchName ) = 0; - virtual bool ClearUserAchievement( CSteamID steamIDUser, const char *pchName ) = 0; - - // Store the current data on the server, will get a GSStatsStored_t callback when set. - // - // If the callback has a result of k_EResultInvalidParam, one or more stats - // uploaded has been rejected, either because they broke constraints - // or were out of date. In this case the server sends back updated values. - // The stats should be re-iterated to keep in sync. - STEAM_CALL_RESULT( GSStatsStored_t ) - virtual SteamAPICall_t StoreUserStats( CSteamID steamIDUser ) = 0; -}; -#define STEAMGAMESERVERSTATS_INTERFACE_VERSION "SteamGameServerStats001" - -// Global accessor -inline ISteamGameServerStats *SteamGameServerStats(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamGameServerStats *, SteamGameServerStats, STEAMGAMESERVERSTATS_INTERFACE_VERSION ); - - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: called when the latests stats and achievements have been received -// from the server -//----------------------------------------------------------------------------- -struct GSStatsReceived_t -{ - enum { k_iCallback = k_iSteamGameServerStatsCallbacks }; - EResult m_eResult; // Success / error fetching the stats - CSteamID m_steamIDUser; // The user for whom the stats are retrieved for -}; - - -//----------------------------------------------------------------------------- -// Purpose: result of a request to store the user stats for a game -//----------------------------------------------------------------------------- -struct GSStatsStored_t -{ - enum { k_iCallback = k_iSteamGameServerStatsCallbacks + 1 }; - EResult m_eResult; // success / error - CSteamID m_steamIDUser; // The user for whom the stats were stored -}; - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that a user's stats have been unloaded. -// Call RequestUserStats again to access stats for this user -//----------------------------------------------------------------------------- -struct GSStatsUnloaded_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 8 }; - CSteamID m_steamIDUser; // User whose stats have been unloaded -}; - -#pragma pack( pop ) - - -#endif // ISTEAMGAMESERVERSTATS_H diff --git a/lib/steamworks_150/public/steam/isteamhtmlsurface.h b/lib/steamworks_150/public/steam/isteamhtmlsurface.h deleted file mode 100644 index 086a842..0000000 --- a/lib/steamworks_150/public/steam/isteamhtmlsurface.h +++ /dev/null @@ -1,480 +0,0 @@ -//====== Copyright 1996-2013, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to display html pages in a texture -// -//============================================================================= - -#ifndef ISTEAMHTMLSURFACE_H -#define ISTEAMHTMLSURFACE_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -typedef uint32 HHTMLBrowser; -const uint32 INVALID_HTMLBROWSER = 0; - -//----------------------------------------------------------------------------- -// Purpose: Functions for displaying HTML pages and interacting with them -//----------------------------------------------------------------------------- -class ISteamHTMLSurface -{ -public: - virtual ~ISteamHTMLSurface() {} - - // Must call init and shutdown when starting/ending use of the interface - virtual bool Init() = 0; - virtual bool Shutdown() = 0; - - // Create a browser object for display of a html page, when creation is complete the call handle - // will return a HTML_BrowserReady_t callback for the HHTMLBrowser of your new browser. - // The user agent string is a substring to be added to the general user agent string so you can - // identify your client on web servers. - // The userCSS string lets you apply a CSS style sheet to every displayed page, leave null if - // you do not require this functionality. - // - // YOU MUST HAVE IMPLEMENTED HANDLERS FOR HTML_BrowserReady_t, HTML_StartRequest_t, - // HTML_JSAlert_t, HTML_JSConfirm_t, and HTML_FileOpenDialog_t! See the CALLBACKS - // section of this interface (AllowStartRequest, etc) for more details. If you do - // not implement these callback handlers, the browser may appear to hang instead of - // navigating to new pages or triggering javascript popups. - // - STEAM_CALL_RESULT( HTML_BrowserReady_t ) - virtual SteamAPICall_t CreateBrowser( const char *pchUserAgent, const char *pchUserCSS ) = 0; - - // Call this when you are done with a html surface, this lets us free the resources being used by it - virtual void RemoveBrowser( HHTMLBrowser unBrowserHandle ) = 0; - - // Navigate to this URL, results in a HTML_StartRequest_t as the request commences - virtual void LoadURL( HHTMLBrowser unBrowserHandle, const char *pchURL, const char *pchPostData ) = 0; - - // Tells the surface the size in pixels to display the surface - virtual void SetSize( HHTMLBrowser unBrowserHandle, uint32 unWidth, uint32 unHeight ) = 0; - - // Stop the load of the current html page - virtual void StopLoad( HHTMLBrowser unBrowserHandle ) = 0; - // Reload (most likely from local cache) the current page - virtual void Reload( HHTMLBrowser unBrowserHandle ) = 0; - // navigate back in the page history - virtual void GoBack( HHTMLBrowser unBrowserHandle ) = 0; - // navigate forward in the page history - virtual void GoForward( HHTMLBrowser unBrowserHandle ) = 0; - - // add this header to any url requests from this browser - virtual void AddHeader( HHTMLBrowser unBrowserHandle, const char *pchKey, const char *pchValue ) = 0; - // run this javascript script in the currently loaded page - virtual void ExecuteJavascript( HHTMLBrowser unBrowserHandle, const char *pchScript ) = 0; - - enum EHTMLMouseButton - { - eHTMLMouseButton_Left = 0, - eHTMLMouseButton_Right = 1, - eHTMLMouseButton_Middle = 2, - }; - - // Mouse click and mouse movement commands - virtual void MouseUp( HHTMLBrowser unBrowserHandle, EHTMLMouseButton eMouseButton ) = 0; - virtual void MouseDown( HHTMLBrowser unBrowserHandle, EHTMLMouseButton eMouseButton ) = 0; - virtual void MouseDoubleClick( HHTMLBrowser unBrowserHandle, EHTMLMouseButton eMouseButton ) = 0; - // x and y are relative to the HTML bounds - virtual void MouseMove( HHTMLBrowser unBrowserHandle, int x, int y ) = 0; - // nDelta is pixels of scroll - virtual void MouseWheel( HHTMLBrowser unBrowserHandle, int32 nDelta ) = 0; - - enum EMouseCursor - { - dc_user = 0, - dc_none, - dc_arrow, - dc_ibeam, - dc_hourglass, - dc_waitarrow, - dc_crosshair, - dc_up, - dc_sizenw, - dc_sizese, - dc_sizene, - dc_sizesw, - dc_sizew, - dc_sizee, - dc_sizen, - dc_sizes, - dc_sizewe, - dc_sizens, - dc_sizeall, - dc_no, - dc_hand, - dc_blank, // don't show any custom cursor, just use your default - dc_middle_pan, - dc_north_pan, - dc_north_east_pan, - dc_east_pan, - dc_south_east_pan, - dc_south_pan, - dc_south_west_pan, - dc_west_pan, - dc_north_west_pan, - dc_alias, - dc_cell, - dc_colresize, - dc_copycur, - dc_verticaltext, - dc_rowresize, - dc_zoomin, - dc_zoomout, - dc_help, - dc_custom, - - dc_last, // custom cursors start from this value and up - }; - - enum EHTMLKeyModifiers - { - k_eHTMLKeyModifier_None = 0, - k_eHTMLKeyModifier_AltDown = 1 << 0, - k_eHTMLKeyModifier_CtrlDown = 1 << 1, - k_eHTMLKeyModifier_ShiftDown = 1 << 2, - }; - - // keyboard interactions, native keycode is the virtual key code value from your OS, system key flags the key to not - // be sent as a typed character as well as a key down - virtual void KeyDown( HHTMLBrowser unBrowserHandle, uint32 nNativeKeyCode, EHTMLKeyModifiers eHTMLKeyModifiers, bool bIsSystemKey = false ) = 0; - virtual void KeyUp( HHTMLBrowser unBrowserHandle, uint32 nNativeKeyCode, EHTMLKeyModifiers eHTMLKeyModifiers ) = 0; - // cUnicodeChar is the unicode character point for this keypress (and potentially multiple chars per press) - virtual void KeyChar( HHTMLBrowser unBrowserHandle, uint32 cUnicodeChar, EHTMLKeyModifiers eHTMLKeyModifiers ) = 0; - - // programmatically scroll this many pixels on the page - virtual void SetHorizontalScroll( HHTMLBrowser unBrowserHandle, uint32 nAbsolutePixelScroll ) = 0; - virtual void SetVerticalScroll( HHTMLBrowser unBrowserHandle, uint32 nAbsolutePixelScroll ) = 0; - - // tell the html control if it has key focus currently, controls showing the I-beam cursor in text controls amongst other things - virtual void SetKeyFocus( HHTMLBrowser unBrowserHandle, bool bHasKeyFocus ) = 0; - - // open the current pages html code in the local editor of choice, used for debugging - virtual void ViewSource( HHTMLBrowser unBrowserHandle ) = 0; - // copy the currently selected text on the html page to the local clipboard - virtual void CopyToClipboard( HHTMLBrowser unBrowserHandle ) = 0; - // paste from the local clipboard to the current html page - virtual void PasteFromClipboard( HHTMLBrowser unBrowserHandle ) = 0; - - // find this string in the browser, if bCurrentlyInFind is true then instead cycle to the next matching element - virtual void Find( HHTMLBrowser unBrowserHandle, const char *pchSearchStr, bool bCurrentlyInFind, bool bReverse ) = 0; - // cancel a currently running find - virtual void StopFind( HHTMLBrowser unBrowserHandle ) = 0; - - // return details about the link at position x,y on the current page - virtual void GetLinkAtPosition( HHTMLBrowser unBrowserHandle, int x, int y ) = 0; - - // set a webcookie for the hostname in question - virtual void SetCookie( const char *pchHostname, const char *pchKey, const char *pchValue, const char *pchPath = "/", RTime32 nExpires = 0, bool bSecure = false, bool bHTTPOnly = false ) = 0; - - // Zoom the current page by flZoom ( from 0.0 to 2.0, so to zoom to 120% use 1.2 ), zooming around point X,Y in the page (use 0,0 if you don't care) - virtual void SetPageScaleFactor( HHTMLBrowser unBrowserHandle, float flZoom, int nPointX, int nPointY ) = 0; - - // Enable/disable low-resource background mode, where javascript and repaint timers are throttled, resources are - // more aggressively purged from memory, and audio/video elements are paused. When background mode is enabled, - // all HTML5 video and audio objects will execute ".pause()" and gain the property "._steam_background_paused = 1". - // When background mode is disabled, any video or audio objects with that property will resume with ".play()". - virtual void SetBackgroundMode( HHTMLBrowser unBrowserHandle, bool bBackgroundMode ) = 0; - - // Scale the output display space by this factor, this is useful when displaying content on high dpi devices. - // Specifies the ratio between physical and logical pixels. - virtual void SetDPIScalingFactor( HHTMLBrowser unBrowserHandle, float flDPIScaling ) = 0; - - // Open HTML/JS developer tools - virtual void OpenDeveloperTools( HHTMLBrowser unBrowserHandle ) = 0; - - // CALLBACKS - // - // These set of functions are used as responses to callback requests - // - - // You MUST call this in response to a HTML_StartRequest_t callback - // Set bAllowed to true to allow this navigation, false to cancel it and stay - // on the current page. You can use this feature to limit the valid pages - // allowed in your HTML surface. - virtual void AllowStartRequest( HHTMLBrowser unBrowserHandle, bool bAllowed ) = 0; - - // You MUST call this in response to a HTML_JSAlert_t or HTML_JSConfirm_t callback - // Set bResult to true for the OK option of a confirm, use false otherwise - virtual void JSDialogResponse( HHTMLBrowser unBrowserHandle, bool bResult ) = 0; - - // You MUST call this in response to a HTML_FileOpenDialog_t callback - STEAM_IGNOREATTR() - virtual void FileLoadDialogResponse( HHTMLBrowser unBrowserHandle, const char **pchSelectedFiles ) = 0; -}; - -#define STEAMHTMLSURFACE_INTERFACE_VERSION "STEAMHTMLSURFACE_INTERFACE_VERSION_005" - -// Global interface accessor -inline ISteamHTMLSurface *SteamHTMLSurface(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamHTMLSurface *, SteamHTMLSurface, STEAMHTMLSURFACE_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -//----------------------------------------------------------------------------- -// Purpose: The browser is ready for use -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_BrowserReady_t, k_iSteamHTMLSurfaceCallbacks + 1 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // this browser is now fully created and ready to navigate to pages -STEAM_CALLBACK_END(1) - - -//----------------------------------------------------------------------------- -// Purpose: the browser has a pending paint -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN(HTML_NeedsPaint_t, k_iSteamHTMLSurfaceCallbacks + 2) -STEAM_CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the browser that needs the paint -STEAM_CALLBACK_MEMBER(1, const char *, pBGRA ) // a pointer to the B8G8R8A8 data for this surface, valid until SteamAPI_RunCallbacks is next called -STEAM_CALLBACK_MEMBER(2, uint32, unWide) // the total width of the pBGRA texture -STEAM_CALLBACK_MEMBER(3, uint32, unTall) // the total height of the pBGRA texture -STEAM_CALLBACK_MEMBER(4, uint32, unUpdateX) // the offset in X for the damage rect for this update -STEAM_CALLBACK_MEMBER(5, uint32, unUpdateY) // the offset in Y for the damage rect for this update -STEAM_CALLBACK_MEMBER(6, uint32, unUpdateWide) // the width of the damage rect for this update -STEAM_CALLBACK_MEMBER(7, uint32, unUpdateTall) // the height of the damage rect for this update -STEAM_CALLBACK_MEMBER(8, uint32, unScrollX) // the page scroll the browser was at when this texture was rendered -STEAM_CALLBACK_MEMBER(9, uint32, unScrollY) // the page scroll the browser was at when this texture was rendered -STEAM_CALLBACK_MEMBER(10, float, flPageScale) // the page scale factor on this page when rendered -STEAM_CALLBACK_MEMBER(11, uint32, unPageSerial) // incremented on each new page load, you can use this to reject draws while navigating to new pages -STEAM_CALLBACK_END(12) - - -//----------------------------------------------------------------------------- -// Purpose: The browser wanted to navigate to a new page -// NOTE - you MUST call AllowStartRequest in response to this callback -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN(HTML_StartRequest_t, k_iSteamHTMLSurfaceCallbacks + 3) -STEAM_CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface navigating -STEAM_CALLBACK_MEMBER(1, const char *, pchURL) // the url they wish to navigate to -STEAM_CALLBACK_MEMBER(2, const char *, pchTarget) // the html link target type (i.e _blank, _self, _parent, _top ) -STEAM_CALLBACK_MEMBER(3, const char *, pchPostData ) // any posted data for the request -STEAM_CALLBACK_MEMBER(4, bool, bIsRedirect) // true if this was a http/html redirect from the last load request -STEAM_CALLBACK_END(5) - - -//----------------------------------------------------------------------------- -// Purpose: The browser has been requested to close due to user interaction (usually from a javascript window.close() call) -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN(HTML_CloseBrowser_t, k_iSteamHTMLSurfaceCallbacks + 4) -STEAM_CALLBACK_MEMBER(0, HHTMLBrowser, unBrowserHandle) // the handle of the surface -STEAM_CALLBACK_END(1) - - -//----------------------------------------------------------------------------- -// Purpose: the browser is navigating to a new url -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_URLChanged_t, k_iSteamHTMLSurfaceCallbacks + 5 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface navigating -STEAM_CALLBACK_MEMBER( 1, const char *, pchURL ) // the url they wish to navigate to -STEAM_CALLBACK_MEMBER( 2, const char *, pchPostData ) // any posted data for the request -STEAM_CALLBACK_MEMBER( 3, bool, bIsRedirect ) // true if this was a http/html redirect from the last load request -STEAM_CALLBACK_MEMBER( 4, const char *, pchPageTitle ) // the title of the page -STEAM_CALLBACK_MEMBER( 5, bool, bNewNavigation ) // true if this was from a fresh tab and not a click on an existing page -STEAM_CALLBACK_END(6) - - -//----------------------------------------------------------------------------- -// Purpose: A page is finished loading -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_FinishedRequest_t, k_iSteamHTMLSurfaceCallbacks + 6 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchURL ) // -STEAM_CALLBACK_MEMBER( 2, const char *, pchPageTitle ) // -STEAM_CALLBACK_END(3) - - -//----------------------------------------------------------------------------- -// Purpose: a request to load this url in a new tab -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_OpenLinkInNewTab_t, k_iSteamHTMLSurfaceCallbacks + 7 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchURL ) // -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: the page has a new title now -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_ChangedTitle_t, k_iSteamHTMLSurfaceCallbacks + 8 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchTitle ) // -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: results from a search -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_SearchResults_t, k_iSteamHTMLSurfaceCallbacks + 9 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, uint32, unResults ) // -STEAM_CALLBACK_MEMBER( 2, uint32, unCurrentMatch ) // -STEAM_CALLBACK_END(3) - - -//----------------------------------------------------------------------------- -// Purpose: page history status changed on the ability to go backwards and forward -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_CanGoBackAndForward_t, k_iSteamHTMLSurfaceCallbacks + 10 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, bool, bCanGoBack ) // -STEAM_CALLBACK_MEMBER( 2, bool, bCanGoForward ) // -STEAM_CALLBACK_END(3) - - -//----------------------------------------------------------------------------- -// Purpose: details on the visibility and size of the horizontal scrollbar -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_HorizontalScroll_t, k_iSteamHTMLSurfaceCallbacks + 11 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, uint32, unScrollMax ) // -STEAM_CALLBACK_MEMBER( 2, uint32, unScrollCurrent ) // -STEAM_CALLBACK_MEMBER( 3, float, flPageScale ) // -STEAM_CALLBACK_MEMBER( 4, bool , bVisible ) // -STEAM_CALLBACK_MEMBER( 5, uint32, unPageSize ) // -STEAM_CALLBACK_END(6) - - -//----------------------------------------------------------------------------- -// Purpose: details on the visibility and size of the vertical scrollbar -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_VerticalScroll_t, k_iSteamHTMLSurfaceCallbacks + 12 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, uint32, unScrollMax ) // -STEAM_CALLBACK_MEMBER( 2, uint32, unScrollCurrent ) // -STEAM_CALLBACK_MEMBER( 3, float, flPageScale ) // -STEAM_CALLBACK_MEMBER( 4, bool, bVisible ) // -STEAM_CALLBACK_MEMBER( 5, uint32, unPageSize ) // -STEAM_CALLBACK_END(6) - - -//----------------------------------------------------------------------------- -// Purpose: response to GetLinkAtPosition call -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_LinkAtPosition_t, k_iSteamHTMLSurfaceCallbacks + 13 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, uint32, x ) // NOTE - Not currently set -STEAM_CALLBACK_MEMBER( 2, uint32, y ) // NOTE - Not currently set -STEAM_CALLBACK_MEMBER( 3, const char *, pchURL ) // -STEAM_CALLBACK_MEMBER( 4, bool, bInput ) // -STEAM_CALLBACK_MEMBER( 5, bool, bLiveLink ) // -STEAM_CALLBACK_END(6) - - - -//----------------------------------------------------------------------------- -// Purpose: show a Javascript alert dialog, call JSDialogResponse -// when the user dismisses this dialog (or right away to ignore it) -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_JSAlert_t, k_iSteamHTMLSurfaceCallbacks + 14 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchMessage ) // -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: show a Javascript confirmation dialog, call JSDialogResponse -// when the user dismisses this dialog (or right away to ignore it) -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_JSConfirm_t, k_iSteamHTMLSurfaceCallbacks + 15 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchMessage ) // -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: when received show a file open dialog -// then call FileLoadDialogResponse with the file(s) the user selected. -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_FileOpenDialog_t, k_iSteamHTMLSurfaceCallbacks + 16 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchTitle ) // -STEAM_CALLBACK_MEMBER( 2, const char *, pchInitialFile ) // -STEAM_CALLBACK_END(3) - - -//----------------------------------------------------------------------------- -// Purpose: a new html window is being created. -// -// IMPORTANT NOTE: at this time, the API does not allow you to acknowledge or -// render the contents of this new window, so the new window is always destroyed -// immediately. The URL and other parameters of the new window are passed here -// to give your application the opportunity to call CreateBrowser and set up -// a new browser in response to the attempted popup, if you wish to do so. -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_NewWindow_t, k_iSteamHTMLSurfaceCallbacks + 21 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the current surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchURL ) // the page to load -STEAM_CALLBACK_MEMBER( 2, uint32, unX ) // the x pos into the page to display the popup -STEAM_CALLBACK_MEMBER( 3, uint32, unY ) // the y pos into the page to display the popup -STEAM_CALLBACK_MEMBER( 4, uint32, unWide ) // the total width of the pBGRA texture -STEAM_CALLBACK_MEMBER( 5, uint32, unTall ) // the total height of the pBGRA texture -STEAM_CALLBACK_MEMBER( 6, HHTMLBrowser, unNewWindow_BrowserHandle_IGNORE ) -STEAM_CALLBACK_END(7) - - -//----------------------------------------------------------------------------- -// Purpose: change the cursor to display -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_SetCursor_t, k_iSteamHTMLSurfaceCallbacks + 22 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, uint32, eMouseCursor ) // the EMouseCursor to display -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: informational message from the browser -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_StatusText_t, k_iSteamHTMLSurfaceCallbacks + 23 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchMsg ) // the EMouseCursor to display -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: show a tooltip -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_ShowToolTip_t, k_iSteamHTMLSurfaceCallbacks + 24 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchMsg ) // the EMouseCursor to display -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: update the text of an existing tooltip -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_UpdateToolTip_t, k_iSteamHTMLSurfaceCallbacks + 25 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_MEMBER( 1, const char *, pchMsg ) // the EMouseCursor to display -STEAM_CALLBACK_END(2) - - -//----------------------------------------------------------------------------- -// Purpose: hide the tooltip you are showing -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_HideToolTip_t, k_iSteamHTMLSurfaceCallbacks + 26 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // the handle of the surface -STEAM_CALLBACK_END(1) - - -//----------------------------------------------------------------------------- -// Purpose: The browser has restarted due to an internal failure, use this new handle value -//----------------------------------------------------------------------------- -STEAM_CALLBACK_BEGIN( HTML_BrowserRestarted_t, k_iSteamHTMLSurfaceCallbacks + 27 ) -STEAM_CALLBACK_MEMBER( 0, HHTMLBrowser, unBrowserHandle ) // this is the new browser handle after the restart -STEAM_CALLBACK_MEMBER( 1, HHTMLBrowser, unOldBrowserHandle ) // the handle for the browser before the restart, if your handle was this then switch to using unBrowserHandle for API calls -STEAM_CALLBACK_END(2) - - -#pragma pack( pop ) - - -#endif // ISTEAMHTMLSURFACE_H diff --git a/lib/steamworks_150/public/steam/isteamhttp.h b/lib/steamworks_150/public/steam/isteamhttp.h deleted file mode 100644 index 26a02b3..0000000 --- a/lib/steamworks_150/public/steam/isteamhttp.h +++ /dev/null @@ -1,219 +0,0 @@ -//====== Copyright © 1996-2009, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to http client -// -//============================================================================= - -#ifndef ISTEAMHTTP_H -#define ISTEAMHTTP_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "steamhttpenums.h" - -// Handle to a HTTP Request handle -typedef uint32 HTTPRequestHandle; -#define INVALID_HTTPREQUEST_HANDLE 0 - -typedef uint32 HTTPCookieContainerHandle; -#define INVALID_HTTPCOOKIE_HANDLE 0 - -//----------------------------------------------------------------------------- -// Purpose: interface to http client -//----------------------------------------------------------------------------- -class ISteamHTTP -{ -public: - - // Initializes a new HTTP request, returning a handle to use in further operations on it. Requires - // the method (GET or POST) and the absolute URL for the request. Both http and https are supported, - // so this string must start with http:// or https:// and should look like http://store.steampowered.com/app/250/ - // or such. - virtual HTTPRequestHandle CreateHTTPRequest( EHTTPMethod eHTTPRequestMethod, const char *pchAbsoluteURL ) = 0; - - // Set a context value for the request, which will be returned in the HTTPRequestCompleted_t callback after - // sending the request. This is just so the caller can easily keep track of which callbacks go with which request data. - virtual bool SetHTTPRequestContextValue( HTTPRequestHandle hRequest, uint64 ulContextValue ) = 0; - - // Set a timeout in seconds for the HTTP request, must be called prior to sending the request. Default - // timeout is 60 seconds if you don't call this. Returns false if the handle is invalid, or the request - // has already been sent. - virtual bool SetHTTPRequestNetworkActivityTimeout( HTTPRequestHandle hRequest, uint32 unTimeoutSeconds ) = 0; - - // Set a request header value for the request, must be called prior to sending the request. Will - // return false if the handle is invalid or the request is already sent. - virtual bool SetHTTPRequestHeaderValue( HTTPRequestHandle hRequest, const char *pchHeaderName, const char *pchHeaderValue ) = 0; - - // Set a GET or POST parameter value on the request, which is set will depend on the EHTTPMethod specified - // when creating the request. Must be called prior to sending the request. Will return false if the - // handle is invalid or the request is already sent. - virtual bool SetHTTPRequestGetOrPostParameter( HTTPRequestHandle hRequest, const char *pchParamName, const char *pchParamValue ) = 0; - - // Sends the HTTP request, will return false on a bad handle, otherwise use SteamCallHandle to wait on - // asynchronous response via callback. - // - // Note: If the user is in offline mode in Steam, then this will add a only-if-cached cache-control - // header and only do a local cache lookup rather than sending any actual remote request. - virtual bool SendHTTPRequest( HTTPRequestHandle hRequest, SteamAPICall_t *pCallHandle ) = 0; - - // Sends the HTTP request, will return false on a bad handle, otherwise use SteamCallHandle to wait on - // asynchronous response via callback for completion, and listen for HTTPRequestHeadersReceived_t and - // HTTPRequestDataReceived_t callbacks while streaming. - virtual bool SendHTTPRequestAndStreamResponse( HTTPRequestHandle hRequest, SteamAPICall_t *pCallHandle ) = 0; - - // Defers a request you have sent, the actual HTTP client code may have many requests queued, and this will move - // the specified request to the tail of the queue. Returns false on invalid handle, or if the request is not yet sent. - virtual bool DeferHTTPRequest( HTTPRequestHandle hRequest ) = 0; - - // Prioritizes a request you have sent, the actual HTTP client code may have many requests queued, and this will move - // the specified request to the head of the queue. Returns false on invalid handle, or if the request is not yet sent. - virtual bool PrioritizeHTTPRequest( HTTPRequestHandle hRequest ) = 0; - - // Checks if a response header is present in a HTTP response given a handle from HTTPRequestCompleted_t, also - // returns the size of the header value if present so the caller and allocate a correctly sized buffer for - // GetHTTPResponseHeaderValue. - virtual bool GetHTTPResponseHeaderSize( HTTPRequestHandle hRequest, const char *pchHeaderName, uint32 *unResponseHeaderSize ) = 0; - - // Gets header values from a HTTP response given a handle from HTTPRequestCompleted_t, will return false if the - // header is not present or if your buffer is too small to contain it's value. You should first call - // BGetHTTPResponseHeaderSize to check for the presence of the header and to find out the size buffer needed. - virtual bool GetHTTPResponseHeaderValue( HTTPRequestHandle hRequest, const char *pchHeaderName, uint8 *pHeaderValueBuffer, uint32 unBufferSize ) = 0; - - // Gets the size of the body data from a HTTP response given a handle from HTTPRequestCompleted_t, will return false if the - // handle is invalid. - virtual bool GetHTTPResponseBodySize( HTTPRequestHandle hRequest, uint32 *unBodySize ) = 0; - - // Gets the body data from a HTTP response given a handle from HTTPRequestCompleted_t, will return false if the - // handle is invalid or is to a streaming response, or if the provided buffer is not the correct size. Use BGetHTTPResponseBodySize first to find out - // the correct buffer size to use. - virtual bool GetHTTPResponseBodyData( HTTPRequestHandle hRequest, uint8 *pBodyDataBuffer, uint32 unBufferSize ) = 0; - - // Gets the body data from a streaming HTTP response given a handle from HTTPRequestDataReceived_t. Will return false if the - // handle is invalid or is to a non-streaming response (meaning it wasn't sent with SendHTTPRequestAndStreamResponse), or if the buffer size and offset - // do not match the size and offset sent in HTTPRequestDataReceived_t. - virtual bool GetHTTPStreamingResponseBodyData( HTTPRequestHandle hRequest, uint32 cOffset, uint8 *pBodyDataBuffer, uint32 unBufferSize ) = 0; - - // Releases an HTTP response handle, should always be called to free resources after receiving a HTTPRequestCompleted_t - // callback and finishing using the response. - virtual bool ReleaseHTTPRequest( HTTPRequestHandle hRequest ) = 0; - - // Gets progress on downloading the body for the request. This will be zero unless a response header has already been - // received which included a content-length field. For responses that contain no content-length it will report - // zero for the duration of the request as the size is unknown until the connection closes. - virtual bool GetHTTPDownloadProgressPct( HTTPRequestHandle hRequest, float *pflPercentOut ) = 0; - - // Sets the body for an HTTP Post request. Will fail and return false on a GET request, and will fail if POST params - // have already been set for the request. Setting this raw body makes it the only contents for the post, the pchContentType - // parameter will set the content-type header for the request so the server may know how to interpret the body. - virtual bool SetHTTPRequestRawPostBody( HTTPRequestHandle hRequest, const char *pchContentType, uint8 *pubBody, uint32 unBodyLen ) = 0; - - // Creates a cookie container handle which you must later free with ReleaseCookieContainer(). If bAllowResponsesToModify=true - // than any response to your requests using this cookie container may add new cookies which may be transmitted with - // future requests. If bAllowResponsesToModify=false than only cookies you explicitly set will be sent. This API is just for - // during process lifetime, after steam restarts no cookies are persisted and you have no way to access the cookie container across - // repeat executions of your process. - virtual HTTPCookieContainerHandle CreateCookieContainer( bool bAllowResponsesToModify ) = 0; - - // Release a cookie container you are finished using, freeing it's memory - virtual bool ReleaseCookieContainer( HTTPCookieContainerHandle hCookieContainer ) = 0; - - // Adds a cookie to the specified cookie container that will be used with future requests. - virtual bool SetCookie( HTTPCookieContainerHandle hCookieContainer, const char *pchHost, const char *pchUrl, const char *pchCookie ) = 0; - - // Set the cookie container to use for a HTTP request - virtual bool SetHTTPRequestCookieContainer( HTTPRequestHandle hRequest, HTTPCookieContainerHandle hCookieContainer ) = 0; - - // Set the extra user agent info for a request, this doesn't clobber the normal user agent, it just adds the extra info on the end - virtual bool SetHTTPRequestUserAgentInfo( HTTPRequestHandle hRequest, const char *pchUserAgentInfo ) = 0; - - // Disable or re-enable verification of SSL/TLS certificates. - // By default, certificates are checked for all HTTPS requests. - virtual bool SetHTTPRequestRequiresVerifiedCertificate( HTTPRequestHandle hRequest, bool bRequireVerifiedCertificate ) = 0; - - // Set an absolute timeout on the HTTP request, this is just a total time timeout different than the network activity timeout - // which can bump everytime we get more data - virtual bool SetHTTPRequestAbsoluteTimeoutMS( HTTPRequestHandle hRequest, uint32 unMilliseconds ) = 0; - - // Check if the reason the request failed was because we timed it out (rather than some harder failure) - virtual bool GetHTTPRequestWasTimedOut( HTTPRequestHandle hRequest, bool *pbWasTimedOut ) = 0; -}; - -#define STEAMHTTP_INTERFACE_VERSION "STEAMHTTP_INTERFACE_VERSION003" - -// Global interface accessor -inline ISteamHTTP *SteamHTTP(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamHTTP *, SteamHTTP, STEAMHTTP_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamHTTP *SteamGameServerHTTP(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamHTTP *, SteamGameServerHTTP, STEAMHTTP_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -struct HTTPRequestCompleted_t -{ - enum { k_iCallback = k_iClientHTTPCallbacks + 1 }; - - // Handle value for the request that has completed. - HTTPRequestHandle m_hRequest; - - // Context value that the user defined on the request that this callback is associated with, 0 if - // no context value was set. - uint64 m_ulContextValue; - - // This will be true if we actually got any sort of response from the server (even an error). - // It will be false if we failed due to an internal error or client side network failure. - bool m_bRequestSuccessful; - - // Will be the HTTP status code value returned by the server, k_EHTTPStatusCode200OK is the normal - // OK response, if you get something else you probably need to treat it as a failure. - EHTTPStatusCode m_eStatusCode; - - uint32 m_unBodySize; // Same as GetHTTPResponseBodySize() -}; - - -struct HTTPRequestHeadersReceived_t -{ - enum { k_iCallback = k_iClientHTTPCallbacks + 2 }; - - // Handle value for the request that has received headers. - HTTPRequestHandle m_hRequest; - - // Context value that the user defined on the request that this callback is associated with, 0 if - // no context value was set. - uint64 m_ulContextValue; -}; - -struct HTTPRequestDataReceived_t -{ - enum { k_iCallback = k_iClientHTTPCallbacks + 3 }; - - // Handle value for the request that has received data. - HTTPRequestHandle m_hRequest; - - // Context value that the user defined on the request that this callback is associated with, 0 if - // no context value was set. - uint64 m_ulContextValue; - - - // Offset to provide to GetHTTPStreamingResponseBodyData to get this chunk of data - uint32 m_cOffset; - - // Size to provide to GetHTTPStreamingResponseBodyData to get this chunk of data - uint32 m_cBytesReceived; -}; - - -#pragma pack( pop ) - -#endif // ISTEAMHTTP_H \ No newline at end of file diff --git a/lib/steamworks_150/public/steam/isteaminput.h b/lib/steamworks_150/public/steam/isteaminput.h deleted file mode 100644 index 84f1b14..0000000 --- a/lib/steamworks_150/public/steam/isteaminput.h +++ /dev/null @@ -1,609 +0,0 @@ -//====== Copyright 1996-2018, Valve Corporation, All rights reserved. ======= -// -// Purpose: Steam Input is a flexible input API that supports over three hundred devices including all -// common variants of Xbox, Playstation, Nintendo Switch Pro, and Steam Controllers. -// For more info including a getting started guide for developers -// please visit: https://partner.steamgames.com/doc/features/steam_controller -// -//============================================================================= - -#ifndef ISTEAMINPUT_H -#define ISTEAMINPUT_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -#define STEAM_INPUT_MAX_COUNT 16 - -#define STEAM_INPUT_MAX_ANALOG_ACTIONS 16 - -#define STEAM_INPUT_MAX_DIGITAL_ACTIONS 128 - -#define STEAM_INPUT_MAX_ORIGINS 8 - -#define STEAM_INPUT_MAX_ACTIVE_LAYERS 16 - -// When sending an option to a specific controller handle, you can send to all devices via this command -#define STEAM_INPUT_HANDLE_ALL_CONTROLLERS UINT64_MAX - -#define STEAM_INPUT_MIN_ANALOG_ACTION_DATA -1.0f -#define STEAM_INPUT_MAX_ANALOG_ACTION_DATA 1.0f - -enum EInputSourceMode -{ - k_EInputSourceMode_None, - k_EInputSourceMode_Dpad, - k_EInputSourceMode_Buttons, - k_EInputSourceMode_FourButtons, - k_EInputSourceMode_AbsoluteMouse, - k_EInputSourceMode_RelativeMouse, - k_EInputSourceMode_JoystickMove, - k_EInputSourceMode_JoystickMouse, - k_EInputSourceMode_JoystickCamera, - k_EInputSourceMode_ScrollWheel, - k_EInputSourceMode_Trigger, - k_EInputSourceMode_TouchMenu, - k_EInputSourceMode_MouseJoystick, - k_EInputSourceMode_MouseRegion, - k_EInputSourceMode_RadialMenu, - k_EInputSourceMode_SingleButton, - k_EInputSourceMode_Switches -}; - -// Note: Please do not use action origins as a way to identify controller types. There is no -// guarantee that they will be added in a contiguous manner - use GetInputTypeForHandle instead. -// Versions of Steam that add new controller types in the future will extend this enum so if you're -// using a lookup table please check the bounds of any origins returned by Steam. -enum EInputActionOrigin -{ - // Steam Controller - k_EInputActionOrigin_None, - k_EInputActionOrigin_SteamController_A, - k_EInputActionOrigin_SteamController_B, - k_EInputActionOrigin_SteamController_X, - k_EInputActionOrigin_SteamController_Y, - k_EInputActionOrigin_SteamController_LeftBumper, - k_EInputActionOrigin_SteamController_RightBumper, - k_EInputActionOrigin_SteamController_LeftGrip, - k_EInputActionOrigin_SteamController_RightGrip, - k_EInputActionOrigin_SteamController_Start, - k_EInputActionOrigin_SteamController_Back, - k_EInputActionOrigin_SteamController_LeftPad_Touch, - k_EInputActionOrigin_SteamController_LeftPad_Swipe, - k_EInputActionOrigin_SteamController_LeftPad_Click, - k_EInputActionOrigin_SteamController_LeftPad_DPadNorth, - k_EInputActionOrigin_SteamController_LeftPad_DPadSouth, - k_EInputActionOrigin_SteamController_LeftPad_DPadWest, - k_EInputActionOrigin_SteamController_LeftPad_DPadEast, - k_EInputActionOrigin_SteamController_RightPad_Touch, - k_EInputActionOrigin_SteamController_RightPad_Swipe, - k_EInputActionOrigin_SteamController_RightPad_Click, - k_EInputActionOrigin_SteamController_RightPad_DPadNorth, - k_EInputActionOrigin_SteamController_RightPad_DPadSouth, - k_EInputActionOrigin_SteamController_RightPad_DPadWest, - k_EInputActionOrigin_SteamController_RightPad_DPadEast, - k_EInputActionOrigin_SteamController_LeftTrigger_Pull, - k_EInputActionOrigin_SteamController_LeftTrigger_Click, - k_EInputActionOrigin_SteamController_RightTrigger_Pull, - k_EInputActionOrigin_SteamController_RightTrigger_Click, - k_EInputActionOrigin_SteamController_LeftStick_Move, - k_EInputActionOrigin_SteamController_LeftStick_Click, - k_EInputActionOrigin_SteamController_LeftStick_DPadNorth, - k_EInputActionOrigin_SteamController_LeftStick_DPadSouth, - k_EInputActionOrigin_SteamController_LeftStick_DPadWest, - k_EInputActionOrigin_SteamController_LeftStick_DPadEast, - k_EInputActionOrigin_SteamController_Gyro_Move, - k_EInputActionOrigin_SteamController_Gyro_Pitch, - k_EInputActionOrigin_SteamController_Gyro_Yaw, - k_EInputActionOrigin_SteamController_Gyro_Roll, - k_EInputActionOrigin_SteamController_Reserved0, - k_EInputActionOrigin_SteamController_Reserved1, - k_EInputActionOrigin_SteamController_Reserved2, - k_EInputActionOrigin_SteamController_Reserved3, - k_EInputActionOrigin_SteamController_Reserved4, - k_EInputActionOrigin_SteamController_Reserved5, - k_EInputActionOrigin_SteamController_Reserved6, - k_EInputActionOrigin_SteamController_Reserved7, - k_EInputActionOrigin_SteamController_Reserved8, - k_EInputActionOrigin_SteamController_Reserved9, - k_EInputActionOrigin_SteamController_Reserved10, - - // PS4 Dual Shock - k_EInputActionOrigin_PS4_X, - k_EInputActionOrigin_PS4_Circle, - k_EInputActionOrigin_PS4_Triangle, - k_EInputActionOrigin_PS4_Square, - k_EInputActionOrigin_PS4_LeftBumper, - k_EInputActionOrigin_PS4_RightBumper, - k_EInputActionOrigin_PS4_Options, //Start - k_EInputActionOrigin_PS4_Share, //Back - k_EInputActionOrigin_PS4_LeftPad_Touch, - k_EInputActionOrigin_PS4_LeftPad_Swipe, - k_EInputActionOrigin_PS4_LeftPad_Click, - k_EInputActionOrigin_PS4_LeftPad_DPadNorth, - k_EInputActionOrigin_PS4_LeftPad_DPadSouth, - k_EInputActionOrigin_PS4_LeftPad_DPadWest, - k_EInputActionOrigin_PS4_LeftPad_DPadEast, - k_EInputActionOrigin_PS4_RightPad_Touch, - k_EInputActionOrigin_PS4_RightPad_Swipe, - k_EInputActionOrigin_PS4_RightPad_Click, - k_EInputActionOrigin_PS4_RightPad_DPadNorth, - k_EInputActionOrigin_PS4_RightPad_DPadSouth, - k_EInputActionOrigin_PS4_RightPad_DPadWest, - k_EInputActionOrigin_PS4_RightPad_DPadEast, - k_EInputActionOrigin_PS4_CenterPad_Touch, - k_EInputActionOrigin_PS4_CenterPad_Swipe, - k_EInputActionOrigin_PS4_CenterPad_Click, - k_EInputActionOrigin_PS4_CenterPad_DPadNorth, - k_EInputActionOrigin_PS4_CenterPad_DPadSouth, - k_EInputActionOrigin_PS4_CenterPad_DPadWest, - k_EInputActionOrigin_PS4_CenterPad_DPadEast, - k_EInputActionOrigin_PS4_LeftTrigger_Pull, - k_EInputActionOrigin_PS4_LeftTrigger_Click, - k_EInputActionOrigin_PS4_RightTrigger_Pull, - k_EInputActionOrigin_PS4_RightTrigger_Click, - k_EInputActionOrigin_PS4_LeftStick_Move, - k_EInputActionOrigin_PS4_LeftStick_Click, - k_EInputActionOrigin_PS4_LeftStick_DPadNorth, - k_EInputActionOrigin_PS4_LeftStick_DPadSouth, - k_EInputActionOrigin_PS4_LeftStick_DPadWest, - k_EInputActionOrigin_PS4_LeftStick_DPadEast, - k_EInputActionOrigin_PS4_RightStick_Move, - k_EInputActionOrigin_PS4_RightStick_Click, - k_EInputActionOrigin_PS4_RightStick_DPadNorth, - k_EInputActionOrigin_PS4_RightStick_DPadSouth, - k_EInputActionOrigin_PS4_RightStick_DPadWest, - k_EInputActionOrigin_PS4_RightStick_DPadEast, - k_EInputActionOrigin_PS4_DPad_North, - k_EInputActionOrigin_PS4_DPad_South, - k_EInputActionOrigin_PS4_DPad_West, - k_EInputActionOrigin_PS4_DPad_East, - k_EInputActionOrigin_PS4_Gyro_Move, - k_EInputActionOrigin_PS4_Gyro_Pitch, - k_EInputActionOrigin_PS4_Gyro_Yaw, - k_EInputActionOrigin_PS4_Gyro_Roll, - k_EInputActionOrigin_PS4_DPad_Move, - k_EInputActionOrigin_PS4_Reserved1, - k_EInputActionOrigin_PS4_Reserved2, - k_EInputActionOrigin_PS4_Reserved3, - k_EInputActionOrigin_PS4_Reserved4, - k_EInputActionOrigin_PS4_Reserved5, - k_EInputActionOrigin_PS4_Reserved6, - k_EInputActionOrigin_PS4_Reserved7, - k_EInputActionOrigin_PS4_Reserved8, - k_EInputActionOrigin_PS4_Reserved9, - k_EInputActionOrigin_PS4_Reserved10, - - // XBox One - k_EInputActionOrigin_XBoxOne_A, - k_EInputActionOrigin_XBoxOne_B, - k_EInputActionOrigin_XBoxOne_X, - k_EInputActionOrigin_XBoxOne_Y, - k_EInputActionOrigin_XBoxOne_LeftBumper, - k_EInputActionOrigin_XBoxOne_RightBumper, - k_EInputActionOrigin_XBoxOne_Menu, //Start - k_EInputActionOrigin_XBoxOne_View, //Back - k_EInputActionOrigin_XBoxOne_LeftTrigger_Pull, - k_EInputActionOrigin_XBoxOne_LeftTrigger_Click, - k_EInputActionOrigin_XBoxOne_RightTrigger_Pull, - k_EInputActionOrigin_XBoxOne_RightTrigger_Click, - k_EInputActionOrigin_XBoxOne_LeftStick_Move, - k_EInputActionOrigin_XBoxOne_LeftStick_Click, - k_EInputActionOrigin_XBoxOne_LeftStick_DPadNorth, - k_EInputActionOrigin_XBoxOne_LeftStick_DPadSouth, - k_EInputActionOrigin_XBoxOne_LeftStick_DPadWest, - k_EInputActionOrigin_XBoxOne_LeftStick_DPadEast, - k_EInputActionOrigin_XBoxOne_RightStick_Move, - k_EInputActionOrigin_XBoxOne_RightStick_Click, - k_EInputActionOrigin_XBoxOne_RightStick_DPadNorth, - k_EInputActionOrigin_XBoxOne_RightStick_DPadSouth, - k_EInputActionOrigin_XBoxOne_RightStick_DPadWest, - k_EInputActionOrigin_XBoxOne_RightStick_DPadEast, - k_EInputActionOrigin_XBoxOne_DPad_North, - k_EInputActionOrigin_XBoxOne_DPad_South, - k_EInputActionOrigin_XBoxOne_DPad_West, - k_EInputActionOrigin_XBoxOne_DPad_East, - k_EInputActionOrigin_XBoxOne_DPad_Move, - k_EInputActionOrigin_XBoxOne_Reserved1, - k_EInputActionOrigin_XBoxOne_Reserved2, - k_EInputActionOrigin_XBoxOne_Reserved3, - k_EInputActionOrigin_XBoxOne_Reserved4, - k_EInputActionOrigin_XBoxOne_Reserved5, - k_EInputActionOrigin_XBoxOne_Reserved6, - k_EInputActionOrigin_XBoxOne_Reserved7, - k_EInputActionOrigin_XBoxOne_Reserved8, - k_EInputActionOrigin_XBoxOne_Reserved9, - k_EInputActionOrigin_XBoxOne_Reserved10, - - // XBox 360 - k_EInputActionOrigin_XBox360_A, - k_EInputActionOrigin_XBox360_B, - k_EInputActionOrigin_XBox360_X, - k_EInputActionOrigin_XBox360_Y, - k_EInputActionOrigin_XBox360_LeftBumper, - k_EInputActionOrigin_XBox360_RightBumper, - k_EInputActionOrigin_XBox360_Start, //Start - k_EInputActionOrigin_XBox360_Back, //Back - k_EInputActionOrigin_XBox360_LeftTrigger_Pull, - k_EInputActionOrigin_XBox360_LeftTrigger_Click, - k_EInputActionOrigin_XBox360_RightTrigger_Pull, - k_EInputActionOrigin_XBox360_RightTrigger_Click, - k_EInputActionOrigin_XBox360_LeftStick_Move, - k_EInputActionOrigin_XBox360_LeftStick_Click, - k_EInputActionOrigin_XBox360_LeftStick_DPadNorth, - k_EInputActionOrigin_XBox360_LeftStick_DPadSouth, - k_EInputActionOrigin_XBox360_LeftStick_DPadWest, - k_EInputActionOrigin_XBox360_LeftStick_DPadEast, - k_EInputActionOrigin_XBox360_RightStick_Move, - k_EInputActionOrigin_XBox360_RightStick_Click, - k_EInputActionOrigin_XBox360_RightStick_DPadNorth, - k_EInputActionOrigin_XBox360_RightStick_DPadSouth, - k_EInputActionOrigin_XBox360_RightStick_DPadWest, - k_EInputActionOrigin_XBox360_RightStick_DPadEast, - k_EInputActionOrigin_XBox360_DPad_North, - k_EInputActionOrigin_XBox360_DPad_South, - k_EInputActionOrigin_XBox360_DPad_West, - k_EInputActionOrigin_XBox360_DPad_East, - k_EInputActionOrigin_XBox360_DPad_Move, - k_EInputActionOrigin_XBox360_Reserved1, - k_EInputActionOrigin_XBox360_Reserved2, - k_EInputActionOrigin_XBox360_Reserved3, - k_EInputActionOrigin_XBox360_Reserved4, - k_EInputActionOrigin_XBox360_Reserved5, - k_EInputActionOrigin_XBox360_Reserved6, - k_EInputActionOrigin_XBox360_Reserved7, - k_EInputActionOrigin_XBox360_Reserved8, - k_EInputActionOrigin_XBox360_Reserved9, - k_EInputActionOrigin_XBox360_Reserved10, - - - // Switch - Pro or Joycons used as a single input device. - // This does not apply to a single joycon - k_EInputActionOrigin_Switch_A, - k_EInputActionOrigin_Switch_B, - k_EInputActionOrigin_Switch_X, - k_EInputActionOrigin_Switch_Y, - k_EInputActionOrigin_Switch_LeftBumper, - k_EInputActionOrigin_Switch_RightBumper, - k_EInputActionOrigin_Switch_Plus, //Start - k_EInputActionOrigin_Switch_Minus, //Back - k_EInputActionOrigin_Switch_Capture, - k_EInputActionOrigin_Switch_LeftTrigger_Pull, - k_EInputActionOrigin_Switch_LeftTrigger_Click, - k_EInputActionOrigin_Switch_RightTrigger_Pull, - k_EInputActionOrigin_Switch_RightTrigger_Click, - k_EInputActionOrigin_Switch_LeftStick_Move, - k_EInputActionOrigin_Switch_LeftStick_Click, - k_EInputActionOrigin_Switch_LeftStick_DPadNorth, - k_EInputActionOrigin_Switch_LeftStick_DPadSouth, - k_EInputActionOrigin_Switch_LeftStick_DPadWest, - k_EInputActionOrigin_Switch_LeftStick_DPadEast, - k_EInputActionOrigin_Switch_RightStick_Move, - k_EInputActionOrigin_Switch_RightStick_Click, - k_EInputActionOrigin_Switch_RightStick_DPadNorth, - k_EInputActionOrigin_Switch_RightStick_DPadSouth, - k_EInputActionOrigin_Switch_RightStick_DPadWest, - k_EInputActionOrigin_Switch_RightStick_DPadEast, - k_EInputActionOrigin_Switch_DPad_North, - k_EInputActionOrigin_Switch_DPad_South, - k_EInputActionOrigin_Switch_DPad_West, - k_EInputActionOrigin_Switch_DPad_East, - k_EInputActionOrigin_Switch_ProGyro_Move, // Primary Gyro in Pro Controller, or Right JoyCon - k_EInputActionOrigin_Switch_ProGyro_Pitch, // Primary Gyro in Pro Controller, or Right JoyCon - k_EInputActionOrigin_Switch_ProGyro_Yaw, // Primary Gyro in Pro Controller, or Right JoyCon - k_EInputActionOrigin_Switch_ProGyro_Roll, // Primary Gyro in Pro Controller, or Right JoyCon - k_EInputActionOrigin_Switch_DPad_Move, - k_EInputActionOrigin_Switch_Reserved1, - k_EInputActionOrigin_Switch_Reserved2, - k_EInputActionOrigin_Switch_Reserved3, - k_EInputActionOrigin_Switch_Reserved4, - k_EInputActionOrigin_Switch_Reserved5, - k_EInputActionOrigin_Switch_Reserved6, - k_EInputActionOrigin_Switch_Reserved7, - k_EInputActionOrigin_Switch_Reserved8, - k_EInputActionOrigin_Switch_Reserved9, - k_EInputActionOrigin_Switch_Reserved10, - - // Switch JoyCon Specific - k_EInputActionOrigin_Switch_RightGyro_Move, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EInputActionOrigin_Switch_RightGyro_Pitch, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EInputActionOrigin_Switch_RightGyro_Yaw, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EInputActionOrigin_Switch_RightGyro_Roll, // Right JoyCon Gyro generally should correspond to Pro's single gyro - k_EInputActionOrigin_Switch_LeftGyro_Move, - k_EInputActionOrigin_Switch_LeftGyro_Pitch, - k_EInputActionOrigin_Switch_LeftGyro_Yaw, - k_EInputActionOrigin_Switch_LeftGyro_Roll, - k_EInputActionOrigin_Switch_LeftGrip_Lower, // Left JoyCon SR Button - k_EInputActionOrigin_Switch_LeftGrip_Upper, // Left JoyCon SL Button - k_EInputActionOrigin_Switch_RightGrip_Lower, // Right JoyCon SL Button - k_EInputActionOrigin_Switch_RightGrip_Upper, // Right JoyCon SR Button - k_EInputActionOrigin_Switch_Reserved11, - k_EInputActionOrigin_Switch_Reserved12, - k_EInputActionOrigin_Switch_Reserved13, - k_EInputActionOrigin_Switch_Reserved14, - k_EInputActionOrigin_Switch_Reserved15, - k_EInputActionOrigin_Switch_Reserved16, - k_EInputActionOrigin_Switch_Reserved17, - k_EInputActionOrigin_Switch_Reserved18, - k_EInputActionOrigin_Switch_Reserved19, - k_EInputActionOrigin_Switch_Reserved20, - - k_EInputActionOrigin_Count, // If Steam has added support for new controllers origins will go here. - k_EInputActionOrigin_MaximumPossibleValue = 32767, // Origins are currently a maximum of 16 bits. -}; - -enum EXboxOrigin -{ - k_EXboxOrigin_A, - k_EXboxOrigin_B, - k_EXboxOrigin_X, - k_EXboxOrigin_Y, - k_EXboxOrigin_LeftBumper, - k_EXboxOrigin_RightBumper, - k_EXboxOrigin_Menu, //Start - k_EXboxOrigin_View, //Back - k_EXboxOrigin_LeftTrigger_Pull, - k_EXboxOrigin_LeftTrigger_Click, - k_EXboxOrigin_RightTrigger_Pull, - k_EXboxOrigin_RightTrigger_Click, - k_EXboxOrigin_LeftStick_Move, - k_EXboxOrigin_LeftStick_Click, - k_EXboxOrigin_LeftStick_DPadNorth, - k_EXboxOrigin_LeftStick_DPadSouth, - k_EXboxOrigin_LeftStick_DPadWest, - k_EXboxOrigin_LeftStick_DPadEast, - k_EXboxOrigin_RightStick_Move, - k_EXboxOrigin_RightStick_Click, - k_EXboxOrigin_RightStick_DPadNorth, - k_EXboxOrigin_RightStick_DPadSouth, - k_EXboxOrigin_RightStick_DPadWest, - k_EXboxOrigin_RightStick_DPadEast, - k_EXboxOrigin_DPad_North, - k_EXboxOrigin_DPad_South, - k_EXboxOrigin_DPad_West, - k_EXboxOrigin_DPad_East, - k_EXboxOrigin_Count, -}; - -enum ESteamControllerPad -{ - k_ESteamControllerPad_Left, - k_ESteamControllerPad_Right -}; - -enum ESteamInputType -{ - k_ESteamInputType_Unknown, - k_ESteamInputType_SteamController, - k_ESteamInputType_XBox360Controller, - k_ESteamInputType_XBoxOneController, - k_ESteamInputType_GenericGamepad, // DirectInput controllers - k_ESteamInputType_PS4Controller, - k_ESteamInputType_AppleMFiController, // Unused - k_ESteamInputType_AndroidController, // Unused - k_ESteamInputType_SwitchJoyConPair, // Unused - k_ESteamInputType_SwitchJoyConSingle, // Unused - k_ESteamInputType_SwitchProController, - k_ESteamInputType_MobileTouch, // Steam Link App On-screen Virtual Controller - k_ESteamInputType_PS3Controller, // Currently uses PS4 Origins - k_ESteamInputType_Count, - k_ESteamInputType_MaximumPossibleValue = 255, -}; - -// These values are passed into SetLEDColor -enum ESteamInputLEDFlag -{ - k_ESteamInputLEDFlag_SetColor, - // Restore the LED color to the user's preference setting as set in the controller personalization menu. - // This also happens automatically on exit of your game. - k_ESteamInputLEDFlag_RestoreUserDefault -}; - -// InputHandle_t is used to refer to a specific controller. -// This handle will consistently identify a controller, even if it is disconnected and re-connected -typedef uint64 InputHandle_t; - - -// These handles are used to refer to a specific in-game action or action set -// All action handles should be queried during initialization for performance reasons -typedef uint64 InputActionSetHandle_t; -typedef uint64 InputDigitalActionHandle_t; -typedef uint64 InputAnalogActionHandle_t; - -#pragma pack( push, 1 ) - -struct InputAnalogActionData_t -{ - // Type of data coming from this action, this will match what got specified in the action set - EInputSourceMode eMode; - - // The current state of this action; will be delta updates for mouse actions - float x, y; - - // Whether or not this action is currently available to be bound in the active action set - bool bActive; -}; - -struct InputDigitalActionData_t -{ - // The current state of this action; will be true if currently pressed - bool bState; - - // Whether or not this action is currently available to be bound in the active action set - bool bActive; -}; - -struct InputMotionData_t -{ - // Sensor-fused absolute rotation; will drift in heading - float rotQuatX; - float rotQuatY; - float rotQuatZ; - float rotQuatW; - - // Positional acceleration - float posAccelX; - float posAccelY; - float posAccelZ; - - // Angular velocity - float rotVelX; - float rotVelY; - float rotVelZ; -}; - -#pragma pack( pop ) - - -//----------------------------------------------------------------------------- -// Purpose: Steam Input API -//----------------------------------------------------------------------------- -class ISteamInput -{ -public: - - // Init and Shutdown must be called when starting/ending use of this interface - virtual bool Init() = 0; - virtual bool Shutdown() = 0; - - // Synchronize API state with the latest Steam Controller inputs available. This - // is performed automatically by SteamAPI_RunCallbacks, but for the absolute lowest - // possible latency, you call this directly before reading controller state. This must - // be called from somewhere before GetConnectedControllers will return any handles - virtual void RunFrame() = 0; - - // Enumerate currently connected Steam Input enabled devices - developers can opt in controller by type (ex: Xbox/Playstation/etc) via - // the Steam Input settings in the Steamworks site or users can opt-in in their controller settings in Steam. - // handlesOut should point to a STEAM_INPUT_MAX_COUNT sized array of InputHandle_t handles - // Returns the number of handles written to handlesOut - virtual int GetConnectedControllers( STEAM_OUT_ARRAY_COUNT( STEAM_INPUT_MAX_COUNT, Receives list of connected controllers ) InputHandle_t *handlesOut ) = 0; - - //----------------------------------------------------------------------------- - // ACTION SETS - //----------------------------------------------------------------------------- - - // Lookup the handle for an Action Set. Best to do this once on startup, and store the handles for all future API calls. - virtual InputActionSetHandle_t GetActionSetHandle( const char *pszActionSetName ) = 0; - - // Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive') - // This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in - // your state loops, instead of trying to place it in all of your state transitions. - virtual void ActivateActionSet( InputHandle_t inputHandle, InputActionSetHandle_t actionSetHandle ) = 0; - virtual InputActionSetHandle_t GetCurrentActionSet( InputHandle_t inputHandle ) = 0; - - // ACTION SET LAYERS - virtual void ActivateActionSetLayer( InputHandle_t inputHandle, InputActionSetHandle_t actionSetLayerHandle ) = 0; - virtual void DeactivateActionSetLayer( InputHandle_t inputHandle, InputActionSetHandle_t actionSetLayerHandle ) = 0; - virtual void DeactivateAllActionSetLayers( InputHandle_t inputHandle ) = 0; - // Enumerate currently active layers. - // handlesOut should point to a STEAM_INPUT_MAX_ACTIVE_LAYERS sized array of ControllerActionSetHandle_t handles - // Returns the number of handles written to handlesOut - virtual int GetActiveActionSetLayers( InputHandle_t inputHandle, STEAM_OUT_ARRAY_COUNT( STEAM_INPUT_MAX_ACTIVE_LAYERS, Receives list of active layers ) InputActionSetHandle_t *handlesOut ) = 0; - - //----------------------------------------------------------------------------- - // ACTIONS - //----------------------------------------------------------------------------- - - // Lookup the handle for a digital action. Best to do this once on startup, and store the handles for all future API calls. - virtual InputDigitalActionHandle_t GetDigitalActionHandle( const char *pszActionName ) = 0; - - // Returns the current state of the supplied digital game action - virtual InputDigitalActionData_t GetDigitalActionData( InputHandle_t inputHandle, InputDigitalActionHandle_t digitalActionHandle ) = 0; - - // Get the origin(s) for a digital action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action. - // originsOut should point to a STEAM_INPUT_MAX_ORIGINS sized array of EInputActionOrigin handles. The EInputActionOrigin enum will get extended as support for new controller controllers gets added to - // the Steam client and will exceed the values from this header, please check bounds if you are using a look up table. - virtual int GetDigitalActionOrigins( InputHandle_t inputHandle, InputActionSetHandle_t actionSetHandle, InputDigitalActionHandle_t digitalActionHandle, STEAM_OUT_ARRAY_COUNT( STEAM_INPUT_MAX_ORIGINS, Receives list of action origins ) EInputActionOrigin *originsOut ) = 0; - - // Lookup the handle for an analog action. Best to do this once on startup, and store the handles for all future API calls. - virtual InputAnalogActionHandle_t GetAnalogActionHandle( const char *pszActionName ) = 0; - - // Returns the current state of these supplied analog game action - virtual InputAnalogActionData_t GetAnalogActionData( InputHandle_t inputHandle, InputAnalogActionHandle_t analogActionHandle ) = 0; - - // Get the origin(s) for an analog action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action. - // originsOut should point to a STEAM_INPUT_MAX_ORIGINS sized array of EInputActionOrigin handles. The EInputActionOrigin enum will get extended as support for new controller controllers gets added to - // the Steam client and will exceed the values from this header, please check bounds if you are using a look up table. - virtual int GetAnalogActionOrigins( InputHandle_t inputHandle, InputActionSetHandle_t actionSetHandle, InputAnalogActionHandle_t analogActionHandle, STEAM_OUT_ARRAY_COUNT( STEAM_INPUT_MAX_ORIGINS, Receives list of action origins ) EInputActionOrigin *originsOut ) = 0; - - // Get a local path to art for on-screen glyph for a particular origin - virtual const char *GetGlyphForActionOrigin( EInputActionOrigin eOrigin ) = 0; - - // Returns a localized string (from Steam's language setting) for the specified origin. - virtual const char *GetStringForActionOrigin( EInputActionOrigin eOrigin ) = 0; - - // Stop analog momentum for the action if it is a mouse action in trackball mode - virtual void StopAnalogActionMomentum( InputHandle_t inputHandle, InputAnalogActionHandle_t eAction ) = 0; - - // Returns raw motion data from the specified device - virtual InputMotionData_t GetMotionData( InputHandle_t inputHandle ) = 0; - - //----------------------------------------------------------------------------- - // OUTPUTS - //----------------------------------------------------------------------------- - - // Trigger a vibration event on supported controllers - Steam will translate these commands into haptic pulses for Steam Controllers - virtual void TriggerVibration( InputHandle_t inputHandle, unsigned short usLeftSpeed, unsigned short usRightSpeed ) = 0; - - // Set the controller LED color on supported controllers. nFlags is a bitmask of values from ESteamInputLEDFlag - 0 will default to setting a color. Steam will handle - // the behavior on exit of your program so you don't need to try restore the default as you are shutting down - virtual void SetLEDColor( InputHandle_t inputHandle, uint8 nColorR, uint8 nColorG, uint8 nColorB, unsigned int nFlags ) = 0; - - // Trigger a haptic pulse on a Steam Controller - if you are approximating rumble you may want to use TriggerVibration instead. - // Good uses for Haptic pulses include chimes, noises, or directional gameplay feedback (taking damage, footstep locations, etc). - virtual void TriggerHapticPulse( InputHandle_t inputHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec ) = 0; - - // Trigger a haptic pulse with a duty cycle of usDurationMicroSec / usOffMicroSec, unRepeat times. If you are approximating rumble you may want to use TriggerVibration instead. - // nFlags is currently unused and reserved for future use. - virtual void TriggerRepeatedHapticPulse( InputHandle_t inputHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec, unsigned short usOffMicroSec, unsigned short unRepeat, unsigned int nFlags ) = 0; - - //----------------------------------------------------------------------------- - // Utility functions availible without using the rest of Steam Input API - //----------------------------------------------------------------------------- - - // Invokes the Steam overlay and brings up the binding screen if the user is using Big Picture Mode - // If the user is not in Big Picture Mode it will open up the binding in a new window - virtual bool ShowBindingPanel( InputHandle_t inputHandle ) = 0; - - // Returns the input type for a particular handle - virtual ESteamInputType GetInputTypeForHandle( InputHandle_t inputHandle ) = 0; - - // Returns the associated controller handle for the specified emulated gamepad - can be used with the above 2 functions - // to identify controllers presented to your game over Xinput. Returns 0 if the Xinput index isn't associated with Steam Input - virtual InputHandle_t GetControllerForGamepadIndex( int nIndex ) = 0; - - // Returns the associated gamepad index for the specified controller, if emulating a gamepad or -1 if not associated with an Xinput index - virtual int GetGamepadIndexForController( InputHandle_t ulinputHandle ) = 0; - - // Returns a localized string (from Steam's language setting) for the specified Xbox controller origin. - virtual const char *GetStringForXboxOrigin( EXboxOrigin eOrigin ) = 0; - - // Get a local path to art for on-screen glyph for a particular Xbox controller origin - virtual const char *GetGlyphForXboxOrigin( EXboxOrigin eOrigin ) = 0; - - // Get the equivalent ActionOrigin for a given Xbox controller origin this can be chained with GetGlyphForActionOrigin to provide future proof glyphs for - // non-Steam Input API action games. Note - this only translates the buttons directly and doesn't take into account any remapping a user has made in their configuration - virtual EInputActionOrigin GetActionOriginFromXboxOrigin( InputHandle_t inputHandle, EXboxOrigin eOrigin ) = 0; - - // Convert an origin to another controller type - for inputs not present on the other controller type this will return k_EInputActionOrigin_None - // When a new input type is added you will be able to pass in k_ESteamInputType_Unknown and the closest origin that your version of the SDK recognized will be returned - // ex: if a Playstation 5 controller was released this function would return Playstation 4 origins. - virtual EInputActionOrigin TranslateActionOrigin( ESteamInputType eDestinationInputType, EInputActionOrigin eSourceOrigin ) = 0; - - // Get the binding revision for a given device. Returns false if the handle was not valid or if a mapping is not yet loaded for the device - virtual bool GetDeviceBindingRevision( InputHandle_t inputHandle, int *pMajor, int *pMinor ) = 0; - - // Get the Steam Remote Play session ID associated with a device, or 0 if there is no session associated with it - // See isteamremoteplay.h for more information on Steam Remote Play sessions - virtual uint32 GetRemotePlaySessionID( InputHandle_t inputHandle ) = 0; -}; - -#define STEAMINPUT_INTERFACE_VERSION "SteamInput001" - -// Global interface accessor -inline ISteamInput *SteamInput(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamInput *, SteamInput, STEAMINPUT_INTERFACE_VERSION ); - -#endif // ISTEAMINPUT_H diff --git a/lib/steamworks_150/public/steam/isteaminventory.h b/lib/steamworks_150/public/steam/isteaminventory.h deleted file mode 100644 index 4d19cc9..0000000 --- a/lib/steamworks_150/public/steam/isteaminventory.h +++ /dev/null @@ -1,448 +0,0 @@ -//====== Copyright © 1996-2014 Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to Steam Inventory -// -//============================================================================= - -#ifndef ISTEAMINVENTORY_H -#define ISTEAMINVENTORY_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -// Every individual instance of an item has a globally-unique ItemInstanceID. -// This ID is unique to the combination of (player, specific item instance) -// and will not be transferred to another player or re-used for another item. -typedef uint64 SteamItemInstanceID_t; - -static const SteamItemInstanceID_t k_SteamItemInstanceIDInvalid = (SteamItemInstanceID_t)~0; - -// Types of items in your game are identified by a 32-bit "item definition number". -// Valid definition numbers are between 1 and 999999999; numbers less than or equal to -// zero are invalid, and numbers greater than or equal to one billion (1x10^9) are -// reserved for internal Steam use. -typedef int32 SteamItemDef_t; - - -enum ESteamItemFlags -{ - // Item status flags - these flags are permanently attached to specific item instances - k_ESteamItemNoTrade = 1 << 0, // This item is account-locked and cannot be traded or given away. - - // Action confirmation flags - these flags are set one time only, as part of a result set - k_ESteamItemRemoved = 1 << 8, // The item has been destroyed, traded away, expired, or otherwise invalidated - k_ESteamItemConsumed = 1 << 9, // The item quantity has been decreased by 1 via ConsumeItem API. - - // All other flag bits are currently reserved for internal Steam use at this time. - // Do not assume anything about the state of other flags which are not defined here. -}; - -struct SteamItemDetails_t -{ - SteamItemInstanceID_t m_itemId; - SteamItemDef_t m_iDefinition; - uint16 m_unQuantity; - uint16 m_unFlags; // see ESteamItemFlags -}; - -typedef int32 SteamInventoryResult_t; - -static const SteamInventoryResult_t k_SteamInventoryResultInvalid = -1; - -typedef uint64 SteamInventoryUpdateHandle_t; -const SteamInventoryUpdateHandle_t k_SteamInventoryUpdateHandleInvalid = 0xffffffffffffffffull; - -//----------------------------------------------------------------------------- -// Purpose: Steam Inventory query and manipulation API -//----------------------------------------------------------------------------- -class ISteamInventory -{ -public: - - // INVENTORY ASYNC RESULT MANAGEMENT - // - // Asynchronous inventory queries always output a result handle which can be used with - // GetResultStatus, GetResultItems, etc. A SteamInventoryResultReady_t callback will - // be triggered when the asynchronous result becomes ready (or fails). - // - - // Find out the status of an asynchronous inventory result handle. Possible values: - // k_EResultPending - still in progress - // k_EResultOK - done, result ready - // k_EResultExpired - done, result ready, maybe out of date (see DeserializeResult) - // k_EResultInvalidParam - ERROR: invalid API call parameters - // k_EResultServiceUnavailable - ERROR: service temporarily down, you may retry later - // k_EResultLimitExceeded - ERROR: operation would exceed per-user inventory limits - // k_EResultFail - ERROR: unknown / generic error - STEAM_METHOD_DESC(Find out the status of an asynchronous inventory result handle.) - virtual EResult GetResultStatus( SteamInventoryResult_t resultHandle ) = 0; - - // Copies the contents of a result set into a flat array. The specific - // contents of the result set depend on which query which was used. - STEAM_METHOD_DESC(Copies the contents of a result set into a flat array. The specific contents of the result set depend on which query which was used.) - virtual bool GetResultItems( SteamInventoryResult_t resultHandle, - STEAM_OUT_ARRAY_COUNT( punOutItemsArraySize,Output array) SteamItemDetails_t *pOutItemsArray, - uint32 *punOutItemsArraySize ) = 0; - - // In combination with GetResultItems, you can use GetResultItemProperty to retrieve - // dynamic string properties for a given item returned in the result set. - // - // Property names are always composed of ASCII letters, numbers, and/or underscores. - // - // Pass a NULL pointer for pchPropertyName to get a comma - separated list of available - // property names. - // - // If pchValueBuffer is NULL, *punValueBufferSize will contain the - // suggested buffer size. Otherwise it will be the number of bytes actually copied - // to pchValueBuffer. If the results do not fit in the given buffer, partial - // results may be copied. - virtual bool GetResultItemProperty( SteamInventoryResult_t resultHandle, - uint32 unItemIndex, - const char *pchPropertyName, - STEAM_OUT_STRING_COUNT( punValueBufferSizeOut ) char *pchValueBuffer, uint32 *punValueBufferSizeOut ) = 0; - - // Returns the server time at which the result was generated. Compare against - // the value of IClientUtils::GetServerRealTime() to determine age. - STEAM_METHOD_DESC(Returns the server time at which the result was generated. Compare against the value of IClientUtils::GetServerRealTime() to determine age.) - virtual uint32 GetResultTimestamp( SteamInventoryResult_t resultHandle ) = 0; - - // Returns true if the result belongs to the target steam ID, false if the - // result does not. This is important when using DeserializeResult, to verify - // that a remote player is not pretending to have a different user's inventory. - STEAM_METHOD_DESC(Returns true if the result belongs to the target steam ID or false if the result does not. This is important when using DeserializeResult to verify that a remote player is not pretending to have a different users inventory.) - virtual bool CheckResultSteamID( SteamInventoryResult_t resultHandle, CSteamID steamIDExpected ) = 0; - - // Destroys a result handle and frees all associated memory. - STEAM_METHOD_DESC(Destroys a result handle and frees all associated memory.) - virtual void DestroyResult( SteamInventoryResult_t resultHandle ) = 0; - - - // INVENTORY ASYNC QUERY - // - - // Captures the entire state of the current user's Steam inventory. - // You must call DestroyResult on this handle when you are done with it. - // Returns false and sets *pResultHandle to zero if inventory is unavailable. - // Note: calls to this function are subject to rate limits and may return - // cached results if called too frequently. It is suggested that you call - // this function only when you are about to display the user's full inventory, - // or if you expect that the inventory may have changed. - STEAM_METHOD_DESC(Captures the entire state of the current users Steam inventory.) - virtual bool GetAllItems( SteamInventoryResult_t *pResultHandle ) = 0; - - - // Captures the state of a subset of the current user's Steam inventory, - // identified by an array of item instance IDs. The results from this call - // can be serialized and passed to other players to "prove" that the current - // user owns specific items, without exposing the user's entire inventory. - // For example, you could call GetItemsByID with the IDs of the user's - // currently equipped cosmetic items and serialize this to a buffer, and - // then transmit this buffer to other players upon joining a game. - STEAM_METHOD_DESC(Captures the state of a subset of the current users Steam inventory identified by an array of item instance IDs.) - virtual bool GetItemsByID( SteamInventoryResult_t *pResultHandle, STEAM_ARRAY_COUNT( unCountInstanceIDs ) const SteamItemInstanceID_t *pInstanceIDs, uint32 unCountInstanceIDs ) = 0; - - - // RESULT SERIALIZATION AND AUTHENTICATION - // - // Serialized result sets contain a short signature which can't be forged - // or replayed across different game sessions. A result set can be serialized - // on the local client, transmitted to other players via your game networking, - // and deserialized by the remote players. This is a secure way of preventing - // hackers from lying about posessing rare/high-value items. - - // Serializes a result set with signature bytes to an output buffer. Pass - // NULL as an output buffer to get the required size via punOutBufferSize. - // The size of a serialized result depends on the number items which are being - // serialized. When securely transmitting items to other players, it is - // recommended to use "GetItemsByID" first to create a minimal result set. - // Results have a built-in timestamp which will be considered "expired" after - // an hour has elapsed. See DeserializeResult for expiration handling. - virtual bool SerializeResult( SteamInventoryResult_t resultHandle, STEAM_OUT_BUFFER_COUNT(punOutBufferSize) void *pOutBuffer, uint32 *punOutBufferSize ) = 0; - - // Deserializes a result set and verifies the signature bytes. Returns false - // if bRequireFullOnlineVerify is set but Steam is running in Offline mode. - // Otherwise returns true and then delivers error codes via GetResultStatus. - // - // The bRESERVED_MUST_BE_FALSE flag is reserved for future use and should not - // be set to true by your game at this time. - // - // DeserializeResult has a potential soft-failure mode where the handle status - // is set to k_EResultExpired. GetResultItems() still succeeds in this mode. - // The "expired" result could indicate that the data may be out of date - not - // just due to timed expiration (one hour), but also because one of the items - // in the result set may have been traded or consumed since the result set was - // generated. You could compare the timestamp from GetResultTimestamp() to - // ISteamUtils::GetServerRealTime() to determine how old the data is. You could - // simply ignore the "expired" result code and continue as normal, or you - // could challenge the player with expired data to send an updated result set. - virtual bool DeserializeResult( SteamInventoryResult_t *pOutResultHandle, STEAM_BUFFER_COUNT(punOutBufferSize) const void *pBuffer, uint32 unBufferSize, bool bRESERVED_MUST_BE_FALSE = false ) = 0; - - - // INVENTORY ASYNC MODIFICATION - // - - // GenerateItems() creates one or more items and then generates a SteamInventoryCallback_t - // notification with a matching nCallbackContext parameter. This API is only intended - // for prototyping - it is only usable by Steam accounts that belong to the publisher group - // for your game. - // If punArrayQuantity is not NULL, it should be the same length as pArrayItems and should - // describe the quantity of each item to generate. - virtual bool GenerateItems( SteamInventoryResult_t *pResultHandle, STEAM_ARRAY_COUNT(unArrayLength) const SteamItemDef_t *pArrayItemDefs, STEAM_ARRAY_COUNT(unArrayLength) const uint32 *punArrayQuantity, uint32 unArrayLength ) = 0; - - // GrantPromoItems() checks the list of promotional items for which the user may be eligible - // and grants the items (one time only). On success, the result set will include items which - // were granted, if any. If no items were granted because the user isn't eligible for any - // promotions, this is still considered a success. - STEAM_METHOD_DESC(GrantPromoItems() checks the list of promotional items for which the user may be eligible and grants the items (one time only).) - virtual bool GrantPromoItems( SteamInventoryResult_t *pResultHandle ) = 0; - - // AddPromoItem() / AddPromoItems() are restricted versions of GrantPromoItems(). Instead of - // scanning for all eligible promotional items, the check is restricted to a single item - // definition or set of item definitions. This can be useful if your game has custom UI for - // showing a specific promo item to the user. - virtual bool AddPromoItem( SteamInventoryResult_t *pResultHandle, SteamItemDef_t itemDef ) = 0; - virtual bool AddPromoItems( SteamInventoryResult_t *pResultHandle, STEAM_ARRAY_COUNT(unArrayLength) const SteamItemDef_t *pArrayItemDefs, uint32 unArrayLength ) = 0; - - // ConsumeItem() removes items from the inventory, permanently. They cannot be recovered. - // Not for the faint of heart - if your game implements item removal at all, a high-friction - // UI confirmation process is highly recommended. - STEAM_METHOD_DESC(ConsumeItem() removes items from the inventory permanently.) - virtual bool ConsumeItem( SteamInventoryResult_t *pResultHandle, SteamItemInstanceID_t itemConsume, uint32 unQuantity ) = 0; - - // ExchangeItems() is an atomic combination of item generation and consumption. - // It can be used to implement crafting recipes or transmutations, or items which unpack - // themselves into other items (e.g., a chest). - // Exchange recipes are defined in the ItemDef, and explicitly list the required item - // types and resulting generated type. - // Exchange recipes are evaluated atomically by the Inventory Service; if the supplied - // components do not match the recipe, or do not contain sufficient quantity, the - // exchange will fail. - virtual bool ExchangeItems( SteamInventoryResult_t *pResultHandle, - STEAM_ARRAY_COUNT(unArrayGenerateLength) const SteamItemDef_t *pArrayGenerate, STEAM_ARRAY_COUNT(unArrayGenerateLength) const uint32 *punArrayGenerateQuantity, uint32 unArrayGenerateLength, - STEAM_ARRAY_COUNT(unArrayDestroyLength) const SteamItemInstanceID_t *pArrayDestroy, STEAM_ARRAY_COUNT(unArrayDestroyLength) const uint32 *punArrayDestroyQuantity, uint32 unArrayDestroyLength ) = 0; - - - // TransferItemQuantity() is intended for use with items which are "stackable" (can have - // quantity greater than one). It can be used to split a stack into two, or to transfer - // quantity from one stack into another stack of identical items. To split one stack into - // two, pass k_SteamItemInstanceIDInvalid for itemIdDest and a new item will be generated. - virtual bool TransferItemQuantity( SteamInventoryResult_t *pResultHandle, SteamItemInstanceID_t itemIdSource, uint32 unQuantity, SteamItemInstanceID_t itemIdDest ) = 0; - - - // TIMED DROPS AND PLAYTIME CREDIT - // - - // Deprecated. Calling this method is not required for proper playtime accounting. - STEAM_METHOD_DESC( Deprecated method. Playtime accounting is performed on the Steam servers. ) - virtual void SendItemDropHeartbeat() = 0; - - // Playtime credit must be consumed and turned into item drops by your game. Only item - // definitions which are marked as "playtime item generators" can be spawned. The call - // will return an empty result set if there is not enough playtime credit for a drop. - // Your game should call TriggerItemDrop at an appropriate time for the user to receive - // new items, such as between rounds or while the player is dead. Note that players who - // hack their clients could modify the value of "dropListDefinition", so do not use it - // to directly control rarity. - // See your Steamworks configuration to set playtime drop rates for individual itemdefs. - // The client library will suppress too-frequent calls to this method. - STEAM_METHOD_DESC(Playtime credit must be consumed and turned into item drops by your game.) - virtual bool TriggerItemDrop( SteamInventoryResult_t *pResultHandle, SteamItemDef_t dropListDefinition ) = 0; - - - // Deprecated. This method is not supported. - virtual bool TradeItems( SteamInventoryResult_t *pResultHandle, CSteamID steamIDTradePartner, - STEAM_ARRAY_COUNT(nArrayGiveLength) const SteamItemInstanceID_t *pArrayGive, STEAM_ARRAY_COUNT(nArrayGiveLength) const uint32 *pArrayGiveQuantity, uint32 nArrayGiveLength, - STEAM_ARRAY_COUNT(nArrayGetLength) const SteamItemInstanceID_t *pArrayGet, STEAM_ARRAY_COUNT(nArrayGetLength) const uint32 *pArrayGetQuantity, uint32 nArrayGetLength ) = 0; - - - // ITEM DEFINITIONS - // - // Item definitions are a mapping of "definition IDs" (integers between 1 and 1000000) - // to a set of string properties. Some of these properties are required to display items - // on the Steam community web site. Other properties can be defined by applications. - // Use of these functions is optional; there is no reason to call LoadItemDefinitions - // if your game hardcodes the numeric definition IDs (eg, purple face mask = 20, blue - // weapon mod = 55) and does not allow for adding new item types without a client patch. - // - - // LoadItemDefinitions triggers the automatic load and refresh of item definitions. - // Every time new item definitions are available (eg, from the dynamic addition of new - // item types while players are still in-game), a SteamInventoryDefinitionUpdate_t - // callback will be fired. - STEAM_METHOD_DESC(LoadItemDefinitions triggers the automatic load and refresh of item definitions.) - virtual bool LoadItemDefinitions() = 0; - - // GetItemDefinitionIDs returns the set of all defined item definition IDs (which are - // defined via Steamworks configuration, and not necessarily contiguous integers). - // If pItemDefIDs is null, the call will return true and *punItemDefIDsArraySize will - // contain the total size necessary for a subsequent call. Otherwise, the call will - // return false if and only if there is not enough space in the output array. - virtual bool GetItemDefinitionIDs( - STEAM_OUT_ARRAY_COUNT(punItemDefIDsArraySize,List of item definition IDs) SteamItemDef_t *pItemDefIDs, - STEAM_DESC(Size of array is passed in and actual size used is returned in this param) uint32 *punItemDefIDsArraySize ) = 0; - - // GetItemDefinitionProperty returns a string property from a given item definition. - // Note that some properties (for example, "name") may be localized and will depend - // on the current Steam language settings (see ISteamApps::GetCurrentGameLanguage). - // Property names are always composed of ASCII letters, numbers, and/or underscores. - // Pass a NULL pointer for pchPropertyName to get a comma - separated list of available - // property names. If pchValueBuffer is NULL, *punValueBufferSize will contain the - // suggested buffer size. Otherwise it will be the number of bytes actually copied - // to pchValueBuffer. If the results do not fit in the given buffer, partial - // results may be copied. - virtual bool GetItemDefinitionProperty( SteamItemDef_t iDefinition, const char *pchPropertyName, - STEAM_OUT_STRING_COUNT(punValueBufferSizeOut) char *pchValueBuffer, uint32 *punValueBufferSizeOut ) = 0; - - // Request the list of "eligible" promo items that can be manually granted to the given - // user. These are promo items of type "manual" that won't be granted automatically. - // An example usage of this is an item that becomes available every week. - STEAM_CALL_RESULT( SteamInventoryEligiblePromoItemDefIDs_t ) - virtual SteamAPICall_t RequestEligiblePromoItemDefinitionsIDs( CSteamID steamID ) = 0; - - // After handling a SteamInventoryEligiblePromoItemDefIDs_t call result, use this - // function to pull out the list of item definition ids that the user can be - // manually granted via the AddPromoItems() call. - virtual bool GetEligiblePromoItemDefinitionIDs( - CSteamID steamID, - STEAM_OUT_ARRAY_COUNT(punItemDefIDsArraySize,List of item definition IDs) SteamItemDef_t *pItemDefIDs, - STEAM_DESC(Size of array is passed in and actual size used is returned in this param) uint32 *punItemDefIDsArraySize ) = 0; - - // Starts the purchase process for the given item definitions. The callback SteamInventoryStartPurchaseResult_t - // will be posted if Steam was able to initialize the transaction. - // - // Once the purchase has been authorized and completed by the user, the callback SteamInventoryResultReady_t - // will be posted. - STEAM_CALL_RESULT( SteamInventoryStartPurchaseResult_t ) - virtual SteamAPICall_t StartPurchase( STEAM_ARRAY_COUNT(unArrayLength) const SteamItemDef_t *pArrayItemDefs, STEAM_ARRAY_COUNT(unArrayLength) const uint32 *punArrayQuantity, uint32 unArrayLength ) = 0; - - // Request current prices for all applicable item definitions - STEAM_CALL_RESULT( SteamInventoryRequestPricesResult_t ) - virtual SteamAPICall_t RequestPrices() = 0; - - // Returns the number of items with prices. Need to call RequestPrices() first. - virtual uint32 GetNumItemsWithPrices() = 0; - - // Returns item definition ids and their prices in the user's local currency. - // Need to call RequestPrices() first. - virtual bool GetItemsWithPrices( STEAM_ARRAY_COUNT(unArrayLength) STEAM_OUT_ARRAY_COUNT(pArrayItemDefs, Items with prices) SteamItemDef_t *pArrayItemDefs, - STEAM_ARRAY_COUNT(unArrayLength) STEAM_OUT_ARRAY_COUNT(pPrices, List of prices for the given item defs) uint64 *pCurrentPrices, - STEAM_ARRAY_COUNT(unArrayLength) STEAM_OUT_ARRAY_COUNT(pPrices, List of prices for the given item defs) uint64 *pBasePrices, - uint32 unArrayLength ) = 0; - - // Retrieves the price for the item definition id - // Returns false if there is no price stored for the item definition. - virtual bool GetItemPrice( SteamItemDef_t iDefinition, uint64 *pCurrentPrice, uint64 *pBasePrice ) = 0; - - // Create a request to update properties on items - virtual SteamInventoryUpdateHandle_t StartUpdateProperties() = 0; - // Remove the property on the item - virtual bool RemoveProperty( SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char *pchPropertyName ) = 0; - // Accessor methods to set properties on items - - STEAM_FLAT_NAME( SetPropertyString ) - virtual bool SetProperty( SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char *pchPropertyName, const char *pchPropertyValue ) = 0; - - STEAM_FLAT_NAME( SetPropertyBool ) - virtual bool SetProperty( SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char *pchPropertyName, bool bValue ) = 0; - - STEAM_FLAT_NAME( SetPropertyInt64 ) - virtual bool SetProperty( SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char *pchPropertyName, int64 nValue ) = 0; - - STEAM_FLAT_NAME( SetPropertyFloat ) - virtual bool SetProperty( SteamInventoryUpdateHandle_t handle, SteamItemInstanceID_t nItemID, const char *pchPropertyName, float flValue ) = 0; - - // 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" - -// Global interface accessor -inline ISteamInventory *SteamInventory(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamInventory *, SteamInventory, STEAMINVENTORY_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamInventory *SteamGameServerInventory(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamInventory *, SteamGameServerInventory, STEAMINVENTORY_INTERFACE_VERSION ); - -// SteamInventoryResultReady_t callbacks are fired whenever asynchronous -// results transition from "Pending" to "OK" or an error state. There will -// always be exactly one callback per handle. -struct SteamInventoryResultReady_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 0 }; - SteamInventoryResult_t m_handle; - EResult m_result; -}; - - -// SteamInventoryFullUpdate_t callbacks are triggered when GetAllItems -// successfully returns a result which is newer / fresher than the last -// known result. (It will not trigger if the inventory hasn't changed, -// or if results from two overlapping calls are reversed in flight and -// the earlier result is already known to be stale/out-of-date.) -// The normal ResultReady callback will still be triggered immediately -// afterwards; this is an additional notification for your convenience. -struct SteamInventoryFullUpdate_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 1 }; - SteamInventoryResult_t m_handle; -}; - - -// A SteamInventoryDefinitionUpdate_t callback is triggered whenever -// item definitions have been updated, which could be in response to -// LoadItemDefinitions() or any other async request which required -// a definition update in order to process results from the server. -struct SteamInventoryDefinitionUpdate_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 2 }; -}; - -// Returned -struct SteamInventoryEligiblePromoItemDefIDs_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 3 }; - EResult m_result; - CSteamID m_steamID; - int m_numEligiblePromoItemDefs; - bool m_bCachedData; // indicates that the data was retrieved from the cache and not the server -}; - -// Triggered from StartPurchase call -struct SteamInventoryStartPurchaseResult_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 4 }; - EResult m_result; - uint64 m_ulOrderID; - uint64 m_ulTransID; -}; - - -// Triggered from RequestPrices -struct SteamInventoryRequestPricesResult_t -{ - enum { k_iCallback = k_iClientInventoryCallbacks + 5 }; - EResult m_result; - char m_rgchCurrency[4]; -}; - -#pragma pack( pop ) - - -#endif // ISTEAMCONTROLLER_H diff --git a/lib/steamworks_150/public/steam/isteammasterserverupdater.h b/lib/steamworks_150/public/steam/isteammasterserverupdater.h deleted file mode 100644 index 4be0ca5..0000000 --- a/lib/steamworks_150/public/steam/isteammasterserverupdater.h +++ /dev/null @@ -1 +0,0 @@ -#error "This file isn't used any more" diff --git a/lib/steamworks_150/public/steam/isteammatchmaking.h b/lib/steamworks_150/public/steam/isteammatchmaking.h deleted file mode 100644 index 12189c7..0000000 --- a/lib/steamworks_150/public/steam/isteammatchmaking.h +++ /dev/null @@ -1,1087 +0,0 @@ -//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to steam managing game server/client match making -// -//============================================================================= - -#ifndef ISTEAMMATCHMAKING -#define ISTEAMMATCHMAKING -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "matchmakingtypes.h" -#include "isteamfriends.h" - -// lobby type description -enum ELobbyType -{ - k_ELobbyTypePrivate = 0, // only way to join the lobby is to invite to someone else - k_ELobbyTypeFriendsOnly = 1, // shows for friends or invitees, but not in lobby list - k_ELobbyTypePublic = 2, // visible for friends and in lobby list - k_ELobbyTypeInvisible = 3, // returned by search, but not visible to other friends - // useful if you want a user in two lobbies, for example matching groups together - // a user can be in only one regular lobby, and up to two invisible lobbies - k_ELobbyTypePrivateUnique = 4, // private, unique and does not delete when empty - only one of these may exist per unique keypair set - // can only create from webapi -}; - -// lobby search filter tools -enum ELobbyComparison -{ - k_ELobbyComparisonEqualToOrLessThan = -2, - k_ELobbyComparisonLessThan = -1, - k_ELobbyComparisonEqual = 0, - k_ELobbyComparisonGreaterThan = 1, - k_ELobbyComparisonEqualToOrGreaterThan = 2, - k_ELobbyComparisonNotEqual = 3, -}; - -// lobby search distance. Lobby results are sorted from closest to farthest. -enum ELobbyDistanceFilter -{ - k_ELobbyDistanceFilterClose, // only lobbies in the same immediate region will be returned - k_ELobbyDistanceFilterDefault, // only lobbies in the same region or near by regions - k_ELobbyDistanceFilterFar, // for games that don't have many latency requirements, will return lobbies about half-way around the globe - k_ELobbyDistanceFilterWorldwide, // no filtering, will match lobbies as far as India to NY (not recommended, expect multiple seconds of latency between the clients) -}; - -// maximum number of characters a lobby metadata key can be -#define k_nMaxLobbyKeyLength 255 - -//----------------------------------------------------------------------------- -// Purpose: Functions for match making services for clients to get to favorites -// and to operate on game lobbies. -//----------------------------------------------------------------------------- -class ISteamMatchmaking -{ -public: - // game server favorites storage - // saves basic details about a multiplayer game server locally - - // returns the number of favorites servers the user has stored - virtual int GetFavoriteGameCount() = 0; - - // returns the details of the game server - // iGame is of range [0,GetFavoriteGameCount()) - // *pnIP, *pnConnPort are filled in the with IP:port of the game server - // *punFlags specify whether the game server was stored as an explicit favorite or in the history of connections - // *pRTime32LastPlayedOnServer is filled in the with the Unix time the favorite was added - virtual bool GetFavoriteGame( int iGame, AppId_t *pnAppID, uint32 *pnIP, uint16 *pnConnPort, uint16 *pnQueryPort, uint32 *punFlags, uint32 *pRTime32LastPlayedOnServer ) = 0; - - // adds the game server to the local list; updates the time played of the server if it already exists in the list - virtual int AddFavoriteGame( AppId_t nAppID, uint32 nIP, uint16 nConnPort, uint16 nQueryPort, uint32 unFlags, uint32 rTime32LastPlayedOnServer ) = 0; - - // removes the game server from the local storage; returns true if one was removed - virtual bool RemoveFavoriteGame( AppId_t nAppID, uint32 nIP, uint16 nConnPort, uint16 nQueryPort, uint32 unFlags ) = 0; - - /////// - // Game lobby functions - - // Get a list of relevant lobbies - // this is an asynchronous request - // results will be returned by LobbyMatchList_t callback & call result, with the number of lobbies found - // this will never return lobbies that are full - // to add more filter, the filter calls below need to be call before each and every RequestLobbyList() call - // use the CCallResult<> object in steam_api.h to match the SteamAPICall_t call result to a function in an object, e.g. - /* - class CMyLobbyListManager - { - CCallResult m_CallResultLobbyMatchList; - void FindLobbies() - { - // SteamMatchmaking()->AddRequestLobbyListFilter*() functions would be called here, before RequestLobbyList() - SteamAPICall_t hSteamAPICall = SteamMatchmaking()->RequestLobbyList(); - m_CallResultLobbyMatchList.Set( hSteamAPICall, this, &CMyLobbyListManager::OnLobbyMatchList ); - } - - void OnLobbyMatchList( LobbyMatchList_t *pLobbyMatchList, bool bIOFailure ) - { - // lobby list has be retrieved from Steam back-end, use results - } - } - */ - // - STEAM_CALL_RESULT( LobbyMatchList_t ) - virtual SteamAPICall_t RequestLobbyList() = 0; - // filters for lobbies - // this needs to be called before RequestLobbyList() to take effect - // these are cleared on each call to RequestLobbyList() - virtual void AddRequestLobbyListStringFilter( const char *pchKeyToMatch, const char *pchValueToMatch, ELobbyComparison eComparisonType ) = 0; - // numerical comparison - virtual void AddRequestLobbyListNumericalFilter( const char *pchKeyToMatch, int nValueToMatch, ELobbyComparison eComparisonType ) = 0; - // returns results closest to the specified value. Multiple near filters can be added, with early filters taking precedence - virtual void AddRequestLobbyListNearValueFilter( const char *pchKeyToMatch, int nValueToBeCloseTo ) = 0; - // returns only lobbies with the specified number of slots available - virtual void AddRequestLobbyListFilterSlotsAvailable( int nSlotsAvailable ) = 0; - // sets the distance for which we should search for lobbies (based on users IP address to location map on the Steam backed) - virtual void AddRequestLobbyListDistanceFilter( ELobbyDistanceFilter eLobbyDistanceFilter ) = 0; - // sets how many results to return, the lower the count the faster it is to download the lobby results & details to the client - virtual void AddRequestLobbyListResultCountFilter( int cMaxResults ) = 0; - - virtual void AddRequestLobbyListCompatibleMembersFilter( CSteamID steamIDLobby ) = 0; - - // returns the CSteamID of a lobby, as retrieved by a RequestLobbyList call - // should only be called after a LobbyMatchList_t callback is received - // iLobby is of the range [0, LobbyMatchList_t::m_nLobbiesMatching) - // the returned CSteamID::IsValid() will be false if iLobby is out of range - virtual CSteamID GetLobbyByIndex( int iLobby ) = 0; - - // Create a lobby on the Steam servers. - // If private, then the lobby will not be returned by any RequestLobbyList() call; the CSteamID - // of the lobby will need to be communicated via game channels or via InviteUserToLobby() - // this is an asynchronous request - // results will be returned by LobbyCreated_t callback and call result; lobby is joined & ready to use at this point - // a LobbyEnter_t callback will also be received (since the local user is joining their own lobby) - STEAM_CALL_RESULT( LobbyCreated_t ) - virtual SteamAPICall_t CreateLobby( ELobbyType eLobbyType, int cMaxMembers ) = 0; - - // Joins an existing lobby - // this is an asynchronous request - // results will be returned by LobbyEnter_t callback & call result, check m_EChatRoomEnterResponse to see if was successful - // lobby metadata is available to use immediately on this call completing - STEAM_CALL_RESULT( LobbyEnter_t ) - virtual SteamAPICall_t JoinLobby( CSteamID steamIDLobby ) = 0; - - // Leave a lobby; this will take effect immediately on the client side - // other users in the lobby will be notified by a LobbyChatUpdate_t callback - virtual void LeaveLobby( CSteamID steamIDLobby ) = 0; - - // Invite another user to the lobby - // the target user will receive a LobbyInvite_t callback - // will return true if the invite is successfully sent, whether or not the target responds - // returns false if the local user is not connected to the Steam servers - // if the other user clicks the join link, a GameLobbyJoinRequested_t will be posted if the user is in-game, - // or if the game isn't running yet the game will be launched with the parameter +connect_lobby <64-bit lobby id> - virtual bool InviteUserToLobby( CSteamID steamIDLobby, CSteamID steamIDInvitee ) = 0; - - // Lobby iteration, for viewing details of users in a lobby - // only accessible if the lobby user is a member of the specified lobby - // persona information for other lobby members (name, avatar, etc.) will be asynchronously received - // and accessible via ISteamFriends interface - - // returns the number of users in the specified lobby - virtual int GetNumLobbyMembers( CSteamID steamIDLobby ) = 0; - // returns the CSteamID of a user in the lobby - // iMember is of range [0,GetNumLobbyMembers()) - // note that the current user must be in a lobby to retrieve CSteamIDs of other users in that lobby - virtual CSteamID GetLobbyMemberByIndex( CSteamID steamIDLobby, int iMember ) = 0; - - // Get data associated with this lobby - // takes a simple key, and returns the string associated with it - // "" will be returned if no value is set, or if steamIDLobby is invalid - virtual const char *GetLobbyData( CSteamID steamIDLobby, const char *pchKey ) = 0; - // Sets a key/value pair in the lobby metadata - // each user in the lobby will be broadcast this new value, and any new users joining will receive any existing data - // this can be used to set lobby names, map, etc. - // to reset a key, just set it to "" - // other users in the lobby will receive notification of the lobby data change via a LobbyDataUpdate_t callback - virtual bool SetLobbyData( CSteamID steamIDLobby, const char *pchKey, const char *pchValue ) = 0; - - // returns the number of metadata keys set on the specified lobby - virtual int GetLobbyDataCount( CSteamID steamIDLobby ) = 0; - - // returns a lobby metadata key/values pair by index, of range [0, GetLobbyDataCount()) - virtual bool GetLobbyDataByIndex( CSteamID steamIDLobby, int iLobbyData, char *pchKey, int cchKeyBufferSize, char *pchValue, int cchValueBufferSize ) = 0; - - // removes a metadata key from the lobby - virtual bool DeleteLobbyData( CSteamID steamIDLobby, const char *pchKey ) = 0; - - // Gets per-user metadata for someone in this lobby - virtual const char *GetLobbyMemberData( CSteamID steamIDLobby, CSteamID steamIDUser, const char *pchKey ) = 0; - // Sets per-user metadata (for the local user implicitly) - virtual void SetLobbyMemberData( CSteamID steamIDLobby, const char *pchKey, const char *pchValue ) = 0; - - // Broadcasts a chat message to the all the users in the lobby - // users in the lobby (including the local user) will receive a LobbyChatMsg_t callback - // returns true if the message is successfully sent - // pvMsgBody can be binary or text data, up to 4k - // if pvMsgBody is text, cubMsgBody should be strlen( text ) + 1, to include the null terminator - virtual bool SendLobbyChatMsg( CSteamID steamIDLobby, const void *pvMsgBody, int cubMsgBody ) = 0; - // Get a chat message as specified in a LobbyChatMsg_t callback - // iChatID is the LobbyChatMsg_t::m_iChatID value in the callback - // *pSteamIDUser is filled in with the CSteamID of the member - // *pvData is filled in with the message itself - // return value is the number of bytes written into the buffer - virtual int GetLobbyChatEntry( CSteamID steamIDLobby, int iChatID, STEAM_OUT_STRUCT() CSteamID *pSteamIDUser, void *pvData, int cubData, EChatEntryType *peChatEntryType ) = 0; - - // Refreshes metadata for a lobby you're not necessarily in right now - // you never do this for lobbies you're a member of, only if your - // this will send down all the metadata associated with a lobby - // this is an asynchronous call - // returns false if the local user is not connected to the Steam servers - // results will be returned by a LobbyDataUpdate_t callback - // if the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to false - virtual bool RequestLobbyData( CSteamID steamIDLobby ) = 0; - - // sets the game server associated with the lobby - // usually at this point, the users will join the specified game server - // either the IP/Port or the steamID of the game server has to be valid, depending on how you want the clients to be able to connect - virtual void SetLobbyGameServer( CSteamID steamIDLobby, uint32 unGameServerIP, uint16 unGameServerPort, CSteamID steamIDGameServer ) = 0; - // returns the details of a game server set in a lobby - returns false if there is no game server set, or that lobby doesn't exist - virtual bool GetLobbyGameServer( CSteamID steamIDLobby, uint32 *punGameServerIP, uint16 *punGameServerPort, STEAM_OUT_STRUCT() CSteamID *psteamIDGameServer ) = 0; - - // set the limit on the # of users who can join the lobby - virtual bool SetLobbyMemberLimit( CSteamID steamIDLobby, int cMaxMembers ) = 0; - // returns the current limit on the # of users who can join the lobby; returns 0 if no limit is defined - virtual int GetLobbyMemberLimit( CSteamID steamIDLobby ) = 0; - - // updates which type of lobby it is - // only lobbies that are k_ELobbyTypePublic or k_ELobbyTypeInvisible, and are set to joinable, will be returned by RequestLobbyList() calls - virtual bool SetLobbyType( CSteamID steamIDLobby, ELobbyType eLobbyType ) = 0; - - // sets whether or not a lobby is joinable - defaults to true for a new lobby - // if set to false, no user can join, even if they are a friend or have been invited - virtual bool SetLobbyJoinable( CSteamID steamIDLobby, bool bLobbyJoinable ) = 0; - - // returns the current lobby owner - // you must be a member of the lobby to access this - // there always one lobby owner - if the current owner leaves, another user will become the owner - // it is possible (bur rare) to join a lobby just as the owner is leaving, thus entering a lobby with self as the owner - virtual CSteamID GetLobbyOwner( CSteamID steamIDLobby ) = 0; - - // changes who the lobby owner is - // you must be the lobby owner for this to succeed, and steamIDNewOwner must be in the lobby - // after completion, the local user will no longer be the owner - virtual bool SetLobbyOwner( CSteamID steamIDLobby, CSteamID steamIDNewOwner ) = 0; - - // link two lobbies for the purposes of checking player compatibility - // you must be the lobby owner of both lobbies - virtual bool SetLinkedLobby( CSteamID steamIDLobby, CSteamID steamIDLobbyDependent ) = 0; - -#ifdef _PS3 - // changes who the lobby owner is - // you must be the lobby owner for this to succeed, and steamIDNewOwner must be in the lobby - // after completion, the local user will no longer be the owner - virtual void CheckForPSNGameBootInvite( unsigned int iGameBootAttributes ) = 0; -#endif -}; -#define STEAMMATCHMAKING_INTERFACE_VERSION "SteamMatchMaking009" - -// Global interface accessor -inline ISteamMatchmaking *SteamMatchmaking(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamMatchmaking *, SteamMatchmaking, STEAMMATCHMAKING_INTERFACE_VERSION ); - -//----------------------------------------------------------------------------- -// Callback interfaces for server list functions (see ISteamMatchmakingServers below) -// -// The idea here is that your game code implements objects that implement these -// interfaces to receive callback notifications after calling asynchronous functions -// inside the ISteamMatchmakingServers() interface below. -// -// This is different than normal Steam callback handling due to the potentially -// large size of server lists. -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// Typedef for handle type you will receive when requesting server list. -//----------------------------------------------------------------------------- -typedef void* HServerListRequest; - -//----------------------------------------------------------------------------- -// Purpose: Callback interface for receiving responses after a server list refresh -// or an individual server update. -// -// Since you get these callbacks after requesting full list refreshes you will -// usually implement this interface inside an object like CServerBrowser. If that -// object is getting destructed you should use ISteamMatchMakingServers()->CancelQuery() -// to cancel any in-progress queries so you don't get a callback into the destructed -// object and crash. -//----------------------------------------------------------------------------- -class ISteamMatchmakingServerListResponse -{ -public: - // Server has responded ok with updated data - virtual void ServerResponded( HServerListRequest hRequest, int iServer ) = 0; - - // Server has failed to respond - virtual void ServerFailedToRespond( HServerListRequest hRequest, int iServer ) = 0; - - // A list refresh you had initiated is now 100% completed - virtual void RefreshComplete( HServerListRequest hRequest, EMatchMakingServerResponse response ) = 0; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Callback interface for receiving responses after pinging an individual server -// -// These callbacks all occur in response to querying an individual server -// via the ISteamMatchmakingServers()->PingServer() call below. If you are -// destructing an object that implements this interface then you should call -// ISteamMatchmakingServers()->CancelServerQuery() passing in the handle to the query -// which is in progress. Failure to cancel in progress queries when destructing -// a callback handler may result in a crash when a callback later occurs. -//----------------------------------------------------------------------------- -class ISteamMatchmakingPingResponse -{ -public: - // Server has responded successfully and has updated data - virtual void ServerResponded( gameserveritem_t &server ) = 0; - - // Server failed to respond to the ping request - virtual void ServerFailedToRespond() = 0; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Callback interface for receiving responses after requesting details on -// who is playing on a particular server. -// -// These callbacks all occur in response to querying an individual server -// via the ISteamMatchmakingServers()->PlayerDetails() call below. If you are -// destructing an object that implements this interface then you should call -// ISteamMatchmakingServers()->CancelServerQuery() passing in the handle to the query -// which is in progress. Failure to cancel in progress queries when destructing -// a callback handler may result in a crash when a callback later occurs. -//----------------------------------------------------------------------------- -class ISteamMatchmakingPlayersResponse -{ -public: - // Got data on a new player on the server -- you'll get this callback once per player - // on the server which you have requested player data on. - virtual void AddPlayerToList( const char *pchName, int nScore, float flTimePlayed ) = 0; - - // The server failed to respond to the request for player details - virtual void PlayersFailedToRespond() = 0; - - // The server has finished responding to the player details request - // (ie, you won't get anymore AddPlayerToList callbacks) - virtual void PlayersRefreshComplete() = 0; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Callback interface for receiving responses after requesting rules -// details on a particular server. -// -// These callbacks all occur in response to querying an individual server -// via the ISteamMatchmakingServers()->ServerRules() call below. If you are -// destructing an object that implements this interface then you should call -// ISteamMatchmakingServers()->CancelServerQuery() passing in the handle to the query -// which is in progress. Failure to cancel in progress queries when destructing -// a callback handler may result in a crash when a callback later occurs. -//----------------------------------------------------------------------------- -class ISteamMatchmakingRulesResponse -{ -public: - // Got data on a rule on the server -- you'll get one of these per rule defined on - // the server you are querying - virtual void RulesResponded( const char *pchRule, const char *pchValue ) = 0; - - // The server failed to respond to the request for rule details - virtual void RulesFailedToRespond() = 0; - - // The server has finished responding to the rule details request - // (ie, you won't get anymore RulesResponded callbacks) - virtual void RulesRefreshComplete() = 0; -}; - - -//----------------------------------------------------------------------------- -// Typedef for handle type you will receive when querying details on an individual server. -//----------------------------------------------------------------------------- -typedef int HServerQuery; -const int HSERVERQUERY_INVALID = 0xffffffff; - -//----------------------------------------------------------------------------- -// Purpose: Functions for match making services for clients to get to game lists and details -//----------------------------------------------------------------------------- -class ISteamMatchmakingServers -{ -public: - // Request a new list of servers of a particular type. These calls each correspond to one of the EMatchMakingType values. - // Each call allocates a new asynchronous request object. - // Request object must be released by calling ReleaseRequest( hServerListRequest ) - virtual HServerListRequest RequestInternetServerList( AppId_t iApp, STEAM_ARRAY_COUNT(nFilters) MatchMakingKeyValuePair_t **ppchFilters, uint32 nFilters, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - virtual HServerListRequest RequestLANServerList( AppId_t iApp, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - virtual HServerListRequest RequestFriendsServerList( AppId_t iApp, STEAM_ARRAY_COUNT(nFilters) MatchMakingKeyValuePair_t **ppchFilters, uint32 nFilters, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - virtual HServerListRequest RequestFavoritesServerList( AppId_t iApp, STEAM_ARRAY_COUNT(nFilters) MatchMakingKeyValuePair_t **ppchFilters, uint32 nFilters, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - virtual HServerListRequest RequestHistoryServerList( AppId_t iApp, STEAM_ARRAY_COUNT(nFilters) MatchMakingKeyValuePair_t **ppchFilters, uint32 nFilters, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - virtual HServerListRequest RequestSpectatorServerList( AppId_t iApp, STEAM_ARRAY_COUNT(nFilters) MatchMakingKeyValuePair_t **ppchFilters, uint32 nFilters, ISteamMatchmakingServerListResponse *pRequestServersResponse ) = 0; - - // Releases the asynchronous request object and cancels any pending query on it if there's a pending query in progress. - // RefreshComplete callback is not posted when request is released. - virtual void ReleaseRequest( HServerListRequest hServerListRequest ) = 0; - - /* the filter operation codes that go in the key part of MatchMakingKeyValuePair_t should be one of these: - - "map" - - Server passes the filter if the server is playing the specified map. - "gamedataand" - - Server passes the filter if the server's game data (ISteamGameServer::SetGameData) contains all of the - specified strings. The value field is a comma-delimited list of strings to match. - "gamedataor" - - Server passes the filter if the server's game data (ISteamGameServer::SetGameData) contains at least one of the - specified strings. The value field is a comma-delimited list of strings to match. - "gamedatanor" - - Server passes the filter if the server's game data (ISteamGameServer::SetGameData) does not contain any - of the specified strings. The value field is a comma-delimited list of strings to check. - "gametagsand" - - Server passes the filter if the server's game tags (ISteamGameServer::SetGameTags) contains all - of the specified strings. The value field is a comma-delimited list of strings to check. - "gametagsnor" - - Server passes the filter if the server's game tags (ISteamGameServer::SetGameTags) does not contain any - of the specified strings. The value field is a comma-delimited list of strings to check. - "and" (x1 && x2 && ... && xn) - "or" (x1 || x2 || ... || xn) - "nand" !(x1 && x2 && ... && xn) - "nor" !(x1 || x2 || ... || xn) - - Performs Boolean operation on the following filters. The operand to this filter specifies - the "size" of the Boolean inputs to the operation, in Key/value pairs. (The keyvalue - pairs must immediately follow, i.e. this is a prefix logical operator notation.) - In the simplest case where Boolean expressions are not nested, this is simply - the number of operands. - - For example, to match servers on a particular map or with a particular tag, would would - use these filters. - - ( server.map == "cp_dustbowl" || server.gametags.contains("payload") ) - "or", "2" - "map", "cp_dustbowl" - "gametagsand", "payload" - - If logical inputs are nested, then the operand specifies the size of the entire - "length" of its operands, not the number of immediate children. - - ( server.map == "cp_dustbowl" || ( server.gametags.contains("payload") && !server.gametags.contains("payloadrace") ) ) - "or", "4" - "map", "cp_dustbowl" - "and", "2" - "gametagsand", "payload" - "gametagsnor", "payloadrace" - - Unary NOT can be achieved using either "nand" or "nor" with a single operand. - - "addr" - - Server passes the filter if the server's query address matches the specified IP or IP:port. - "gameaddr" - - Server passes the filter if the server's game address matches the specified IP or IP:port. - - The following filter operations ignore the "value" part of MatchMakingKeyValuePair_t - - "dedicated" - - Server passes the filter if it passed true to SetDedicatedServer. - "secure" - - Server passes the filter if the server is VAC-enabled. - "notfull" - - Server passes the filter if the player count is less than the reported max player count. - "hasplayers" - - Server passes the filter if the player count is greater than zero. - "noplayers" - - Server passes the filter if it doesn't have any players. - "linux" - - Server passes the filter if it's a linux server - */ - - // Get details on a given server in the list, you can get the valid range of index - // values by calling GetServerCount(). You will also receive index values in - // ISteamMatchmakingServerListResponse::ServerResponded() callbacks - virtual gameserveritem_t *GetServerDetails( HServerListRequest hRequest, int iServer ) = 0; - - // Cancel an request which is operation on the given list type. You should call this to cancel - // any in-progress requests before destructing a callback object that may have been passed - // to one of the above list request calls. Not doing so may result in a crash when a callback - // occurs on the destructed object. - // Canceling a query does not release the allocated request handle. - // The request handle must be released using ReleaseRequest( hRequest ) - virtual void CancelQuery( HServerListRequest hRequest ) = 0; - - // Ping every server in your list again but don't update the list of servers - // Query callback installed when the server list was requested will be used - // again to post notifications and RefreshComplete, so the callback must remain - // valid until another RefreshComplete is called on it or the request - // is released with ReleaseRequest( hRequest ) - virtual void RefreshQuery( HServerListRequest hRequest ) = 0; - - // Returns true if the list is currently refreshing its server list - virtual bool IsRefreshing( HServerListRequest hRequest ) = 0; - - // How many servers in the given list, GetServerDetails above takes 0... GetServerCount() - 1 - virtual int GetServerCount( HServerListRequest hRequest ) = 0; - - // Refresh a single server inside of a query (rather than all the servers ) - virtual void RefreshServer( HServerListRequest hRequest, int iServer ) = 0; - - - //----------------------------------------------------------------------------- - // Queries to individual servers directly via IP/Port - //----------------------------------------------------------------------------- - - // Request updated ping time and other details from a single server - virtual HServerQuery PingServer( uint32 unIP, uint16 usPort, ISteamMatchmakingPingResponse *pRequestServersResponse ) = 0; - - // Request the list of players currently playing on a server - virtual HServerQuery PlayerDetails( uint32 unIP, uint16 usPort, ISteamMatchmakingPlayersResponse *pRequestServersResponse ) = 0; - - // Request the list of rules that the server is running (See ISteamGameServer::SetKeyValue() to set the rules server side) - virtual HServerQuery ServerRules( uint32 unIP, uint16 usPort, ISteamMatchmakingRulesResponse *pRequestServersResponse ) = 0; - - // Cancel an outstanding Ping/Players/Rules query from above. You should call this to cancel - // any in-progress requests before destructing a callback object that may have been passed - // to one of the above calls to avoid crashing when callbacks occur. - virtual void CancelServerQuery( HServerQuery hServerQuery ) = 0; -}; -#define STEAMMATCHMAKINGSERVERS_INTERFACE_VERSION "SteamMatchMakingServers002" - -// Global interface accessor -inline ISteamMatchmakingServers *SteamMatchmakingServers(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamMatchmakingServers *, SteamMatchmakingServers, STEAMMATCHMAKINGSERVERS_INTERFACE_VERSION ); - -// game server flags -const uint32 k_unFavoriteFlagNone = 0x00; -const uint32 k_unFavoriteFlagFavorite = 0x01; // this game favorite entry is for the favorites list -const uint32 k_unFavoriteFlagHistory = 0x02; // this game favorite entry is for the history list - - -//----------------------------------------------------------------------------- -// Purpose: Used in ChatInfo messages - fields specific to a chat member - must fit in a uint32 -//----------------------------------------------------------------------------- -enum EChatMemberStateChange -{ - // Specific to joining / leaving the chatroom - k_EChatMemberStateChangeEntered = 0x0001, // This user has joined or is joining the chat room - k_EChatMemberStateChangeLeft = 0x0002, // This user has left or is leaving the chat room - k_EChatMemberStateChangeDisconnected = 0x0004, // User disconnected without leaving the chat first - k_EChatMemberStateChangeKicked = 0x0008, // User kicked - k_EChatMemberStateChangeBanned = 0x0010, // User kicked and banned -}; - -// returns true of the flags indicate that a user has been removed from the chat -#define BChatMemberStateChangeRemoved( rgfChatMemberStateChangeFlags ) ( rgfChatMemberStateChangeFlags & ( k_EChatMemberStateChangeDisconnected | k_EChatMemberStateChangeLeft | k_EChatMemberStateChangeKicked | k_EChatMemberStateChangeBanned ) ) - - - -//----------------------------------------------------------------------------- -// Purpose: Functions for match making services for clients to get to favorites -// and to operate on game lobbies. -//----------------------------------------------------------------------------- -class ISteamGameSearch -{ -public: - // ============================================================================================= - // Game Player APIs - - // a keyname and a list of comma separated values: one of which is must be found in order for the match to qualify - // fails if a search is currently in progress - virtual EGameSearchErrorCode_t AddGameSearchParams( const char *pchKeyToFind, const char *pchValuesToFind ) = 0; - - // all players in lobby enter the queue and await a SearchForGameNotificationCallback_t callback. fails if another search is currently in progress - // if not the owner of the lobby or search already in progress this call fails - // periodic callbacks will be sent as queue time estimates change - virtual EGameSearchErrorCode_t SearchForGameWithLobby( CSteamID steamIDLobby, int nPlayerMin, int nPlayerMax ) = 0; - - // user enter the queue and await a SearchForGameNotificationCallback_t callback. fails if another search is currently in progress - // periodic callbacks will be sent as queue time estimates change - virtual EGameSearchErrorCode_t SearchForGameSolo( int nPlayerMin, int nPlayerMax ) = 0; - - // after receiving SearchForGameResultCallback_t, accept or decline the game - // multiple SearchForGameResultCallback_t will follow as players accept game until the host starts or cancels the game - virtual EGameSearchErrorCode_t AcceptGame() = 0; - virtual EGameSearchErrorCode_t DeclineGame() = 0; - - // after receiving GameStartedByHostCallback_t get connection details to server - virtual EGameSearchErrorCode_t RetrieveConnectionDetails( CSteamID steamIDHost, char *pchConnectionDetails, int cubConnectionDetails ) = 0; - - // leaves queue if still waiting - virtual EGameSearchErrorCode_t EndGameSearch() = 0; - - // ============================================================================================= - // Game Host APIs - - // a keyname and a list of comma separated values: all the values you allow - virtual EGameSearchErrorCode_t SetGameHostParams( const char *pchKey, const char *pchValue ) = 0; - - // set connection details for players once game is found so they can connect to this server - virtual EGameSearchErrorCode_t SetConnectionDetails( const char *pchConnectionDetails, int cubConnectionDetails ) = 0; - - // mark server as available for more players with nPlayerMin,nPlayerMax desired - // accept no lobbies with playercount greater than nMaxTeamSize - // the set of lobbies returned must be partitionable into teams of no more than nMaxTeamSize - // RequestPlayersForGameNotificationCallback_t callback will be sent when the search has started - // multple RequestPlayersForGameResultCallback_t callbacks will follow when players are found - virtual EGameSearchErrorCode_t RequestPlayersForGame( int nPlayerMin, int nPlayerMax, int nMaxTeamSize ) = 0; - - // accept the player list and release connection details to players - // players will only be given connection details and host steamid when this is called - // ( allows host to accept after all players confirm, some confirm, or none confirm. decision is entirely up to the host ) - virtual EGameSearchErrorCode_t HostConfirmGameStart( uint64 ullUniqueGameID ) = 0; - - // cancel request and leave the pool of game hosts looking for players - // if a set of players has already been sent to host, all players will receive SearchForGameHostFailedToConfirm_t - virtual EGameSearchErrorCode_t CancelRequestPlayersForGame() = 0; - - // submit a result for one player. does not end the game. ullUniqueGameID continues to describe this game - virtual EGameSearchErrorCode_t SubmitPlayerResult( uint64 ullUniqueGameID, CSteamID steamIDPlayer, EPlayerResult_t EPlayerResult ) = 0; - - // ends the game. no further SubmitPlayerResults for ullUniqueGameID will be accepted - // any future requests will provide a new ullUniqueGameID - virtual EGameSearchErrorCode_t EndGame( uint64 ullUniqueGameID ) = 0; - -}; -#define STEAMGAMESEARCH_INTERFACE_VERSION "SteamMatchGameSearch001" - -// Global interface accessor -inline ISteamGameSearch *SteamGameSearch(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamGameSearch *, SteamGameSearch, STEAMGAMESEARCH_INTERFACE_VERSION ); - - -//----------------------------------------------------------------------------- -// Purpose: Functions for quickly creating a Party with friends or acquaintances, -// EG from chat rooms. -//----------------------------------------------------------------------------- -enum ESteamPartyBeaconLocationType -{ - k_ESteamPartyBeaconLocationType_Invalid = 0, - k_ESteamPartyBeaconLocationType_ChatGroup = 1, - - k_ESteamPartyBeaconLocationType_Max, -}; - - -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -struct SteamPartyBeaconLocation_t -{ - ESteamPartyBeaconLocationType m_eType; - uint64 m_ulLocationID; -}; - -enum ESteamPartyBeaconLocationData -{ - k_ESteamPartyBeaconLocationDataInvalid = 0, - k_ESteamPartyBeaconLocationDataName = 1, - k_ESteamPartyBeaconLocationDataIconURLSmall = 2, - k_ESteamPartyBeaconLocationDataIconURLMedium = 3, - k_ESteamPartyBeaconLocationDataIconURLLarge = 4, -}; - -class ISteamParties -{ -public: - - // ============================================================================================= - // Party Client APIs - - // Enumerate any active beacons for parties you may wish to join - virtual uint32 GetNumActiveBeacons() = 0; - virtual PartyBeaconID_t GetBeaconByIndex( uint32 unIndex ) = 0; - virtual bool GetBeaconDetails( PartyBeaconID_t ulBeaconID, CSteamID *pSteamIDBeaconOwner, STEAM_OUT_STRUCT() SteamPartyBeaconLocation_t *pLocation, STEAM_OUT_STRING_COUNT(cchMetadata) char *pchMetadata, int cchMetadata ) = 0; - - // Join an open party. Steam will reserve one beacon slot for your SteamID, - // and return the necessary JoinGame string for you to use to connect - STEAM_CALL_RESULT( JoinPartyCallback_t ) - virtual SteamAPICall_t JoinParty( PartyBeaconID_t ulBeaconID ) = 0; - - // ============================================================================================= - // Party Host APIs - - // Get a list of possible beacon locations - virtual bool GetNumAvailableBeaconLocations( uint32 *puNumLocations ) = 0; - virtual bool GetAvailableBeaconLocations( SteamPartyBeaconLocation_t *pLocationList, uint32 uMaxNumLocations ) = 0; - - // Create a new party beacon and activate it in the selected location. - // unOpenSlots is the maximum number of users that Steam will send to you. - // When people begin responding to your beacon, Steam will send you - // PartyReservationCallback_t callbacks to let you know who is on the way. - STEAM_CALL_RESULT( CreateBeaconCallback_t ) - virtual SteamAPICall_t CreateBeacon( uint32 unOpenSlots, SteamPartyBeaconLocation_t *pBeaconLocation, const char *pchConnectString, const char *pchMetadata ) = 0; - - // Call this function when a user that had a reservation (see callback below) - // has successfully joined your party. - // Steam will manage the remaining open slots automatically. - virtual void OnReservationCompleted( PartyBeaconID_t ulBeacon, CSteamID steamIDUser ) = 0; - - // To cancel a reservation (due to timeout or user input), call this. - // Steam will open a new reservation slot. - // Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party. - virtual void CancelReservation( PartyBeaconID_t ulBeacon, CSteamID steamIDUser ) = 0; - - // Change the number of open beacon reservation slots. - // Call this if, for example, someone without a reservation joins your party (eg a friend, or via your own matchmaking system). - STEAM_CALL_RESULT( ChangeNumOpenSlotsCallback_t ) - virtual SteamAPICall_t ChangeNumOpenSlots( PartyBeaconID_t ulBeacon, uint32 unOpenSlots ) = 0; - - // Turn off the beacon. - virtual bool DestroyBeacon( PartyBeaconID_t ulBeacon ) = 0; - - // Utils - virtual bool GetBeaconLocationData( SteamPartyBeaconLocation_t BeaconLocation, ESteamPartyBeaconLocationData eData, STEAM_OUT_STRING_COUNT(cchDataStringOut) char *pchDataStringOut, int cchDataStringOut ) = 0; - -}; -#define STEAMPARTIES_INTERFACE_VERSION "SteamParties002" - -// Global interface accessor -inline ISteamParties *SteamParties(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamParties *, SteamParties, STEAMPARTIES_INTERFACE_VERSION ); - - -//----------------------------------------------------------------------------- -// Callbacks for ISteamMatchmaking (which go through the regular Steam callback registration system) - -//----------------------------------------------------------------------------- -// Purpose: a server was added/removed from the favorites list, you should refresh now -//----------------------------------------------------------------------------- -struct FavoritesListChanged_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 2 }; - uint32 m_nIP; // an IP of 0 means reload the whole list, any other value means just one server - uint32 m_nQueryPort; - uint32 m_nConnPort; - uint32 m_nAppID; - uint32 m_nFlags; - bool m_bAdd; // true if this is adding the entry, otherwise it is a remove - AccountID_t m_unAccountId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Someone has invited you to join a Lobby -// normally you don't need to do anything with this, since -// the Steam UI will also display a ' has invited you to the lobby, join?' dialog -// -// if the user outside a game chooses to join, your game will be launched with the parameter "+connect_lobby <64-bit lobby id>", -// or with the callback GameLobbyJoinRequested_t if they're already in-game -//----------------------------------------------------------------------------- -struct LobbyInvite_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 3 }; - - uint64 m_ulSteamIDUser; // Steam ID of the person making the invite - uint64 m_ulSteamIDLobby; // Steam ID of the Lobby - uint64 m_ulGameID; // GameID of the Lobby -}; - - -//----------------------------------------------------------------------------- -// Purpose: Sent on entering a lobby, or on failing to enter -// m_EChatRoomEnterResponse will be set to k_EChatRoomEnterResponseSuccess on success, -// or a higher value on failure (see enum EChatRoomEnterResponse) -//----------------------------------------------------------------------------- -struct LobbyEnter_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 4 }; - - uint64 m_ulSteamIDLobby; // SteamID of the Lobby you have entered - uint32 m_rgfChatPermissions; // Permissions of the current user - bool m_bLocked; // If true, then only invited users may join - uint32 m_EChatRoomEnterResponse; // EChatRoomEnterResponse -}; - - -//----------------------------------------------------------------------------- -// Purpose: The lobby metadata has changed -// if m_ulSteamIDMember is the steamID of a lobby member, use GetLobbyMemberData() to access per-user details -// if m_ulSteamIDMember == m_ulSteamIDLobby, use GetLobbyData() to access lobby metadata -//----------------------------------------------------------------------------- -struct LobbyDataUpdate_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 5 }; - - uint64 m_ulSteamIDLobby; // steamID of the Lobby - uint64 m_ulSteamIDMember; // steamID of the member whose data changed, or the room itself - uint8 m_bSuccess; // true if we lobby data was successfully changed; - // will only be false if RequestLobbyData() was called on a lobby that no longer exists -}; - - -//----------------------------------------------------------------------------- -// Purpose: The lobby chat room state has changed -// this is usually sent when a user has joined or left the lobby -//----------------------------------------------------------------------------- -struct LobbyChatUpdate_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 6 }; - - uint64 m_ulSteamIDLobby; // Lobby ID - uint64 m_ulSteamIDUserChanged; // user who's status in the lobby just changed - can be recipient - uint64 m_ulSteamIDMakingChange; // Chat member who made the change (different from SteamIDUserChange if kicking, muting, etc.) - // for example, if one user kicks another from the lobby, this will be set to the id of the user who initiated the kick - uint32 m_rgfChatMemberStateChange; // bitfield of EChatMemberStateChange values -}; - - -//----------------------------------------------------------------------------- -// Purpose: A chat message for this lobby has been sent -// use GetLobbyChatEntry( m_iChatID ) to retrieve the contents of this message -//----------------------------------------------------------------------------- -struct LobbyChatMsg_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 7 }; - - uint64 m_ulSteamIDLobby; // the lobby id this is in - uint64 m_ulSteamIDUser; // steamID of the user who has sent this message - uint8 m_eChatEntryType; // type of message - uint32 m_iChatID; // index of the chat entry to lookup -}; - - -//----------------------------------------------------------------------------- -// Purpose: A game created a game for all the members of the lobby to join, -// as triggered by a SetLobbyGameServer() -// it's up to the individual clients to take action on this; the usual -// game behavior is to leave the lobby and connect to the specified game server -//----------------------------------------------------------------------------- -struct LobbyGameCreated_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 9 }; - - uint64 m_ulSteamIDLobby; // the lobby we were in - uint64 m_ulSteamIDGameServer; // the new game server that has been created or found for the lobby members - uint32 m_unIP; // IP & Port of the game server (if any) - uint16 m_usPort; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Number of matching lobbies found -// iterate the returned lobbies with GetLobbyByIndex(), from values 0 to m_nLobbiesMatching-1 -//----------------------------------------------------------------------------- -struct LobbyMatchList_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 10 }; - uint32 m_nLobbiesMatching; // Number of lobbies that matched search criteria and we have SteamIDs for -}; - - -//----------------------------------------------------------------------------- -// Purpose: posted if a user is forcefully removed from a lobby -// can occur if a user loses connection to Steam -//----------------------------------------------------------------------------- -struct LobbyKicked_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 12 }; - uint64 m_ulSteamIDLobby; // Lobby - uint64 m_ulSteamIDAdmin; // User who kicked you - possibly the ID of the lobby itself - uint8 m_bKickedDueToDisconnect; // true if you were kicked from the lobby due to the user losing connection to Steam (currently always true) -}; - - -//----------------------------------------------------------------------------- -// Purpose: Result of our request to create a Lobby -// m_eResult == k_EResultOK on success -// at this point, the lobby has been joined and is ready for use -// a LobbyEnter_t callback will also be received (since the local user is joining their own lobby) -//----------------------------------------------------------------------------- -struct LobbyCreated_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 13 }; - - EResult m_eResult; // k_EResultOK - the lobby was successfully created - // k_EResultNoConnection - your Steam client doesn't have a connection to the back-end - // k_EResultTimeout - you the message to the Steam servers, but it didn't respond - // k_EResultFail - the server responded, but with an unknown internal error - // k_EResultAccessDenied - your game isn't set to allow lobbies, or your client does haven't rights to play the game - // k_EResultLimitExceeded - your game client has created too many lobbies - - uint64 m_ulSteamIDLobby; // chat room, zero if failed -}; - -// used by now obsolete RequestFriendsLobbiesResponse_t -// enum { k_iCallback = k_iSteamMatchmakingCallbacks + 14 }; - - -//----------------------------------------------------------------------------- -// Purpose: Result of CheckForPSNGameBootInvite -// m_eResult == k_EResultOK on success -// at this point, the local user may not have finishing joining this lobby; -// game code should wait until the subsequent LobbyEnter_t callback is received -//----------------------------------------------------------------------------- -struct PSNGameBootInviteResult_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 15 }; - - bool m_bGameBootInviteExists; - CSteamID m_steamIDLobby; // Should be valid if m_bGameBootInviteExists == true -}; - - -//----------------------------------------------------------------------------- -// Purpose: Result of our request to create a Lobby -// m_eResult == k_EResultOK on success -// at this point, the lobby has been joined and is ready for use -// a LobbyEnter_t callback will also be received (since the local user is joining their own lobby) -//----------------------------------------------------------------------------- -struct FavoritesListAccountsUpdated_t -{ - enum { k_iCallback = k_iSteamMatchmakingCallbacks + 16 }; - - EResult m_eResult; -}; - - - -//----------------------------------------------------------------------------- -// Callbacks for ISteamGameSearch (which go through the regular Steam callback registration system) - -struct SearchForGameProgressCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 1 }; - - uint64 m_ullSearchID; // all future callbacks referencing this search will include this Search ID - - EResult m_eResult; // if search has started this result will be k_EResultOK, any other value indicates search has failed to start or has terminated - CSteamID m_lobbyID; // lobby ID if lobby search, invalid steamID otherwise - CSteamID m_steamIDEndedSearch; // if search was terminated, steamID that terminated search - - int32 m_nSecondsRemainingEstimate; - int32 m_cPlayersSearching; -}; - -// notification to all players searching that a game has been found -struct SearchForGameResultCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 2 }; - - uint64 m_ullSearchID; - - EResult m_eResult; // if game/host was lost this will be an error value - - // if m_bGameFound is true the following are non-zero - int32 m_nCountPlayersInGame; - int32 m_nCountAcceptedGame; - // if m_steamIDHost is valid the host has started the game - CSteamID m_steamIDHost; - bool m_bFinalCallback; -}; - - -//----------------------------------------------------------------------------- -// ISteamGameSearch : Game Host API callbacks - -// callback from RequestPlayersForGame when the matchmaking service has started or ended search -// callback will also follow a call from CancelRequestPlayersForGame - m_bSearchInProgress will be false -struct RequestPlayersForGameProgressCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 11 }; - - EResult m_eResult; // m_ullSearchID will be non-zero if this is k_EResultOK - uint64 m_ullSearchID; // all future callbacks referencing this search will include this Search ID -}; - -// callback from RequestPlayersForGame -// one of these will be sent per player -// followed by additional callbacks when players accept or decline the game -struct RequestPlayersForGameResultCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 12 }; - - EResult m_eResult; // m_ullSearchID will be non-zero if this is k_EResultOK - uint64 m_ullSearchID; - - CSteamID m_SteamIDPlayerFound; // player steamID - CSteamID m_SteamIDLobby; // if the player is in a lobby, the lobby ID - enum PlayerAcceptState_t - { - k_EStateUnknown = 0, - k_EStatePlayerAccepted = 1, - k_EStatePlayerDeclined = 2, - }; - PlayerAcceptState_t m_ePlayerAcceptState; - int32 m_nPlayerIndex; - int32 m_nTotalPlayersFound; // expect this many callbacks at minimum - int32 m_nTotalPlayersAcceptedGame; - int32 m_nSuggestedTeamIndex; - uint64 m_ullUniqueGameID; -}; - - -struct RequestPlayersForGameFinalResultCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 13 }; - - EResult m_eResult; - uint64 m_ullSearchID; - uint64 m_ullUniqueGameID; -}; - - - -// this callback confirms that results were received by the matchmaking service for this player -struct SubmitPlayerResultResultCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 14 }; - - EResult m_eResult; - uint64 ullUniqueGameID; - CSteamID steamIDPlayer; -}; - - -// this callback confirms that the game is recorded as complete on the matchmaking service -// the next call to RequestPlayersForGame will generate a new unique game ID -struct EndGameResultCallback_t -{ - enum { k_iCallback = k_iSteamGameSearchCallbacks + 15 }; - - EResult m_eResult; - uint64 ullUniqueGameID; -}; - - -// Steam has responded to the user request to join a party via the given Beacon ID. -// If successful, the connect string contains game-specific instructions to connect -// to the game with that party. -struct JoinPartyCallback_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 1 }; - - EResult m_eResult; - PartyBeaconID_t m_ulBeaconID; - CSteamID m_SteamIDBeaconOwner; - char m_rgchConnectString[256]; -}; - -// Response to CreateBeacon request. If successful, the beacon ID is provided. -struct CreateBeaconCallback_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 2 }; - - EResult m_eResult; - PartyBeaconID_t m_ulBeaconID; -}; - -// Someone has used the beacon to join your party - they are in-flight now -// and we've reserved one of the open slots for them. -// You should confirm when they join your party by calling OnReservationCompleted(). -// Otherwise, Steam may timeout their reservation eventually. -struct ReservationNotificationCallback_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 3 }; - - PartyBeaconID_t m_ulBeaconID; - CSteamID m_steamIDJoiner; -}; - -// Response to ChangeNumOpenSlots call -struct ChangeNumOpenSlotsCallback_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 4 }; - - EResult m_eResult; -}; - -// The list of possible Party beacon locations has changed -struct AvailableBeaconLocationsUpdated_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 5 }; -}; - -// The list of active beacons may have changed -struct ActiveBeaconsUpdated_t -{ - enum { k_iCallback = k_iSteamPartiesCallbacks + 6 }; -}; - - -#pragma pack( pop ) - - -#endif // ISTEAMMATCHMAKING diff --git a/lib/steamworks_150/public/steam/isteammusic.h b/lib/steamworks_150/public/steam/isteammusic.h deleted file mode 100644 index ffa49a0..0000000 --- a/lib/steamworks_150/public/steam/isteammusic.h +++ /dev/null @@ -1,71 +0,0 @@ -//============ Copyright (c) Valve Corporation, All rights reserved. ============ - -#ifndef ISTEAMMUSIC_H -#define ISTEAMMUSIC_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -//----------------------------------------------------------------------------- -// Purpose: -//----------------------------------------------------------------------------- -enum AudioPlayback_Status -{ - AudioPlayback_Undefined = 0, - AudioPlayback_Playing = 1, - AudioPlayback_Paused = 2, - AudioPlayback_Idle = 3 -}; - - -//----------------------------------------------------------------------------- -// Purpose: Functions to control music playback in the steam client -//----------------------------------------------------------------------------- -class ISteamMusic -{ -public: - virtual bool BIsEnabled() = 0; - virtual bool BIsPlaying() = 0; - - virtual AudioPlayback_Status GetPlaybackStatus() = 0; - - virtual void Play() = 0; - virtual void Pause() = 0; - virtual void PlayPrevious() = 0; - virtual void PlayNext() = 0; - - // volume is between 0.0 and 1.0 - virtual void SetVolume( float flVolume ) = 0; - virtual float GetVolume() = 0; - -}; - -#define STEAMMUSIC_INTERFACE_VERSION "STEAMMUSIC_INTERFACE_VERSION001" - -// Global interface accessor -inline ISteamMusic *SteamMusic(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamMusic *, SteamMusic, STEAMMUSIC_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -STEAM_CALLBACK_BEGIN( PlaybackStatusHasChanged_t, k_iSteamMusicCallbacks + 1 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( VolumeHasChanged_t, k_iSteamMusicCallbacks + 2 ) - STEAM_CALLBACK_MEMBER( 0, float, m_flNewVolume ) -STEAM_CALLBACK_END(1) - -#pragma pack( pop ) - - -#endif // #define ISTEAMMUSIC_H diff --git a/lib/steamworks_150/public/steam/isteammusicremote.h b/lib/steamworks_150/public/steam/isteammusicremote.h deleted file mode 100644 index a36f4f8..0000000 --- a/lib/steamworks_150/public/steam/isteammusicremote.h +++ /dev/null @@ -1,133 +0,0 @@ -//============ Copyright (c) Valve Corporation, All rights reserved. ============ - -#ifndef ISTEAMMUSICREMOTE_H -#define ISTEAMMUSICREMOTE_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "isteammusic.h" - -#define k_SteamMusicNameMaxLength 255 -#define k_SteamMusicPNGMaxLength 65535 - - -class ISteamMusicRemote -{ -public: - // Service Definition - virtual bool RegisterSteamMusicRemote( const char *pchName ) = 0; - virtual bool DeregisterSteamMusicRemote() = 0; - virtual bool BIsCurrentMusicRemote() = 0; - virtual bool BActivationSuccess( bool bValue ) = 0; - - virtual bool SetDisplayName( const char *pchDisplayName ) = 0; - virtual bool SetPNGIcon_64x64( void *pvBuffer, uint32 cbBufferLength ) = 0; - - // Abilities for the user interface - virtual bool EnablePlayPrevious(bool bValue) = 0; - virtual bool EnablePlayNext( bool bValue ) = 0; - virtual bool EnableShuffled( bool bValue ) = 0; - virtual bool EnableLooped( bool bValue ) = 0; - virtual bool EnableQueue( bool bValue ) = 0; - virtual bool EnablePlaylists( bool bValue ) = 0; - - // Status - virtual bool UpdatePlaybackStatus( AudioPlayback_Status nStatus ) = 0; - virtual bool UpdateShuffled( bool bValue ) = 0; - virtual bool UpdateLooped( bool bValue ) = 0; - virtual bool UpdateVolume( float flValue ) = 0; // volume is between 0.0 and 1.0 - - // Current Entry - virtual bool CurrentEntryWillChange() = 0; - virtual bool CurrentEntryIsAvailable( bool bAvailable ) = 0; - virtual bool UpdateCurrentEntryText( const char *pchText ) = 0; - virtual bool UpdateCurrentEntryElapsedSeconds( int nValue ) = 0; - virtual bool UpdateCurrentEntryCoverArt( void *pvBuffer, uint32 cbBufferLength ) = 0; - virtual bool CurrentEntryDidChange() = 0; - - // Queue - virtual bool QueueWillChange() = 0; - virtual bool ResetQueueEntries() = 0; - virtual bool SetQueueEntry( int nID, int nPosition, const char *pchEntryText ) = 0; - virtual bool SetCurrentQueueEntry( int nID ) = 0; - virtual bool QueueDidChange() = 0; - - // Playlist - virtual bool PlaylistWillChange() = 0; - virtual bool ResetPlaylistEntries() = 0; - virtual bool SetPlaylistEntry( int nID, int nPosition, const char *pchEntryText ) = 0; - virtual bool SetCurrentPlaylistEntry( int nID ) = 0; - virtual bool PlaylistDidChange() = 0; -}; - -#define STEAMMUSICREMOTE_INTERFACE_VERSION "STEAMMUSICREMOTE_INTERFACE_VERSION001" - -// Global interface accessor -inline ISteamMusicRemote *SteamMusicRemote(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamMusicRemote *, SteamMusicRemote, STEAMMUSICREMOTE_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -STEAM_CALLBACK_BEGIN( MusicPlayerRemoteWillActivate_t, k_iSteamMusicRemoteCallbacks + 1) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerRemoteWillDeactivate_t, k_iSteamMusicRemoteCallbacks + 2 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerRemoteToFront_t, k_iSteamMusicRemoteCallbacks + 3 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWillQuit_t, k_iSteamMusicRemoteCallbacks + 4 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsPlay_t, k_iSteamMusicRemoteCallbacks + 5 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsPause_t, k_iSteamMusicRemoteCallbacks + 6 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsPlayPrevious_t, k_iSteamMusicRemoteCallbacks + 7 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsPlayNext_t, k_iSteamMusicRemoteCallbacks + 8 ) -STEAM_CALLBACK_END(0) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsShuffled_t, k_iSteamMusicRemoteCallbacks + 9 ) - STEAM_CALLBACK_MEMBER( 0, bool, m_bShuffled ) -STEAM_CALLBACK_END(1) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsLooped_t, k_iSteamMusicRemoteCallbacks + 10 ) - STEAM_CALLBACK_MEMBER(0, bool, m_bLooped ) -STEAM_CALLBACK_END(1) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsVolume_t, k_iSteamMusicCallbacks + 11 ) - STEAM_CALLBACK_MEMBER(0, float, m_flNewVolume) -STEAM_CALLBACK_END(1) - -STEAM_CALLBACK_BEGIN( MusicPlayerSelectsQueueEntry_t, k_iSteamMusicCallbacks + 12 ) - STEAM_CALLBACK_MEMBER(0, int, nID ) -STEAM_CALLBACK_END(1) - -STEAM_CALLBACK_BEGIN( MusicPlayerSelectsPlaylistEntry_t, k_iSteamMusicCallbacks + 13 ) - STEAM_CALLBACK_MEMBER(0, int, nID ) -STEAM_CALLBACK_END(1) - -STEAM_CALLBACK_BEGIN( MusicPlayerWantsPlayingRepeatStatus_t, k_iSteamMusicRemoteCallbacks + 14 ) - STEAM_CALLBACK_MEMBER(0, int, m_nPlayingRepeatStatus ) -STEAM_CALLBACK_END(1) - -#pragma pack( pop ) - - - -#endif // #define ISTEAMMUSICREMOTE_H diff --git a/lib/steamworks_150/public/steam/isteamnetworking.h b/lib/steamworks_150/public/steam/isteamnetworking.h deleted file mode 100644 index 2f14d27..0000000 --- a/lib/steamworks_150/public/steam/isteamnetworking.h +++ /dev/null @@ -1,339 +0,0 @@ -//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to steam managing network connections between game clients & servers -// -//============================================================================= - -#ifndef ISTEAMNETWORKING -#define ISTEAMNETWORKING -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -// list of possible errors returned by SendP2PPacket() API -// these will be posted in the P2PSessionConnectFail_t callback -enum EP2PSessionError -{ - k_EP2PSessionErrorNone = 0, - k_EP2PSessionErrorNotRunningApp = 1, // target is not running the same game - k_EP2PSessionErrorNoRightsToApp = 2, // local user doesn't own the app that is running - k_EP2PSessionErrorDestinationNotLoggedIn = 3, // target user isn't connected to Steam - k_EP2PSessionErrorTimeout = 4, // target isn't responding, perhaps not calling AcceptP2PSessionWithUser() - // corporate firewalls can also block this (NAT traversal is not firewall traversal) - // make sure that UDP ports 3478, 4379, and 4380 are open in an outbound direction - k_EP2PSessionErrorMax = 5 -}; - -// SendP2PPacket() send types -// Typically k_EP2PSendUnreliable is what you want for UDP-like packets, k_EP2PSendReliable for TCP-like packets -enum EP2PSend -{ - // Basic UDP send. Packets can't be bigger than 1200 bytes (your typical MTU size). Can be lost, or arrive out of order (rare). - // The sending API does have some knowledge of the underlying connection, so if there is no NAT-traversal accomplished or - // there is a recognized adjustment happening on the connection, the packet will be batched until the connection is open again. - k_EP2PSendUnreliable = 0, - - // As above, but if the underlying p2p connection isn't yet established the packet will just be thrown away. Using this on the first - // packet sent to a remote host almost guarantees the packet will be dropped. - // This is only really useful for kinds of data that should never buffer up, i.e. voice payload packets - k_EP2PSendUnreliableNoDelay = 1, - - // Reliable message send. Can send up to 1MB of data in a single message. - // Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for efficient sends of large chunks of data. - k_EP2PSendReliable = 2, - - // As above, but applies the Nagle algorithm to the send - sends will accumulate - // until the current MTU size (typically ~1200 bytes, but can change) or ~200ms has passed (Nagle algorithm). - // Useful if you want to send a set of smaller messages but have the coalesced into a single packet - // Since the reliable stream is all ordered, you can do several small message sends with k_EP2PSendReliableWithBuffering and then - // do a normal k_EP2PSendReliable to force all the buffered data to be sent. - k_EP2PSendReliableWithBuffering = 3, - -}; - - -// connection state to a specified user, returned by GetP2PSessionState() -// this is under-the-hood info about what's going on with a SendP2PPacket(), shouldn't be needed except for debuggin -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif -struct P2PSessionState_t -{ - uint8 m_bConnectionActive; // true if we've got an active open connection - uint8 m_bConnecting; // true if we're currently trying to establish a connection - uint8 m_eP2PSessionError; // last error recorded (see enum above) - uint8 m_bUsingRelay; // true if it's going through a relay server (TURN) - int32 m_nBytesQueuedForSend; - int32 m_nPacketsQueuedForSend; - uint32 m_nRemoteIP; // potential IP:Port of remote host. Could be TURN server. - uint16 m_nRemotePort; // Only exists for compatibility with older authentication api's -}; -#pragma pack( pop ) - - -// handle to a socket -typedef uint32 SNetSocket_t; // CreateP2PConnectionSocket() -typedef uint32 SNetListenSocket_t; // CreateListenSocket() - -// connection progress indicators, used by CreateP2PConnectionSocket() -enum ESNetSocketState -{ - k_ESNetSocketStateInvalid = 0, - - // communication is valid - k_ESNetSocketStateConnected = 1, - - // states while establishing a connection - k_ESNetSocketStateInitiated = 10, // the connection state machine has started - - // p2p connections - k_ESNetSocketStateLocalCandidatesFound = 11, // we've found our local IP info - k_ESNetSocketStateReceivedRemoteCandidates = 12,// we've received information from the remote machine, via the Steam back-end, about their IP info - - // direct connections - k_ESNetSocketStateChallengeHandshake = 15, // we've received a challenge packet from the server - - // failure states - k_ESNetSocketStateDisconnecting = 21, // the API shut it down, and we're in the process of telling the other end - k_ESNetSocketStateLocalDisconnect = 22, // the API shut it down, and we've completed shutdown - k_ESNetSocketStateTimeoutDuringConnect = 23, // we timed out while trying to creating the connection - k_ESNetSocketStateRemoteEndDisconnected = 24, // the remote end has disconnected from us - k_ESNetSocketStateConnectionBroken = 25, // connection has been broken; either the other end has disappeared or our local network connection has broke - -}; - -// describes how the socket is currently connected -enum ESNetSocketConnectionType -{ - k_ESNetSocketConnectionTypeNotConnected = 0, - k_ESNetSocketConnectionTypeUDP = 1, - k_ESNetSocketConnectionTypeUDPRelay = 2, -}; - - -//----------------------------------------------------------------------------- -// Purpose: Functions for making connections and sending data between clients, -// traversing NAT's where possible -// -// NOTE: This interface is deprecated and may be removed in a future release of -/// the Steamworks SDK. Please see ISteamNetworkingSockets and -/// ISteamNetworkingMessages -//----------------------------------------------------------------------------- -class ISteamNetworking -{ -public: - //////////////////////////////////////////////////////////////////////////////////////////// - // - // UDP-style (connectionless) networking interface. These functions send messages using - // an API organized around the destination. Reliable and unreliable messages are supported. - // - // For a more TCP-style interface (meaning you have a connection handle), see the functions below. - // Both interface styles can send both reliable and unreliable messages. - // - // Automatically establishes NAT-traversing or Relay server connections - // - // These APIs are deprecated, and may be removed in a future version of the Steamworks - // SDK. See ISteamNetworkingMessages. - - // Sends a P2P packet to the specified user - // UDP-like, unreliable and a max packet size of 1200 bytes - // the first packet send may be delayed as the NAT-traversal code runs - // if we can't get through to the user, an error will be posted via the callback P2PSessionConnectFail_t - // see EP2PSend enum above for the descriptions of the different ways of sending packets - // - // nChannel is a routing number you can use to help route message to different systems - you'll have to call ReadP2PPacket() - // with the same channel number in order to retrieve the data on the other end - // using different channels to talk to the same user will still use the same underlying p2p connection, saving on resources - virtual bool SendP2PPacket( CSteamID steamIDRemote, const void *pubData, uint32 cubData, EP2PSend eP2PSendType, int nChannel = 0 ) = 0; - - // returns true if any data is available for read, and the amount of data that will need to be read - virtual bool IsP2PPacketAvailable( uint32 *pcubMsgSize, int nChannel = 0 ) = 0; - - // reads in a packet that has been sent from another user via SendP2PPacket() - // returns the size of the message and the steamID of the user who sent it in the last two parameters - // if the buffer passed in is too small, the message will be truncated - // this call is not blocking, and will return false if no data is available - virtual bool ReadP2PPacket( void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, CSteamID *psteamIDRemote, int nChannel = 0 ) = 0; - - // AcceptP2PSessionWithUser() should only be called in response to a P2PSessionRequest_t callback - // P2PSessionRequest_t will be posted if another user tries to send you a packet that you haven't talked to yet - // if you don't want to talk to the user, just ignore the request - // if the user continues to send you packets, another P2PSessionRequest_t will be posted periodically - // this may be called multiple times for a single user - // (if you've called SendP2PPacket() on the other user, this implicitly accepts the session request) - virtual bool AcceptP2PSessionWithUser( CSteamID steamIDRemote ) = 0; - - // call CloseP2PSessionWithUser() when you're done talking to a user, will free up resources under-the-hood - // if the remote user tries to send data to you again, another P2PSessionRequest_t callback will be posted - virtual bool CloseP2PSessionWithUser( CSteamID steamIDRemote ) = 0; - - // call CloseP2PChannelWithUser() when you're done talking to a user on a specific channel. Once all channels - // open channels to a user have been closed, the open session to the user will be closed and new data from this - // user will trigger a P2PSessionRequest_t callback - virtual bool CloseP2PChannelWithUser( CSteamID steamIDRemote, int nChannel ) = 0; - - // fills out P2PSessionState_t structure with details about the underlying connection to the user - // should only needed for debugging purposes - // returns false if no connection exists to the specified user - virtual bool GetP2PSessionState( CSteamID steamIDRemote, P2PSessionState_t *pConnectionState ) = 0; - - // Allow P2P connections to fall back to being relayed through the Steam servers if a direct connection - // or NAT-traversal cannot be established. Only applies to connections created after setting this value, - // or to existing connections that need to automatically reconnect after this value is set. - // - // P2P packet relay is allowed by default - // - // NOTE: This function is deprecated and may be removed in a future version of the SDK. For - // security purposes, we may decide to relay the traffic to certain peers, even if you pass false - // to this function, to prevent revealing the client's IP address top another peer. - virtual bool AllowP2PPacketRelay( bool bAllow ) = 0; - - - //////////////////////////////////////////////////////////////////////////////////////////// - // - // LISTEN / CONNECT connection-oriented interface functions - // - // These functions are more like a client-server TCP API. One side is the "server" - // and "listens" for incoming connections, which then must be "accepted." The "client" - // initiates a connection by "connecting." Sending and receiving is done through a - // connection handle. - // - // For a more UDP-style interface, where you do not track connection handles but - // simply send messages to a SteamID, use the UDP-style functions above. - // - // Both methods can send both reliable and unreliable methods. - // - // These APIs are deprecated, and may be removed in a future version of the Steamworks - // SDK. See ISteamNetworkingSockets. - // - //////////////////////////////////////////////////////////////////////////////////////////// - - - // creates a socket and listens others to connect - // will trigger a SocketStatusCallback_t callback on another client connecting - // nVirtualP2PPort is the unique ID that the client will connect to, in case you have multiple ports - // this can usually just be 0 unless you want multiple sets of connections - // unIP is the local IP address to bind to - // pass in 0 if you just want the default local IP - // unPort is the port to use - // pass in 0 if you don't want users to be able to connect via IP/Port, but expect to be always peer-to-peer connections only - virtual SNetListenSocket_t CreateListenSocket( int nVirtualP2PPort, SteamIPAddress_t nIP, uint16 nPort, bool bAllowUseOfPacketRelay ) = 0; - - // creates a socket and begin connection to a remote destination - // can connect via a known steamID (client or game server), or directly to an IP - // on success will trigger a SocketStatusCallback_t callback - // on failure or timeout will trigger a SocketStatusCallback_t callback with a failure code in m_eSNetSocketState - virtual SNetSocket_t CreateP2PConnectionSocket( CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay ) = 0; - virtual SNetSocket_t CreateConnectionSocket( SteamIPAddress_t nIP, uint16 nPort, int nTimeoutSec ) = 0; - - // disconnects the connection to the socket, if any, and invalidates the handle - // any unread data on the socket will be thrown away - // if bNotifyRemoteEnd is set, socket will not be completely destroyed until the remote end acknowledges the disconnect - virtual bool DestroySocket( SNetSocket_t hSocket, bool bNotifyRemoteEnd ) = 0; - // destroying a listen socket will automatically kill all the regular sockets generated from it - virtual bool DestroyListenSocket( SNetListenSocket_t hSocket, bool bNotifyRemoteEnd ) = 0; - - // sending data - // must be a handle to a connected socket - // data is all sent via UDP, and thus send sizes are limited to 1200 bytes; after this, many routers will start dropping packets - // use the reliable flag with caution; although the resend rate is pretty aggressive, - // it can still cause stalls in receiving data (like TCP) - virtual bool SendDataOnSocket( SNetSocket_t hSocket, void *pubData, uint32 cubData, bool bReliable ) = 0; - - // receiving data - // returns false if there is no data remaining - // fills out *pcubMsgSize with the size of the next message, in bytes - virtual bool IsDataAvailableOnSocket( SNetSocket_t hSocket, uint32 *pcubMsgSize ) = 0; - - // fills in pubDest with the contents of the message - // messages are always complete, of the same size as was sent (i.e. packetized, not streaming) - // if *pcubMsgSize < cubDest, only partial data is written - // returns false if no data is available - virtual bool RetrieveDataFromSocket( SNetSocket_t hSocket, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize ) = 0; - - // checks for data from any socket that has been connected off this listen socket - // returns false if there is no data remaining - // fills out *pcubMsgSize with the size of the next message, in bytes - // fills out *phSocket with the socket that data is available on - virtual bool IsDataAvailable( SNetListenSocket_t hListenSocket, uint32 *pcubMsgSize, SNetSocket_t *phSocket ) = 0; - - // retrieves data from any socket that has been connected off this listen socket - // fills in pubDest with the contents of the message - // messages are always complete, of the same size as was sent (i.e. packetized, not streaming) - // if *pcubMsgSize < cubDest, only partial data is written - // returns false if no data is available - // fills out *phSocket with the socket that data is available on - virtual bool RetrieveData( SNetListenSocket_t hListenSocket, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize, SNetSocket_t *phSocket ) = 0; - - // returns information about the specified socket, filling out the contents of the pointers - virtual bool GetSocketInfo( SNetSocket_t hSocket, CSteamID *pSteamIDRemote, int *peSocketStatus, SteamIPAddress_t *punIPRemote, uint16 *punPortRemote ) = 0; - - // returns which local port the listen socket is bound to - // *pnIP and *pnPort will be 0 if the socket is set to listen for P2P connections only - virtual bool GetListenSocketInfo( SNetListenSocket_t hListenSocket, SteamIPAddress_t *pnIP, uint16 *pnPort ) = 0; - - // returns true to describe how the socket ended up connecting - virtual ESNetSocketConnectionType GetSocketConnectionType( SNetSocket_t hSocket ) = 0; - - // max packet size, in bytes - virtual int GetMaxPacketSize( SNetSocket_t hSocket ) = 0; -}; -#define STEAMNETWORKING_INTERFACE_VERSION "SteamNetworking006" - -// Global interface accessor -inline ISteamNetworking *SteamNetworking(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamNetworking *, SteamNetworking, STEAMNETWORKING_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamNetworking *SteamGameServerNetworking(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamNetworking *, SteamGameServerNetworking, STEAMNETWORKING_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -// callback notification - a user wants to talk to us over the P2P channel via the SendP2PPacket() API -// in response, a call to AcceptP2PPacketsFromUser() needs to be made, if you want to talk with them -struct P2PSessionRequest_t -{ - enum { k_iCallback = k_iSteamNetworkingCallbacks + 2 }; - CSteamID m_steamIDRemote; // user who wants to talk to us -}; - - -// callback notification - packets can't get through to the specified user via the SendP2PPacket() API -// all packets queued packets unsent at this point will be dropped -// further attempts to send will retry making the connection (but will be dropped if we fail again) -struct P2PSessionConnectFail_t -{ - enum { k_iCallback = k_iSteamNetworkingCallbacks + 3 }; - CSteamID m_steamIDRemote; // user we were sending packets to - uint8 m_eP2PSessionError; // EP2PSessionError indicating why we're having trouble -}; - - -// callback notification - status of a socket has changed -// used as part of the CreateListenSocket() / CreateP2PConnectionSocket() -struct SocketStatusCallback_t -{ - enum { k_iCallback = k_iSteamNetworkingCallbacks + 1 }; - SNetSocket_t m_hSocket; // the socket used to send/receive data to the remote host - SNetListenSocket_t m_hListenSocket; // this is the server socket that we were listening on; NULL if this was an outgoing connection - CSteamID m_steamIDRemote; // remote steamID we have connected to, if it has one - int m_eSNetSocketState; // socket state, ESNetSocketState -}; - -#pragma pack( pop ) - -#endif // ISTEAMNETWORKING diff --git a/lib/steamworks_150/public/steam/isteamnetworkingmessages.h b/lib/steamworks_150/public/steam/isteamnetworkingmessages.h deleted file mode 100644 index b7fa687..0000000 --- a/lib/steamworks_150/public/steam/isteamnetworkingmessages.h +++ /dev/null @@ -1,189 +0,0 @@ -//====== Copyright Valve Corporation, All rights reserved. ==================== - -#ifndef ISTEAMNETWORKINGMESSAGES -#define ISTEAMNETWORKINGMESSAGES -#pragma once - -#include "steamnetworkingtypes.h" - -//----------------------------------------------------------------------------- -/// The non-connection-oriented interface to send and receive messages -/// (whether they be "clients" or "servers"). -/// -/// ISteamNetworkingSockets is connection-oriented (like TCP), meaning you -/// need to listen and connect, and then you send messages using a connection -/// handle. ISteamNetworkingMessages is more like UDP, in that you can just send -/// messages to arbitrary peers at any time. The underlying connections are -/// established implicitly. -/// -/// Under the hood ISteamNetworkingMessages works on top of the ISteamNetworkingSockets -/// code, so you get the same routing and messaging efficiency. The difference is -/// mainly in your responsibility to explicitly establish a connection and -/// the type of feedback you get about the state of the connection. Both -/// interfaces can do "P2P" communications, and both support both unreliable -/// and reliable messages, fragmentation and reassembly. -/// -/// The primary purpose of this interface is to be "like UDP", so that UDP-based code -/// can be ported easily to take advantage of relayed connections. If you find -/// yourself needing more low level information or control, or to be able to better -/// handle failure, then you probably need to use ISteamNetworkingSockets directly. -/// Also, note that if your main goal is to obtain a connection between two peers -/// without concerning yourself with assigning roles of "client" and "server", -/// you may find the symmetric connection mode of ISteamNetworkingSockets useful. -/// (See k_ESteamNetworkingConfig_SymmetricConnect.) -/// -class ISteamNetworkingMessages -{ -public: - /// Sends a message to the specified host. If we don't already have a session with that user, - /// a session is implicitly created. There might be some handshaking that needs to happen - /// before we can actually begin sending message data. If this handshaking fails and we can't - /// get through, an error will be posted via the callback SteamNetworkingMessagesSessionFailed_t. - /// There is no notification when the operation succeeds. (You should have the peer send a reply - /// for this purpose.) - /// - /// Sending a message to a host will also implicitly accept any incoming connection from that host. - /// - /// nSendFlags is a bitmask of k_nSteamNetworkingSend_xxx options - /// - /// nRemoteChannel is a routing number you can use to help route message to different systems. - /// You'll have to call ReceiveMessagesOnChannel() with the same channel number in order to retrieve - /// the data on the other end. - /// - /// Using different channels to talk to the same user will still use the same underlying - /// connection, saving on resources. If you don't need this feature, use 0. - /// Otherwise, small integers are the most efficient. - /// - /// It is guaranteed that reliable messages to the same host on the same channel - /// will be be received by the remote host (if they are received at all) exactly once, - /// and in the same order that they were sent. - /// - /// NO other order guarantees exist! In particular, unreliable messages may be dropped, - /// received out of order with respect to each other and with respect to reliable data, - /// or may be received multiple times. Messages on different channels are *not* guaranteed - /// to be received in the order they were sent. - /// - /// A note for those familiar with TCP/IP ports, or converting an existing codebase that - /// opened multiple sockets: You might notice that there is only one channel, and with - /// TCP/IP each endpoint has a port number. You can think of the channel number as the - /// *destination* port. If you need each message to also include a "source port" (so the - /// recipient can route the reply), then just put that in your message. That is essentially - /// how UDP works! - /// - /// Returns: - /// - k_EREsultOK on success. - /// - k_EResultNoConnection will be returned if the session has failed or was closed by the peer, - /// and k_nSteamNetworkingSend_AutoRestartBrokenSession is not used. (You can use - /// GetSessionConnectionInfo to get the details.) In order to acknowledge the broken session - /// and start a new one, you must call CloseSessionWithUser - /// - See ISteamNetworkingSockets::SendMessageToConnection for more possible return values - virtual EResult SendMessageToUser( const SteamNetworkingIdentity &identityRemote, const void *pubData, uint32 cubData, int nSendFlags, int nRemoteChannel ) = 0; - - /// Reads the next message that has been sent from another user via SendMessageToUser() on the given channel. - /// Returns number of messages returned into your list. (0 if no message are available on that channel.) - /// - /// When you're done with the message object(s), make sure and call SteamNetworkingMessage_t::Release()! - virtual int ReceiveMessagesOnChannel( int nLocalChannel, SteamNetworkingMessage_t **ppOutMessages, int nMaxMessages ) = 0; - - /// Call this in response to a SteamNetworkingMessagesSessionRequest_t callback. - /// SteamNetworkingMessagesSessionRequest_t are posted when a user tries to send you a message, - /// and you haven't tried to talk to them first. If you don't want to talk to them, just ignore - /// the request. If the user continues to send you messages, SteamNetworkingMessagesSessionRequest_t - /// callbacks will continue to be posted periodically. - /// - /// Returns false if there is no session with the user pending or otherwise. If there is an - /// existing active session, this function will return true, even if it is not pending. - /// - /// Calling SendMessageToUser() will implicitly accepts any pending session request to that user. - virtual bool AcceptSessionWithUser( const SteamNetworkingIdentity &identityRemote ) = 0; - - /// Call this when you're done talking to a user to immediately free up resources under-the-hood. - /// If the remote user tries to send data to you again, another SteamNetworkingMessagesSessionRequest_t - /// callback will be posted. - /// - /// Note that sessions that go unused for a few minutes are automatically timed out. - virtual bool CloseSessionWithUser( const SteamNetworkingIdentity &identityRemote ) = 0; - - /// Call this when you're done talking to a user on a specific channel. Once all - /// open channels to a user have been closed, the open session to the user will be - /// closed, and any new data from this user will trigger a - /// SteamSteamNetworkingMessagesSessionRequest_t callback - virtual bool CloseChannelWithUser( const SteamNetworkingIdentity &identityRemote, int nLocalChannel ) = 0; - - /// Returns information about the latest state of a connection, if any, with the given peer. - /// Primarily intended for debugging purposes, but can also be used to get more detailed - /// failure information. (See SendMessageToUser and k_nSteamNetworkingSend_AutoRestartBrokenSession.) - /// - /// Returns the value of SteamNetConnectionInfo_t::m_eState, or k_ESteamNetworkingConnectionState_None - /// if no connection exists with specified peer. You may pass nullptr for either parameter if - /// you do not need the corresponding details. Note that sessions time out after a while, - /// so if a connection fails, or SendMessageToUser returns k_EResultNoConnection, you cannot wait - /// indefinitely to obtain the reason for failure. - virtual ESteamNetworkingConnectionState GetSessionConnectionInfo( const SteamNetworkingIdentity &identityRemote, SteamNetConnectionInfo_t *pConnectionInfo, SteamNetworkingQuickConnectionStatus *pQuickStatus ) = 0; -}; -#define STEAMNETWORKINGMESSAGES_INTERFACE_VERSION "SteamNetworkingMessages002" - -// -// Callbacks -// - -#pragma pack( push, 1 ) - -/// Posted when a remote host is sending us a message, and we do not already have a session with them -struct SteamNetworkingMessagesSessionRequest_t -{ - enum { k_iCallback = k_iSteamNetworkingMessagesCallbacks + 1 }; - SteamNetworkingIdentity m_identityRemote; // user who wants to talk to us -}; - -/// Posted when we fail to establish a connection, or we detect that communications -/// have been disrupted it an unusual way. There is no notification when a peer proactively -/// closes the session. ("Closed by peer" is not a concept of UDP-style communications, and -/// SteamNetworkingMessages is primarily intended to make porting UDP code easy.) -/// -/// Remember: callbacks are asynchronous. See notes on SendMessageToUser, -/// and k_nSteamNetworkingSend_AutoRestartBrokenSession in particular. -/// -/// Also, if a session times out due to inactivity, no callbacks will be posted. The only -/// way to detect that this is happening is that querying the session state may return -/// none, connecting, and findingroute again. -struct SteamNetworkingMessagesSessionFailed_t -{ - enum { k_iCallback = k_iSteamNetworkingMessagesCallbacks + 2 }; - - /// Detailed info about the session that failed. - /// SteamNetConnectionInfo_t::m_identityRemote indicates who this session - /// was with. - SteamNetConnectionInfo_t m_info; -}; - -#pragma pack(pop) - -// -// Global accessor -// - -#if defined( STEAMNETWORKINGSOCKETS_PARTNER ) - - // Standalone lib. Use different symbol name, so that we can dynamically switch between steamclient.dll - // and the standalone lib - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingMessages *SteamNetworkingMessages_Lib(); - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingMessages *SteamGameServerNetworkingMessages_Lib(); - inline ISteamNetworkingMessages *SteamNetworkingMessages() { return SteamNetworkingMessages_Lib(); } - inline ISteamNetworkingMessages *SteamGameServerNetworkingMessages() { return SteamGameServerNetworkingMessages_Lib(); } - -#elif defined( STEAMNETWORKINGSOCKETS_OPENSOURCE ) - - // Opensource GameNetworkingSockets - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingMessages *SteamNetworkingMessages(); - -#else - - // Steamworks SDK - inline ISteamNetworkingMessages *SteamNetworkingMessages(); - STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamNetworkingMessages *, SteamNetworkingMessages, STEAMNETWORKINGMESSAGES_INTERFACE_VERSION ); - inline ISteamNetworkingMessages *SteamGameServerNetworkingMessages(); - STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamNetworkingMessages *, SteamGameServerNetworkingMessages, STEAMNETWORKINGMESSAGES_INTERFACE_VERSION ); -#endif - -#endif // ISTEAMNETWORKINGMESSAGES diff --git a/lib/steamworks_150/public/steam/isteamnetworkingsockets.h b/lib/steamworks_150/public/steam/isteamnetworkingsockets.h deleted file mode 100644 index 904ec4b..0000000 --- a/lib/steamworks_150/public/steam/isteamnetworkingsockets.h +++ /dev/null @@ -1,771 +0,0 @@ -//====== Copyright Valve Corporation, All rights reserved. ==================== - -#ifndef ISTEAMNETWORKINGSOCKETS -#define ISTEAMNETWORKINGSOCKETS -#ifdef _WIN32 -#pragma once -#endif - -#include "steamnetworkingtypes.h" - -struct SteamNetAuthenticationStatus_t; -class ISteamNetworkingConnectionCustomSignaling; -class ISteamNetworkingCustomSignalingRecvContext; - -//----------------------------------------------------------------------------- -/// Lower level networking API. -/// -/// - Connection-oriented API (like TCP, not UDP). When sending and receiving -/// messages, a connection handle is used. (For a UDP-style interface, see -/// ISteamNetworkingMessages.) In this TCP-style interface, the "server" will -/// "listen" on a "listen socket." A "client" will "connect" to the server, -/// and the server will "accept" the connection. -/// - But unlike TCP, it's message-oriented, not stream-oriented. -/// - Mix of reliable and unreliable messages -/// - Fragmentation and reassembly -/// - Supports connectivity over plain UDP -/// - Also supports SDR ("Steam Datagram Relay") connections, which are -/// addressed by the identity of the peer. There is a "P2P" use case and -/// a "hosted dedicated server" use case. -/// -/// Note that neither of the terms "connection" nor "socket" necessarily correspond -/// one-to-one with an underlying UDP socket. An attempt has been made to -/// keep the semantics as similar to the standard socket model when appropriate, -/// but some deviations do exist. -/// -/// See also: ISteamNetworkingMessages, the UDP-style interface. This API might be -/// easier to use, especially when porting existing UDP code. -class ISteamNetworkingSockets -{ -public: - - /// Creates a "server" socket that listens for clients to connect to by - /// calling ConnectByIPAddress, over ordinary UDP (IPv4 or IPv6) - /// - /// You must select a specific local port to listen on and set it - /// the port field of the local address. - /// - /// Usually you will set the IP portion of the address to zero (SteamNetworkingIPAddr::Clear()). - /// This means that you will not bind to any particular local interface (i.e. the same - /// as INADDR_ANY in plain socket code). Furthermore, if possible the socket will be bound - /// in "dual stack" mode, which means that it can accept both IPv4 and IPv6 client connections. - /// If you really do wish to bind a particular interface, then set the local address to the - /// appropriate IPv4 or IPv6 IP. - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - /// - /// When a client attempts to connect, a SteamNetConnectionStatusChangedCallback_t - /// will be posted. The connection will be in the connecting state. - virtual HSteamListenSocket CreateListenSocketIP( const SteamNetworkingIPAddr &localAddress, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Creates a connection and begins talking to a "server" over UDP at the - /// given IPv4 or IPv6 address. The remote host must be listening with a - /// matching call to CreateListenSocketIP on the specified port. - /// - /// A SteamNetConnectionStatusChangedCallback_t callback will be triggered when we start - /// connecting, and then another one on either timeout or successful connection. - /// - /// If the server does not have any identity configured, then their network address - /// will be the only identity in use. Or, the network host may provide a platform-specific - /// identity with or without a valid certificate to authenticate that identity. (These - /// details will be contained in the SteamNetConnectionStatusChangedCallback_t.) It's - /// up to your application to decide whether to allow the connection. - /// - /// By default, all connections will get basic encryption sufficient to prevent - /// casual eavesdropping. But note that without certificates (or a shared secret - /// distributed through some other out-of-band mechanism), you don't have any - /// way of knowing who is actually on the other end, and thus are vulnerable to - /// man-in-the-middle attacks. - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamNetConnection ConnectByIPAddress( const SteamNetworkingIPAddr &address, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Like CreateListenSocketIP, but clients will connect using ConnectP2P - /// - /// nLocalVirtualPort specifies how clients can connect to this socket using - /// ConnectP2P. It's very common for applications to only have one listening socket; - /// in that case, use zero. If you need to open multiple listen sockets and have clients - /// be able to connect to one or the other, then nLocalVirtualPort should be a small - /// integer (<1000) unique to each listen socket you create. - /// - /// If you use this, you probably want to call ISteamNetworkingUtils::InitRelayNetworkAccess() - /// when your app initializes - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamListenSocket CreateListenSocketP2P( int nLocalVirtualPort, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Begin connecting to a peer that is identified using a platform-specific identifier. - /// This uses the default rendezvous service, which depends on the platform and library - /// configuration. (E.g. on Steam, it goes through the steam backend.) - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamNetConnection ConnectP2P( const SteamNetworkingIdentity &identityRemote, int nRemoteVirtualPort, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Accept an incoming connection that has been received on a listen socket. - /// - /// When a connection attempt is received (perhaps after a few basic handshake - /// packets have been exchanged to prevent trivial spoofing), a connection interface - /// object is created in the k_ESteamNetworkingConnectionState_Connecting state - /// and a SteamNetConnectionStatusChangedCallback_t is posted. At this point, your - /// application MUST either accept or close the connection. (It may not ignore it.) - /// Accepting the connection will transition it either into the connected state, - /// or the finding route state, depending on the connection type. - /// - /// You should take action within a second or two, because accepting the connection is - /// what actually sends the reply notifying the client that they are connected. If you - /// delay taking action, from the client's perspective it is the same as the network - /// being unresponsive, and the client may timeout the connection attempt. In other - /// words, the client cannot distinguish between a delay caused by network problems - /// and a delay caused by the application. - /// - /// This means that if your application goes for more than a few seconds without - /// processing callbacks (for example, while loading a map), then there is a chance - /// that a client may attempt to connect in that interval and fail due to timeout. - /// - /// If the application does not respond to the connection attempt in a timely manner, - /// and we stop receiving communication from the client, the connection attempt will - /// be timed out locally, transitioning the connection to the - /// k_ESteamNetworkingConnectionState_ProblemDetectedLocally state. The client may also - /// close the connection before it is accepted, and a transition to the - /// k_ESteamNetworkingConnectionState_ClosedByPeer is also possible depending the exact - /// sequence of events. - /// - /// Returns k_EResultInvalidParam if the handle is invalid. - /// Returns k_EResultInvalidState if the connection is not in the appropriate state. - /// (Remember that the connection state could change in between the time that the - /// notification being posted to the queue and when it is received by the application.) - /// - /// A note about connection configuration options. If you need to set any configuration - /// options that are common to all connections accepted through a particular listen - /// socket, consider setting the options on the listen socket, since such options are - /// inherited automatically. If you really do need to set options that are connection - /// specific, it is safe to set them on the connection before accepting the connection. - virtual EResult AcceptConnection( HSteamNetConnection hConn ) = 0; - - /// Disconnects from the remote host and invalidates the connection handle. - /// Any unread data on the connection is discarded. - /// - /// nReason is an application defined code that will be received on the other - /// end and recorded (when possible) in backend analytics. The value should - /// come from a restricted range. (See ESteamNetConnectionEnd.) If you don't need - /// to communicate any information to the remote host, and do not want analytics to - /// be able to distinguish "normal" connection terminations from "exceptional" ones, - /// You may pass zero, in which case the generic value of - /// k_ESteamNetConnectionEnd_App_Generic will be used. - /// - /// pszDebug is an optional human-readable diagnostic string that will be received - /// by the remote host and recorded (when possible) in backend analytics. - /// - /// If you wish to put the socket into a "linger" state, where an attempt is made to - /// flush any remaining sent data, use bEnableLinger=true. Otherwise reliable data - /// is not flushed. - /// - /// If the connection has already ended and you are just freeing up the - /// connection interface, the reason code, debug string, and linger flag are - /// ignored. - virtual bool CloseConnection( HSteamNetConnection hPeer, int nReason, const char *pszDebug, bool bEnableLinger ) = 0; - - /// Destroy a listen socket. All the connections that were accepting on the listen - /// socket are closed ungracefully. - virtual bool CloseListenSocket( HSteamListenSocket hSocket ) = 0; - - /// Set connection user data. the data is returned in the following places - /// - You can query it using GetConnectionUserData. - /// - The SteamNetworkingmessage_t structure. - /// - The SteamNetConnectionInfo_t structure. (Which is a member of SteamNetConnectionStatusChangedCallback_t.) - /// - /// Returns false if the handle is invalid. - virtual bool SetConnectionUserData( HSteamNetConnection hPeer, int64 nUserData ) = 0; - - /// Fetch connection user data. Returns -1 if handle is invalid - /// or if you haven't set any userdata on the connection. - virtual int64 GetConnectionUserData( HSteamNetConnection hPeer ) = 0; - - /// Set a name for the connection, used mostly for debugging - virtual void SetConnectionName( HSteamNetConnection hPeer, const char *pszName ) = 0; - - /// Fetch connection name. Returns false if handle is invalid - virtual bool GetConnectionName( HSteamNetConnection hPeer, char *pszName, int nMaxLen ) = 0; - - /// Send a message to the remote host on the specified connection. - /// - /// nSendFlags determines the delivery guarantees that will be provided, - /// when data should be buffered, etc. E.g. k_nSteamNetworkingSend_Unreliable - /// - /// Note that the semantics we use for messages are not precisely - /// the same as the semantics of a standard "stream" socket. - /// (SOCK_STREAM) For an ordinary stream socket, the boundaries - /// between chunks are not considered relevant, and the sizes of - /// the chunks of data written will not necessarily match up to - /// the sizes of the chunks that are returned by the reads on - /// the other end. The remote host might read a partial chunk, - /// or chunks might be coalesced. For the message semantics - /// used here, however, the sizes WILL match. Each send call - /// will match a successful read call on the remote host - /// one-for-one. If you are porting existing stream-oriented - /// code to the semantics of reliable messages, your code should - /// work the same, since reliable message semantics are more - /// strict than stream semantics. The only caveat is related to - /// performance: there is per-message overhead to retain the - /// message sizes, and so if your code sends many small chunks - /// of data, performance will suffer. Any code based on stream - /// sockets that does not write excessively small chunks will - /// work without any changes. - /// - /// The pOutMessageNumber is an optional pointer to receive the - /// message number assigned to the message, if sending was successful. - /// - /// Returns: - /// - k_EResultInvalidParam: invalid connection handle, or the individual message is too big. - /// (See k_cbMaxSteamNetworkingSocketsMessageSizeSend) - /// - k_EResultInvalidState: connection is in an invalid state - /// - k_EResultNoConnection: connection has ended - /// - k_EResultIgnored: You used k_nSteamNetworkingSend_NoDelay, and the message was dropped because - /// we were not ready to send it. - /// - k_EResultLimitExceeded: there was already too much data queued to be sent. - /// (See k_ESteamNetworkingConfig_SendBufferSize) - virtual EResult SendMessageToConnection( HSteamNetConnection hConn, const void *pData, uint32 cbData, int nSendFlags, int64 *pOutMessageNumber ) = 0; - - /// Send one or more messages without copying the message payload. - /// This is the most efficient way to send messages. To use this - /// function, you must first allocate a message object using - /// ISteamNetworkingUtils::AllocateMessage. (Do not declare one - /// on the stack or allocate your own.) - /// - /// You should fill in the message payload. You can either let - /// it allocate the buffer for you and then fill in the payload, - /// or if you already have a buffer allocated, you can just point - /// m_pData at your buffer and set the callback to the appropriate function - /// to free it. Note that if you use your own buffer, it MUST remain valid - /// until the callback is executed. And also note that your callback can be - /// invoked at ant time from any thread (perhaps even before SendMessages - /// returns!), so it MUST be fast and threadsafe. - /// - /// You MUST also fill in: - /// - m_conn - the handle of the connection to send the message to - /// - m_nFlags - bitmask of k_nSteamNetworkingSend_xxx flags. - /// - /// All other fields are currently reserved and should not be modified. - /// - /// The library will take ownership of the message structures. They may - /// be modified or become invalid at any time, so you must not read them - /// after passing them to this function. - /// - /// pOutMessageNumberOrResult is an optional array that will receive, - /// for each message, the message number that was assigned to the message - /// if sending was successful. If sending failed, then a negative EResult - /// value is placed into the array. For example, the array will hold - /// -k_EResultInvalidState if the connection was in an invalid state. - /// See ISteamNetworkingSockets::SendMessageToConnection for possible - /// failure codes. - virtual void SendMessages( int nMessages, SteamNetworkingMessage_t *const *pMessages, int64 *pOutMessageNumberOrResult ) = 0; - - /// Flush any messages waiting on the Nagle timer and send them - /// at the next transmission opportunity (often that means right now). - /// - /// If Nagle is enabled (it's on by default) then when calling - /// SendMessageToConnection the message will be buffered, up to the Nagle time - /// before being sent, to merge small messages into the same packet. - /// (See k_ESteamNetworkingConfig_NagleTime) - /// - /// Returns: - /// k_EResultInvalidParam: invalid connection handle - /// k_EResultInvalidState: connection is in an invalid state - /// k_EResultNoConnection: connection has ended - /// k_EResultIgnored: We weren't (yet) connected, so this operation has no effect. - virtual EResult FlushMessagesOnConnection( HSteamNetConnection hConn ) = 0; - - /// Fetch the next available message(s) from the connection, if any. - /// Returns the number of messages returned into your array, up to nMaxMessages. - /// If the connection handle is invalid, -1 is returned. - /// - /// The order of the messages returned in the array is relevant. - /// Reliable messages will be received in the order they were sent (and with the - /// same sizes --- see SendMessageToConnection for on this subtle difference from a stream socket). - /// - /// Unreliable messages may be dropped, or delivered out of order with respect to - /// each other or with respect to reliable messages. The same unreliable message - /// may be received multiple times. - /// - /// If any messages are returned, you MUST call SteamNetworkingMessage_t::Release() on each - /// of them free up resources after you are done. It is safe to keep the object alive for - /// a little while (put it into some queue, etc), and you may call Release() from any thread. - virtual int ReceiveMessagesOnConnection( HSteamNetConnection hConn, SteamNetworkingMessage_t **ppOutMessages, int nMaxMessages ) = 0; - - /// Returns basic information about the high-level state of the connection. - virtual bool GetConnectionInfo( HSteamNetConnection hConn, SteamNetConnectionInfo_t *pInfo ) = 0; - - /// Returns a small set of information about the real-time state of the connection - /// Returns false if the connection handle is invalid, or the connection has ended. - virtual bool GetQuickConnectionStatus( HSteamNetConnection hConn, SteamNetworkingQuickConnectionStatus *pStats ) = 0; - - /// Returns detailed connection stats in text format. Useful - /// for dumping to a log, etc. - /// - /// Returns: - /// -1 failure (bad connection handle) - /// 0 OK, your buffer was filled in and '\0'-terminated - /// >0 Your buffer was either nullptr, or it was too small and the text got truncated. - /// Try again with a buffer of at least N bytes. - virtual int GetDetailedConnectionStatus( HSteamNetConnection hConn, char *pszBuf, int cbBuf ) = 0; - - /// Returns local IP and port that a listen socket created using CreateListenSocketIP is bound to. - /// - /// An IPv6 address of ::0 means "any IPv4 or IPv6" - /// An IPv6 address of ::ffff:0000:0000 means "any IPv4" - virtual bool GetListenSocketAddress( HSteamListenSocket hSocket, SteamNetworkingIPAddr *address ) = 0; - - /// Create a pair of connections that are talking to each other, e.g. a loopback connection. - /// This is very useful for testing, or so that your client/server code can work the same - /// even when you are running a local "server". - /// - /// The two connections will immediately be placed into the connected state, and no callbacks - /// will be posted immediately. After this, if you close either connection, the other connection - /// will receive a callback, exactly as if they were communicating over the network. You must - /// close *both* sides in order to fully clean up the resources! - /// - /// By default, internal buffers are used, completely bypassing the network, the chopping up of - /// messages into packets, encryption, copying the payload, etc. This means that loopback - /// packets, by default, will not simulate lag or loss. Passing true for bUseNetworkLoopback will - /// cause the socket pair to send packets through the local network loopback device (127.0.0.1) - /// on ephemeral ports. Fake lag and loss are supported in this case, and CPU time is expended - /// to encrypt and decrypt. - /// - /// If you wish to assign a specific identity to either connection, you may pass a particular - /// identity. Otherwise, if you pass nullptr, the respective connection will assume a generic - /// "localhost" identity. If you use real network loopback, this might be translated to the - /// actual bound loopback port. Otherwise, the port will be zero. - virtual bool CreateSocketPair( HSteamNetConnection *pOutConnection1, HSteamNetConnection *pOutConnection2, bool bUseNetworkLoopback, const SteamNetworkingIdentity *pIdentity1, const SteamNetworkingIdentity *pIdentity2 ) = 0; - - /// Get the identity assigned to this interface. - /// E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned - /// to the gameserver. Returns false and sets the result to an invalid identity if we don't know - /// our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID - /// even if they are not signed into Steam.) - virtual bool GetIdentity( SteamNetworkingIdentity *pIdentity ) = 0; - - /// Indicate our desire to be ready participate in authenticated communications. - /// If we are currently not ready, then steps will be taken to obtain the necessary - /// certificates. (This includes a certificate for us, as well as any CA certificates - /// needed to authenticate peers.) - /// - /// You can call this at program init time if you know that you are going to - /// be making authenticated connections, so that we will be ready immediately when - /// those connections are attempted. (Note that essentially all connections require - /// authentication, with the exception of ordinary UDP connections with authentication - /// disabled using k_ESteamNetworkingConfig_IP_AllowWithoutAuth.) If you don't call - /// this function, we will wait until a feature is utilized that that necessitates - /// these resources. - /// - /// You can also call this function to force a retry, if failure has occurred. - /// Once we make an attempt and fail, we will not automatically retry. - /// In this respect, the behavior of the system after trying and failing is the same - /// as before the first attempt: attempting authenticated communication or calling - /// this function will call the system to attempt to acquire the necessary resources. - /// - /// You can use GetAuthenticationStatus or listen for SteamNetAuthenticationStatus_t - /// to monitor the status. - /// - /// Returns the current value that would be returned from GetAuthenticationStatus. - virtual ESteamNetworkingAvailability InitAuthentication() = 0; - - /// Query our readiness to participate in authenticated communications. A - /// SteamNetAuthenticationStatus_t callback is posted any time this status changes, - /// but you can use this function to query it at any time. - /// - /// The value of SteamNetAuthenticationStatus_t::m_eAvail is returned. If you only - /// want this high level status, you can pass NULL for pDetails. If you want further - /// details, pass non-NULL to receive them. - virtual ESteamNetworkingAvailability GetAuthenticationStatus( SteamNetAuthenticationStatus_t *pDetails ) = 0; - - // - // Poll groups. A poll group is a set of connections that can be polled efficiently. - // (In our API, to "poll" a connection means to retrieve all pending messages. We - // actually don't have an API to "poll" the connection *state*, like BSD sockets.) - // - - /// Create a new poll group. - /// - /// You should destroy the poll group when you are done using DestroyPollGroup - virtual HSteamNetPollGroup CreatePollGroup() = 0; - - /// Destroy a poll group created with CreatePollGroup(). - /// - /// If there are any connections in the poll group, they are removed from the group, - /// and left in a state where they are not part of any poll group. - /// Returns false if passed an invalid poll group handle. - virtual bool DestroyPollGroup( HSteamNetPollGroup hPollGroup ) = 0; - - /// Assign a connection to a poll group. Note that a connection may only belong to a - /// single poll group. Adding a connection to a poll group implicitly removes it from - /// any other poll group it is in. - /// - /// You can pass k_HSteamNetPollGroup_Invalid to remove a connection from its current - /// poll group without adding it to a new poll group. - /// - /// If there are received messages currently pending on the connection, an attempt - /// is made to add them to the queue of messages for the poll group in approximately - /// the order that would have applied if the connection was already part of the poll - /// group at the time that the messages were received. - /// - /// Returns false if the connection handle is invalid, or if the poll group handle - /// is invalid (and not k_HSteamNetPollGroup_Invalid). - virtual bool SetConnectionPollGroup( HSteamNetConnection hConn, HSteamNetPollGroup hPollGroup ) = 0; - - /// Same as ReceiveMessagesOnConnection, but will return the next messages available - /// on any connection in the poll group. Examine SteamNetworkingMessage_t::m_conn - /// to know which connection. (SteamNetworkingMessage_t::m_nConnUserData might also - /// be useful.) - /// - /// Delivery order of messages among different connections will usually match the - /// order that the last packet was received which completed the message. But this - /// is not a strong guarantee, especially for packets received right as a connection - /// is being assigned to poll group. - /// - /// Delivery order of messages on the same connection is well defined and the - /// same guarantees are present as mentioned in ReceiveMessagesOnConnection. - /// (But the messages are not grouped by connection, so they will not necessarily - /// appear consecutively in the list; they may be interleaved with messages for - /// other connections.) - virtual int ReceiveMessagesOnPollGroup( HSteamNetPollGroup hPollGroup, SteamNetworkingMessage_t **ppOutMessages, int nMaxMessages ) = 0; - -#ifdef STEAMNETWORKINGSOCKETS_ENABLE_SDR - - // - // Clients connecting to dedicated servers hosted in a data center, - // using central-authority-granted tickets. - // - - /// Call this when you receive a ticket from your backend / matchmaking system. Puts the - /// ticket into a persistent cache, and optionally returns the parsed ticket. - /// - /// See stamdatagram_ticketgen.h for more details. - virtual bool ReceivedRelayAuthTicket( const void *pvTicket, int cbTicket, SteamDatagramRelayAuthTicket *pOutParsedTicket ) = 0; - - /// Search cache for a ticket to talk to the server on the specified virtual port. - /// If found, returns the number of seconds until the ticket expires, and optionally - /// the complete cracked ticket. Returns 0 if we don't have a ticket. - /// - /// Typically this is useful just to confirm that you have a ticket, before you - /// call ConnectToHostedDedicatedServer to connect to the server. - virtual int FindRelayAuthTicketForServer( const SteamNetworkingIdentity &identityGameServer, int nRemoteVirtualPort, SteamDatagramRelayAuthTicket *pOutParsedTicket ) = 0; - - /// Client call to connect to a server hosted in a Valve data center, on the specified virtual - /// port. You must have placed a ticket for this server into the cache, or else this connect attempt will fail! - /// - /// You may wonder why tickets are stored in a cache, instead of simply being passed as an argument - /// here. The reason is to make reconnection to a gameserver robust, even if the client computer loses - /// connection to Steam or the central backend, or the app is restarted or crashes, etc. - /// - /// If you use this, you probably want to call ISteamNetworkingUtils::InitRelayNetworkAccess() - /// when your app initializes - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamNetConnection ConnectToHostedDedicatedServer( const SteamNetworkingIdentity &identityTarget, int nRemoteVirtualPort, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - // - // Servers hosted in data centers known to the Valve relay network - // - - /// Returns the value of the SDR_LISTEN_PORT environment variable. This - /// is the UDP server your server will be listening on. This will - /// configured automatically for you in production environments. - /// - /// In development, you'll need to set it yourself. See - /// https://partner.steamgames.com/doc/api/ISteamNetworkingSockets - /// for more information on how to configure dev environments. - virtual uint16 GetHostedDedicatedServerPort() = 0; - - /// Returns 0 if SDR_LISTEN_PORT is not set. Otherwise, returns the data center the server - /// is running in. This will be k_SteamDatagramPOPID_dev in non-production environment. - virtual SteamNetworkingPOPID GetHostedDedicatedServerPOPID() = 0; - - /// Return info about the hosted server. This contains the PoPID of the server, - /// and opaque routing information that can be used by the relays to send traffic - /// to your server. - /// - /// You will need to send this information to your backend, and put it in tickets, - /// so that the relays will know how to forward traffic from - /// clients to your server. See SteamDatagramRelayAuthTicket for more info. - /// - /// Also, note that the routing information is contained in SteamDatagramGameCoordinatorServerLogin, - /// so if possible, it's preferred to use GetGameCoordinatorServerLogin to send this info - /// to your game coordinator service, and also login securely at the same time. - /// - /// On a successful exit, k_EResultOK is returned - /// - /// Unsuccessful exit: - /// - Something other than k_EResultOK is returned. - /// - k_EResultInvalidState: We are not configured to listen for SDR (SDR_LISTEN_SOCKET - /// is not set.) - /// - k_EResultPending: we do not (yet) have the authentication information needed. - /// (See GetAuthenticationStatus.) If you use environment variables to pre-fetch - /// the network config, this data should always be available immediately. - /// - A non-localized diagnostic debug message will be placed in m_data that describes - /// the cause of the failure. - /// - /// NOTE: The returned blob is not encrypted. Send it to your backend, but don't - /// directly share it with clients. - virtual EResult GetHostedDedicatedServerAddress( SteamDatagramHostedAddress *pRouting ) = 0; - - /// Create a listen socket on the specified virtual port. The physical UDP port to use - /// will be determined by the SDR_LISTEN_PORT environment variable. If a UDP port is not - /// configured, this call will fail. - /// - /// Note that this call MUST be made through the SteamGameServerNetworkingSockets() interface - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamListenSocket CreateHostedDedicatedServerListenSocket( int nLocalVirtualPort, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Generate an authentication blob that can be used to securely login with - /// your backend, using SteamDatagram_ParseHostedServerLogin. (See - /// steamdatagram_gamecoordinator.h) - /// - /// Before calling the function: - /// - Populate the app data in pLoginInfo (m_cbAppData and m_appData). You can leave - /// all other fields uninitialized. - /// - *pcbSignedBlob contains the size of the buffer at pBlob. (It should be - /// at least k_cbMaxSteamDatagramGameCoordinatorServerLoginSerialized.) - /// - /// On a successful exit: - /// - k_EResultOK is returned - /// - All of the remaining fields of pLoginInfo will be filled out. - /// - *pcbSignedBlob contains the size of the serialized blob that has been - /// placed into pBlob. - /// - /// Unsuccessful exit: - /// - Something other than k_EResultOK is returned. - /// - k_EResultNotLoggedOn: you are not logged in (yet) - /// - See GetHostedDedicatedServerAddress for more potential failure return values. - /// - A non-localized diagnostic debug message will be placed in pBlob that describes - /// the cause of the failure. - /// - /// This works by signing the contents of the SteamDatagramGameCoordinatorServerLogin - /// with the cert that is issued to this server. In dev environments, it's OK if you do - /// not have a cert. (You will need to enable insecure dev login in SteamDatagram_ParseHostedServerLogin.) - /// Otherwise, you will need a signed cert. - /// - /// NOTE: The routing blob returned here is not encrypted. Send it to your backend - /// and don't share it directly with clients. - virtual EResult GetGameCoordinatorServerLogin( SteamDatagramGameCoordinatorServerLogin *pLoginInfo, int *pcbSignedBlob, void *pBlob ) = 0; -#endif // #ifndef STEAMNETWORKINGSOCKETS_ENABLE_SDR - - - // - // Relayed connections using custom signaling protocol - // - // This is used if you have your own method of sending out-of-band - // signaling / rendezvous messages through a mutually trusted channel. - // - - /// Create a P2P "client" connection that does signaling over a custom - /// rendezvous/signaling channel. - /// - /// pSignaling points to a new object that you create just for this connection. - /// It must stay valid until Release() is called. Once you pass the - /// object to this function, it assumes ownership. Release() will be called - /// from within the function call if the call fails. Furthermore, until Release() - /// is called, you should be prepared for methods to be invoked on your - /// object from any thread! You need to make sure your object is threadsafe! - /// Furthermore, you should make sure that dispatching the methods is done - /// as quickly as possible. - /// - /// This function will immediately construct a connection in the "connecting" - /// state. Soon after (perhaps before this function returns, perhaps in another thread), - /// the connection will begin sending signaling messages by calling - /// ISteamNetworkingConnectionCustomSignaling::SendSignal. - /// - /// When the remote peer accepts the connection (See - /// ISteamNetworkingCustomSignalingRecvContext::OnConnectRequest), - /// it will begin sending signaling messages. When these messages are received, - /// you can pass them to the connection using ReceivedP2PCustomSignal. - /// - /// If you know the identity of the peer that you expect to be on the other end, - /// you can pass their identity to improve debug output or just detect bugs. - /// If you don't know their identity yet, you can pass NULL, and their - /// identity will be established in the connection handshake. - /// - /// If you use this, you probably want to call ISteamNetworkingUtils::InitRelayNetworkAccess() - /// when your app initializes - /// - /// If you need to set any initial config options, pass them here. See - /// SteamNetworkingConfigValue_t for more about why this is preferable to - /// setting the options "immediately" after creation. - virtual HSteamNetConnection ConnectP2PCustomSignaling( ISteamNetworkingConnectionCustomSignaling *pSignaling, const SteamNetworkingIdentity *pPeerIdentity, int nRemoteVirtualPort, int nOptions, const SteamNetworkingConfigValue_t *pOptions ) = 0; - - /// Called when custom signaling has received a message. When your - /// signaling channel receives a message, it should save off whatever - /// routing information was in the envelope into the context object, - /// and then pass the payload to this function. - /// - /// A few different things can happen next, depending on the message: - /// - /// - If the signal is associated with existing connection, it is dealt - /// with immediately. If any replies need to be sent, they will be - /// dispatched using the ISteamNetworkingConnectionCustomSignaling - /// associated with the connection. - /// - If the message represents a connection request (and the request - /// is not redundant for an existing connection), a new connection - /// will be created, and ReceivedConnectRequest will be called on your - /// context object to determine how to proceed. - /// - Otherwise, the message is for a connection that does not - /// exist (anymore). In this case, we *may* call SendRejectionReply - /// on your context object. - /// - /// In any case, we will not save off pContext or access it after this - /// function returns. - /// - /// Returns true if the message was parsed and dispatched without anything - /// unusual or suspicious happening. Returns false if there was some problem - /// with the message that prevented ordinary handling. (Debug output will - /// usually have more information.) - /// - /// If you expect to be using relayed connections, then you probably want - /// to call ISteamNetworkingUtils::InitRelayNetworkAccess() when your app initializes - virtual bool ReceivedP2PCustomSignal( const void *pMsg, int cbMsg, ISteamNetworkingCustomSignalingRecvContext *pContext ) = 0; - -// -// Certificate provision by the application. On Steam, we normally handle all this automatically -// and you will not need to use these advanced functions. -// - - /// Get blob that describes a certificate request. You can send this to your game coordinator. - /// Upon entry, *pcbBlob should contain the size of the buffer. On successful exit, it will - /// return the number of bytes that were populated. You can pass pBlob=NULL to query for the required - /// size. (256 bytes is a very conservative estimate.) - /// - /// Pass this blob to your game coordinator and call SteamDatagram_CreateCert. - virtual bool GetCertificateRequest( int *pcbBlob, void *pBlob, SteamNetworkingErrMsg &errMsg ) = 0; - - /// Set the certificate. The certificate blob should be the output of - /// SteamDatagram_CreateCert. - virtual bool SetCertificate( const void *pCertificate, int cbCertificate, SteamNetworkingErrMsg &errMsg ) = 0; - - /// Invoke all callback functions queued for this interface. - /// See k_ESteamNetworkingConfig_Callback_ConnectionStatusChanged, etc - /// - /// You don't need to call this if you are using Steam's callback dispatch - /// mechanism (SteamAPI_RunCallbacks and SteamGameserver_RunCallbacks). - virtual void RunCallbacks() = 0; -protected: - ~ISteamNetworkingSockets(); // Silence some warnings -}; -#define STEAMNETWORKINGSOCKETS_INTERFACE_VERSION "SteamNetworkingSockets009" - -// Global accessor. -#if defined( STEAMNETWORKINGSOCKETS_PARTNER ) - - // Standalone lib. Use different symbol name, so that we can dynamically switch between steamclient.dll - // and the standalone lib - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingSockets *SteamNetworkingSockets_Lib(); - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingSockets *SteamGameServerNetworkingSockets_Lib(); - inline ISteamNetworkingSockets *SteamNetworkingSockets() { return SteamNetworkingSockets_Lib(); } - inline ISteamNetworkingSockets *SteamGameServerNetworkingSockets() { return SteamGameServerNetworkingSockets_Lib(); } - -#elif defined( STEAMNETWORKINGSOCKETS_OPENSOURCE ) || defined( STEAMNETWORKINGSOCKETS_STREAMINGCLIENT ) - - // Opensource GameNetworkingSockets - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingSockets *SteamNetworkingSockets(); - -#else - - // Steamworks SDK - inline ISteamNetworkingSockets *SteamNetworkingSockets(); - STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamNetworkingSockets *, SteamNetworkingSockets, STEAMNETWORKINGSOCKETS_INTERFACE_VERSION ); - inline ISteamNetworkingSockets *SteamGameServerNetworkingSockets(); - STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamNetworkingSockets *, SteamGameServerNetworkingSockets, STEAMNETWORKINGSOCKETS_INTERFACE_VERSION ); -#endif - -/// Callback struct used to notify when a connection has changed state -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error "Must define VALVE_CALLBACK_PACK_SMALL or VALVE_CALLBACK_PACK_LARGE" -#endif - -/// This callback is posted whenever a connection is created, destroyed, or changes state. -/// The m_info field will contain a complete description of the connection at the time the -/// change occurred and the callback was posted. In particular, m_eState will have the -/// new connection state. -/// -/// You will usually need to listen for this callback to know when: -/// - A new connection arrives on a listen socket. -/// m_info.m_hListenSocket will be set, m_eOldState = k_ESteamNetworkingConnectionState_None, -/// and m_info.m_eState = k_ESteamNetworkingConnectionState_Connecting. -/// See ISteamNetworkigSockets::AcceptConnection. -/// - A connection you initiated has been accepted by the remote host. -/// m_eOldState = k_ESteamNetworkingConnectionState_Connecting, and -/// m_info.m_eState = k_ESteamNetworkingConnectionState_Connected. -/// Some connections might transition to k_ESteamNetworkingConnectionState_FindingRoute first. -/// - A connection has been actively rejected or closed by the remote host. -/// m_eOldState = k_ESteamNetworkingConnectionState_Connecting or k_ESteamNetworkingConnectionState_Connected, -/// and m_info.m_eState = k_ESteamNetworkingConnectionState_ClosedByPeer. m_info.m_eEndReason -/// and m_info.m_szEndDebug will have for more details. -/// NOTE: upon receiving this callback, you must still destroy the connection using -/// ISteamNetworkingSockets::CloseConnection to free up local resources. (The details -/// passed to the function are not used in this case, since the connection is already closed.) -/// - A problem was detected with the connection, and it has been closed by the local host. -/// The most common failure is timeout, but other configuration or authentication failures -/// can cause this. m_eOldState = k_ESteamNetworkingConnectionState_Connecting or -/// k_ESteamNetworkingConnectionState_Connected, and m_info.m_eState = k_ESteamNetworkingConnectionState_ProblemDetectedLocally. -/// m_info.m_eEndReason and m_info.m_szEndDebug will have for more details. -/// NOTE: upon receiving this callback, you must still destroy the connection using -/// ISteamNetworkingSockets::CloseConnection to free up local resources. (The details -/// passed to the function are not used in this case, since the connection is already closed.) -/// -/// Remember that callbacks are posted to a queue, and networking connections can -/// change at any time. It is possible that the connection has already changed -/// state by the time you process this callback. -/// -/// Also note that callbacks will be posted when connections are created and destroyed by your own API calls. -struct SteamNetConnectionStatusChangedCallback_t -{ - enum { k_iCallback = k_iSteamNetworkingSocketsCallbacks + 1 }; - - /// Connection handle - HSteamNetConnection m_hConn; - - /// Full connection info - SteamNetConnectionInfo_t m_info; - - /// Previous state. (Current state is in m_info.m_eState) - ESteamNetworkingConnectionState m_eOldState; -}; - -/// A struct used to describe our readiness to participate in authenticated, -/// encrypted communication. In order to do this we need: -/// -/// - The list of trusted CA certificates that might be relevant for this -/// app. -/// - A valid certificate issued by a CA. -/// -/// This callback is posted whenever the state of our readiness changes. -struct SteamNetAuthenticationStatus_t -{ - enum { k_iCallback = k_iSteamNetworkingSocketsCallbacks + 2 }; - - /// Status - ESteamNetworkingAvailability m_eAvail; - - /// Non-localized English language status. For diagnostic/debugging - /// purposes only. - char m_debugMsg[ 256 ]; -}; - -#pragma pack( pop ) - -#endif // ISTEAMNETWORKINGSOCKETS diff --git a/lib/steamworks_150/public/steam/isteamnetworkingutils.h b/lib/steamworks_150/public/steam/isteamnetworkingutils.h deleted file mode 100644 index 0f15f73..0000000 --- a/lib/steamworks_150/public/steam/isteamnetworkingutils.h +++ /dev/null @@ -1,441 +0,0 @@ -//====== Copyright Valve Corporation, All rights reserved. ==================== -// -// Purpose: misc networking utilities -// -//============================================================================= - -#ifndef ISTEAMNETWORKINGUTILS -#define ISTEAMNETWORKINGUTILS -#ifdef _WIN32 -#pragma once -#endif - -#include - -#include "steamnetworkingtypes.h" -struct SteamDatagramRelayAuthTicket; -struct SteamRelayNetworkStatus_t; - -//----------------------------------------------------------------------------- -/// Misc networking utilities for checking the local networking environment -/// and estimating pings. -class ISteamNetworkingUtils -{ -public: - // - // Efficient message sending - // - - /// Allocate and initialize a message object. Usually the reason - /// you call this is to pass it to ISteamNetworkingSockets::SendMessages. - /// The returned object will have all of the relevant fields cleared to zero. - /// - /// Optionally you can also request that this system allocate space to - /// hold the payload itself. If cbAllocateBuffer is nonzero, the system - /// will allocate memory to hold a payload of at least cbAllocateBuffer bytes. - /// m_pData will point to the allocated buffer, m_cbSize will be set to the - /// size, and m_pfnFreeData will be set to the proper function to free up - /// the buffer. - /// - /// If cbAllocateBuffer=0, then no buffer is allocated. m_pData will be NULL, - /// m_cbSize will be zero, and m_pfnFreeData will be NULL. You will need to - /// set each of these. - virtual SteamNetworkingMessage_t *AllocateMessage( int cbAllocateBuffer ) = 0; - - // - // Access to Steam Datagram Relay (SDR) network - // - -#ifdef STEAMNETWORKINGSOCKETS_ENABLE_SDR - - // - // Initialization and status check - // - - /// If you know that you are going to be using the relay network (for example, - /// because you anticipate making P2P connections), call this to initialize the - /// relay network. If you do not call this, the initialization will - /// be delayed until the first time you use a feature that requires access - /// to the relay network, which will delay that first access. - /// - /// You can also call this to force a retry if the previous attempt has failed. - /// Performing any action that requires access to the relay network will also - /// trigger a retry, and so calling this function is never strictly necessary, - /// but it can be useful to call it a program launch time, if access to the - /// relay network is anticipated. - /// - /// Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t - /// callbacks to know when initialization has completed. - /// Typically initialization completes in a few seconds. - /// - /// Note: dedicated servers hosted in known data centers do *not* need - /// to call this, since they do not make routing decisions. However, if - /// the dedicated server will be using P2P functionality, it will act as - /// a "client" and this should be called. - inline void InitRelayNetworkAccess(); - - /// Fetch current status of the relay network. - /// - /// SteamRelayNetworkStatus_t is also a callback. It will be triggered on - /// both the user and gameserver interfaces any time the status changes, or - /// ping measurement starts or stops. - /// - /// SteamRelayNetworkStatus_t::m_eAvail is returned. If you want - /// more details, you can pass a non-NULL value. - virtual ESteamNetworkingAvailability GetRelayNetworkStatus( SteamRelayNetworkStatus_t *pDetails ) = 0; - - // - // "Ping location" functions - // - // We use the ping times to the valve relays deployed worldwide to - // generate a "marker" that describes the location of an Internet host. - // Given two such markers, we can estimate the network latency between - // two hosts, without sending any packets. The estimate is based on the - // optimal route that is found through the Valve network. If you are - // using the Valve network to carry the traffic, then this is precisely - // the ping you want. If you are not, then the ping time will probably - // still be a reasonable estimate. - // - // This is extremely useful to select peers for matchmaking! - // - // The markers can also be converted to a string, so they can be transmitted. - // We have a separate library you can use on your app's matchmaking/coordinating - // server to manipulate these objects. (See steamdatagram_gamecoordinator.h) - - /// Return location info for the current host. Returns the approximate - /// age of the data, in seconds, or -1 if no data is available. - /// - /// It takes a few seconds to initialize access to the relay network. If - /// you call this very soon after calling InitRelayNetworkAccess, - /// the data may not be available yet. - /// - /// This always return the most up-to-date information we have available - /// right now, even if we are in the middle of re-calculating ping times. - virtual float GetLocalPingLocation( SteamNetworkPingLocation_t &result ) = 0; - - /// Estimate the round-trip latency between two arbitrary locations, in - /// milliseconds. This is a conservative estimate, based on routing through - /// the relay network. For most basic relayed connections, this ping time - /// will be pretty accurate, since it will be based on the route likely to - /// be actually used. - /// - /// If a direct IP route is used (perhaps via NAT traversal), then the route - /// will be different, and the ping time might be better. Or it might actually - /// be a bit worse! Standard IP routing is frequently suboptimal! - /// - /// But even in this case, the estimate obtained using this method is a - /// reasonable upper bound on the ping time. (Also it has the advantage - /// of returning immediately and not sending any packets.) - /// - /// In a few cases we might not able to estimate the route. In this case - /// a negative value is returned. k_nSteamNetworkingPing_Failed means - /// the reason was because of some networking difficulty. (Failure to - /// ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot - /// currently answer the question for some other reason. - /// - /// Do you need to be able to do this from a backend/matchmaking server? - /// You are looking for the "ticketgen" library. - virtual int EstimatePingTimeBetweenTwoLocations( const SteamNetworkPingLocation_t &location1, const SteamNetworkPingLocation_t &location2 ) = 0; - - /// Same as EstimatePingTime, but assumes that one location is the local host. - /// This is a bit faster, especially if you need to calculate a bunch of - /// these in a loop to find the fastest one. - /// - /// In rare cases this might return a slightly different estimate than combining - /// GetLocalPingLocation with EstimatePingTimeBetweenTwoLocations. That's because - /// this function uses a slightly more complete set of information about what - /// route would be taken. - virtual int EstimatePingTimeFromLocalHost( const SteamNetworkPingLocation_t &remoteLocation ) = 0; - - /// Convert a ping location into a text format suitable for sending over the wire. - /// The format is a compact and human readable. However, it is subject to change - /// so please do not parse it yourself. Your buffer must be at least - /// k_cchMaxSteamNetworkingPingLocationString bytes. - virtual void ConvertPingLocationToString( const SteamNetworkPingLocation_t &location, char *pszBuf, int cchBufSize ) = 0; - - /// Parse back SteamNetworkPingLocation_t string. Returns false if we couldn't understand - /// the string. - virtual bool ParsePingLocationString( const char *pszString, SteamNetworkPingLocation_t &result ) = 0; - - /// Check if the ping data of sufficient recency is available, and if - /// it's too old, start refreshing it. - /// - /// Please only call this function when you *really* do need to force an - /// immediate refresh of the data. (For example, in response to a specific - /// user input to refresh this information.) Don't call it "just in case", - /// before every connection, etc. That will cause extra traffic to be sent - /// for no benefit. The library will automatically refresh the information - /// as needed. - /// - /// Returns true if sufficiently recent data is already available. - /// - /// Returns false if sufficiently recent data is not available. In this - /// case, ping measurement is initiated, if it is not already active. - /// (You cannot restart a measurement already in progress.) - /// - /// You can use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t - /// to know when ping measurement completes. - virtual bool CheckPingDataUpToDate( float flMaxAgeSeconds ) = 0; - - // - // List of Valve data centers, and ping times to them. This might - // be useful to you if you are use our hosting, or just need to measure - // latency to a cloud data center where we are running relays. - // - - /// Fetch ping time of best available relayed route from this host to - /// the specified data center. - virtual int GetPingToDataCenter( SteamNetworkingPOPID popID, SteamNetworkingPOPID *pViaRelayPoP ) = 0; - - /// Get *direct* ping time to the relays at the data center. - virtual int GetDirectPingToPOP( SteamNetworkingPOPID popID ) = 0; - - /// Get number of network points of presence in the config - virtual int GetPOPCount() = 0; - - /// Get list of all POP IDs. Returns the number of entries that were filled into - /// your list. - virtual int GetPOPList( SteamNetworkingPOPID *list, int nListSz ) = 0; -#endif // #ifdef STEAMNETWORKINGSOCKETS_ENABLE_SDR - - // - // Misc - // - - /// Fetch current timestamp. This timer has the following properties: - /// - /// - Monotonicity is guaranteed. - /// - The initial value will be at least 24*3600*30*1e6, i.e. about - /// 30 days worth of microseconds. In this way, the timestamp value of - /// 0 will always be at least "30 days ago". Also, negative numbers - /// will never be returned. - /// - Wraparound / overflow is not a practical concern. - /// - /// If you are running under the debugger and stop the process, the clock - /// might not advance the full wall clock time that has elapsed between - /// calls. If the process is not blocked from normal operation, the - /// timestamp values will track wall clock time, even if you don't call - /// the function frequently. - /// - /// The value is only meaningful for this run of the process. Don't compare - /// it to values obtained on another computer, or other runs of the same process. - virtual SteamNetworkingMicroseconds GetLocalTimestamp() = 0; - - /// Set a function to receive network-related information that is useful for debugging. - /// This can be very useful during development, but it can also be useful for troubleshooting - /// problems with tech savvy end users. If you have a console or other log that customers - /// can examine, these log messages can often be helpful to troubleshoot network issues. - /// (Especially any warning/error messages.) - /// - /// The detail level indicates what message to invoke your callback on. Lower numeric - /// 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 - /// all of the expense of formatting the messages, which are then discarded. Setting a high - /// priority value (low numeric value) here allows the library to avoid doing this work. - /// - /// IMPORTANT: This may be called from a service thread, while we own a mutex, etc. - /// Your output function must be threadsafe and fast! Do not make any other - /// Steamworks calls from within the handler. - virtual void SetDebugOutputFunction( ESteamNetworkingSocketsDebugOutputType eDetailLevel, FSteamNetworkingSocketsDebugOutput pfnFunc ) = 0; - - // - // Set and get configuration values, see ESteamNetworkingConfigValue for individual descriptions. - // - - // Shortcuts for common cases. (Implemented as inline functions below) - bool SetGlobalConfigValueInt32( ESteamNetworkingConfigValue eValue, int32 val ); - bool SetGlobalConfigValueFloat( ESteamNetworkingConfigValue eValue, float val ); - bool SetGlobalConfigValueString( ESteamNetworkingConfigValue eValue, const char *val ); - bool SetGlobalConfigValuePtr( ESteamNetworkingConfigValue eValue, void *val ); - bool SetConnectionConfigValueInt32( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, int32 val ); - bool SetConnectionConfigValueFloat( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, float val ); - bool SetConnectionConfigValueString( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, const char *val ); - - // - // Set global callbacks. If you do not want to use Steam's callback dispatch mechanism and you - // want to use the same callback on all (or most) listen sockets and connections, then - // simply install these callbacks first thing, and you are good to go. - // See ISteamNetworkingSockets::RunCallbacks - // - bool SetGlobalCallback_SteamNetConnectionStatusChanged( FnSteamNetConnectionStatusChanged fnCallback ); - bool SetGlobalCallback_SteamNetAuthenticationStatusChanged( FnSteamNetAuthenticationStatusChanged fnCallback ); - bool SetGlobalCallback_SteamRelayNetworkStatusChanged( FnSteamRelayNetworkStatusChanged fnCallback ); - bool SetGlobalCallback_MessagesSessionRequest( FnSteamNetworkingMessagesSessionRequest fnCallback ); - bool SetGlobalCallback_MessagesSessionFailed( FnSteamNetworkingMessagesSessionFailed fnCallback ); - - /// Set a configuration value. - /// - eValue: which value is being set - /// - eScope: Onto what type of object are you applying the setting? - /// - scopeArg: Which object you want to change? (Ignored for global scope). E.g. connection handle, listen socket handle, interface pointer, etc. - /// - eDataType: What type of data is in the buffer at pValue? This must match the type of the variable exactly! - /// - pArg: Value to set it to. You can pass NULL to remove a non-global setting at this scope, - /// causing the value for that object to use global defaults. Or at global scope, passing NULL - /// will reset any custom value and restore it to the system default. - /// NOTE: When setting pointers (e.g. callback functions), do not pass the function pointer directly. - /// Your argument should be a pointer to a function pointer. - virtual bool SetConfigValue( ESteamNetworkingConfigValue eValue, ESteamNetworkingConfigScope eScopeType, intptr_t scopeObj, - ESteamNetworkingConfigDataType eDataType, const void *pArg ) = 0; - - /// Set a configuration value, using a struct to pass the value. - /// (This is just a convenience shortcut; see below for the implementation and - /// a little insight into how SteamNetworkingConfigValue_t is used when - /// setting config options during listen socket and connection creation.) - bool SetConfigValueStruct( const SteamNetworkingConfigValue_t &opt, ESteamNetworkingConfigScope eScopeType, intptr_t scopeObj ); - - /// Get a configuration value. - /// - eValue: which value to fetch - /// - eScopeType: query setting on what type of object - /// - eScopeArg: the object to query the setting for - /// - pOutDataType: If non-NULL, the data type of the value is returned. - /// - pResult: Where to put the result. Pass NULL to query the required buffer size. (k_ESteamNetworkingGetConfigValue_BufferTooSmall will be returned.) - /// - cbResult: IN: the size of your buffer. OUT: the number of bytes filled in or required. - virtual ESteamNetworkingGetConfigValueResult GetConfigValue( ESteamNetworkingConfigValue eValue, ESteamNetworkingConfigScope eScopeType, intptr_t scopeObj, - ESteamNetworkingConfigDataType *pOutDataType, void *pResult, size_t *cbResult ) = 0; - - /// Returns info about a configuration value. Returns false if the value does not exist. - /// pOutNextValue can be used to iterate through all of the known configuration values. - /// (Use GetFirstConfigValue() to begin the iteration, will be k_ESteamNetworkingConfig_Invalid on the last value) - /// Any of the output parameters can be NULL if you do not need that information. - /// - /// See k_ESteamNetworkingConfig_EnumerateDevVars for some more info about "dev" variables, - /// which are usually excluded from the set of variables enumerated using this function. - virtual bool GetConfigValueInfo( ESteamNetworkingConfigValue eValue, const char **pOutName, ESteamNetworkingConfigDataType *pOutDataType, ESteamNetworkingConfigScope *pOutScope, ESteamNetworkingConfigValue *pOutNextValue ) = 0; - - /// Return the lowest numbered configuration value available in the current environment. - virtual ESteamNetworkingConfigValue GetFirstConfigValue() = 0; - - // String conversions. You'll usually access these using the respective - // inline methods. - virtual void SteamNetworkingIPAddr_ToString( const SteamNetworkingIPAddr &addr, char *buf, size_t cbBuf, bool bWithPort ) = 0; - virtual bool SteamNetworkingIPAddr_ParseString( SteamNetworkingIPAddr *pAddr, const char *pszStr ) = 0; - virtual void SteamNetworkingIdentity_ToString( const SteamNetworkingIdentity &identity, char *buf, size_t cbBuf ) = 0; - virtual bool SteamNetworkingIdentity_ParseString( SteamNetworkingIdentity *pIdentity, const char *pszStr ) = 0; - -protected: - ~ISteamNetworkingUtils(); // Silence some warnings -}; -#define STEAMNETWORKINGUTILS_INTERFACE_VERSION "SteamNetworkingUtils003" - -// Global accessor. -#ifdef STEAMNETWORKINGSOCKETS_STANDALONELIB - - // Standalone lib - STEAMNETWORKINGSOCKETS_INTERFACE ISteamNetworkingUtils *SteamNetworkingUtils_Lib(); - inline ISteamNetworkingUtils *SteamNetworkingUtils() { return SteamNetworkingUtils_Lib(); } - -#else - - // Steamworks SDK - inline ISteamNetworkingUtils *SteamNetworkingUtils(); - STEAM_DEFINE_INTERFACE_ACCESSOR( ISteamNetworkingUtils *, SteamNetworkingUtils, - /* Prefer user version of the interface. But if it isn't found, then use - gameserver one. Yes, this is a completely terrible hack */ - SteamInternal_FindOrCreateUserInterface( 0, STEAMNETWORKINGUTILS_INTERFACE_VERSION ) ? - SteamInternal_FindOrCreateUserInterface( 0, STEAMNETWORKINGUTILS_INTERFACE_VERSION ) : - SteamInternal_FindOrCreateGameServerInterface( 0, STEAMNETWORKINGUTILS_INTERFACE_VERSION ), - "global", - STEAMNETWORKINGUTILS_INTERFACE_VERSION - ) -#endif - -/// A struct used to describe our readiness to use the relay network. -/// To do this we first need to fetch the network configuration, -/// which describes what POPs are available. -struct SteamRelayNetworkStatus_t -{ - enum { k_iCallback = k_iSteamNetworkingUtilsCallbacks + 1 }; - - /// Summary status. When this is "current", initialization has - /// completed. Anything else means you are not ready yet, or - /// there is a significant problem. - ESteamNetworkingAvailability m_eAvail; - - /// Nonzero if latency measurement is in progress (or pending, - /// awaiting a prerequisite). - int m_bPingMeasurementInProgress; - - /// Status obtaining the network config. This is a prerequisite - /// for relay network access. - /// - /// Failure to obtain the network config almost always indicates - /// a problem with the local internet connection. - ESteamNetworkingAvailability m_eAvailNetworkConfig; - - /// Current ability to communicate with ANY relay. Note that - /// the complete failure to communicate with any relays almost - /// always indicates a problem with the local Internet connection. - /// (However, just because you can reach a single relay doesn't - /// mean that the local connection is in perfect health.) - ESteamNetworkingAvailability m_eAvailAnyRelay; - - /// Non-localized English language status. For diagnostic/debugging - /// purposes only. - 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 ]; -}; - -/////////////////////////////////////////////////////////////////////////////// -// -// Internal stuff - -#ifdef STEAMNETWORKINGSOCKETS_ENABLE_SDR -inline void ISteamNetworkingUtils::InitRelayNetworkAccess() { CheckPingDataUpToDate( 1e10f ); } -#endif - -inline bool ISteamNetworkingUtils::SetGlobalConfigValueInt32( ESteamNetworkingConfigValue eValue, int32 val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Global, 0, k_ESteamNetworkingConfig_Int32, &val ); } -inline bool ISteamNetworkingUtils::SetGlobalConfigValueFloat( ESteamNetworkingConfigValue eValue, float val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Global, 0, k_ESteamNetworkingConfig_Float, &val ); } -inline bool ISteamNetworkingUtils::SetGlobalConfigValueString( ESteamNetworkingConfigValue eValue, const char *val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Global, 0, k_ESteamNetworkingConfig_String, val ); } -inline bool ISteamNetworkingUtils::SetGlobalConfigValuePtr( ESteamNetworkingConfigValue eValue, void *val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Global, 0, k_ESteamNetworkingConfig_Ptr, &val ); } // Note: passing pointer to pointer. -inline bool ISteamNetworkingUtils::SetConnectionConfigValueInt32( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, int32 val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Connection, hConn, k_ESteamNetworkingConfig_Int32, &val ); } -inline bool ISteamNetworkingUtils::SetConnectionConfigValueFloat( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, float val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Connection, hConn, k_ESteamNetworkingConfig_Float, &val ); } -inline bool ISteamNetworkingUtils::SetConnectionConfigValueString( HSteamNetConnection hConn, ESteamNetworkingConfigValue eValue, const char *val ) { return SetConfigValue( eValue, k_ESteamNetworkingConfig_Connection, hConn, k_ESteamNetworkingConfig_String, val ); } -inline bool ISteamNetworkingUtils::SetGlobalCallback_SteamNetConnectionStatusChanged( FnSteamNetConnectionStatusChanged fnCallback ) { return SetGlobalConfigValuePtr( k_ESteamNetworkingConfig_Callback_ConnectionStatusChanged, (void*)fnCallback ); } -inline bool ISteamNetworkingUtils::SetGlobalCallback_SteamNetAuthenticationStatusChanged( FnSteamNetAuthenticationStatusChanged fnCallback ) { return SetGlobalConfigValuePtr( k_ESteamNetworkingConfig_Callback_AuthStatusChanged, (void*)fnCallback ); } -inline bool ISteamNetworkingUtils::SetGlobalCallback_SteamRelayNetworkStatusChanged( FnSteamRelayNetworkStatusChanged fnCallback ) { return SetGlobalConfigValuePtr( k_ESteamNetworkingConfig_Callback_RelayNetworkStatusChanged, (void*)fnCallback ); } -inline bool ISteamNetworkingUtils::SetGlobalCallback_MessagesSessionRequest( FnSteamNetworkingMessagesSessionRequest fnCallback ) { return SetGlobalConfigValuePtr( k_ESteamNetworkingConfig_Callback_MessagesSessionRequest, (void*)fnCallback ); } -inline bool ISteamNetworkingUtils::SetGlobalCallback_MessagesSessionFailed( FnSteamNetworkingMessagesSessionFailed fnCallback ) { return SetGlobalConfigValuePtr( k_ESteamNetworkingConfig_Callback_MessagesSessionFailed, (void*)fnCallback ); } - -inline bool ISteamNetworkingUtils::SetConfigValueStruct( const SteamNetworkingConfigValue_t &opt, ESteamNetworkingConfigScope eScopeType, intptr_t scopeObj ) -{ - // Locate the argument. Strings are a special case, since the - // "value" (the whole string buffer) doesn't fit in the struct - // NOTE: for pointer values, we pass a pointer to the pointer, - // we do not pass the pointer directly. - const void *pVal = ( opt.m_eDataType == k_ESteamNetworkingConfig_String ) ? (const void *)opt.m_val.m_string : (const void *)&opt.m_val; - return SetConfigValue( opt.m_eValue, eScopeType, scopeObj, opt.m_eDataType, pVal ); -} - -#if !defined( STEAMNETWORKINGSOCKETS_STATIC_LINK ) && defined( STEAMNETWORKINGSOCKETS_STEAMCLIENT ) -inline void SteamNetworkingIPAddr::ToString( char *buf, size_t cbBuf, bool bWithPort ) const { SteamNetworkingUtils()->SteamNetworkingIPAddr_ToString( *this, buf, cbBuf, bWithPort ); } -inline bool SteamNetworkingIPAddr::ParseString( const char *pszStr ) { return SteamNetworkingUtils()->SteamNetworkingIPAddr_ParseString( this, pszStr ); } -inline void SteamNetworkingIdentity::ToString( char *buf, size_t cbBuf ) const { SteamNetworkingUtils()->SteamNetworkingIdentity_ToString( *this, buf, cbBuf ); } -inline bool SteamNetworkingIdentity::ParseString( const char *pszStr ) { return SteamNetworkingUtils()->SteamNetworkingIdentity_ParseString( this, pszStr ); } -#endif - -#endif // ISTEAMNETWORKINGUTILS diff --git a/lib/steamworks_150/public/steam/isteamparentalsettings.h b/lib/steamworks_150/public/steam/isteamparentalsettings.h deleted file mode 100644 index 2a22b01..0000000 --- a/lib/steamworks_150/public/steam/isteamparentalsettings.h +++ /dev/null @@ -1,63 +0,0 @@ -//====== Copyright � 2013-, Valve Corporation, All rights reserved. ======= -// -// Purpose: Interface to Steam parental settings (Family View) -// -//============================================================================= - -#ifndef ISTEAMPARENTALSETTINGS_H -#define ISTEAMPARENTALSETTINGS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -// Feature types for parental settings -enum EParentalFeature -{ - k_EFeatureInvalid = 0, - k_EFeatureStore = 1, - k_EFeatureCommunity = 2, - k_EFeatureProfile = 3, - k_EFeatureFriends = 4, - k_EFeatureNews = 5, - k_EFeatureTrading = 6, - k_EFeatureSettings = 7, - k_EFeatureConsole = 8, - k_EFeatureBrowser = 9, - k_EFeatureParentalSetup = 10, - k_EFeatureLibrary = 11, - k_EFeatureTest = 12, - k_EFeatureSiteLicense = 13, - k_EFeatureMax -}; - -class ISteamParentalSettings -{ -public: - virtual bool BIsParentalLockEnabled() = 0; - virtual bool BIsParentalLockLocked() = 0; - - virtual bool BIsAppBlocked( AppId_t nAppID ) = 0; - virtual bool BIsAppInBlockList( AppId_t nAppID ) = 0; - - virtual bool BIsFeatureBlocked( EParentalFeature eFeature ) = 0; - virtual bool BIsFeatureInBlockList( EParentalFeature eFeature ) = 0; -}; - -#define STEAMPARENTALSETTINGS_INTERFACE_VERSION "STEAMPARENTALSETTINGS_INTERFACE_VERSION001" - -// Global interface accessor -inline ISteamParentalSettings *SteamParentalSettings(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamParentalSettings *, SteamParentalSettings, STEAMPARENTALSETTINGS_INTERFACE_VERSION ); - -//----------------------------------------------------------------------------- -// Purpose: Callback for querying UGC -//----------------------------------------------------------------------------- -struct SteamParentalSettingsChanged_t -{ - enum { k_iCallback = k_ISteamParentalSettingsCallbacks + 1 }; -}; - - -#endif // ISTEAMPARENTALSETTINGS_H diff --git a/lib/steamworks_150/public/steam/isteamps3overlayrenderer.h b/lib/steamworks_150/public/steam/isteamps3overlayrenderer.h deleted file mode 100644 index 4e07d4a..0000000 --- a/lib/steamworks_150/public/steam/isteamps3overlayrenderer.h +++ /dev/null @@ -1,91 +0,0 @@ -//====== Copyright © 1996-2010, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface the game must provide Steam with on PS3 in order for the -// Steam overlay to render. -// -//============================================================================= - -#ifndef ISTEAMPS3OVERLAYRENDERER_H -#define ISTEAMPS3OVERLAYRENDERER_H -#ifdef _WIN32 -#pragma once -#endif - -#include "cell/pad.h" - -//----------------------------------------------------------------------------- -// Purpose: Enum for supported gradient directions -//----------------------------------------------------------------------------- -enum EOverlayGradientDirection -{ - k_EOverlayGradientHorizontal = 1, - k_EOverlayGradientVertical = 2, - k_EOverlayGradientNone = 3, -}; - -// Helpers for fetching individual color components from ARGB packed DWORD colors Steam PS3 overlay renderer uses. -#define STEAM_COLOR_RED( color ) \ - (int)(((color)>>16)&0xff) - -#define STEAM_COLOR_GREEN( color ) \ - (int)(((color)>>8)&0xff) - -#define STEAM_COLOR_BLUE( color ) \ - (int)((color)&0xff) - -#define STEAM_COLOR_ALPHA( color ) \ - (int)(((color)>>24)&0xff) - - -//----------------------------------------------------------------------------- -// Purpose: Interface the game must expose to Steam for rendering -//----------------------------------------------------------------------------- -class ISteamPS3OverlayRenderHost -{ -public: - - // Interface for game engine to implement which Steam requires to render. - - // Draw a textured rect. This may use only part of the texture and will pass texture coords, it will also possibly request a gradient and will specify colors for vertexes. - virtual void DrawTexturedRect( int x0, int y0, int x1, int y1, float u0, float v0, float u1, float v1, int32 iTextureID, DWORD colorStart, DWORD colorEnd, EOverlayGradientDirection eDirection ) = 0; - - // Load a RGBA texture for Steam, or update a previously loaded one. Updates may be partial. You must not evict or remove this texture once Steam has uploaded it. - virtual void LoadOrUpdateTexture( int32 iTextureID, bool bIsFullTexture, int x0, int y0, uint32 uWidth, uint32 uHeight, int32 iBytes, char *pData ) = 0; - - // Delete a texture Steam previously uploaded - virtual void DeleteTexture( int32 iTextureID ) = 0; - - // Delete all previously uploaded textures - virtual void DeleteAllTextures() = 0; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Interface Steam exposes for the game to tell it when to render, etc. -//----------------------------------------------------------------------------- -class ISteamPS3OverlayRender -{ -public: - - // Call once at startup to initialize the Steam overlay and pass it your host interface ptr - virtual bool BHostInitialize( uint32 unScreenWidth, uint32 unScreenHeight, uint32 unRefreshRate, ISteamPS3OverlayRenderHost *pRenderHost, void *CellFontLib ) = 0; - - // Call this once a frame when you are ready for the Steam overlay to render (ie, right before flipping buffers, after all your rendering) - virtual void Render() = 0; - - // Call this everytime you read input on PS3. - // - // If this returns true, then the overlay is active and has consumed the input, your game - // should then ignore all the input until BHandleCellPadData once again returns false, which - // will mean the overlay is deactivated. - virtual bool BHandleCellPadData( const CellPadData &padData ) = 0; - - // Call this if you detect no controllers connected or that the XMB is intercepting input - // - // This is important to clear input state for the overlay, so keys left down during XMB activation - // are not continued to be processed. - virtual bool BResetInputState() = 0; -}; - - -#endif // ISTEAMPS3OVERLAYRENDERER_H \ No newline at end of file diff --git a/lib/steamworks_150/public/steam/isteamremoteplay.h b/lib/steamworks_150/public/steam/isteamremoteplay.h deleted file mode 100644 index 9c2dafb..0000000 --- a/lib/steamworks_150/public/steam/isteamremoteplay.h +++ /dev/null @@ -1,88 +0,0 @@ -//============ Copyright (c) Valve Corporation, All rights reserved. ============ - -#ifndef ISTEAMREMOTEPLAY_H -#define ISTEAMREMOTEPLAY_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - - -//----------------------------------------------------------------------------- -// Purpose: The form factor of a device -//----------------------------------------------------------------------------- -enum ESteamDeviceFormFactor -{ - k_ESteamDeviceFormFactorUnknown = 0, - k_ESteamDeviceFormFactorPhone = 1, - k_ESteamDeviceFormFactorTablet = 2, - k_ESteamDeviceFormFactorComputer = 3, - k_ESteamDeviceFormFactorTV = 4, -}; - -// Steam Remote Play session ID -typedef uint32 RemotePlaySessionID_t; - - -//----------------------------------------------------------------------------- -// Purpose: Functions to provide information about Steam Remote Play sessions -//----------------------------------------------------------------------------- -class ISteamRemotePlay -{ -public: - // Get the number of currently connected Steam Remote Play sessions - virtual uint32 GetSessionCount() = 0; - - // Get the currently connected Steam Remote Play session ID at the specified index. Returns zero if index is out of bounds. - virtual RemotePlaySessionID_t GetSessionID( int iSessionIndex ) = 0; - - // Get the SteamID of the connected user - virtual CSteamID GetSessionSteamID( RemotePlaySessionID_t unSessionID ) = 0; - - // Get the name of the session client device - // This returns NULL if the sessionID is not valid - virtual const char *GetSessionClientName( RemotePlaySessionID_t unSessionID ) = 0; - - // Get the form factor of the session client device - virtual ESteamDeviceFormFactor GetSessionClientFormFactor( RemotePlaySessionID_t unSessionID ) = 0; - - // Get the resolution, in pixels, of the session client device - // This is set to 0x0 if the resolution is not available - virtual bool BGetSessionClientResolution( RemotePlaySessionID_t unSessionID, int *pnResolutionX, int *pnResolutionY ) = 0; - - // Invite a friend to Remote Play Together - // This returns false if the invite can't be sent - virtual bool BSendRemotePlayTogetherInvite( CSteamID steamIDFriend ) = 0; -}; - -#define STEAMREMOTEPLAY_INTERFACE_VERSION "STEAMREMOTEPLAY_INTERFACE_VERSION001" - -// Global interface accessor -inline ISteamRemotePlay *SteamRemotePlay(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamRemotePlay *, SteamRemotePlay, STEAMREMOTEPLAY_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -STEAM_CALLBACK_BEGIN( SteamRemotePlaySessionConnected_t, k_iSteamRemotePlayCallbacks + 1 ) - STEAM_CALLBACK_MEMBER( 0, RemotePlaySessionID_t, m_unSessionID ) -STEAM_CALLBACK_END( 0 ) - - -STEAM_CALLBACK_BEGIN( SteamRemotePlaySessionDisconnected_t, k_iSteamRemotePlayCallbacks + 2 ) - STEAM_CALLBACK_MEMBER( 0, RemotePlaySessionID_t, m_unSessionID ) -STEAM_CALLBACK_END( 0 ) - - -#pragma pack( pop ) - - -#endif // #define ISTEAMREMOTEPLAY_H diff --git a/lib/steamworks_150/public/steam/isteamremotestorage.h b/lib/steamworks_150/public/steam/isteamremotestorage.h deleted file mode 100644 index f15d952..0000000 --- a/lib/steamworks_150/public/steam/isteamremotestorage.h +++ /dev/null @@ -1,688 +0,0 @@ -//====== Copyright � 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: public interface to user remote file storage in Steam -// -//============================================================================= - -#ifndef ISTEAMREMOTESTORAGE_H -#define ISTEAMREMOTESTORAGE_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - - -//----------------------------------------------------------------------------- -// Purpose: Defines the largest allowed file size. Cloud files cannot be written -// in a single chunk over 100MB (and cannot be over 200MB total.) -//----------------------------------------------------------------------------- -const uint32 k_unMaxCloudFileChunkSize = 100 * 1024 * 1024; - - -//----------------------------------------------------------------------------- -// Purpose: Structure that contains an array of const char * strings and the number of those strings -//----------------------------------------------------------------------------- -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif -struct SteamParamStringArray_t -{ - const char ** m_ppStrings; - int32 m_nNumStrings; -}; -#pragma pack( pop ) - -// A handle to a piece of user generated content -typedef uint64 UGCHandle_t; -typedef uint64 PublishedFileUpdateHandle_t; -typedef uint64 PublishedFileId_t; -const PublishedFileId_t k_PublishedFileIdInvalid = 0; -const UGCHandle_t k_UGCHandleInvalid = 0xffffffffffffffffull; -const PublishedFileUpdateHandle_t k_PublishedFileUpdateHandleInvalid = 0xffffffffffffffffull; - -// Handle for writing to Steam Cloud -typedef uint64 UGCFileWriteStreamHandle_t; -const UGCFileWriteStreamHandle_t k_UGCFileStreamHandleInvalid = 0xffffffffffffffffull; - -const uint32 k_cchPublishedDocumentTitleMax = 128 + 1; -const uint32 k_cchPublishedDocumentDescriptionMax = 8000; -const uint32 k_cchPublishedDocumentChangeDescriptionMax = 8000; -const uint32 k_unEnumeratePublishedFilesMaxResults = 50; -const uint32 k_cchTagListMax = 1024 + 1; -const uint32 k_cchFilenameMax = 260; -const uint32 k_cchPublishedFileURLMax = 256; - - -enum ERemoteStoragePlatform -{ - k_ERemoteStoragePlatformNone = 0, - k_ERemoteStoragePlatformWindows = (1 << 0), - k_ERemoteStoragePlatformOSX = (1 << 1), - k_ERemoteStoragePlatformPS3 = (1 << 2), - k_ERemoteStoragePlatformLinux = (1 << 3), - k_ERemoteStoragePlatformSwitch = (1 << 4), - k_ERemoteStoragePlatformAndroid = (1 << 5), - k_ERemoteStoragePlatformIOS = (1 << 6), - // NB we get one more before we need to widen some things - - k_ERemoteStoragePlatformAll = 0xffffffff -}; - -enum ERemoteStoragePublishedFileVisibility -{ - k_ERemoteStoragePublishedFileVisibilityPublic = 0, - k_ERemoteStoragePublishedFileVisibilityFriendsOnly = 1, - k_ERemoteStoragePublishedFileVisibilityPrivate = 2, - k_ERemoteStoragePublishedFileVisibilityUnlisted = 3, -}; - - -enum EWorkshopFileType -{ - k_EWorkshopFileTypeFirst = 0, - - k_EWorkshopFileTypeCommunity = 0, // normal Workshop item that can be subscribed to - k_EWorkshopFileTypeMicrotransaction = 1, // Workshop item that is meant to be voted on for the purpose of selling in-game - k_EWorkshopFileTypeCollection = 2, // a collection of Workshop or Greenlight items - k_EWorkshopFileTypeArt = 3, // artwork - k_EWorkshopFileTypeVideo = 4, // external video - k_EWorkshopFileTypeScreenshot = 5, // screenshot - k_EWorkshopFileTypeGame = 6, // Greenlight game entry - k_EWorkshopFileTypeSoftware = 7, // Greenlight software entry - k_EWorkshopFileTypeConcept = 8, // Greenlight concept - k_EWorkshopFileTypeWebGuide = 9, // Steam web guide - k_EWorkshopFileTypeIntegratedGuide = 10, // application integrated guide - k_EWorkshopFileTypeMerch = 11, // Workshop merchandise meant to be voted on for the purpose of being sold - k_EWorkshopFileTypeControllerBinding = 12, // Steam Controller bindings - k_EWorkshopFileTypeSteamworksAccessInvite = 13, // internal - k_EWorkshopFileTypeSteamVideo = 14, // Steam video - k_EWorkshopFileTypeGameManagedItem = 15, // managed completely by the game, not the user, and not shown on the web - - // Update k_EWorkshopFileTypeMax if you add values. - k_EWorkshopFileTypeMax = 16 - -}; - -enum EWorkshopVote -{ - k_EWorkshopVoteUnvoted = 0, - k_EWorkshopVoteFor = 1, - k_EWorkshopVoteAgainst = 2, - k_EWorkshopVoteLater = 3, -}; - -enum EWorkshopFileAction -{ - k_EWorkshopFileActionPlayed = 0, - k_EWorkshopFileActionCompleted = 1, -}; - -enum EWorkshopEnumerationType -{ - k_EWorkshopEnumerationTypeRankedByVote = 0, - k_EWorkshopEnumerationTypeRecent = 1, - k_EWorkshopEnumerationTypeTrending = 2, - k_EWorkshopEnumerationTypeFavoritesOfFriends = 3, - k_EWorkshopEnumerationTypeVotedByFriends = 4, - k_EWorkshopEnumerationTypeContentByFriends = 5, - k_EWorkshopEnumerationTypeRecentFromFollowedUsers = 6, -}; - -enum EWorkshopVideoProvider -{ - k_EWorkshopVideoProviderNone = 0, - k_EWorkshopVideoProviderYoutube = 1 -}; - - -enum EUGCReadAction -{ - // Keeps the file handle open unless the last byte is read. You can use this when reading large files (over 100MB) in sequential chunks. - // If the last byte is read, this will behave the same as k_EUGCRead_Close. Otherwise, it behaves the same as k_EUGCRead_ContinueReading. - // This value maintains the same behavior as before the EUGCReadAction parameter was introduced. - k_EUGCRead_ContinueReadingUntilFinished = 0, - - // Keeps the file handle open. Use this when using UGCRead to seek to different parts of the file. - // When you are done seeking around the file, make a final call with k_EUGCRead_Close to close it. - k_EUGCRead_ContinueReading = 1, - - // Frees the file handle. Use this when you're done reading the content. - // To read the file from Steam again you will need to call UGCDownload again. - k_EUGCRead_Close = 2, -}; - - -//----------------------------------------------------------------------------- -// Purpose: Functions for accessing, reading and writing files stored remotely -// and cached locally -//----------------------------------------------------------------------------- -class ISteamRemoteStorage -{ - public: - // NOTE - // - // Filenames are case-insensitive, and will be converted to lowercase automatically. - // So "foo.bar" and "Foo.bar" are the same file, and if you write "Foo.bar" then - // iterate the files, the filename returned will be "foo.bar". - // - - // file operations - virtual bool FileWrite( const char *pchFile, const void *pvData, int32 cubData ) = 0; - virtual int32 FileRead( const char *pchFile, void *pvData, int32 cubDataToRead ) = 0; - - STEAM_CALL_RESULT( RemoteStorageFileWriteAsyncComplete_t ) - virtual SteamAPICall_t FileWriteAsync( const char *pchFile, const void *pvData, uint32 cubData ) = 0; - - STEAM_CALL_RESULT( RemoteStorageFileReadAsyncComplete_t ) - virtual SteamAPICall_t FileReadAsync( const char *pchFile, uint32 nOffset, uint32 cubToRead ) = 0; - virtual bool FileReadAsyncComplete( SteamAPICall_t hReadCall, void *pvBuffer, uint32 cubToRead ) = 0; - - virtual bool FileForget( const char *pchFile ) = 0; - virtual bool FileDelete( const char *pchFile ) = 0; - STEAM_CALL_RESULT( RemoteStorageFileShareResult_t ) - virtual SteamAPICall_t FileShare( const char *pchFile ) = 0; - virtual bool SetSyncPlatforms( const char *pchFile, ERemoteStoragePlatform eRemoteStoragePlatform ) = 0; - - // file operations that cause network IO - virtual UGCFileWriteStreamHandle_t FileWriteStreamOpen( const char *pchFile ) = 0; - virtual bool FileWriteStreamWriteChunk( UGCFileWriteStreamHandle_t writeHandle, const void *pvData, int32 cubData ) = 0; - virtual bool FileWriteStreamClose( UGCFileWriteStreamHandle_t writeHandle ) = 0; - virtual bool FileWriteStreamCancel( UGCFileWriteStreamHandle_t writeHandle ) = 0; - - // file information - virtual bool FileExists( const char *pchFile ) = 0; - virtual bool FilePersisted( const char *pchFile ) = 0; - virtual int32 GetFileSize( const char *pchFile ) = 0; - virtual int64 GetFileTimestamp( const char *pchFile ) = 0; - virtual ERemoteStoragePlatform GetSyncPlatforms( const char *pchFile ) = 0; - - // iteration - virtual int32 GetFileCount() = 0; - virtual const char *GetFileNameAndSize( int iFile, int32 *pnFileSizeInBytes ) = 0; - - // configuration management - virtual bool GetQuota( uint64 *pnTotalBytes, uint64 *puAvailableBytes ) = 0; - virtual bool IsCloudEnabledForAccount() = 0; - virtual bool IsCloudEnabledForApp() = 0; - virtual void SetCloudEnabledForApp( bool bEnabled ) = 0; - - // user generated content - - // Downloads a UGC file. A priority value of 0 will download the file immediately, - // otherwise it will wait to download the file until all downloads with a lower priority - // value are completed. Downloads with equal priority will occur simultaneously. - STEAM_CALL_RESULT( RemoteStorageDownloadUGCResult_t ) - virtual SteamAPICall_t UGCDownload( UGCHandle_t hContent, uint32 unPriority ) = 0; - - // Gets the amount of data downloaded so far for a piece of content. pnBytesExpected can be 0 if function returns false - // or if the transfer hasn't started yet, so be careful to check for that before dividing to get a percentage - virtual bool GetUGCDownloadProgress( UGCHandle_t hContent, int32 *pnBytesDownloaded, int32 *pnBytesExpected ) = 0; - - // Gets metadata for a file after it has been downloaded. This is the same metadata given in the RemoteStorageDownloadUGCResult_t call result - virtual bool GetUGCDetails( UGCHandle_t hContent, AppId_t *pnAppID, STEAM_OUT_STRING() char **ppchName, int32 *pnFileSizeInBytes, STEAM_OUT_STRUCT() CSteamID *pSteamIDOwner ) = 0; - - // After download, gets the content of the file. - // Small files can be read all at once by calling this function with an offset of 0 and cubDataToRead equal to the size of the file. - // Larger files can be read in chunks to reduce memory usage (since both sides of the IPC client and the game itself must allocate - // enough memory for each chunk). Once the last byte is read, the file is implicitly closed and further calls to UGCRead will fail - // unless UGCDownload is called again. - // For especially large files (anything over 100MB) it is a requirement that the file is read in chunks. - virtual int32 UGCRead( UGCHandle_t hContent, void *pvData, int32 cubDataToRead, uint32 cOffset, EUGCReadAction eAction ) = 0; - - // Functions to iterate through UGC that has finished downloading but has not yet been read via UGCRead() - virtual int32 GetCachedUGCCount() = 0; - virtual UGCHandle_t GetCachedUGCHandle( int32 iCachedContent ) = 0; - - // The following functions are only necessary on the Playstation 3. On PC & Mac, the Steam client will handle these operations for you - // On Playstation 3, the game controls which files are stored in the cloud, via FilePersist, FileFetch, and FileForget. - -#if defined(_PS3) || defined(_SERVER) - // Connect to Steam and get a list of files in the Cloud - results in a RemoteStorageAppSyncStatusCheck_t callback - virtual void GetFileListFromServer() = 0; - // Indicate this file should be downloaded in the next sync - virtual bool FileFetch( const char *pchFile ) = 0; - // Indicate this file should be persisted in the next sync - virtual bool FilePersist( const char *pchFile ) = 0; - // Pull any requested files down from the Cloud - results in a RemoteStorageAppSyncedClient_t callback - virtual bool SynchronizeToClient() = 0; - // Upload any requested files to the Cloud - results in a RemoteStorageAppSyncedServer_t callback - virtual bool SynchronizeToServer() = 0; - // Reset any fetch/persist/etc requests - virtual bool ResetFileRequestState() = 0; -#endif - - // publishing UGC - STEAM_CALL_RESULT( RemoteStoragePublishFileProgress_t ) - virtual SteamAPICall_t PublishWorkshopFile( const char *pchFile, const char *pchPreviewFile, AppId_t nConsumerAppId, const char *pchTitle, const char *pchDescription, ERemoteStoragePublishedFileVisibility eVisibility, SteamParamStringArray_t *pTags, EWorkshopFileType eWorkshopFileType ) = 0; - virtual PublishedFileUpdateHandle_t CreatePublishedFileUpdateRequest( PublishedFileId_t unPublishedFileId ) = 0; - virtual bool UpdatePublishedFileFile( PublishedFileUpdateHandle_t updateHandle, const char *pchFile ) = 0; - virtual bool UpdatePublishedFilePreviewFile( PublishedFileUpdateHandle_t updateHandle, const char *pchPreviewFile ) = 0; - virtual bool UpdatePublishedFileTitle( PublishedFileUpdateHandle_t updateHandle, const char *pchTitle ) = 0; - virtual bool UpdatePublishedFileDescription( PublishedFileUpdateHandle_t updateHandle, const char *pchDescription ) = 0; - virtual bool UpdatePublishedFileVisibility( PublishedFileUpdateHandle_t updateHandle, ERemoteStoragePublishedFileVisibility eVisibility ) = 0; - virtual bool UpdatePublishedFileTags( PublishedFileUpdateHandle_t updateHandle, SteamParamStringArray_t *pTags ) = 0; - STEAM_CALL_RESULT( RemoteStorageUpdatePublishedFileResult_t ) - virtual SteamAPICall_t CommitPublishedFileUpdate( PublishedFileUpdateHandle_t updateHandle ) = 0; - // Gets published file details for the given publishedfileid. If unMaxSecondsOld is greater than 0, - // cached data may be returned, depending on how long ago it was cached. A value of 0 will force a refresh. - // A value of k_WorkshopForceLoadPublishedFileDetailsFromCache will use cached data if it exists, no matter how old it is. - STEAM_CALL_RESULT( RemoteStorageGetPublishedFileDetailsResult_t ) - virtual SteamAPICall_t GetPublishedFileDetails( PublishedFileId_t unPublishedFileId, uint32 unMaxSecondsOld ) = 0; - STEAM_CALL_RESULT( RemoteStorageDeletePublishedFileResult_t ) - virtual SteamAPICall_t DeletePublishedFile( PublishedFileId_t unPublishedFileId ) = 0; - // enumerate the files that the current user published with this app - STEAM_CALL_RESULT( RemoteStorageEnumerateUserPublishedFilesResult_t ) - virtual SteamAPICall_t EnumerateUserPublishedFiles( uint32 unStartIndex ) = 0; - STEAM_CALL_RESULT( RemoteStorageSubscribePublishedFileResult_t ) - virtual SteamAPICall_t SubscribePublishedFile( PublishedFileId_t unPublishedFileId ) = 0; - STEAM_CALL_RESULT( RemoteStorageEnumerateUserSubscribedFilesResult_t ) - virtual SteamAPICall_t EnumerateUserSubscribedFiles( uint32 unStartIndex ) = 0; - STEAM_CALL_RESULT( RemoteStorageUnsubscribePublishedFileResult_t ) - virtual SteamAPICall_t UnsubscribePublishedFile( PublishedFileId_t unPublishedFileId ) = 0; - virtual bool UpdatePublishedFileSetChangeDescription( PublishedFileUpdateHandle_t updateHandle, const char *pchChangeDescription ) = 0; - STEAM_CALL_RESULT( RemoteStorageGetPublishedItemVoteDetailsResult_t ) - virtual SteamAPICall_t GetPublishedItemVoteDetails( PublishedFileId_t unPublishedFileId ) = 0; - STEAM_CALL_RESULT( RemoteStorageUpdateUserPublishedItemVoteResult_t ) - virtual SteamAPICall_t UpdateUserPublishedItemVote( PublishedFileId_t unPublishedFileId, bool bVoteUp ) = 0; - STEAM_CALL_RESULT( RemoteStorageGetPublishedItemVoteDetailsResult_t ) - virtual SteamAPICall_t GetUserPublishedItemVoteDetails( PublishedFileId_t unPublishedFileId ) = 0; - STEAM_CALL_RESULT( RemoteStorageEnumerateUserPublishedFilesResult_t ) - virtual SteamAPICall_t EnumerateUserSharedWorkshopFiles( CSteamID steamId, uint32 unStartIndex, SteamParamStringArray_t *pRequiredTags, SteamParamStringArray_t *pExcludedTags ) = 0; - STEAM_CALL_RESULT( RemoteStoragePublishFileProgress_t ) - virtual SteamAPICall_t PublishVideo( EWorkshopVideoProvider eVideoProvider, const char *pchVideoAccount, const char *pchVideoIdentifier, const char *pchPreviewFile, AppId_t nConsumerAppId, const char *pchTitle, const char *pchDescription, ERemoteStoragePublishedFileVisibility eVisibility, SteamParamStringArray_t *pTags ) = 0; - STEAM_CALL_RESULT( RemoteStorageSetUserPublishedFileActionResult_t ) - virtual SteamAPICall_t SetUserPublishedFileAction( PublishedFileId_t unPublishedFileId, EWorkshopFileAction eAction ) = 0; - STEAM_CALL_RESULT( RemoteStorageEnumeratePublishedFilesByUserActionResult_t ) - virtual SteamAPICall_t EnumeratePublishedFilesByUserAction( EWorkshopFileAction eAction, uint32 unStartIndex ) = 0; - // this method enumerates the public view of workshop files - STEAM_CALL_RESULT( RemoteStorageEnumerateWorkshopFilesResult_t ) - virtual SteamAPICall_t EnumeratePublishedWorkshopFiles( EWorkshopEnumerationType eEnumerationType, uint32 unStartIndex, uint32 unCount, uint32 unDays, SteamParamStringArray_t *pTags, SteamParamStringArray_t *pUserTags ) = 0; - - STEAM_CALL_RESULT( RemoteStorageDownloadUGCResult_t ) - virtual SteamAPICall_t UGCDownloadToLocation( UGCHandle_t hContent, const char *pchLocation, uint32 unPriority ) = 0; -}; - -#define STEAMREMOTESTORAGE_INTERFACE_VERSION "STEAMREMOTESTORAGE_INTERFACE_VERSION014" - -// Global interface accessor -inline ISteamRemoteStorage *SteamRemoteStorage(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamRemoteStorage *, SteamRemoteStorage, STEAMREMOTESTORAGE_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: sent when the local file cache is fully synced with the server for an app -// That means that an application can be started and has all latest files -//----------------------------------------------------------------------------- -struct RemoteStorageAppSyncedClient_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 1 }; - AppId_t m_nAppID; - EResult m_eResult; - int m_unNumDownloads; -}; - -//----------------------------------------------------------------------------- -// Purpose: sent when the server is fully synced with the local file cache for an app -// That means that we can shutdown Steam and our data is stored on the server -//----------------------------------------------------------------------------- -struct RemoteStorageAppSyncedServer_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 2 }; - AppId_t m_nAppID; - EResult m_eResult; - int m_unNumUploads; -}; - -//----------------------------------------------------------------------------- -// Purpose: Status of up and downloads during a sync session -// -//----------------------------------------------------------------------------- -struct RemoteStorageAppSyncProgress_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 3 }; - char m_rgchCurrentFile[k_cchFilenameMax]; // Current file being transferred - AppId_t m_nAppID; // App this info relates to - uint32 m_uBytesTransferredThisChunk; // Bytes transferred this chunk - double m_dAppPercentComplete; // Percent complete that this app's transfers are - bool m_bUploading; // if false, downloading -}; - -// -// IMPORTANT! k_iClientRemoteStorageCallbacks + 4 is used, see iclientremotestorage.h -// - - -//----------------------------------------------------------------------------- -// Purpose: Sent after we've determined the list of files that are out of sync -// with the server. -//----------------------------------------------------------------------------- -struct RemoteStorageAppSyncStatusCheck_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 5 }; - AppId_t m_nAppID; - EResult m_eResult; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to FileShare() -//----------------------------------------------------------------------------- -struct RemoteStorageFileShareResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 7 }; - EResult m_eResult; // The result of the operation - UGCHandle_t m_hFile; // The handle that can be shared with users and features - char m_rgchFilename[k_cchFilenameMax]; // The name of the file that was shared -}; - - -// k_iClientRemoteStorageCallbacks + 8 is deprecated! Do not reuse - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to PublishFile() -//----------------------------------------------------------------------------- -struct RemoteStoragePublishFileResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 9 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to DeletePublishedFile() -//----------------------------------------------------------------------------- -struct RemoteStorageDeletePublishedFileResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 11 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to EnumerateUserPublishedFiles() -//----------------------------------------------------------------------------- -struct RemoteStorageEnumerateUserPublishedFilesResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 12 }; - EResult m_eResult; // The result of the operation. - int32 m_nResultsReturned; - int32 m_nTotalResultCount; - PublishedFileId_t m_rgPublishedFileId[ k_unEnumeratePublishedFilesMaxResults ]; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to SubscribePublishedFile() -//----------------------------------------------------------------------------- -struct RemoteStorageSubscribePublishedFileResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 13 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to EnumerateSubscribePublishedFiles() -//----------------------------------------------------------------------------- -struct RemoteStorageEnumerateUserSubscribedFilesResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 14 }; - EResult m_eResult; // The result of the operation. - int32 m_nResultsReturned; - int32 m_nTotalResultCount; - PublishedFileId_t m_rgPublishedFileId[ k_unEnumeratePublishedFilesMaxResults ]; - uint32 m_rgRTimeSubscribed[ k_unEnumeratePublishedFilesMaxResults ]; -}; - -#if defined(VALVE_CALLBACK_PACK_SMALL) - VALVE_COMPILE_TIME_ASSERT( sizeof( RemoteStorageEnumerateUserSubscribedFilesResult_t ) == (1 + 1 + 1 + 50 + 100) * 4 ); -#elif defined(VALVE_CALLBACK_PACK_LARGE) - VALVE_COMPILE_TIME_ASSERT( sizeof( RemoteStorageEnumerateUserSubscribedFilesResult_t ) == (1 + 1 + 1 + 50 + 100) * 4 + 4 ); -#else -#warning You must first include steam_api_common.h -#endif - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to UnsubscribePublishedFile() -//----------------------------------------------------------------------------- -struct RemoteStorageUnsubscribePublishedFileResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 15 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to CommitPublishedFileUpdate() -//----------------------------------------------------------------------------- -struct RemoteStorageUpdatePublishedFileResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 16 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to UGCDownload() -//----------------------------------------------------------------------------- -struct RemoteStorageDownloadUGCResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 17 }; - EResult m_eResult; // The result of the operation. - UGCHandle_t m_hFile; // The handle to the file that was attempted to be downloaded. - AppId_t m_nAppID; // ID of the app that created this file. - int32 m_nSizeInBytes; // The size of the file that was downloaded, in bytes. - char m_pchFileName[k_cchFilenameMax]; // The name of the file that was downloaded. - uint64 m_ulSteamIDOwner; // Steam ID of the user who created this content. -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to GetPublishedFileDetails() -//----------------------------------------------------------------------------- -struct RemoteStorageGetPublishedFileDetailsResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 18 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; - AppId_t m_nCreatorAppID; // ID of the app that created this file. - AppId_t m_nConsumerAppID; // ID of the app that will consume this file. - char m_rgchTitle[k_cchPublishedDocumentTitleMax]; // title of document - char m_rgchDescription[k_cchPublishedDocumentDescriptionMax]; // description of document - UGCHandle_t m_hFile; // The handle of the primary file - UGCHandle_t m_hPreviewFile; // The handle of the preview file - uint64 m_ulSteamIDOwner; // Steam ID of the user who created this content. - uint32 m_rtimeCreated; // time when the published file was created - uint32 m_rtimeUpdated; // time when the published file was last updated - ERemoteStoragePublishedFileVisibility m_eVisibility; - bool m_bBanned; - char m_rgchTags[k_cchTagListMax]; // comma separated list of all tags associated with this file - bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer - char m_pchFileName[k_cchFilenameMax]; // The name of the primary file - int32 m_nFileSize; // Size of the primary file - int32 m_nPreviewFileSize; // Size of the preview file - char m_rgchURL[k_cchPublishedFileURLMax]; // URL (for a video or a website) - EWorkshopFileType m_eFileType; // Type of the file - bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop -}; - - -struct RemoteStorageEnumerateWorkshopFilesResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 19 }; - EResult m_eResult; - int32 m_nResultsReturned; - int32 m_nTotalResultCount; - PublishedFileId_t m_rgPublishedFileId[ k_unEnumeratePublishedFilesMaxResults ]; - float m_rgScore[ k_unEnumeratePublishedFilesMaxResults ]; - AppId_t m_nAppId; - uint32 m_unStartIndex; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of GetPublishedItemVoteDetails -//----------------------------------------------------------------------------- -struct RemoteStorageGetPublishedItemVoteDetailsResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 20 }; - EResult m_eResult; - PublishedFileId_t m_unPublishedFileId; - int32 m_nVotesFor; - int32 m_nVotesAgainst; - int32 m_nReports; - float m_fScore; -}; - - -//----------------------------------------------------------------------------- -// Purpose: User subscribed to a file for the app (from within the app or on the web) -//----------------------------------------------------------------------------- -struct RemoteStoragePublishedFileSubscribed_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 21 }; - PublishedFileId_t m_nPublishedFileId; // The published file id - AppId_t m_nAppID; // ID of the app that will consume this file. -}; - -//----------------------------------------------------------------------------- -// Purpose: User unsubscribed from a file for the app (from within the app or on the web) -//----------------------------------------------------------------------------- -struct RemoteStoragePublishedFileUnsubscribed_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 22 }; - PublishedFileId_t m_nPublishedFileId; // The published file id - AppId_t m_nAppID; // ID of the app that will consume this file. -}; - - -//----------------------------------------------------------------------------- -// Purpose: Published file that a user owns was deleted (from within the app or the web) -//----------------------------------------------------------------------------- -struct RemoteStoragePublishedFileDeleted_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 23 }; - PublishedFileId_t m_nPublishedFileId; // The published file id - AppId_t m_nAppID; // ID of the app that will consume this file. -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to UpdateUserPublishedItemVote() -//----------------------------------------------------------------------------- -struct RemoteStorageUpdateUserPublishedItemVoteResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 24 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; // The published file id -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to GetUserPublishedItemVoteDetails() -//----------------------------------------------------------------------------- -struct RemoteStorageUserVoteDetails_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 25 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; // The published file id - EWorkshopVote m_eVote; // what the user voted -}; - -struct RemoteStorageEnumerateUserSharedWorkshopFilesResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 26 }; - EResult m_eResult; // The result of the operation. - int32 m_nResultsReturned; - int32 m_nTotalResultCount; - PublishedFileId_t m_rgPublishedFileId[ k_unEnumeratePublishedFilesMaxResults ]; -}; - -struct RemoteStorageSetUserPublishedFileActionResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 27 }; - EResult m_eResult; // The result of the operation. - PublishedFileId_t m_nPublishedFileId; // The published file id - EWorkshopFileAction m_eAction; // the action that was attempted -}; - -struct RemoteStorageEnumeratePublishedFilesByUserActionResult_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 28 }; - EResult m_eResult; // The result of the operation. - EWorkshopFileAction m_eAction; // the action that was filtered on - int32 m_nResultsReturned; - int32 m_nTotalResultCount; - PublishedFileId_t m_rgPublishedFileId[ k_unEnumeratePublishedFilesMaxResults ]; - uint32 m_rgRTimeUpdated[ k_unEnumeratePublishedFilesMaxResults ]; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Called periodically while a PublishWorkshopFile is in progress -//----------------------------------------------------------------------------- -struct RemoteStoragePublishFileProgress_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 29 }; - double m_dPercentFile; - bool m_bPreview; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Called when the content for a published file is updated -//----------------------------------------------------------------------------- -struct RemoteStoragePublishedFileUpdated_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 30 }; - PublishedFileId_t m_nPublishedFileId; // The published file id - AppId_t m_nAppID; // ID of the app that will consume this file. - uint64 m_ulUnused; // not used anymore -}; - -//----------------------------------------------------------------------------- -// Purpose: Called when a FileWriteAsync completes -//----------------------------------------------------------------------------- -struct RemoteStorageFileWriteAsyncComplete_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 31 }; - EResult m_eResult; // result -}; - -//----------------------------------------------------------------------------- -// Purpose: Called when a FileReadAsync completes -//----------------------------------------------------------------------------- -struct RemoteStorageFileReadAsyncComplete_t -{ - enum { k_iCallback = k_iClientRemoteStorageCallbacks + 32 }; - SteamAPICall_t m_hFileReadAsync; // call handle of the async read which was made - EResult m_eResult; // result - uint32 m_nOffset; // offset in the file this read was at - uint32 m_cubRead; // amount read - will the <= the amount requested -}; - -#pragma pack( pop ) - - -#endif // ISTEAMREMOTESTORAGE_H diff --git a/lib/steamworks_150/public/steam/isteamscreenshots.h b/lib/steamworks_150/public/steam/isteamscreenshots.h deleted file mode 100644 index 1824268..0000000 --- a/lib/steamworks_150/public/steam/isteamscreenshots.h +++ /dev/null @@ -1,120 +0,0 @@ -//====== Copyright � 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: public interface to user remote file storage in Steam -// -//============================================================================= - -#ifndef ISTEAMSCREENSHOTS_H -#define ISTEAMSCREENSHOTS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -const uint32 k_nScreenshotMaxTaggedUsers = 32; -const uint32 k_nScreenshotMaxTaggedPublishedFiles = 32; -const int k_cubUFSTagTypeMax = 255; -const int k_cubUFSTagValueMax = 255; - -// Required with of a thumbnail provided to AddScreenshotToLibrary. If you do not provide a thumbnail -// one will be generated. -const int k_ScreenshotThumbWidth = 200; - -// Handle is valid for the lifetime of your process and no longer -typedef uint32 ScreenshotHandle; -#define INVALID_SCREENSHOT_HANDLE 0 - -enum EVRScreenshotType -{ - k_EVRScreenshotType_None = 0, - k_EVRScreenshotType_Mono = 1, - k_EVRScreenshotType_Stereo = 2, - k_EVRScreenshotType_MonoCubemap = 3, - k_EVRScreenshotType_MonoPanorama = 4, - k_EVRScreenshotType_StereoPanorama = 5 -}; - -//----------------------------------------------------------------------------- -// Purpose: Functions for adding screenshots to the user's screenshot library -//----------------------------------------------------------------------------- -class ISteamScreenshots -{ -public: - // Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format. - // The return value is a handle that is valid for the duration of the game process and can be used to apply tags. - virtual ScreenshotHandle WriteScreenshot( void *pubRGB, uint32 cubRGB, int nWidth, int nHeight ) = 0; - - // Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio - // as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format. - // The return value is a handle that is valid for the duration of the game process and can be used to apply tags. - // JPEG, TGA, and PNG formats are supported. - virtual ScreenshotHandle AddScreenshotToLibrary( const char *pchFilename, const char *pchThumbnailFilename, int nWidth, int nHeight ) = 0; - - // Causes the Steam overlay to take a screenshot. If screenshots are being hooked by the game then a ScreenshotRequested_t callback is sent back to the game instead. - virtual void TriggerScreenshot() = 0; - - // Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or the game handles them. If the game is hooking screenshots, - // then the ScreenshotRequested_t callback will be sent if the user presses the hotkey, and the game is expected to call WriteScreenshot or AddScreenshotToLibrary - // in response. - virtual void HookScreenshots( bool bHook ) = 0; - - // Sets metadata about a screenshot's location (for example, the name of the map) - virtual bool SetLocation( ScreenshotHandle hScreenshot, const char *pchLocation ) = 0; - - // Tags a user as being visible in the screenshot - virtual bool TagUser( ScreenshotHandle hScreenshot, CSteamID steamID ) = 0; - - // Tags a published file as being visible in the screenshot - virtual bool TagPublishedFile( ScreenshotHandle hScreenshot, PublishedFileId_t unPublishedFileID ) = 0; - - // Returns true if the app has hooked the screenshot - virtual bool IsScreenshotsHooked() = 0; - - // Adds a VR screenshot to the user's screenshot library from disk in the supported type. - // pchFilename should be the normal 2D image used in the library view - // pchVRFilename should contain the image that matches the correct type - // The return value is a handle that is valid for the duration of the game process and can be used to apply tags. - // JPEG, TGA, and PNG formats are supported. - virtual ScreenshotHandle AddVRScreenshotToLibrary( EVRScreenshotType eType, const char *pchFilename, const char *pchVRFilename ) = 0; -}; - -#define STEAMSCREENSHOTS_INTERFACE_VERSION "STEAMSCREENSHOTS_INTERFACE_VERSION003" - -// Global interface accessor -inline ISteamScreenshots *SteamScreenshots(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamScreenshots *, SteamScreenshots, STEAMSCREENSHOTS_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif -//----------------------------------------------------------------------------- -// Purpose: Screenshot successfully written or otherwise added to the library -// and can now be tagged -//----------------------------------------------------------------------------- -struct ScreenshotReady_t -{ - enum { k_iCallback = k_iSteamScreenshotsCallbacks + 1 }; - ScreenshotHandle m_hLocal; - EResult m_eResult; -}; - -//----------------------------------------------------------------------------- -// Purpose: Screenshot has been requested by the user. Only sent if -// HookScreenshots() has been called, in which case Steam will not take -// the screenshot itself. -//----------------------------------------------------------------------------- -struct ScreenshotRequested_t -{ - enum { k_iCallback = k_iSteamScreenshotsCallbacks + 2 }; -}; - -#pragma pack( pop ) - -#endif // ISTEAMSCREENSHOTS_H - diff --git a/lib/steamworks_150/public/steam/isteamugc.h b/lib/steamworks_150/public/steam/isteamugc.h deleted file mode 100644 index c86f197..0000000 --- a/lib/steamworks_150/public/steam/isteamugc.h +++ /dev/null @@ -1,569 +0,0 @@ -//====== Copyright 1996-2013, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to steam ugc -// -//============================================================================= - -#ifndef ISTEAMUGC_H -#define ISTEAMUGC_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "isteamremotestorage.h" - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - -typedef uint64 UGCQueryHandle_t; -typedef uint64 UGCUpdateHandle_t; - - -const UGCQueryHandle_t k_UGCQueryHandleInvalid = 0xffffffffffffffffull; -const UGCUpdateHandle_t k_UGCUpdateHandleInvalid = 0xffffffffffffffffull; - - -// Matching UGC types for queries -enum EUGCMatchingUGCType -{ - k_EUGCMatchingUGCType_Items = 0, // both mtx items and ready-to-use items - k_EUGCMatchingUGCType_Items_Mtx = 1, - k_EUGCMatchingUGCType_Items_ReadyToUse = 2, - k_EUGCMatchingUGCType_Collections = 3, - k_EUGCMatchingUGCType_Artwork = 4, - k_EUGCMatchingUGCType_Videos = 5, - k_EUGCMatchingUGCType_Screenshots = 6, - k_EUGCMatchingUGCType_AllGuides = 7, // both web guides and integrated guides - k_EUGCMatchingUGCType_WebGuides = 8, - k_EUGCMatchingUGCType_IntegratedGuides = 9, - k_EUGCMatchingUGCType_UsableInGame = 10, // ready-to-use items and integrated guides - k_EUGCMatchingUGCType_ControllerBindings = 11, - k_EUGCMatchingUGCType_GameManagedItems = 12, // game managed items (not managed by users) - k_EUGCMatchingUGCType_All = ~0, // @note: will only be valid for CreateQueryUserUGCRequest requests -}; - -// Different lists of published UGC for a user. -// If the current logged in user is different than the specified user, then some options may not be allowed. -enum EUserUGCList -{ - k_EUserUGCList_Published, - k_EUserUGCList_VotedOn, - k_EUserUGCList_VotedUp, - k_EUserUGCList_VotedDown, - k_EUserUGCList_WillVoteLater, - k_EUserUGCList_Favorited, - k_EUserUGCList_Subscribed, - k_EUserUGCList_UsedOrPlayed, - k_EUserUGCList_Followed, -}; - -// Sort order for user published UGC lists (defaults to creation order descending) -enum EUserUGCListSortOrder -{ - k_EUserUGCListSortOrder_CreationOrderDesc, - k_EUserUGCListSortOrder_CreationOrderAsc, - k_EUserUGCListSortOrder_TitleAsc, - k_EUserUGCListSortOrder_LastUpdatedDesc, - k_EUserUGCListSortOrder_SubscriptionDateDesc, - k_EUserUGCListSortOrder_VoteScoreDesc, - k_EUserUGCListSortOrder_ForModeration, -}; - -// Combination of sorting and filtering for queries across all UGC -enum EUGCQuery -{ - k_EUGCQuery_RankedByVote = 0, - k_EUGCQuery_RankedByPublicationDate = 1, - k_EUGCQuery_AcceptedForGameRankedByAcceptanceDate = 2, - k_EUGCQuery_RankedByTrend = 3, - k_EUGCQuery_FavoritedByFriendsRankedByPublicationDate = 4, - k_EUGCQuery_CreatedByFriendsRankedByPublicationDate = 5, - k_EUGCQuery_RankedByNumTimesReported = 6, - k_EUGCQuery_CreatedByFollowedUsersRankedByPublicationDate = 7, - k_EUGCQuery_NotYetRated = 8, - k_EUGCQuery_RankedByTotalVotesAsc = 9, - k_EUGCQuery_RankedByVotesUp = 10, - k_EUGCQuery_RankedByTextSearch = 11, - k_EUGCQuery_RankedByTotalUniqueSubscriptions = 12, - k_EUGCQuery_RankedByPlaytimeTrend = 13, - k_EUGCQuery_RankedByTotalPlaytime = 14, - k_EUGCQuery_RankedByAveragePlaytimeTrend = 15, - k_EUGCQuery_RankedByLifetimeAveragePlaytime = 16, - k_EUGCQuery_RankedByPlaytimeSessionsTrend = 17, - k_EUGCQuery_RankedByLifetimePlaytimeSessions = 18, -}; - -enum EItemUpdateStatus -{ - k_EItemUpdateStatusInvalid = 0, // The item update handle was invalid, job might be finished, listen too SubmitItemUpdateResult_t - k_EItemUpdateStatusPreparingConfig = 1, // The item update is processing configuration data - k_EItemUpdateStatusPreparingContent = 2, // The item update is reading and processing content files - k_EItemUpdateStatusUploadingContent = 3, // The item update is uploading content changes to Steam - k_EItemUpdateStatusUploadingPreviewFile = 4, // The item update is uploading new preview file image - k_EItemUpdateStatusCommittingChanges = 5 // The item update is committing all changes -}; - -enum EItemState -{ - k_EItemStateNone = 0, // item not tracked on client - k_EItemStateSubscribed = 1, // current user is subscribed to this item. Not just cached. - k_EItemStateLegacyItem = 2, // item was created with ISteamRemoteStorage - k_EItemStateInstalled = 4, // item is installed and usable (but maybe out of date) - k_EItemStateNeedsUpdate = 8, // items needs an update. Either because it's not installed yet or creator updated content - k_EItemStateDownloading = 16, // item update is currently downloading - k_EItemStateDownloadPending = 32, // DownloadItem() was called for this item, content isn't available until DownloadItemResult_t is fired -}; - -enum EItemStatistic -{ - k_EItemStatistic_NumSubscriptions = 0, - k_EItemStatistic_NumFavorites = 1, - k_EItemStatistic_NumFollowers = 2, - k_EItemStatistic_NumUniqueSubscriptions = 3, - k_EItemStatistic_NumUniqueFavorites = 4, - k_EItemStatistic_NumUniqueFollowers = 5, - k_EItemStatistic_NumUniqueWebsiteViews = 6, - k_EItemStatistic_ReportScore = 7, - k_EItemStatistic_NumSecondsPlayed = 8, - k_EItemStatistic_NumPlaytimeSessions = 9, - k_EItemStatistic_NumComments = 10, - k_EItemStatistic_NumSecondsPlayedDuringTimePeriod = 11, - k_EItemStatistic_NumPlaytimeSessionsDuringTimePeriod = 12, -}; - -enum EItemPreviewType -{ - k_EItemPreviewType_Image = 0, // standard image file expected (e.g. jpg, png, gif, etc.) - k_EItemPreviewType_YouTubeVideo = 1, // video id is stored - k_EItemPreviewType_Sketchfab = 2, // model id is stored - k_EItemPreviewType_EnvironmentMap_HorizontalCross = 3, // standard image file expected - cube map in the layout - // +---+---+-------+ - // | |Up | | - // +---+---+---+---+ - // | L | F | R | B | - // +---+---+---+---+ - // | |Dn | | - // +---+---+---+---+ - k_EItemPreviewType_EnvironmentMap_LatLong = 4, // standard image file expected - k_EItemPreviewType_ReservedMax = 255, // you can specify your own types above this value -}; - -const uint32 kNumUGCResultsPerPage = 50; -const uint32 k_cchDeveloperMetadataMax = 5000; - -// Details for a single published file/UGC -struct SteamUGCDetails_t -{ - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; // The result of the operation. - EWorkshopFileType m_eFileType; // Type of the file - AppId_t m_nCreatorAppID; // ID of the app that created this file. - AppId_t m_nConsumerAppID; // ID of the app that will consume this file. - char m_rgchTitle[k_cchPublishedDocumentTitleMax]; // title of document - char m_rgchDescription[k_cchPublishedDocumentDescriptionMax]; // description of document - uint64 m_ulSteamIDOwner; // Steam ID of the user who created this content. - uint32 m_rtimeCreated; // time when the published file was created - uint32 m_rtimeUpdated; // time when the published file was last updated - uint32 m_rtimeAddedToUserList; // time when the user added the published file to their list (not always applicable) - ERemoteStoragePublishedFileVisibility m_eVisibility; // visibility - bool m_bBanned; // whether the file was banned - bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop - bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer - char m_rgchTags[k_cchTagListMax]; // comma separated list of all tags associated with this file - // file/url information - UGCHandle_t m_hFile; // The handle of the primary file - UGCHandle_t m_hPreviewFile; // The handle of the preview file - char m_pchFileName[k_cchFilenameMax]; // The cloud filename of the primary file - int32 m_nFileSize; // Size of the primary file - int32 m_nPreviewFileSize; // Size of the preview file - char m_rgchURL[k_cchPublishedFileURLMax]; // URL (for a video or a website) - // voting information - uint32 m_unVotesUp; // number of votes up - uint32 m_unVotesDown; // number of votes down - float m_flScore; // calculated score - // collection details - uint32 m_unNumChildren; -}; - -//----------------------------------------------------------------------------- -// Purpose: Steam UGC support API -//----------------------------------------------------------------------------- -class ISteamUGC -{ -public: - - // Query UGC associated with a user. Creator app id or consumer app id must be valid and be set to the current running app. unPage should start at 1. - virtual UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, EUserUGCList eListType, EUGCMatchingUGCType eMatchingUGCType, EUserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint32 unPage ) = 0; - - // Query for all matching UGC. Creator app id or consumer app id must be valid and be set to the current running app. unPage should start at 1. - STEAM_FLAT_NAME( CreateQueryAllUGCRequestPage ) - virtual UGCQueryHandle_t CreateQueryAllUGCRequest( EUGCQuery eQueryType, EUGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint32 unPage ) = 0; - - // Query for all matching UGC using the new deep paging interface. Creator app id or consumer app id must be valid and be set to the current running app. pchCursor should be set to NULL or "*" to get the first result set. - STEAM_FLAT_NAME( CreateQueryAllUGCRequestCursor ) - virtual UGCQueryHandle_t CreateQueryAllUGCRequest( EUGCQuery eQueryType, EUGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, const char *pchCursor = NULL ) = 0; - - // Query for the details of the given published file ids (the RequestUGCDetails call is deprecated and replaced with this) - virtual UGCQueryHandle_t CreateQueryUGCDetailsRequest( PublishedFileId_t *pvecPublishedFileID, uint32 unNumPublishedFileIDs ) = 0; - - // Send the query to Steam - STEAM_CALL_RESULT( SteamUGCQueryCompleted_t ) - virtual SteamAPICall_t SendQueryUGCRequest( UGCQueryHandle_t handle ) = 0; - - // Retrieve an individual result after receiving the callback for querying UGC - virtual bool GetQueryUGCResult( UGCQueryHandle_t handle, uint32 index, SteamUGCDetails_t *pDetails ) = 0; - virtual bool GetQueryUGCPreviewURL( UGCQueryHandle_t handle, uint32 index, STEAM_OUT_STRING_COUNT(cchURLSize) char *pchURL, uint32 cchURLSize ) = 0; - virtual bool GetQueryUGCMetadata( UGCQueryHandle_t handle, uint32 index, STEAM_OUT_STRING_COUNT(cchMetadatasize) char *pchMetadata, uint32 cchMetadatasize ) = 0; - virtual bool GetQueryUGCChildren( UGCQueryHandle_t handle, uint32 index, PublishedFileId_t* pvecPublishedFileID, uint32 cMaxEntries ) = 0; - virtual bool GetQueryUGCStatistic( UGCQueryHandle_t handle, uint32 index, EItemStatistic eStatType, uint64 *pStatValue ) = 0; - virtual uint32 GetQueryUGCNumAdditionalPreviews( UGCQueryHandle_t handle, uint32 index ) = 0; - virtual bool GetQueryUGCAdditionalPreview( UGCQueryHandle_t handle, uint32 index, uint32 previewIndex, STEAM_OUT_STRING_COUNT(cchURLSize) char *pchURLOrVideoID, uint32 cchURLSize, STEAM_OUT_STRING_COUNT(cchURLSize) char *pchOriginalFileName, uint32 cchOriginalFileNameSize, EItemPreviewType *pPreviewType ) = 0; - virtual uint32 GetQueryUGCNumKeyValueTags( UGCQueryHandle_t handle, uint32 index ) = 0; - - virtual bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint32 index, uint32 keyValueTagIndex, STEAM_OUT_STRING_COUNT(cchKeySize) char *pchKey, uint32 cchKeySize, STEAM_OUT_STRING_COUNT(cchValueSize) char *pchValue, uint32 cchValueSize ) = 0; - - // Return the first value matching the pchKey. Note that a key may map to multiple values. Returns false if there was an error or no matching value was found. - STEAM_FLAT_NAME( GetQueryFirstUGCKeyValueTag ) - virtual bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint32 index, const char *pchKey, STEAM_OUT_STRING_COUNT(cchValueSize) char *pchValue, uint32 cchValueSize ) = 0; - - // Release the request to free up memory, after retrieving results - virtual bool ReleaseQueryUGCRequest( UGCQueryHandle_t handle ) = 0; - - // Options to set for querying UGC - virtual bool AddRequiredTag( UGCQueryHandle_t handle, const char *pTagName ) = 0; - virtual bool AddRequiredTagGroup( UGCQueryHandle_t handle, const SteamParamStringArray_t *pTagGroups ) = 0; // match any of the tags in this group - virtual bool AddExcludedTag( UGCQueryHandle_t handle, const char *pTagName ) = 0; - virtual bool SetReturnOnlyIDs( UGCQueryHandle_t handle, bool bReturnOnlyIDs ) = 0; - virtual bool SetReturnKeyValueTags( UGCQueryHandle_t handle, bool bReturnKeyValueTags ) = 0; - virtual bool SetReturnLongDescription( UGCQueryHandle_t handle, bool bReturnLongDescription ) = 0; - virtual bool SetReturnMetadata( UGCQueryHandle_t handle, bool bReturnMetadata ) = 0; - virtual bool SetReturnChildren( UGCQueryHandle_t handle, bool bReturnChildren ) = 0; - virtual bool SetReturnAdditionalPreviews( UGCQueryHandle_t handle, bool bReturnAdditionalPreviews ) = 0; - virtual bool SetReturnTotalOnly( UGCQueryHandle_t handle, bool bReturnTotalOnly ) = 0; - virtual bool SetReturnPlaytimeStats( UGCQueryHandle_t handle, uint32 unDays ) = 0; - virtual bool SetLanguage( UGCQueryHandle_t handle, const char *pchLanguage ) = 0; - virtual bool SetAllowCachedResponse( UGCQueryHandle_t handle, uint32 unMaxAgeSeconds ) = 0; - - // Options only for querying user UGC - virtual bool SetCloudFileNameFilter( UGCQueryHandle_t handle, const char *pMatchCloudFileName ) = 0; - - // Options only for querying all UGC - virtual bool SetMatchAnyTag( UGCQueryHandle_t handle, bool bMatchAnyTag ) = 0; - virtual bool SetSearchText( UGCQueryHandle_t handle, const char *pSearchText ) = 0; - virtual bool SetRankedByTrendDays( UGCQueryHandle_t handle, uint32 unDays ) = 0; - virtual bool AddRequiredKeyValueTag( UGCQueryHandle_t handle, const char *pKey, const char *pValue ) = 0; - - // DEPRECATED - Use CreateQueryUGCDetailsRequest call above instead! - STEAM_CALL_RESULT( SteamUGCRequestUGCDetailsResult_t ) - virtual SteamAPICall_t RequestUGCDetails( PublishedFileId_t nPublishedFileID, uint32 unMaxAgeSeconds ) = 0; - - // Steam Workshop Creator API - STEAM_CALL_RESULT( CreateItemResult_t ) - virtual SteamAPICall_t CreateItem( AppId_t nConsumerAppId, EWorkshopFileType eFileType ) = 0; // create new item for this app with no content attached yet - - virtual UGCUpdateHandle_t StartItemUpdate( AppId_t nConsumerAppId, PublishedFileId_t nPublishedFileID ) = 0; // start an UGC item update. Set changed properties before commiting update with CommitItemUpdate() - - virtual bool SetItemTitle( UGCUpdateHandle_t handle, const char *pchTitle ) = 0; // change the title of an UGC item - virtual bool SetItemDescription( UGCUpdateHandle_t handle, const char *pchDescription ) = 0; // change the description of an UGC item - virtual bool SetItemUpdateLanguage( UGCUpdateHandle_t handle, const char *pchLanguage ) = 0; // specify the language of the title or description that will be set - virtual bool SetItemMetadata( UGCUpdateHandle_t handle, const char *pchMetaData ) = 0; // change the metadata of an UGC item (max = k_cchDeveloperMetadataMax) - virtual bool SetItemVisibility( UGCUpdateHandle_t handle, ERemoteStoragePublishedFileVisibility eVisibility ) = 0; // change the visibility of an UGC item - virtual bool SetItemTags( UGCUpdateHandle_t updateHandle, const SteamParamStringArray_t *pTags ) = 0; // change the tags of an UGC item - virtual bool SetItemContent( UGCUpdateHandle_t handle, const char *pszContentFolder ) = 0; // update item content from this local folder - virtual bool SetItemPreview( UGCUpdateHandle_t handle, const char *pszPreviewFile ) = 0; // change preview image file for this item. pszPreviewFile points to local image file, which must be under 1MB in size - virtual bool SetAllowLegacyUpload( UGCUpdateHandle_t handle, bool bAllowLegacyUpload ) = 0; // use legacy upload for a single small file. The parameter to SetItemContent() should either be a directory with one file or the full path to the file. The file must also be less than 10MB in size. - virtual bool RemoveAllItemKeyValueTags( UGCUpdateHandle_t handle ) = 0; // remove all existing key-value tags (you can add new ones via the AddItemKeyValueTag function) - virtual bool RemoveItemKeyValueTags( UGCUpdateHandle_t handle, const char *pchKey ) = 0; // remove any existing key-value tags with the specified key - virtual bool AddItemKeyValueTag( UGCUpdateHandle_t handle, const char *pchKey, const char *pchValue ) = 0; // add new key-value tags for the item. Note that there can be multiple values for a tag. - virtual bool AddItemPreviewFile( UGCUpdateHandle_t handle, const char *pszPreviewFile, EItemPreviewType type ) = 0; // add preview file for this item. pszPreviewFile points to local file, which must be under 1MB in size - virtual bool AddItemPreviewVideo( UGCUpdateHandle_t handle, const char *pszVideoID ) = 0; // add preview video for this item - virtual bool UpdateItemPreviewFile( UGCUpdateHandle_t handle, uint32 index, const char *pszPreviewFile ) = 0; // updates an existing preview file for this item. pszPreviewFile points to local file, which must be under 1MB in size - virtual bool UpdateItemPreviewVideo( UGCUpdateHandle_t handle, uint32 index, const char *pszVideoID ) = 0; // updates an existing preview video for this item - virtual bool RemoveItemPreview( UGCUpdateHandle_t handle, uint32 index ) = 0; // remove a preview by index starting at 0 (previews are sorted) - - STEAM_CALL_RESULT( SubmitItemUpdateResult_t ) - virtual SteamAPICall_t SubmitItemUpdate( UGCUpdateHandle_t handle, const char *pchChangeNote ) = 0; // commit update process started with StartItemUpdate() - virtual EItemUpdateStatus GetItemUpdateProgress( UGCUpdateHandle_t handle, uint64 *punBytesProcessed, uint64* punBytesTotal ) = 0; - - // Steam Workshop Consumer API - STEAM_CALL_RESULT( SetUserItemVoteResult_t ) - virtual SteamAPICall_t SetUserItemVote( PublishedFileId_t nPublishedFileID, bool bVoteUp ) = 0; - STEAM_CALL_RESULT( GetUserItemVoteResult_t ) - virtual SteamAPICall_t GetUserItemVote( PublishedFileId_t nPublishedFileID ) = 0; - STEAM_CALL_RESULT( UserFavoriteItemsListChanged_t ) - virtual SteamAPICall_t AddItemToFavorites( AppId_t nAppId, PublishedFileId_t nPublishedFileID ) = 0; - STEAM_CALL_RESULT( UserFavoriteItemsListChanged_t ) - virtual SteamAPICall_t RemoveItemFromFavorites( AppId_t nAppId, PublishedFileId_t nPublishedFileID ) = 0; - STEAM_CALL_RESULT( RemoteStorageSubscribePublishedFileResult_t ) - virtual SteamAPICall_t SubscribeItem( PublishedFileId_t nPublishedFileID ) = 0; // subscribe to this item, will be installed ASAP - STEAM_CALL_RESULT( RemoteStorageUnsubscribePublishedFileResult_t ) - virtual SteamAPICall_t UnsubscribeItem( PublishedFileId_t nPublishedFileID ) = 0; // unsubscribe from this item, will be uninstalled after game quits - virtual uint32 GetNumSubscribedItems() = 0; // number of subscribed items - virtual uint32 GetSubscribedItems( PublishedFileId_t* pvecPublishedFileID, uint32 cMaxEntries ) = 0; // all subscribed item PublishFileIDs - - // get EItemState flags about item on this client - virtual uint32 GetItemState( PublishedFileId_t nPublishedFileID ) = 0; - - // get info about currently installed content on disc for items that have k_EItemStateInstalled set - // if k_EItemStateLegacyItem is set, pchFolder contains the path to the legacy file itself (not a folder) - virtual bool GetItemInstallInfo( PublishedFileId_t nPublishedFileID, uint64 *punSizeOnDisk, STEAM_OUT_STRING_COUNT( cchFolderSize ) char *pchFolder, uint32 cchFolderSize, uint32 *punTimeStamp ) = 0; - - // get info about pending update for items that have k_EItemStateNeedsUpdate set. punBytesTotal will be valid after download started once - virtual bool GetItemDownloadInfo( PublishedFileId_t nPublishedFileID, uint64 *punBytesDownloaded, uint64 *punBytesTotal ) = 0; - - // download new or update already installed item. If function returns true, wait for DownloadItemResult_t. If the item is already installed, - // then files on disk should not be used until callback received. If item is not subscribed to, it will be cached for some time. - // If bHighPriority is set, any other item download will be suspended and this item downloaded ASAP. - virtual bool DownloadItem( PublishedFileId_t nPublishedFileID, bool bHighPriority ) = 0; - - // game servers can set a specific workshop folder before issuing any UGC commands. - // This is helpful if you want to support multiple game servers running out of the same install folder - virtual bool BInitWorkshopForGameServer( DepotId_t unWorkshopDepotID, const char *pszFolder ) = 0; - - // SuspendDownloads( true ) will suspend all workshop downloads until SuspendDownloads( false ) is called or the game ends - virtual void SuspendDownloads( bool bSuspend ) = 0; - - // usage tracking - STEAM_CALL_RESULT( StartPlaytimeTrackingResult_t ) - virtual SteamAPICall_t StartPlaytimeTracking( PublishedFileId_t *pvecPublishedFileID, uint32 unNumPublishedFileIDs ) = 0; - STEAM_CALL_RESULT( StopPlaytimeTrackingResult_t ) - virtual SteamAPICall_t StopPlaytimeTracking( PublishedFileId_t *pvecPublishedFileID, uint32 unNumPublishedFileIDs ) = 0; - STEAM_CALL_RESULT( StopPlaytimeTrackingResult_t ) - virtual SteamAPICall_t StopPlaytimeTrackingForAllItems() = 0; - - // parent-child relationship or dependency management - STEAM_CALL_RESULT( AddUGCDependencyResult_t ) - virtual SteamAPICall_t AddDependency( PublishedFileId_t nParentPublishedFileID, PublishedFileId_t nChildPublishedFileID ) = 0; - STEAM_CALL_RESULT( RemoveUGCDependencyResult_t ) - virtual SteamAPICall_t RemoveDependency( PublishedFileId_t nParentPublishedFileID, PublishedFileId_t nChildPublishedFileID ) = 0; - - // add/remove app dependence/requirements (usually DLC) - STEAM_CALL_RESULT( AddAppDependencyResult_t ) - virtual SteamAPICall_t AddAppDependency( PublishedFileId_t nPublishedFileID, AppId_t nAppID ) = 0; - STEAM_CALL_RESULT( RemoveAppDependencyResult_t ) - virtual SteamAPICall_t RemoveAppDependency( PublishedFileId_t nPublishedFileID, AppId_t nAppID ) = 0; - // request app dependencies. note that whatever callback you register for GetAppDependenciesResult_t may be called multiple times - // until all app dependencies have been returned - STEAM_CALL_RESULT( GetAppDependenciesResult_t ) - virtual SteamAPICall_t GetAppDependencies( PublishedFileId_t nPublishedFileID ) = 0; - - // delete the item without prompting the user - STEAM_CALL_RESULT( DeleteItemResult_t ) - virtual SteamAPICall_t DeleteItem( PublishedFileId_t nPublishedFileID ) = 0; -}; - -#define STEAMUGC_INTERFACE_VERSION "STEAMUGC_INTERFACE_VERSION014" - -// Global interface accessor -inline ISteamUGC *SteamUGC(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamUGC *, SteamUGC, STEAMUGC_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamUGC *SteamGameServerUGC(); -STEAM_DEFINE_GAMESERVER_INTERFACE_ACCESSOR( ISteamUGC *, SteamGameServerUGC, STEAMUGC_INTERFACE_VERSION ); - -//----------------------------------------------------------------------------- -// Purpose: Callback for querying UGC -//----------------------------------------------------------------------------- -struct SteamUGCQueryCompleted_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 1 }; - UGCQueryHandle_t m_handle; - EResult m_eResult; - uint32 m_unNumResultsReturned; - uint32 m_unTotalMatchingResults; - bool m_bCachedData; // indicates whether this data was retrieved from the local on-disk cache - char m_rgchNextCursor[k_cchPublishedFileURLMax]; // If a paging cursor was used, then this will be the next cursor to get the next result set. -}; - - -//----------------------------------------------------------------------------- -// Purpose: Callback for requesting details on one piece of UGC -//----------------------------------------------------------------------------- -struct SteamUGCRequestUGCDetailsResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 2 }; - SteamUGCDetails_t m_details; - bool m_bCachedData; // indicates whether this data was retrieved from the local on-disk cache -}; - - -//----------------------------------------------------------------------------- -// Purpose: result for ISteamUGC::CreateItem() -//----------------------------------------------------------------------------- -struct CreateItemResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 3 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; // new item got this UGC PublishFileID - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; -}; - - -//----------------------------------------------------------------------------- -// Purpose: result for ISteamUGC::SubmitItemUpdate() -//----------------------------------------------------------------------------- -struct SubmitItemUpdateResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 4 }; - EResult m_eResult; - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; - PublishedFileId_t m_nPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: a Workshop item has been installed or updated -//----------------------------------------------------------------------------- -struct ItemInstalled_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 5 }; - AppId_t m_unAppID; - PublishedFileId_t m_nPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: result of DownloadItem(), existing item files can be accessed again -//----------------------------------------------------------------------------- -struct DownloadItemResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 6 }; - AppId_t m_unAppID; - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; -}; - -//----------------------------------------------------------------------------- -// Purpose: result of AddItemToFavorites() or RemoveItemFromFavorites() -//----------------------------------------------------------------------------- -struct UserFavoriteItemsListChanged_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 7 }; - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; - bool m_bWasAddRequest; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to SetUserItemVote() -//----------------------------------------------------------------------------- -struct SetUserItemVoteResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 8 }; - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; - bool m_bVoteUp; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to GetUserItemVote() -//----------------------------------------------------------------------------- -struct GetUserItemVoteResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 9 }; - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; - bool m_bVotedUp; - bool m_bVotedDown; - bool m_bVoteSkipped; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to StartPlaytimeTracking() -//----------------------------------------------------------------------------- -struct StartPlaytimeTrackingResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 10 }; - EResult m_eResult; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to StopPlaytimeTracking() -//----------------------------------------------------------------------------- -struct StopPlaytimeTrackingResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 11 }; - EResult m_eResult; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to AddDependency -//----------------------------------------------------------------------------- -struct AddUGCDependencyResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 12 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - PublishedFileId_t m_nChildPublishedFileId; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to RemoveDependency -//----------------------------------------------------------------------------- -struct RemoveUGCDependencyResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 13 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - PublishedFileId_t m_nChildPublishedFileId; -}; - - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to AddAppDependency -//----------------------------------------------------------------------------- -struct AddAppDependencyResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 14 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - AppId_t m_nAppID; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to RemoveAppDependency -//----------------------------------------------------------------------------- -struct RemoveAppDependencyResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 15 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - AppId_t m_nAppID; -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to GetAppDependencies. Callback may be called -// multiple times until all app dependencies have been returned. -//----------------------------------------------------------------------------- -struct GetAppDependenciesResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 16 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - AppId_t m_rgAppIDs[32]; - uint32 m_nNumAppDependencies; // number returned in this struct - uint32 m_nTotalNumAppDependencies; // total found -}; - -//----------------------------------------------------------------------------- -// Purpose: The result of a call to DeleteItem -//----------------------------------------------------------------------------- -struct DeleteItemResult_t -{ - enum { k_iCallback = k_iClientUGCCallbacks + 17 }; - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; -}; - -#pragma pack( pop ) - -#endif // ISTEAMUGC_H diff --git a/lib/steamworks_150/public/steam/isteamuser.h b/lib/steamworks_150/public/steam/isteamuser.h deleted file mode 100644 index 83f2e26..0000000 --- a/lib/steamworks_150/public/steam/isteamuser.h +++ /dev/null @@ -1,410 +0,0 @@ -//====== Copyright (c) 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to user account information in Steam -// -//============================================================================= - -#ifndef ISTEAMUSER_H -#define ISTEAMUSER_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -//----------------------------------------------------------------------------- -// Purpose: Functions for accessing and manipulating a steam account -// associated with one client instance -//----------------------------------------------------------------------------- -class ISteamUser -{ -public: - // returns the HSteamUser this interface represents - // this is only used internally by the API, and by a few select interfaces that support multi-user - virtual HSteamUser GetHSteamUser() = 0; - - // returns true if the Steam client current has a live connection to the Steam servers. - // If false, it means there is no active connection due to either a networking issue on the local machine, or the Steam server is down/busy. - // The Steam client will automatically be trying to recreate the connection as often as possible. - virtual bool BLoggedOn() = 0; - - // returns the CSteamID of the account currently logged into the Steam client - // a CSteamID is a unique identifier for an account, and used to differentiate users in all parts of the Steamworks API - virtual CSteamID GetSteamID() = 0; - - // Multiplayer Authentication functions - - // InitiateGameConnection() starts the state machine for authenticating the game client with the game server - // It is the client portion of a three-way handshake between the client, the game server, and the steam servers - // - // Parameters: - // void *pAuthBlob - a pointer to empty memory that will be filled in with the authentication token. - // int cbMaxAuthBlob - the number of bytes of allocated memory in pBlob. Should be at least 2048 bytes. - // CSteamID steamIDGameServer - the steamID of the game server, received from the game server by the client - // CGameID gameID - the ID of the current game. For games without mods, this is just CGameID( ) - // uint32 unIPServer, uint16 usPortServer - the IP address of the game server - // bool bSecure - whether or not the client thinks that the game server is reporting itself as secure (i.e. VAC is running) - // - // return value - returns the number of bytes written to pBlob. If the return is 0, then the buffer passed in was too small, and the call has failed - // The contents of pBlob should then be sent to the game server, for it to use to complete the authentication process. - virtual int InitiateGameConnection( void *pAuthBlob, int cbMaxAuthBlob, CSteamID steamIDGameServer, uint32 unIPServer, uint16 usPortServer, bool bSecure ) = 0; - - // notify of disconnect - // needs to occur when the game client leaves the specified game server, needs to match with the InitiateGameConnection() call - virtual void TerminateGameConnection( uint32 unIPServer, uint16 usPortServer ) = 0; - - // Legacy functions - - // used by only a few games to track usage events - virtual void TrackAppUsageEvent( CGameID gameID, int eAppUsageEvent, const char *pchExtraInfo = "" ) = 0; - - // get the local storage folder for current Steam account to write application data, e.g. save games, configs etc. - // this will usually be something like "C:\Progam Files\Steam\userdata\\\local" - virtual bool GetUserDataFolder( char *pchBuffer, int cubBuffer ) = 0; - - // Starts voice recording. Once started, use GetVoice() to get the data - virtual void StartVoiceRecording( ) = 0; - - // Stops voice recording. Because people often release push-to-talk keys early, the system will keep recording for - // a little bit after this function is called. GetVoice() should continue to be called until it returns - // k_eVoiceResultNotRecording - virtual void StopVoiceRecording( ) = 0; - - // Determine the size of captured audio data that is available from GetVoice. - // Most applications will only use compressed data and should ignore the other - // parameters, which exist primarily for backwards compatibility. See comments - // below for further explanation of "uncompressed" data. - virtual EVoiceResult GetAvailableVoice( uint32 *pcbCompressed, uint32 *pcbUncompressed_Deprecated = 0, uint32 nUncompressedVoiceDesiredSampleRate_Deprecated = 0 ) = 0; - - // --------------------------------------------------------------------------- - // NOTE: "uncompressed" audio is a deprecated feature and should not be used - // by most applications. It is raw single-channel 16-bit PCM wave data which - // may have been run through preprocessing filters and/or had silence removed, - // so the uncompressed audio could have a shorter duration than you expect. - // There may be no data at all during long periods of silence. Also, fetching - // uncompressed audio will cause GetVoice to discard any leftover compressed - // audio, so you must fetch both types at once. Finally, GetAvailableVoice is - // not precisely accurate when the uncompressed size is requested. So if you - // really need to use uncompressed audio, you should call GetVoice frequently - // with two very large (20kb+) output buffers instead of trying to allocate - // perfectly-sized buffers. But most applications should ignore all of these - // details and simply leave the "uncompressed" parameters as NULL/zero. - // --------------------------------------------------------------------------- - - // Read captured audio data from the microphone buffer. This should be called - // at least once per frame, and preferably every few milliseconds, to keep the - // microphone input delay as low as possible. Most applications will only use - // compressed data and should pass NULL/zero for the "uncompressed" parameters. - // Compressed data can be transmitted by your application and decoded into raw - // using the DecompressVoice function below. - virtual EVoiceResult GetVoice( bool bWantCompressed, void *pDestBuffer, uint32 cbDestBufferSize, uint32 *nBytesWritten, bool bWantUncompressed_Deprecated = false, void *pUncompressedDestBuffer_Deprecated = 0, uint32 cbUncompressedDestBufferSize_Deprecated = 0, uint32 *nUncompressBytesWritten_Deprecated = 0, uint32 nUncompressedVoiceDesiredSampleRate_Deprecated = 0 ) = 0; - - // Decodes the compressed voice data returned by GetVoice. The output data is - // raw single-channel 16-bit PCM audio. The decoder supports any sample rate - // from 11025 to 48000; see GetVoiceOptimalSampleRate() below for details. - // If the output buffer is not large enough, then *nBytesWritten will be set - // to the required buffer size, and k_EVoiceResultBufferTooSmall is returned. - // It is suggested to start with a 20kb buffer and reallocate as necessary. - virtual EVoiceResult DecompressVoice( const void *pCompressed, uint32 cbCompressed, void *pDestBuffer, uint32 cbDestBufferSize, uint32 *nBytesWritten, uint32 nDesiredSampleRate ) = 0; - - // This returns the native sample rate of the Steam voice decompressor; using - // this sample rate for DecompressVoice will perform the least CPU processing. - // However, the final audio quality will depend on how well the audio device - // (and/or your application's audio output SDK) deals with lower sample rates. - // You may find that you get the best audio output quality when you ignore - // this function and use the native sample rate of your audio output device, - // which is usually 48000 or 44100. - virtual uint32 GetVoiceOptimalSampleRate() = 0; - - // Retrieve ticket to be sent to the entity who wishes to authenticate you. - // pcbTicket retrieves the length of the actual ticket. - virtual HAuthTicket GetAuthSessionTicket( void *pTicket, int cbMaxTicket, uint32 *pcbTicket ) = 0; - - // Authenticate ticket from entity steamID to be sure it is valid and isnt reused - // Registers for callbacks if the entity goes offline or cancels the ticket ( see ValidateAuthTicketResponse_t callback and EAuthSessionResponse ) - virtual EBeginAuthSessionResult BeginAuthSession( const void *pAuthTicket, int cbAuthTicket, CSteamID steamID ) = 0; - - // Stop tracking started by BeginAuthSession - called when no longer playing game with this entity - virtual void EndAuthSession( CSteamID steamID ) = 0; - - // Cancel auth ticket from GetAuthSessionTicket, called when no longer playing game with the entity you gave the ticket to - virtual void CancelAuthTicket( HAuthTicket hAuthTicket ) = 0; - - // After receiving a user's authentication data, and passing it to BeginAuthSession, use this function - // to determine if the user owns downloadable content specified by the provided AppID. - virtual EUserHasLicenseForAppResult UserHasLicenseForApp( CSteamID steamID, AppId_t appID ) = 0; - - // returns true if this users looks like they are behind a NAT device. Only valid once the user has connected to steam - // (i.e a SteamServersConnected_t has been issued) and may not catch all forms of NAT. - virtual bool BIsBehindNAT() = 0; - - // set data to be replicated to friends so that they can join your game - // CSteamID steamIDGameServer - the steamID of the game server, received from the game server by the client - // uint32 unIPServer, uint16 usPortServer - the IP address of the game server - virtual void AdvertiseGame( CSteamID steamIDGameServer, uint32 unIPServer, uint16 usPortServer ) = 0; - - // Requests a ticket encrypted with an app specific shared key - // pDataToInclude, cbDataToInclude will be encrypted into the ticket - // ( This is asynchronous, you must wait for the ticket to be completed by the server ) - STEAM_CALL_RESULT( EncryptedAppTicketResponse_t ) - virtual SteamAPICall_t RequestEncryptedAppTicket( void *pDataToInclude, int cbDataToInclude ) = 0; - - // Retrieves a finished ticket. - // If no ticket is available, or your buffer is too small, returns false. - // Upon exit, *pcbTicket will be either the size of the ticket copied into your buffer - // (if true was returned), or the size needed (if false was returned). To determine the - // proper size of the ticket, you can pass pTicket=NULL and cbMaxTicket=0; if a ticket - // is available, *pcbTicket will contain the size needed, otherwise it will be zero. - virtual bool GetEncryptedAppTicket( void *pTicket, int cbMaxTicket, uint32 *pcbTicket ) = 0; - - // Trading Card badges data access - // if you only have one set of cards, the series will be 1 - // the user has can have two different badges for a series; the regular (max level 5) and the foil (max level 1) - virtual int GetGameBadgeLevel( int nSeries, bool bFoil ) = 0; - - // gets the Steam Level of the user, as shown on their profile - virtual int GetPlayerSteamLevel() = 0; - - // Requests a URL which authenticates an in-game browser for store check-out, - // and then redirects to the specified URL. As long as the in-game browser - // accepts and handles session cookies, Steam microtransaction checkout pages - // will automatically recognize the user instead of presenting a login page. - // The result of this API call will be a StoreAuthURLResponse_t callback. - // NOTE: The URL has a very short lifetime to prevent history-snooping attacks, - // so you should only call this API when you are about to launch the browser, - // or else immediately navigate to the result URL using a hidden browser window. - // NOTE 2: The resulting authorization cookie has an expiration time of one day, - // so it would be a good idea to request and visit a new auth URL every 12 hours. - STEAM_CALL_RESULT( StoreAuthURLResponse_t ) - virtual SteamAPICall_t RequestStoreAuthURL( const char *pchRedirectURL ) = 0; - - // gets whether the users phone number is verified - virtual bool BIsPhoneVerified() = 0; - - // gets whether the user has two factor enabled on their account - virtual bool BIsTwoFactorEnabled() = 0; - - // gets whether the users phone number is identifying - virtual bool BIsPhoneIdentifying() = 0; - - // gets whether the users phone number is awaiting (re)verification - virtual bool BIsPhoneRequiringVerification() = 0; - - STEAM_CALL_RESULT( MarketEligibilityResponse_t ) - virtual SteamAPICall_t GetMarketEligibility() = 0; - - // Retrieves anti indulgence / duration control for current user - 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 "SteamUser021" - -// Global interface accessor -inline ISteamUser *SteamUser(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamUser *, SteamUser, STEAMUSER_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: called when a connections to the Steam back-end has been established -// this means the Steam client now has a working connection to the Steam servers -// usually this will have occurred before the game has launched, and should -// only be seen if the user has dropped connection due to a networking issue -// or a Steam server update -//----------------------------------------------------------------------------- -struct SteamServersConnected_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 1 }; -}; - -//----------------------------------------------------------------------------- -// Purpose: called when a connection attempt has failed -// this will occur periodically if the Steam client is not connected, -// and has failed in it's retry to establish a connection -//----------------------------------------------------------------------------- -struct SteamServerConnectFailure_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 2 }; - EResult m_eResult; - bool m_bStillRetrying; -}; - - -//----------------------------------------------------------------------------- -// Purpose: called if the client has lost connection to the Steam servers -// real-time services will be disabled until a matching SteamServersConnected_t has been posted -//----------------------------------------------------------------------------- -struct SteamServersDisconnected_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 3 }; - EResult m_eResult; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Sent by the Steam server to the client telling it to disconnect from the specified game server, -// which it may be in the process of or already connected to. -// The game client should immediately disconnect upon receiving this message. -// This can usually occur if the user doesn't have rights to play on the game server. -//----------------------------------------------------------------------------- -struct ClientGameServerDeny_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 13 }; - - uint32 m_uAppID; - uint32 m_unGameServerIP; - uint16 m_usGameServerPort; - uint16 m_bSecure; - uint32 m_uReason; -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when the callback system for this client is in an error state (and has flushed pending callbacks) -// When getting this message the client should disconnect from Steam, reset any stored Steam state and reconnect. -// This usually occurs in the rare event the Steam client has some kind of fatal error. -//----------------------------------------------------------------------------- -struct IPCFailure_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 17 }; - enum EFailureType - { - k_EFailureFlushedCallbackQueue, - k_EFailurePipeFail, - }; - uint8 m_eFailureType; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Signaled whenever licenses change -//----------------------------------------------------------------------------- -struct LicensesUpdated_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 25 }; -}; - - -//----------------------------------------------------------------------------- -// callback for BeginAuthSession -//----------------------------------------------------------------------------- -struct ValidateAuthTicketResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 43 }; - CSteamID m_SteamID; - EAuthSessionResponse m_eAuthSessionResponse; - CSteamID m_OwnerSteamID; // different from m_SteamID if borrowed -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when a user has responded to a microtransaction authorization request -//----------------------------------------------------------------------------- -struct MicroTxnAuthorizationResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 52 }; - - uint32 m_unAppID; // AppID for this microtransaction - uint64 m_ulOrderID; // OrderID provided for the microtransaction - uint8 m_bAuthorized; // if user authorized transaction -}; - - -//----------------------------------------------------------------------------- -// Purpose: Result from RequestEncryptedAppTicket -//----------------------------------------------------------------------------- -struct EncryptedAppTicketResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 54 }; - - EResult m_eResult; -}; - -//----------------------------------------------------------------------------- -// callback for GetAuthSessionTicket -//----------------------------------------------------------------------------- -struct GetAuthSessionTicketResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 63 }; - HAuthTicket m_hAuthTicket; - EResult m_eResult; -}; - - -//----------------------------------------------------------------------------- -// Purpose: sent to your game in response to a steam://gamewebcallback/ command -//----------------------------------------------------------------------------- -struct GameWebCallback_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 64 }; - char m_szURL[256]; -}; - -//----------------------------------------------------------------------------- -// Purpose: sent to your game in response to ISteamUser::RequestStoreAuthURL -//----------------------------------------------------------------------------- -struct StoreAuthURLResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 65 }; - char m_szURL[512]; -}; - - -//----------------------------------------------------------------------------- -// Purpose: sent in response to ISteamUser::GetMarketEligibility -//----------------------------------------------------------------------------- -struct MarketEligibilityResponse_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 66 }; - bool m_bAllowed; - EMarketNotAllowedReasonFlags m_eNotAllowedReason; - RTime32 m_rtAllowedAtTime; - - int m_cdaySteamGuardRequiredDays; // The number of days any user is required to have had Steam Guard before they can use the market - int m_cdayNewDeviceCooldown; // The number of days after initial device authorization a user must wait before using the market on that device -}; - - -//----------------------------------------------------------------------------- -// Purpose: sent for games with enabled anti indulgence / duration control, for -// enabled users. Lets the game know whether the user can keep playing or -// whether the game should exit, and returns info about remaining gameplay time. -// -// This callback is fired asynchronously in response to timers triggering. -// It is also fired in response to calls to GetDurationControl(). -//----------------------------------------------------------------------------- -struct DurationControl_t -{ - enum { k_iCallback = k_iSteamUserCallbacks + 67 }; - - EResult m_eResult; // result of call (always k_EResultOK for asynchronous timer-based notifications) - AppId_t m_appid; // appid generating playtime - - bool m_bApplicable; // is duration control applicable to user + game combination - int32 m_csecsLast5h; // playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds - - EDurationControlProgress m_progress; // recommended progress (either everything is fine, or please exit game) - EDurationControlNotification m_notification; // notification to show, if any (always k_EDurationControlNotification_None for API calls) - - int32 m_csecsToday; // playtime on current calendar day - int32 m_csecsRemaining; // playtime remaining until the user hits a regulatory limit -}; - - -#pragma pack( pop ) - -#endif // ISTEAMUSER_H diff --git a/lib/steamworks_150/public/steam/isteamuserstats.h b/lib/steamworks_150/public/steam/isteamuserstats.h deleted file mode 100644 index af37148..0000000 --- a/lib/steamworks_150/public/steam/isteamuserstats.h +++ /dev/null @@ -1,488 +0,0 @@ -//====== Copyright � 1996-2009, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to stats, achievements, and leaderboards -// -//============================================================================= - -#ifndef ISTEAMUSERSTATS_H -#define ISTEAMUSERSTATS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" -#include "isteamremotestorage.h" - -// size limit on stat or achievement name (UTF-8 encoded) -enum { k_cchStatNameMax = 128 }; - -// maximum number of bytes for a leaderboard name (UTF-8 encoded) -enum { k_cchLeaderboardNameMax = 128 }; - -// maximum number of details int32's storable for a single leaderboard entry -enum { k_cLeaderboardDetailsMax = 64 }; - -// handle to a single leaderboard -typedef uint64 SteamLeaderboard_t; - -// handle to a set of downloaded entries in a leaderboard -typedef uint64 SteamLeaderboardEntries_t; - -// type of data request, when downloading leaderboard entries -enum ELeaderboardDataRequest -{ - k_ELeaderboardDataRequestGlobal = 0, - k_ELeaderboardDataRequestGlobalAroundUser = 1, - k_ELeaderboardDataRequestFriends = 2, - k_ELeaderboardDataRequestUsers = 3 -}; - -// the sort order of a leaderboard -enum ELeaderboardSortMethod -{ - k_ELeaderboardSortMethodNone = 0, - k_ELeaderboardSortMethodAscending = 1, // top-score is lowest number - k_ELeaderboardSortMethodDescending = 2, // top-score is highest number -}; - -// the display type (used by the Steam Community web site) for a leaderboard -enum ELeaderboardDisplayType -{ - k_ELeaderboardDisplayTypeNone = 0, - k_ELeaderboardDisplayTypeNumeric = 1, // simple numerical score - k_ELeaderboardDisplayTypeTimeSeconds = 2, // the score represents a time, in seconds - k_ELeaderboardDisplayTypeTimeMilliSeconds = 3, // the score represents a time, in milliseconds -}; - -enum ELeaderboardUploadScoreMethod -{ - k_ELeaderboardUploadScoreMethodNone = 0, - k_ELeaderboardUploadScoreMethodKeepBest = 1, // Leaderboard will keep user's best score - k_ELeaderboardUploadScoreMethodForceUpdate = 2, // Leaderboard will always replace score with specified -}; - -// a single entry in a leaderboard, as returned by GetDownloadedLeaderboardEntry() -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -struct LeaderboardEntry_t -{ - CSteamID m_steamIDUser; // user with the entry - use SteamFriends()->GetFriendPersonaName() & SteamFriends()->GetFriendAvatar() to get more info - int32 m_nGlobalRank; // [1..N], where N is the number of users with an entry in the leaderboard - int32 m_nScore; // score as set in the leaderboard - int32 m_cDetails; // number of int32 details available for this entry - UGCHandle_t m_hUGC; // handle for UGC attached to the entry -}; - -#pragma pack( pop ) - - -//----------------------------------------------------------------------------- -// Purpose: Functions for accessing stats, achievements, and leaderboard information -//----------------------------------------------------------------------------- -class ISteamUserStats -{ -public: - // Ask the server to send down this user's data and achievements for this game - STEAM_CALL_BACK( UserStatsReceived_t ) - virtual bool RequestCurrentStats() = 0; - - // Data accessors - STEAM_FLAT_NAME( GetStatInt32 ) - virtual bool GetStat( const char *pchName, int32 *pData ) = 0; - - STEAM_FLAT_NAME( GetStatFloat ) - virtual bool GetStat( const char *pchName, float *pData ) = 0; - - // Set / update data - STEAM_FLAT_NAME( SetStatInt32 ) - virtual bool SetStat( const char *pchName, int32 nData ) = 0; - - STEAM_FLAT_NAME( SetStatFloat ) - virtual bool SetStat( const char *pchName, float fData ) = 0; - - virtual bool UpdateAvgRateStat( const char *pchName, float flCountThisSession, double dSessionLength ) = 0; - - // Achievement flag accessors - virtual bool GetAchievement( const char *pchName, bool *pbAchieved ) = 0; - virtual bool SetAchievement( const char *pchName ) = 0; - virtual bool ClearAchievement( const char *pchName ) = 0; - - // Get the achievement status, and the time it was unlocked if unlocked. - // If the return value is true, but the unlock time is zero, that means it was unlocked before Steam - // began tracking achievement unlock times (December 2009). Time is seconds since January 1, 1970. - virtual bool GetAchievementAndUnlockTime( const char *pchName, bool *pbAchieved, uint32 *punUnlockTime ) = 0; - - // Store the current data on the server, will get a callback when set - // And one callback for every new achievement - // - // If the callback has a result of k_EResultInvalidParam, one or more stats - // uploaded has been rejected, either because they broke constraints - // or were out of date. In this case the server sends back updated values. - // The stats should be re-iterated to keep in sync. - virtual bool StoreStats() = 0; - - // Achievement / GroupAchievement metadata - - // Gets the icon of the achievement, which is a handle to be used in ISteamUtils::GetImageRGBA(), or 0 if none set. - // A return value of 0 may indicate we are still fetching data, and you can wait for the UserAchievementIconFetched_t callback - // which will notify you when the bits are ready. If the callback still returns zero, then there is no image set for the - // specified achievement. - virtual int GetAchievementIcon( const char *pchName ) = 0; - - // Get general attributes for an achievement. Accepts the following keys: - // - "name" and "desc" for retrieving the localized achievement name and description (returned in UTF8) - // - "hidden" for retrieving if an achievement is hidden (returns "0" when not hidden, "1" when hidden) - virtual const char *GetAchievementDisplayAttribute( const char *pchName, const char *pchKey ) = 0; - - // Achievement progress - triggers an AchievementProgress callback, that is all. - // Calling this w/ N out of N progress will NOT set the achievement, the game must still do that. - virtual bool IndicateAchievementProgress( const char *pchName, uint32 nCurProgress, uint32 nMaxProgress ) = 0; - - // Used for iterating achievements. In general games should not need these functions because they should have a - // list of existing achievements compiled into them - virtual uint32 GetNumAchievements() = 0; - // Get achievement name iAchievement in [0,GetNumAchievements) - virtual const char *GetAchievementName( uint32 iAchievement ) = 0; - - // Friends stats & achievements - - // downloads stats for the user - // returns a UserStatsReceived_t received when completed - // if the other user has no stats, UserStatsReceived_t.m_eResult will be set to k_EResultFail - // these stats won't be auto-updated; you'll need to call RequestUserStats() again to refresh any data - STEAM_CALL_RESULT( UserStatsReceived_t ) - virtual SteamAPICall_t RequestUserStats( CSteamID steamIDUser ) = 0; - - // requests stat information for a user, usable after a successful call to RequestUserStats() - STEAM_FLAT_NAME( GetUserStatInt32 ) - virtual bool GetUserStat( CSteamID steamIDUser, const char *pchName, int32 *pData ) = 0; - - STEAM_FLAT_NAME( GetUserStatFloat ) - virtual bool GetUserStat( CSteamID steamIDUser, const char *pchName, float *pData ) = 0; - - virtual bool GetUserAchievement( CSteamID steamIDUser, const char *pchName, bool *pbAchieved ) = 0; - // See notes for GetAchievementAndUnlockTime above - virtual bool GetUserAchievementAndUnlockTime( CSteamID steamIDUser, const char *pchName, bool *pbAchieved, uint32 *punUnlockTime ) = 0; - - // Reset stats - virtual bool ResetAllStats( bool bAchievementsToo ) = 0; - - // Leaderboard functions - - // asks the Steam back-end for a leaderboard by name, and will create it if it's not yet - // This call is asynchronous, with the result returned in LeaderboardFindResult_t - STEAM_CALL_RESULT(LeaderboardFindResult_t) - virtual SteamAPICall_t FindOrCreateLeaderboard( const char *pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType ) = 0; - - // as above, but won't create the leaderboard if it's not found - // This call is asynchronous, with the result returned in LeaderboardFindResult_t - STEAM_CALL_RESULT( LeaderboardFindResult_t ) - virtual SteamAPICall_t FindLeaderboard( const char *pchLeaderboardName ) = 0; - - // returns the name of a leaderboard - virtual const char *GetLeaderboardName( SteamLeaderboard_t hSteamLeaderboard ) = 0; - - // returns the total number of entries in a leaderboard, as of the last request - virtual int GetLeaderboardEntryCount( SteamLeaderboard_t hSteamLeaderboard ) = 0; - - // returns the sort method of the leaderboard - virtual ELeaderboardSortMethod GetLeaderboardSortMethod( SteamLeaderboard_t hSteamLeaderboard ) = 0; - - // returns the display type of the leaderboard - virtual ELeaderboardDisplayType GetLeaderboardDisplayType( SteamLeaderboard_t hSteamLeaderboard ) = 0; - - // Asks the Steam back-end for a set of rows in the leaderboard. - // This call is asynchronous, with the result returned in LeaderboardScoresDownloaded_t - // LeaderboardScoresDownloaded_t will contain a handle to pull the results from GetDownloadedLeaderboardEntries() (below) - // You can ask for more entries than exist, and it will return as many as do exist. - // k_ELeaderboardDataRequestGlobal requests rows in the leaderboard from the full table, with nRangeStart & nRangeEnd in the range [1, TotalEntries] - // k_ELeaderboardDataRequestGlobalAroundUser requests rows around the current user, nRangeStart being negate - // e.g. DownloadLeaderboardEntries( hLeaderboard, k_ELeaderboardDataRequestGlobalAroundUser, -3, 3 ) will return 7 rows, 3 before the user, 3 after - // k_ELeaderboardDataRequestFriends requests all the rows for friends of the current user - STEAM_CALL_RESULT( LeaderboardScoresDownloaded_t ) - virtual SteamAPICall_t DownloadLeaderboardEntries( SteamLeaderboard_t hSteamLeaderboard, ELeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ) = 0; - // as above, but downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers - // if a user doesn't have a leaderboard entry, they won't be included in the result - // a max of 100 users can be downloaded at a time, with only one outstanding call at a time - STEAM_METHOD_DESC(Downloads leaderboard entries for an arbitrary set of users - ELeaderboardDataRequest is k_ELeaderboardDataRequestUsers) - STEAM_CALL_RESULT( LeaderboardScoresDownloaded_t ) - virtual SteamAPICall_t DownloadLeaderboardEntriesForUsers( SteamLeaderboard_t hSteamLeaderboard, - STEAM_ARRAY_COUNT_D(cUsers, Array of users to retrieve) CSteamID *prgUsers, int cUsers ) = 0; - - // Returns data about a single leaderboard entry - // use a for loop from 0 to LeaderboardScoresDownloaded_t::m_cEntryCount to get all the downloaded entries - // e.g. - // void OnLeaderboardScoresDownloaded( LeaderboardScoresDownloaded_t *pLeaderboardScoresDownloaded ) - // { - // for ( int index = 0; index < pLeaderboardScoresDownloaded->m_cEntryCount; index++ ) - // { - // LeaderboardEntry_t leaderboardEntry; - // int32 details[3]; // we know this is how many we've stored previously - // GetDownloadedLeaderboardEntry( pLeaderboardScoresDownloaded->m_hSteamLeaderboardEntries, index, &leaderboardEntry, details, 3 ); - // assert( leaderboardEntry.m_cDetails == 3 ); - // ... - // } - // once you've accessed all the entries, the data will be free'd, and the SteamLeaderboardEntries_t handle will become invalid - virtual bool GetDownloadedLeaderboardEntry( SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, LeaderboardEntry_t *pLeaderboardEntry, int32 *pDetails, int cDetailsMax ) = 0; - - // Uploads a user score to the Steam back-end. - // This call is asynchronous, with the result returned in LeaderboardScoreUploaded_t - // Details are extra game-defined information regarding how the user got that score - // pScoreDetails points to an array of int32's, cScoreDetailsCount is the number of int32's in the list - STEAM_CALL_RESULT( LeaderboardScoreUploaded_t ) - virtual SteamAPICall_t UploadLeaderboardScore( SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int32 nScore, const int32 *pScoreDetails, int cScoreDetailsCount ) = 0; - - // Attaches a piece of user generated content the user's entry on a leaderboard. - // hContent is a handle to a piece of user generated content that was shared using ISteamUserRemoteStorage::FileShare(). - // This call is asynchronous, with the result returned in LeaderboardUGCSet_t. - STEAM_CALL_RESULT( LeaderboardUGCSet_t ) - virtual SteamAPICall_t AttachLeaderboardUGC( SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ) = 0; - - // Retrieves the number of players currently playing your game (online + offline) - // This call is asynchronous, with the result returned in NumberOfCurrentPlayers_t - STEAM_CALL_RESULT( NumberOfCurrentPlayers_t ) - virtual SteamAPICall_t GetNumberOfCurrentPlayers() = 0; - - // Requests that Steam fetch data on the percentage of players who have received each achievement - // for the game globally. - // This call is asynchronous, with the result returned in GlobalAchievementPercentagesReady_t. - STEAM_CALL_RESULT( GlobalAchievementPercentagesReady_t ) - virtual SteamAPICall_t RequestGlobalAchievementPercentages() = 0; - - // Get the info on the most achieved achievement for the game, returns an iterator index you can use to fetch - // the next most achieved afterwards. Will return -1 if there is no data on achievement - // percentages (ie, you haven't called RequestGlobalAchievementPercentages and waited on the callback). - virtual int GetMostAchievedAchievementInfo( char *pchName, uint32 unNameBufLen, float *pflPercent, bool *pbAchieved ) = 0; - - // Get the info on the next most achieved achievement for the game. Call this after GetMostAchievedAchievementInfo or another - // GetNextMostAchievedAchievementInfo call passing the iterator from the previous call. Returns -1 after the last - // achievement has been iterated. - virtual int GetNextMostAchievedAchievementInfo( int iIteratorPrevious, char *pchName, uint32 unNameBufLen, float *pflPercent, bool *pbAchieved ) = 0; - - // Returns the percentage of users who have achieved the specified achievement. - virtual bool GetAchievementAchievedPercent( const char *pchName, float *pflPercent ) = 0; - - // Requests global stats data, which is available for stats marked as "aggregated". - // This call is asynchronous, with the results returned in GlobalStatsReceived_t. - // nHistoryDays specifies how many days of day-by-day history to retrieve in addition - // to the overall totals. The limit is 60. - STEAM_CALL_RESULT( GlobalStatsReceived_t ) - virtual SteamAPICall_t RequestGlobalStats( int nHistoryDays ) = 0; - - // Gets the lifetime totals for an aggregated stat - STEAM_FLAT_NAME( GetGlobalStatInt64 ) - virtual bool GetGlobalStat( const char *pchStatName, int64 *pData ) = 0; - - STEAM_FLAT_NAME( GetGlobalStatDouble ) - virtual bool GetGlobalStat( const char *pchStatName, double *pData ) = 0; - - // Gets history for an aggregated stat. pData will be filled with daily values, starting with today. - // So when called, pData[0] will be today, pData[1] will be yesterday, and pData[2] will be two days ago, - // etc. cubData is the size in bytes of the pubData buffer. Returns the number of - // elements actually set. - - STEAM_FLAT_NAME( GetGlobalStatHistoryInt64 ) - virtual int32 GetGlobalStatHistory( const char *pchStatName, STEAM_ARRAY_COUNT(cubData) int64 *pData, uint32 cubData ) = 0; - - STEAM_FLAT_NAME( GetGlobalStatHistoryDouble ) - virtual int32 GetGlobalStatHistory( const char *pchStatName, STEAM_ARRAY_COUNT(cubData) double *pData, uint32 cubData ) = 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; - - STEAM_FLAT_NAME( GetAchievementProgressLimitsFloat ) - virtual bool GetAchievementProgressLimits( const char *pchName, float *pfMinProgress, float *pfMaxProgress ) = 0; - -}; - -#define STEAMUSERSTATS_INTERFACE_VERSION "STEAMUSERSTATS_INTERFACE_VERSION012" - -// Global interface accessor -inline ISteamUserStats *SteamUserStats(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamUserStats *, SteamUserStats, STEAMUSERSTATS_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: called when the latests stats and achievements have been received -// from the server -//----------------------------------------------------------------------------- -struct UserStatsReceived_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 1 }; - uint64 m_nGameID; // Game these stats are for - EResult m_eResult; // Success / error fetching the stats - CSteamID m_steamIDUser; // The user for whom the stats are retrieved for -}; - - -//----------------------------------------------------------------------------- -// Purpose: result of a request to store the user stats for a game -//----------------------------------------------------------------------------- -struct UserStatsStored_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 2 }; - uint64 m_nGameID; // Game these stats are for - EResult m_eResult; // success / error -}; - - -//----------------------------------------------------------------------------- -// Purpose: result of a request to store the achievements for a game, or an -// "indicate progress" call. If both m_nCurProgress and m_nMaxProgress -// are zero, that means the achievement has been fully unlocked. -//----------------------------------------------------------------------------- -struct UserAchievementStored_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 3 }; - - uint64 m_nGameID; // Game this is for - bool m_bGroupAchievement; // if this is a "group" achievement - char m_rgchAchievementName[k_cchStatNameMax]; // name of the achievement - uint32 m_nCurProgress; // current progress towards the achievement - uint32 m_nMaxProgress; // "out of" this many -}; - - -//----------------------------------------------------------------------------- -// Purpose: call result for finding a leaderboard, returned as a result of FindOrCreateLeaderboard() or FindLeaderboard() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -struct LeaderboardFindResult_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 4 }; - SteamLeaderboard_t m_hSteamLeaderboard; // handle to the leaderboard serarched for, 0 if no leaderboard found - uint8 m_bLeaderboardFound; // 0 if no leaderboard found -}; - - -//----------------------------------------------------------------------------- -// Purpose: call result indicating scores for a leaderboard have been downloaded and are ready to be retrieved, returned as a result of DownloadLeaderboardEntries() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -struct LeaderboardScoresDownloaded_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 5 }; - SteamLeaderboard_t m_hSteamLeaderboard; - SteamLeaderboardEntries_t m_hSteamLeaderboardEntries; // the handle to pass into GetDownloadedLeaderboardEntries() - int m_cEntryCount; // the number of entries downloaded -}; - - -//----------------------------------------------------------------------------- -// Purpose: call result indicating scores has been uploaded, returned as a result of UploadLeaderboardScore() -// use CCallResult<> to map this async result to a member function -//----------------------------------------------------------------------------- -struct LeaderboardScoreUploaded_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 6 }; - uint8 m_bSuccess; // 1 if the call was successful - SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was - int32 m_nScore; // the score that was attempted to set - uint8 m_bScoreChanged; // true if the score in the leaderboard change, false if the existing score was better - int m_nGlobalRankNew; // the new global rank of the user in this leaderboard - int m_nGlobalRankPrevious; // the previous global rank of the user in this leaderboard; 0 if the user had no existing entry in the leaderboard -}; - -struct NumberOfCurrentPlayers_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 7 }; - uint8 m_bSuccess; // 1 if the call was successful - int32 m_cPlayers; // Number of players currently playing -}; - - - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that a user's stats have been unloaded. -// Call RequestUserStats again to access stats for this user -//----------------------------------------------------------------------------- -struct UserStatsUnloaded_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 8 }; - CSteamID m_steamIDUser; // User whose stats have been unloaded -}; - - - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that an achievement icon has been fetched -//----------------------------------------------------------------------------- -struct UserAchievementIconFetched_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 9 }; - - CGameID m_nGameID; // Game this is for - char m_rgchAchievementName[k_cchStatNameMax]; // name of the achievement - bool m_bAchieved; // Is the icon for the achieved or not achieved version? - int m_nIconHandle; // Handle to the image, which can be used in SteamUtils()->GetImageRGBA(), 0 means no image is set for the achievement -}; - - -//----------------------------------------------------------------------------- -// Purpose: Callback indicating that global achievement percentages are fetched -//----------------------------------------------------------------------------- -struct GlobalAchievementPercentagesReady_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 10 }; - - uint64 m_nGameID; // Game this is for - EResult m_eResult; // Result of the operation -}; - - -//----------------------------------------------------------------------------- -// Purpose: call result indicating UGC has been uploaded, returned as a result of SetLeaderboardUGC() -//----------------------------------------------------------------------------- -struct LeaderboardUGCSet_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 11 }; - EResult m_eResult; // The result of the operation - SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was -}; - - -//----------------------------------------------------------------------------- -// Purpose: callback indicating that PS3 trophies have been installed -//----------------------------------------------------------------------------- -struct PS3TrophiesInstalled_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 12 }; - uint64 m_nGameID; // Game these stats are for - EResult m_eResult; // The result of the operation - uint64 m_ulRequiredDiskSpace; // If m_eResult is k_EResultDiskFull, will contain the amount of space needed to install trophies - -}; - - -//----------------------------------------------------------------------------- -// Purpose: callback indicating global stats have been received. -// Returned as a result of RequestGlobalStats() -//----------------------------------------------------------------------------- -struct GlobalStatsReceived_t -{ - enum { k_iCallback = k_iSteamUserStatsCallbacks + 12 }; - uint64 m_nGameID; // Game global stats were requested for - EResult m_eResult; // The result of the request -}; - -#pragma pack( pop ) - - -#endif // ISTEAMUSER_H diff --git a/lib/steamworks_150/public/steam/isteamutils.h b/lib/steamworks_150/public/steam/isteamutils.h deleted file mode 100644 index 0eb8cb1..0000000 --- a/lib/steamworks_150/public/steam/isteamutils.h +++ /dev/null @@ -1,305 +0,0 @@ -//====== Copyright � 1996-2008, Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to utility functions in Steam -// -//============================================================================= - -#ifndef ISTEAMUTILS_H -#define ISTEAMUTILS_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - - -// Steam API call failure results -enum ESteamAPICallFailure -{ - k_ESteamAPICallFailureNone = -1, // no failure - k_ESteamAPICallFailureSteamGone = 0, // the local Steam process has gone away - k_ESteamAPICallFailureNetworkFailure = 1, // the network connection to Steam has been broken, or was already broken - // SteamServersDisconnected_t callback will be sent around the same time - // SteamServersConnected_t will be sent when the client is able to talk to the Steam servers again - k_ESteamAPICallFailureInvalidHandle = 2, // the SteamAPICall_t handle passed in no longer exists - k_ESteamAPICallFailureMismatchedCallback = 3,// GetAPICallResult() was called with the wrong callback type for this API call -}; - - -// Input modes for the Big Picture gamepad text entry -enum EGamepadTextInputMode -{ - k_EGamepadTextInputModeNormal = 0, - k_EGamepadTextInputModePassword = 1 -}; - - -// Controls number of allowed lines for the Big Picture gamepad text entry -enum EGamepadTextInputLineMode -{ - k_EGamepadTextInputLineModeSingleLine = 0, - k_EGamepadTextInputLineModeMultipleLines = 1 -}; - - -// The context where text filtering is being done -enum ETextFilteringContext -{ - k_ETextFilteringContextUnknown = 0, // Unknown context - k_ETextFilteringContextGameContent = 1, // Game content, only legally required filtering is performed - k_ETextFilteringContextChat = 2, // Chat from another player - k_ETextFilteringContextName = 3, // Character or item name -}; - - -// function prototype for warning message hook -#if defined( POSIX ) -#define __cdecl -#endif -extern "C" typedef void (__cdecl *SteamAPIWarningMessageHook_t)(int, const char *); - -//----------------------------------------------------------------------------- -// Purpose: interface to user independent utility functions -//----------------------------------------------------------------------------- -class ISteamUtils -{ -public: - // return the number of seconds since the user - virtual uint32 GetSecondsSinceAppActive() = 0; - virtual uint32 GetSecondsSinceComputerActive() = 0; - - // the universe this client is connecting to - virtual EUniverse GetConnectedUniverse() = 0; - - // Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time) - virtual uint32 GetServerRealTime() = 0; - - // returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database) - // e.g "US" or "UK". - virtual const char *GetIPCountry() = 0; - - // returns true if the image exists, and valid sizes were filled out - virtual bool GetImageSize( int iImage, uint32 *pnWidth, uint32 *pnHeight ) = 0; - - // returns true if the image exists, and the buffer was successfully filled out - // results are returned in RGBA format - // the destination buffer size should be 4 * height * width * sizeof(char) - virtual bool GetImageRGBA( int iImage, uint8 *pubDest, int nDestBufferSize ) = 0; - - // Deprecated. Do not call this. - STEAM_PRIVATE_API( virtual bool GetCSERIPPort( uint32 *unIP, uint16 *usPort ) = 0; ); - - // return the amount of battery power left in the current system in % [0..100], 255 for being on AC power - virtual uint8 GetCurrentBatteryPower() = 0; - - // returns the appID of the current process - virtual uint32 GetAppID() = 0; - - // Sets the position where the overlay instance for the currently calling game should show notifications. - // This position is per-game and if this function is called from outside of a game context it will do nothing. - virtual void SetOverlayNotificationPosition( ENotificationPosition eNotificationPosition ) = 0; - - // API asynchronous call results - // can be used directly, but more commonly used via the callback dispatch API (see steam_api.h) - virtual bool IsAPICallCompleted( SteamAPICall_t hSteamAPICall, bool *pbFailed ) = 0; - virtual ESteamAPICallFailure GetAPICallFailureReason( SteamAPICall_t hSteamAPICall ) = 0; - virtual bool GetAPICallResult( SteamAPICall_t hSteamAPICall, void *pCallback, int cubCallback, int iCallbackExpected, bool *pbFailed ) = 0; - - // Deprecated. Applications should use SteamAPI_RunCallbacks() instead. Game servers do not need to call this function. - STEAM_PRIVATE_API( virtual void RunFrame() = 0; ) - - // returns the number of IPC calls made since the last time this function was called - // Used for perf debugging so you can understand how many IPC calls your game makes per frame - // Every IPC call is at minimum a thread context switch if not a process one so you want to rate - // control how often you do them. - virtual uint32 GetIPCCallCount() = 0; - - // API warning handling - // 'int' is the severity; 0 for msg, 1 for warning - // 'const char *' is the text of the message - // callbacks will occur directly after the API function is called that generated the warning or message - virtual void SetWarningMessageHook( SteamAPIWarningMessageHook_t pFunction ) = 0; - - // Returns true if the overlay is running & the user can access it. The overlay process could take a few seconds to - // start & hook the game process, so this function will initially return false while the overlay is loading. - virtual bool IsOverlayEnabled() = 0; - - // Normally this call is unneeded if your game has a constantly running frame loop that calls the - // D3D Present API, or OGL SwapBuffers API every frame. - // - // However, if you have a game that only refreshes the screen on an event driven basis then that can break - // the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also - // need to Present() to the screen any time an even needing a notification happens or when the overlay is - // brought up over the game by a user. You can use this API to ask the overlay if it currently need a present - // in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you - // refresh the screen with Present or SwapBuffers to allow the overlay to do it's work. - virtual bool BOverlayNeedsPresent() = 0; - - // Asynchronous call to check if an executable file has been signed using the public key set on the signing tab - // of the partner site, for example to refuse to load modified executable files. - // The result is returned in CheckFileSignature_t. - // k_ECheckFileSignatureNoSignaturesFoundForThisApp - This app has not been configured on the signing tab of the partner site to enable this function. - // k_ECheckFileSignatureNoSignaturesFoundForThisFile - This file is not listed on the signing tab for the partner site. - // k_ECheckFileSignatureFileNotFound - The file does not exist on disk. - // k_ECheckFileSignatureInvalidSignature - The file exists, and the signing tab has been set for this file, but the file is either not signed or the signature does not match. - // k_ECheckFileSignatureValidSignature - The file is signed and the signature is valid. - STEAM_CALL_RESULT( CheckFileSignature_t ) - virtual SteamAPICall_t CheckFileSignature( const char *szFileName ) = 0; - - // Activates the Big Picture text input dialog which only supports gamepad input - virtual bool ShowGamepadTextInput( EGamepadTextInputMode eInputMode, EGamepadTextInputLineMode eLineInputMode, const char *pchDescription, uint32 unCharMax, const char *pchExistingText ) = 0; - - // Returns previously entered text & length - virtual uint32 GetEnteredGamepadTextLength() = 0; - virtual bool GetEnteredGamepadTextInput( char *pchText, uint32 cchText ) = 0; - - // returns the language the steam client is running in, you probably want ISteamApps::GetCurrentGameLanguage instead, this is for very special usage cases - virtual const char *GetSteamUILanguage() = 0; - - // returns true if Steam itself is running in VR mode - virtual bool IsSteamRunningInVR() = 0; - - // Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition. - virtual void SetOverlayNotificationInset( int nHorizontalInset, int nVerticalInset ) = 0; - - // returns true if Steam & the Steam Overlay are running in Big Picture mode - // Games much be launched through the Steam client to enable the Big Picture overlay. During development, - // a game can be added as a non-steam game to the developers library to test this feature - virtual bool IsSteamInBigPictureMode() = 0; - - // ask SteamUI to create and render its OpenVR dashboard - virtual void StartVRDashboard() = 0; - - // Returns true if the HMD content will be streamed via Steam Remote Play - virtual bool IsVRHeadsetStreamingEnabled() = 0; - - // Set whether the HMD content will be streamed via Steam Remote Play - // If this is set to true, then the scene in the HMD headset will be streamed, and remote input will not be allowed. - // If this is set to false, then the application window will be streamed instead, and remote input will be allowed. - // The default is true unless "VRHeadsetStreaming" "0" is in the extended appinfo for a game. - // (this is useful for games that have asymmetric multiplayer gameplay) - virtual void SetVRHeadsetStreamingEnabled( bool bEnabled ) = 0; - - // Returns whether this steam client is a Steam China specific client, vs the global client. - virtual bool IsSteamChinaLauncher() = 0; - - // Initializes text filtering, loading dictionaries for the language the game is running in. - // unFilterOptions are reserved for future use and should be set to 0 - // Returns false if filtering is unavailable for the game's language, in which case FilterText() will act as a passthrough. - // - // Users can customize the text filter behavior in their Steam Account preferences: - // https://store.steampowered.com/account/preferences#CommunityContentPreferences - virtual bool InitFilterText( uint32 unFilterOptions = 0 ) = 0; - - // Filters the provided input message and places the filtered result into pchOutFilteredText, using legally required filtering and additional filtering based on the context and user settings - // eContext is the type of content in the input string - // sourceSteamID is the Steam ID that is the source of the input string (e.g. the player with the name, or who said the chat text) - // pchInputText is the input string that should be filtered, which can be ASCII or UTF-8 - // pchOutFilteredText is where the output will be placed, even if no filtering is performed - // nByteSizeOutFilteredText is the size (in bytes) of pchOutFilteredText, should be at least strlen(pchInputText)+1 - // Returns the number of characters (not bytes) filtered - virtual int FilterText( ETextFilteringContext eContext, CSteamID sourceSteamID, const char *pchInputMessage, char *pchOutFilteredText, uint32 nByteSizeOutFilteredText ) = 0; - - // Return what we believe your current ipv6 connectivity to "the internet" is on the specified protocol. - // This does NOT tell you if the Steam client is currently connected to Steam via ipv6. - virtual ESteamIPv6ConnectivityState GetIPv6ConnectivityState( ESteamIPv6ConnectivityProtocol eProtocol ) = 0; -}; - -#define STEAMUTILS_INTERFACE_VERSION "SteamUtils010" - -// Global interface accessor -inline ISteamUtils *SteamUtils(); -STEAM_DEFINE_INTERFACE_ACCESSOR( ISteamUtils *, SteamUtils, SteamInternal_FindOrCreateUserInterface( 0, STEAMUTILS_INTERFACE_VERSION ), "user", STEAMUTILS_INTERFACE_VERSION ); - -// Global accessor for the gameserver client -inline ISteamUtils *SteamGameServerUtils(); -STEAM_DEFINE_INTERFACE_ACCESSOR( ISteamUtils *, SteamGameServerUtils, SteamInternal_FindOrCreateGameServerInterface( 0, STEAMUTILS_INTERFACE_VERSION ), "gameserver", STEAMUTILS_INTERFACE_VERSION ); - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - -//----------------------------------------------------------------------------- -// Purpose: The country of the user changed -//----------------------------------------------------------------------------- -struct IPCountry_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 1 }; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Fired when running on a laptop and less than 10 minutes of battery is left, fires then every minute -//----------------------------------------------------------------------------- -struct LowBatteryPower_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 2 }; - uint8 m_nMinutesBatteryLeft; -}; - - -//----------------------------------------------------------------------------- -// Purpose: called when a SteamAsyncCall_t has completed (or failed) -//----------------------------------------------------------------------------- -struct SteamAPICallCompleted_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 3 }; - SteamAPICall_t m_hAsyncCall; - int m_iCallback; - uint32 m_cubParam; -}; - - -//----------------------------------------------------------------------------- -// called when Steam wants to shutdown -//----------------------------------------------------------------------------- -struct SteamShutdown_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 4 }; -}; - -//----------------------------------------------------------------------------- -// results for CheckFileSignature -//----------------------------------------------------------------------------- -enum ECheckFileSignature -{ - k_ECheckFileSignatureInvalidSignature = 0, - k_ECheckFileSignatureValidSignature = 1, - k_ECheckFileSignatureFileNotFound = 2, - k_ECheckFileSignatureNoSignaturesFoundForThisApp = 3, - k_ECheckFileSignatureNoSignaturesFoundForThisFile = 4, -}; - -//----------------------------------------------------------------------------- -// callback for CheckFileSignature -//----------------------------------------------------------------------------- -struct CheckFileSignature_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 5 }; - ECheckFileSignature m_eCheckFileSignature; -}; - - -// k_iSteamUtilsCallbacks + 13 is taken - - -//----------------------------------------------------------------------------- -// Big Picture gamepad text input has been closed -//----------------------------------------------------------------------------- -struct GamepadTextInputDismissed_t -{ - enum { k_iCallback = k_iSteamUtilsCallbacks + 14 }; - bool m_bSubmitted; // true if user entered & accepted text (Call ISteamUtils::GetEnteredGamepadTextInput() for text), false if canceled input - uint32 m_unSubmittedText; -}; - -// k_iSteamUtilsCallbacks + 15 is taken - -#pragma pack( pop ) - -#endif // ISTEAMUTILS_H diff --git a/lib/steamworks_150/public/steam/isteamvideo.h b/lib/steamworks_150/public/steam/isteamvideo.h deleted file mode 100644 index 3dbe987..0000000 --- a/lib/steamworks_150/public/steam/isteamvideo.h +++ /dev/null @@ -1,68 +0,0 @@ -//====== Copyright © 1996-2014 Valve Corporation, All rights reserved. ======= -// -// Purpose: interface to Steam Video -// -//============================================================================= - -#ifndef ISTEAMVIDEO_H -#define ISTEAMVIDEO_H -#ifdef _WIN32 -#pragma once -#endif - -#include "steam_api_common.h" - -// callbacks -#if defined( VALVE_CALLBACK_PACK_SMALL ) -#pragma pack( push, 4 ) -#elif defined( VALVE_CALLBACK_PACK_LARGE ) -#pragma pack( push, 8 ) -#else -#error steam_api_common.h should define VALVE_CALLBACK_PACK_xxx -#endif - - - - -//----------------------------------------------------------------------------- -// Purpose: Steam Video API -//----------------------------------------------------------------------------- -class ISteamVideo -{ -public: - - // Get a URL suitable for streaming the given Video app ID's video - virtual void GetVideoURL( AppId_t unVideoAppID ) = 0; - - // returns true if user is uploading a live broadcast - virtual bool IsBroadcasting( int *pnNumViewers ) = 0; - - // Get the OPF Details for 360 Video Playback - STEAM_CALL_BACK( GetOPFSettingsResult_t ) - virtual void GetOPFSettings( AppId_t unVideoAppID ) = 0; - virtual bool GetOPFStringForApp( AppId_t unVideoAppID, char *pchBuffer, int32 *pnBufferSize ) = 0; -}; - -#define STEAMVIDEO_INTERFACE_VERSION "STEAMVIDEO_INTERFACE_V002" - -// Global interface accessor -inline ISteamVideo *SteamVideo(); -STEAM_DEFINE_USER_INTERFACE_ACCESSOR( ISteamVideo *, SteamVideo, STEAMVIDEO_INTERFACE_VERSION ); - -STEAM_CALLBACK_BEGIN( GetVideoURLResult_t, k_iClientVideoCallbacks + 11 ) - STEAM_CALLBACK_MEMBER( 0, EResult, m_eResult ) - STEAM_CALLBACK_MEMBER( 1, AppId_t, m_unVideoAppID ) - STEAM_CALLBACK_MEMBER( 2, char, m_rgchURL[256] ) -STEAM_CALLBACK_END(3) - - -STEAM_CALLBACK_BEGIN( GetOPFSettingsResult_t, k_iClientVideoCallbacks + 24 ) - STEAM_CALLBACK_MEMBER( 0, EResult, m_eResult ) - STEAM_CALLBACK_MEMBER( 1, AppId_t, m_unVideoAppID ) -STEAM_CALLBACK_END(2) - - -#pragma pack( pop ) - - -#endif // ISTEAMVIDEO_H diff --git a/lib/steamworks_150/public/steam/lib/linux32/libsdkencryptedappticket.so b/lib/steamworks_150/public/steam/lib/linux32/libsdkencryptedappticket.so deleted file mode 100644 index d4fef2e4457d2680042771d4603dcbba99341f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130574 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%0DpiEsd2Hohv-}rawn46z+$G?k72lg*p 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

gN9yF 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

_;l3Y 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

AupvfbWZ-GsK3c9h1Ipg#H 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 YNT5D6=YH*E9F>dfX=f2+uPF~LK_w)V!_lu7) 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