X-Git-Url: https://harrygodden.com/git/?p=vg.git;a=blobdiff_plain;f=vg_steam_api.h;fp=vg_steam_api.h;h=2680b5bb83cf755f2095d9325e056981eec79f4b;hp=0000000000000000000000000000000000000000;hb=3b14f3dcd5bf9dd3c85144f2123d667bfa4bb63f;hpb=fce86711735b15bff37de0f70716808410fcf269 diff --git a/vg_steam_api.h b/vg_steam_api.h new file mode 100644 index 0000000..2680b5b --- /dev/null +++ b/vg_steam_api.h @@ -0,0 +1,456 @@ +#pragma once +#include "vg_platform.h" + +#if defined(__linux__) || defined(__APPLE__) +/* + * The 32-bit version of gcc has the alignment requirement for u64 and double + * set to 4 meaning that even with #pragma pack(8) these types will only be + * four-byte aligned. The 64-bit version of gcc has the alignment requirement + * for these types set to 8 meaning that unless we use #pragma pack(4) our + * structures will get bigger. The 64-bit structure packing has to match the + * 32-bit structure packing for each platform. + */ + #define VALVE_CALLBACK_PACK_SMALL +; + #pragma pack( push, 4 ) +#else + #define VALVE_CALLBACK_PACK_LARGE + #pragma pack( push, 8 ) +#endif + +typedef i32 HSteamPipe; +typedef i32 HSteamUser; + +typedef int E_iCallBack_t; + +typedef u64 u64_steamid; +typedef u64 SteamAPICall_t; + +typedef u32 AppId_t; +enum { k_uAppIdInvalid = 0x0 }; + +typedef u32 DepotId_t; +enum { k_uDepotIdInvalid = 0x0 }; + +typedef u32 RTime32; +typedef u32 AccountID_t; +typedef i8 steamapi_bool; + +enum { k_iSteamUserCallbacks = 100 }; +enum { k_iSteamGameServerCallbacks = 200 }; +enum { k_iSteamFriendsCallbacks = 300 }; +enum { k_iSteamBillingCallbacks = 400 }; +enum { k_iSteamMatchmakingCallbacks = 500 }; +enum { k_iSteamContentServerCallbacks = 600 }; +enum { k_iSteamUtilsCallbacks = 700 }; +enum { k_iClientFriendsCallbacks = 800 }; +enum { k_iClientUserCallbacks = 900 }; +enum { k_iSteamAppsCallbacks = 1000 }; +enum { k_iSteamUserStatsCallbacks = 1100 }; +enum { k_iSteamNetworkingCallbacks = 1200 }; +enum { k_iSteamNetworkingSocketsCallbacks = 1220 }; +enum { k_iSteamNetworkingMessagesCallbacks = 1250 }; +enum { k_iSteamNetworkingUtilsCallbacks = 1280 }; +enum { k_iSteamRemoteStorageCallbacks = 1300 }; +enum { k_iClientDepotBuilderCallbacks = 1400 }; +enum { k_iSteamGameServerItemsCallbacks = 1500 }; +enum { k_iClientUtilsCallbacks = 1600 }; +enum { k_iSteamGameCoordinatorCallbacks = 1700 }; +enum { k_iSteamGameServerStatsCallbacks = 1800 }; +enum { k_iSteam2AsyncCallbacks = 1900 }; +enum { k_iSteamGameStatsCallbacks = 2000 }; +enum { k_iClientHTTPCallbacks = 2100 }; +enum { k_iClientScreenshotsCallbacks = 2200 }; +enum { k_iSteamScreenshotsCallbacks = 2300 }; +enum { k_iClientAudioCallbacks = 2400 }; +enum { k_iClientUnifiedMessagesCallbacks = 2500 }; +enum { k_iSteamStreamLauncherCallbacks = 2600 }; +enum { k_iClientControllerCallbacks = 2700 }; +enum { k_iSteamControllerCallbacks = 2800 }; +enum { k_iClientParentalSettingsCallbacks = 2900 }; +enum { k_iClientDeviceAuthCallbacks = 3000 }; +enum { k_iClientNetworkDeviceManagerCallbacks = 3100 }; +enum { k_iClientMusicCallbacks = 3200 }; +enum { k_iClientRemoteClientManagerCallbacks = 3300 }; +enum { k_iClientUGCCallbacks = 3400 }; +enum { k_iSteamUGCCallbacks = 3400 }; +enum { k_iSteamStreamClientCallbacks = 3500 }; +enum { k_IClientProductBuilderCallbacks = 3600 }; +enum { k_iClientShortcutsCallbacks = 3700 }; +enum { k_iClientRemoteControlManagerCallbacks = 3800 }; +enum { k_iSteamAppListCallbacks = 3900 }; +enum { k_iSteamMusicCallbacks = 4000 }; +enum { k_iSteamMusicRemoteCallbacks = 4100 }; +enum { k_iClientVRCallbacks = 4200 }; +enum { k_iClientGameNotificationCallbacks = 4300 }; +enum { k_iSteamGameNotificationCallbacks = 4400 }; +enum { k_iSteamHTMLSurfaceCallbacks = 4500 }; +enum { k_iClientVideoCallbacks = 4600 }; +enum { k_iClientInventoryCallbacks = 4700 }; +enum { k_iClientBluetoothManagerCallbacks = 4800 }; +enum { k_iClientSharedConnectionCallbacks = 4900 }; +enum { k_ISteamParentalSettingsCallbacks = 5000 }; +enum { k_iClientShaderCallbacks = 5100 }; +enum { k_iSteamGameSearchCallbacks = 5200 }; +enum { k_iSteamPartiesCallbacks = 5300 }; +enum { k_iClientPartiesCallbacks = 5400 }; +enum { k_iSteamSTARCallbacks = 5500 }; +enum { k_iClientSTARCallbacks = 5600 }; +enum { k_iSteamRemotePlayCallbacks = 5700 }; +enum { k_iClientCompatCallbacks = 5800 }; +enum { k_iSteamChatCallbacks = 5900 }; + +// General result codes +typedef enum EResult +{ + k_EResultNone = 0, // no result + k_EResultOK = 1, // success + k_EResultFail = 2, // generic failure + k_EResultNoConnection = 3, // no/failed network connection +// k_EResultNoConnectionRetry = 4, // OBSOLETE - removed + k_EResultInvalidPassword = 5, // password/ticket is invalid + k_EResultLoggedInElsewhere = 6, // same user logged in elsewhere + k_EResultInvalidProtocolVer = 7, // protocol version is incorrect + k_EResultInvalidParam = 8, // a parameter is incorrect + k_EResultFileNotFound = 9, // file was not found + k_EResultBusy = 10, // called method busy - action not taken + k_EResultInvalidState = 11, // called object was in an invalid state + k_EResultInvalidName = 12, // name is invalid + k_EResultInvalidEmail = 13, // email is invalid + k_EResultDuplicateName = 14, // name is not unique + k_EResultAccessDenied = 15, // access is denied + k_EResultTimeout = 16, // operation timed out + k_EResultBanned = 17, // VAC2 banned + k_EResultAccountNotFound = 18, // account not found + k_EResultInvalidSteamID = 19, // steamID is invalid + k_EResultServiceUnavailable = 20,// The requested service is currently + // unavailable + k_EResultNotLoggedOn = 21, // The user is not logged on + k_EResultPending = 22, // Request is pending (may be in process, or + // waiting on third party) + k_EResultEncryptionFailure = 23, // Encryption or Decryption failed + k_EResultInsufficientPrivilege = 24,// Insufficient privilege + k_EResultLimitExceeded = 25, // Too much of a good thing + k_EResultRevoked = 26, // Access has been revoked (used for revoked + // guest passes) + k_EResultExpired = 27, // License/Guest pass the user is trying to + // access is expired + k_EResultAlreadyRedeemed = 28, // Guest pass has already been redeemed by + // account, cannot be acked again + k_EResultDuplicateRequest = 29, // The request is a duplicate and the action + // has already occurred in the past, ignored + // this time + k_EResultAlreadyOwned = 30, // All the games in this guest pass + // redemption request are already owned by + // the user + k_EResultIPNotFound = 31, // IP address not found + k_EResultPersistFailed = 32, // failed to write change to the data store + k_EResultLockingFailed = 33, // failed to acquire access lock for this + // operation + k_EResultLogonSessionReplaced = 34, + k_EResultConnectFailed = 35, + k_EResultHandshakeFailed = 36, + k_EResultIOFailure = 37, + k_EResultRemoteDisconnect = 38, + k_EResultShoppingCartNotFound = 39, // failed to find the shopping cart + // requested + k_EResultBlocked = 40, // a user didn't allow it + k_EResultIgnored = 41, // target is ignoring sender + k_EResultNoMatch = 42, // nothing matching the request found + k_EResultAccountDisabled = 43, + k_EResultServiceReadOnly = 44, // this service is not accepting content + // changes right now + k_EResultAccountNotFeatured = 45, // account doesn't have value, so this + // feature isn't available + k_EResultAdministratorOK = 46, // allowed to take this action, but only + // because requester is admin + k_EResultContentVersion = 47, // A Version mismatch in content + // transmitted within the Steam protocol. + k_EResultTryAnotherCM = 48, // The current CM can't service the user + // making a request, user should try + // another. + k_EResultPasswordRequiredToKickSession = 49, // You are already logged in + // elsewhere, this cached credential + // login has failed. + k_EResultAlreadyLoggedInElsewhere = 50, // You are already logged in + // elsewhere, you must wait + k_EResultSuspended = 51, // Long running operation (content download) + // suspended/paused + k_EResultCancelled = 52, // Operation canceled (typically by user: + // content download) + k_EResultDataCorruption = 53, // Operation canceled because data is ill + // formed or unrecoverable + k_EResultDiskFull = 54, // Operation canceled - not enough disk space. + k_EResultRemoteCallFailed = 55, // an remote call or IPC call failed + k_EResultPasswordUnset = 56, // Password could not be verified as it's + // unset server side + k_EResultExternalAccountUnlinked = 57, // External account (PSN, Facebook...) + // is not linked to a Steam account + k_EResultPSNTicketInvalid = 58, // PSN ticket was invalid + k_EResultExternalAccountAlreadyLinked = 59, // External account (PSN, + // Facebook...) is already linked to some other account, + // must explicitly request to replace/delete the link first + k_EResultRemoteFileConflict = 60, // The sync cannot resume due to a conflict + // between the local and remote files + k_EResultIllegalPassword = 61, // The requested new password is not legal + k_EResultSameAsPreviousValue = 62,// new value is the same as the old one ( + // secret question and answer ) + k_EResultAccountLogonDenied = 63, // account login denied due to 2nd factor + // authentication failure + k_EResultCannotUseOldPassword = 64, // The requested new password is not + // legal + k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code + // invalid + k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd + // factor auth failure - and no mail + // has been sent + k_EResultHardwareNotCapableOfIPT = 67, + k_EResultIPTInitError = 68, + k_EResultParentalControlRestricted = 69,// operation failed due to parental + // control restrictions for current + // user + k_EResultFacebookQueryError = 70, // Facebook query returned an error + k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth + // code expired + k_EResultIPLoginRestrictionFailed = 72, + k_EResultAccountLockedDown = 73, + k_EResultAccountLogonDeniedVerifiedEmailRequired = 74, + k_EResultNoMatchingURL = 75, + k_EResultBadResponse = 76, // parse failure, missing field, etc. + k_EResultRequirePasswordReEntry = 77, // The user cannot complete the action + // until they re-enter their password + k_EResultValueOutOfRange = 78, // the value entered is outside the + // acceptable range + k_EResultUnexpectedError = 79, // something happened that we didn't expect + // to ever happen + k_EResultDisabled = 80, // The requested service has been configured + // to be unavailable + k_EResultInvalidCEGSubmission = 81, // The set of files submitted to the CEG + // server are not valid ! + k_EResultRestrictedDevice = 82, // The device being used is not allowed + // to perform this action + k_EResultRegionLocked = 83, // The action could not be complete + // because it is region restricted + k_EResultRateLimitExceeded = 84, // Temporary rate limit exceeded, try + // again later, different from + // k_EResultLimitExceeded which may be + // permanent + k_EResultAccountLoginDeniedNeedTwoFactor = 85, // Need two-factor code to + // login + k_EResultItemDeleted = 86, // The thing we're trying to access has been + // deleted + k_EResultAccountLoginDeniedThrottle = 87, // login attempt failed, try to + // throttle response to possible + // attacker + k_EResultTwoFactorCodeMismatch = 88, // two factor code mismatch + k_EResultTwoFactorActivationCodeMismatch = 89, // activation code for + // two-factor didn't match + k_EResultAccountAssociatedToMultiplePartners = 90, // account has been + // associated with multiple partners + k_EResultNotModified = 91, // data not modified + k_EResultNoMobileDevice = 92, // the account does not have a mobile + // device associated with it + k_EResultTimeNotSynced = 93, // the time presented is out of range or + // tolerance + k_EResultSmsCodeFailed = 94, // SMS code failure (no match, none pending, + // etc.) + k_EResultAccountLimitExceeded = 95, // Too many accounts access this resource + k_EResultAccountActivityLimitExceeded = 96,// Too many changes to + // this account + k_EResultPhoneActivityLimitExceeded = 97, // Too many changes to this phone + k_EResultRefundToWallet = 98, // Cannot refund to payment method, must use + // wallet + k_EResultEmailSendFailure = 99, // Cannot send an email + k_EResultNotSettled = 100, // Can't perform operation till payment + // has settled + k_EResultNeedCaptcha = 101,// Needs to provide a valid captcha + k_EResultGSLTDenied = 102, // a game server login token owned by this token's + // owner has been banned + k_EResultGSOwnerDenied = 103, // game server owner is denied for other reason + // (account lock, community ban, vac ban, missing phone) + k_EResultInvalidItemType = 104,// the type of thing we were requested to act + // on is invalid + k_EResultIPBanned = 105,// the ip address has been banned from taking this + // action + k_EResultGSLTExpired = 106,// this token has expired from disuse; can be + // reset for use + k_EResultInsufficientFunds = 107,// user doesn't have enough wallet funds to + // complete the action + k_EResultTooManyPending = 108, // There are too many of this thing pending + // already + k_EResultNoSiteLicensesFound = 109, // No site licenses found + k_EResultWGNetworkSendExceeded = 110,// the WG couldn't send a response + // because we exceeded max network send size + k_EResultAccountNotFriends = 111, // the user is not mutually friends + k_EResultLimitedUserAccount = 112,// the user is limited + k_EResultCantRemoveItem = 113, // item can't be removed + k_EResultAccountDeleted = 114, // account has been deleted + k_EResultExistingUserCancelledLicense = 115, + // A license for this already exists, but cancelled + k_EResultCommunityCooldown = 116, // access is denied because of a + // community cooldown (probably from support profile data resets) + k_EResultNoLauncherSpecified = 117, // No launcher was specified, but a + // launcher was needed to choose correct realm for operation. + k_EResultMustAgreeToSSA = 118,// User must agree to china SSA or global SSA + // before login + k_EResultLauncherMigrated = 119, // The specified launcher type is no longer + // supported; the user should be directed elsewhere + k_EResultSteamRealmMismatch = 120, // The user's realm does not match the + // realm of the requested resource + k_EResultInvalidSignature = 121, // signature check did not match + k_EResultParseFailure = 122, // Failed to parse input + k_EResultNoVerifiedPhone = 123, // account does not have a verified phone + // number +} EResult; + +typedef struct { + + HSteamUser m_hSteamUser; // Specific user to whom this callback applies. + int m_iCallback; + u8 *m_pubParam; // Points to the callback structure + int m_cubParam; // Size of the data pointed to by m_pubParam + +} CallbackMsg_t; + +typedef struct { + + SteamAPICall_t m_hAsyncCall; + int m_iCallback; + u32 m_cubParam; + +} SteamAPICallCompleted_t; +enum { k_iSteamAPICallCompleted = k_iSteamUtilsCallbacks + 3 }; + +// Steam universes. Each universe is a self-contained Steam instance. +typedef enum EUniverse { + k_EUniverseInvalid = 0, + k_EUniversePublic = 1, + k_EUniverseBeta = 2, + k_EUniverseInternal = 3, + k_EUniverseDev = 4, + // k_EUniverseRC = 5, // no such universe anymore + k_EUniverseMax +} EUniverse_t; + +#pragma pack( push, 1 ) +struct SteamIDComponent_t +{ +#ifdef VALVE_BIG_ENDIAN + EUniverse_t m_EUniverse : 8 + unsigned int m_EAccountType : 4; + unsigned int m_unAccountInstance : 20; + u32 m_unAccountID : 32; +#else + u32 m_unAccountID : 32; + unsigned int m_unAccountInstance : 20; + unsigned int m_EAccountType : 4; + EUniverse_t m_EUniverse : 8; +#endif +}; + +typedef struct +{ + // 64 bits total + union + { + struct SteamIDComponent_t m_comp; + u64 m_unAll64Bits; + }; +} +CSteamID; + +typedef struct GameID_t +{ +#ifdef VALVE_BIG_ENDIAN + unsigned int m_nModID : 32; + unsigned int m_nType : 8; + unsigned int m_nAppID : 24; +#else + unsigned int m_nAppID : 24; + unsigned int m_nType : 8; + unsigned int m_nModID : 32; +#endif +} CGameID; +#pragma pack( pop ) +#pragma pack( pop ) + +/* + * Standard login + * ============================================================================= + */ + +int SteamAPI_RestartAppIfNecessary( u32 unOwnAppID ); +int SteamAPI_Init(void); +void SteamAPI_Shutdown(void); + +/* + * Server mode login + * ============================================================================= + */ + +typedef enum EServerMode EServerMode; +enum EServerMode +{ + eServerModeInvalid = 0, + eServerModeNoAuthentication = 1, + eServerModeAuthentication = 2, + eServerModeAuthenticationAndSecure = 3, +}; + +int SteamInternal_GameServer_Init( u32 unIP, u16 usLegacySteamPort, + u16 usGamePort, u16 usQueryPort, + EServerMode eServerMode, + const char *pchVersionString ); + +/* Initialize SteamGameServer client and interface objects, and set server + * properties which may not be changed. + * After calling this function, you should set any additional server parameters, + * and then call ISteamGameServer::LogOnAnonymous() or ISteamGameServer::LogOn() + * + * - unIP will usually be zero. If you are on a machine with multiple IP + * addresses, you can pass a non-zero value here and the relevant sockets will + * be bound to that IP. This can be used to ensure that the IP you desire is + * the one used in the server browser. + * - usGamePort is the port that clients will connect to for gameplay. You will + * usually open up your own socket bound to this port. + * - usQueryPort is the port that will manage server browser related duties and + * info pings from clients. If you pass STEAMGAMESERVER_QUERY_PORT_SHARED for + * usQueryPort, then it will use "GameSocketShare" mode, which means that the + * game is responsible for sending and receiving UDP packets for the master + * server updater. (See ISteamGameServer::HandleIncomingPacket and + * ISteamGameServer::GetNextOutgoingPacket.) + * - The version string should be in the form x.x.x.x, and is used by the master + * server to detect when the server is out of date. (Only servers with the + * latest version will be listed.) + */ +static inline int SteamGameServer_Init( + u32 unIP, u16 usGamePort, u16 usQueryPort, + EServerMode eServerMode, + const char *pchVersionString ) +{ + return SteamInternal_GameServer_Init( unIP, 0, usGamePort, usQueryPort, + eServerMode, pchVersionString ); +} + +void *SteamAPI_SteamGameServer_v014(void); +static inline void *SteamAPI_SteamGameServer(void) +{ + return SteamAPI_SteamGameServer_v014(); +} + +void SteamAPI_ISteamGameServer_LogOnAnonymous( void* self ); +void SteamGameServer_Shutdown(void); +int SteamGameServer_BSecure(void); +u64 SteamGameServer_GetSteamID(void); +HSteamPipe SteamAPI_GetHSteamPipe(void); +HSteamPipe SteamGameServer_GetHSteamPipe(void); +HSteamUser SteamAPI_GetHSteamUser(void); +void SteamAPI_ManualDispatch_Init(void); +void SteamAPI_ManualDispatch_RunFrame( HSteamPipe hSteamPipe ); +steamapi_bool SteamAPI_ManualDispatch_GetNextCallback( HSteamPipe hSteamPipe, + CallbackMsg_t *pCallbackMsg ); +void SteamAPI_ManualDispatch_FreeLastCallback( HSteamPipe hSteamPipe ); +steamapi_bool SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe, + SteamAPICall_t hSteamAPICall, void *pCallback, int cubCallback, + int iCallbackExpected, steamapi_bool *pbFailed ); +void SteamAPI_ReleaseCurrentThreadMemory(void);