Make it possible to join via the Steam friend list

This commit is contained in:
heinrich5991 2020-09-06 13:37:48 +02:00
parent ef9260601e
commit f682a79d5f
4 changed files with 53 additions and 8 deletions

View file

@ -4048,6 +4048,11 @@ static CClient *CreateClient()
return new(pClient) CClient;
}
void CClient::HandleConnectAddress(const NETADDR *pAddr)
{
net_addr_str(pAddr, m_aCmdConnect, sizeof(m_aCmdConnect), true);
}
void CClient::HandleConnectLink(const char *pLink)
{
str_copy(m_aCmdConnect, pLink + sizeof(CONNECTLINK) - 1, sizeof(m_aCmdConnect));
@ -4118,6 +4123,7 @@ int main(int argc, const char **argv) // ignore_convention
IEngineTextRender *pEngineTextRender = CreateEngineTextRender();
IEngineMap *pEngineMap = CreateEngineMap();
IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer();
ISteam *pSteam = CreateSteam();
if(RandInitFailed)
{
@ -4150,7 +4156,7 @@ int main(int argc, const char **argv) // ignore_convention
RegisterFail = RegisterFail || !pKernel->RegisterInterface(CreateEditor(), false);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(CreateGameClient(), false);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(CreateSteam());
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pSteam);
if(RegisterFail)
{
@ -4215,6 +4221,11 @@ int main(int argc, const char **argv) // ignore_convention
else if(argc > 1) // ignore_convention
pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention
if(pSteam->GetLaunchConnectAddress())
{
pClient->HandleConnectAddress(pSteam->GetLaunchConnectAddress());
}
pClient->Engine()->InitLogfile();
#if defined(CONF_FAMILY_WINDOWS)

View file

@ -427,6 +427,7 @@ public:
void ServerBrowserUpdate();
void HandleConnectAddress(const NETADDR *pAddr);
void HandleConnectLink(const char *pLink);
void HandleDemoPath(const char *pPath);
void HandleMapPath(const char *pPath);

View file

@ -7,6 +7,8 @@ class CSteam : public ISteam
ISteamApps *m_pSteamApps;
ISteamFriends *m_pSteamFriends;
char m_aPlayerName[16];
bool m_GotConnectAddr;
NETADDR m_ConnectAddr;
public:
CSteam()
@ -14,14 +16,25 @@ public:
m_pSteamApps = SteamAPI_SteamApps_v008();
m_pSteamFriends = SteamAPI_SteamFriends_v017();
char aCmdLine[128];
int CmdLineSize = SteamAPI_ISteamApps_GetLaunchCommandLine(m_pSteamApps, aCmdLine, sizeof(aCmdLine));
if(CmdLineSize >= 128)
char aConnect[NETADDR_MAXSTRSIZE];
int ConnectSize = SteamAPI_ISteamApps_GetLaunchCommandLine(m_pSteamApps, aConnect, sizeof(aConnect));
if(ConnectSize >= NETADDR_MAXSTRSIZE)
{
CmdLineSize = 127;
ConnectSize = NETADDR_MAXSTRSIZE - 1;
}
aConnect[ConnectSize] = 0;
m_GotConnectAddr = false;
if(aConnect[0])
{
if(net_addr_from_str(&m_ConnectAddr, aConnect) == 0)
{
m_GotConnectAddr = true;
}
else
{
dbg_msg("steam", "got unparsable launch connect string: '%s'", aConnect);
}
}
aCmdLine[CmdLineSize] = 0;
dbg_msg("steam", "cmdline='%s' param_connect='%s'", aCmdLine, SteamAPI_ISteamApps_GetLaunchQueryParam(m_pSteamApps, "connect"));
str_copy(m_aPlayerName, SteamAPI_ISteamFriends_GetPersonaName(m_pSteamFriends), sizeof(m_aPlayerName));
}
~CSteam()
@ -34,21 +47,38 @@ public:
return m_aPlayerName;
}
const NETADDR *GetLaunchConnectAddress()
{
if(m_GotConnectAddr)
{
return &m_ConnectAddr;
}
else
{
return 0;
}
}
void ClearGameInfo()
{
SteamAPI_ISteamFriends_ClearRichPresence(m_pSteamFriends);
}
void SetGameInfo(NETADDR ServerAddr, const char *pMapName)
{
char aServerAddr[NETADDR_MAXSTRSIZE];
net_addr_str(&ServerAddr, aServerAddr, sizeof(aServerAddr), true);
SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "connect", aServerAddr);
SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "map", pMapName);
SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "status", pMapName);
SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "steam_display", "#Status");
SteamAPI_ISteamFriends_SetRichPresence(m_pSteamFriends, "map", pMapName);
}
};
class CSteamStub : public ISteam
{
const char *GetPlayerName() { return 0; }
const NETADDR *GetLaunchConnectAddress() { return 0; }
void ClearGameInfo() { }
void SetGameInfo(NETADDR ServerAddr, const char *pMapName) { }
};

View file

@ -10,6 +10,9 @@ public:
// Returns NULL if the name cannot be determined.
virtual const char *GetPlayerName() = 0;
// Returns NULL if the no server needs to be joined.
virtual const NETADDR *GetLaunchConnectAddress() = 0;
virtual void ClearGameInfo() = 0;
virtual void SetGameInfo(NETADDR ServerAddr, const char *pMapName) = 0;
};