diff --git a/RP_L4/RPL4LOBBY.cpp b/RP_L4/RPL4LOBBY.cpp index a5784f2..7dc0a48 100644 --- a/RP_L4/RPL4LOBBY.cpp +++ b/RP_L4/RPL4LOBBY.cpp @@ -293,6 +293,26 @@ namespace return (text != NULL) ? text : ""; } + //------------------------------------------------------------------- + // The same for one member's own row. + // + // Steam answers NULL - not "" - for a member it no longer knows, + // and the roster is polled on a 750ms timer, so somebody leaving + // between GetNumLobbyMembers and the read of their row is ordinary + // rather than exotic. Every caller treats the answer as a string: + // strncpy walks off address zero, and so does atoi. + //------------------------------------------------------------------- + const char *MemberText(CSteamID member, const char *key) + { + if (!gInLobby) + { + return ""; + } + const char *text = + SteamMatchmaking()->GetLobbyMemberData(gLobby, member, key); + return (text != NULL) ? text : ""; + } + //--------------------------------------------------------------- // Launch: roster into lobby data, peers into the transport, and // the hosted-race path primed on the owner @@ -328,39 +348,36 @@ namespace memset(member, 0, sizeof(*member)); member->id = SteamMatchmaking()->GetLobbyMemberByIndex(gLobby, i); strncpy(member->ip, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "ip"), + MemberText(member->id, "ip"), sizeof(member->ip) - 1); - member->consolePort = atoi( - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "cp")); - member->gamePort = atoi( - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "gp")); + member->consolePort = atoi(MemberText(member->id, "cp")); + member->gamePort = atoi(MemberText(member->id, "gp")); strncpy(member->name, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "nm"), + MemberText(member->id, "nm"), sizeof(member->name) - 1); strncpy(member->vehicle, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "vh"), + MemberText(member->id, "vh"), sizeof(member->vehicle) - 1); strncpy(member->color, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "cl"), + MemberText(member->id, "cl"), sizeof(member->color) - 1); strncpy(member->badge, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "bd"), + MemberText(member->id, "bd"), sizeof(member->badge) - 1); strncpy(member->team, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "tm"), + MemberText(member->id, "tm"), sizeof(member->team) - 1); strncpy(member->position, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, "ps"), + MemberText(member->id, "ps"), sizeof(member->position) - 1); strncpy(member->netRev, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, kNetRevKey), + MemberText(member->id, kNetRevKey), sizeof(member->netRev) - 1); strncpy(member->build, - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, kBuildKey), + MemberText(member->id, kBuildKey), sizeof(member->build) - 1); - member->camera = (atoi( - SteamMatchmaking()->GetLobbyMemberData(gLobby, member->id, kCamKey)) != 0) - ? True : False; + member->camera = + (atoi(MemberText(member->id, kCamKey)) != 0) ? True : False; member->published = member->ip[0] != '\0' && member->consolePort > 0 && member->gamePort > 0; }