1
0
Fork 0
mirror of https://github.com/Detanup01/gbe_fork.git synced 2025-03-28 14:56:24 +01:00

grab players list for Steam_Matchmaking_Servers from Steam_GameServers , probably broken!

This commit is contained in:
otavepto 2024-02-28 22:41:04 +02:00 committed by otavepto
parent 8393261473
commit 6a7bd6c063
3 changed files with 25 additions and 19 deletions

View file

@ -300,7 +300,7 @@ static int send_packet_to(sock_t sock, IP_PORT ip_port, char *data, unsigned lon
static int receive_packet(sock_t sock, IP_PORT *ip_port, char *data, unsigned long max_length) static int receive_packet(sock_t sock, IP_PORT *ip_port, char *data, unsigned long max_length)
{ {
struct sockaddr_storage addr; struct sockaddr_storage addr{};
#if defined(STEAM_WIN32) #if defined(STEAM_WIN32)
int addrlen = sizeof(addr); int addrlen = sizeof(addr);
#else #else
@ -943,22 +943,24 @@ void Networking::Run()
int len; int len;
if (query_alive && is_socket_valid(query_socket)) { if (query_alive && is_socket_valid(query_socket)) {
PRINT_DEBUG("RECV QUERY\n"); PRINT_DEBUG("Networking::Run RECV Source Query\n");
Steam_Client* client = get_steam_client(); Steam_Client* client = get_steam_client();
sockaddr_in addr; sockaddr_in addr;
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
while ((len = receive_packet(query_socket, &ip_port, data, sizeof(data))) >= 0) { while ((len = receive_packet(query_socket, &ip_port, data, sizeof(data))) >= 0) {
PRINT_DEBUG("Networking::Run requesting Source Query server info from Steam_GameServer\n");
client->steam_gameserver->HandleIncomingPacket(data, len, htonl(ip_port.ip), htons(ip_port.port)); client->steam_gameserver->HandleIncomingPacket(data, len, htonl(ip_port.ip), htons(ip_port.port));
len = client->steam_gameserver->GetNextOutgoingPacket(data, sizeof(data), &ip_port.ip, &ip_port.port); len = client->steam_gameserver->GetNextOutgoingPacket(data, sizeof(data), &ip_port.ip, &ip_port.port);
PRINT_DEBUG("Networking::Run sending Source Query server info\n");
addr.sin_addr.s_addr = htonl(ip_port.ip); addr.sin_addr.s_addr = htonl(ip_port.ip);
addr.sin_port = htons(ip_port.port); addr.sin_port = htons(ip_port.port);
sendto(query_socket, data, len, 0, (sockaddr*)&addr, sizeof(addr)); sendto(query_socket, data, len, 0, (sockaddr*)&addr, sizeof(addr));
} }
} }
PRINT_DEBUG("RECV UDP\n"); PRINT_DEBUG("Networking::Run RECV UDP\n");
while((len = receive_packet(udp_socket, &ip_port, data, sizeof(data))) >= 0) { while((len = receive_packet(udp_socket, &ip_port, data, sizeof(data))) >= 0) {
PRINT_DEBUG("recv %i %hhu.%hhu.%hhu.%hhu:%hu\n", len, ((unsigned char *)&ip_port.ip)[0], ((unsigned char *)&ip_port.ip)[1], ((unsigned char *)&ip_port.ip)[2], ((unsigned char *)&ip_port.ip)[3], htons(ip_port.port)); PRINT_DEBUG("recv %i %hhu.%hhu.%hhu.%hhu:%hu\n", len, ((unsigned char *)&ip_port.ip)[0], ((unsigned char *)&ip_port.ip)[1], ((unsigned char *)&ip_port.ip)[2], ((unsigned char *)&ip_port.ip)[3], htons(ip_port.port));
Common_Message msg; Common_Message msg;
@ -981,7 +983,7 @@ void Networking::Run()
} }
} }
PRINT_DEBUG("RECV LOCAL\n"); PRINT_DEBUG("Networking::Run RECV LOCAL\n");
std::vector<Common_Message> local_send_copy = local_send; std::vector<Common_Message> local_send_copy = local_send;
local_send.clear(); local_send.clear();
@ -1346,7 +1348,7 @@ void Networking::startQuery(IP_PORT ip_port)
} }
retry = 0; retry = 0;
sockaddr_in addr; sockaddr_in addr{};
addr.sin_addr.s_addr = htonl(ip_port.ip); addr.sin_addr.s_addr = htonl(ip_port.ip);
addr.sin_port = htons(ip_port.port); addr.sin_port = htons(ip_port.port);
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
@ -1369,7 +1371,7 @@ void Networking::startQuery(IP_PORT ip_port)
} }
} }
char str_ip[16]; char str_ip[16]{};
inet_ntop(AF_INET, &(addr.sin_addr), str_ip, 16); inet_ntop(AF_INET, &(addr.sin_addr), str_ip, 16);
PRINT_DEBUG("Started query server on %s:%d\n", str_ip, htons(addr.sin_port)); PRINT_DEBUG("Started query server on %s:%d\n", str_ip, htons(addr.sin_port));

View file

@ -152,12 +152,12 @@ std::vector<uint8_t> Source_Query::handle_source_query(const void* buffer, size_
source_query_data const& query = *reinterpret_cast<source_query_data const*>(buffer); source_query_data const& query = *reinterpret_cast<source_query_data const*>(buffer);
// || gs.max_player_count() == 0 // || gs.max_player_count() == 0
if (gs.offline() || query.magic != source_query_magic::simple) if (gs.offline() || query.magic != source_query_magic::simple) return output_buffer;
return output_buffer;
switch (query.header) switch (query.header)
{ {
case source_query_header::A2S_INFO: case source_query_header::A2S_INFO:
PRINT_DEBUG("Source_Query::handle_source_query got request for server info\n");
if (len >= a2s_query_info_size && !strncmp(query.a2s_info_payload, a2s_info_payload, a2s_info_payload_size)) if (len >= a2s_query_info_size && !strncmp(query.a2s_info_payload, a2s_info_payload, a2s_info_payload_size))
{ {
std::vector<std::pair<CSteamID, Gameserver_Player_Info_t>> const& players = *get_steam_client()->steam_gameserver->get_players(); std::vector<std::pair<CSteamID, Gameserver_Player_Info_t>> const& players = *get_steam_client()->steam_gameserver->get_players();
@ -213,6 +213,7 @@ std::vector<uint8_t> Source_Query::handle_source_query(const void* buffer, size_
break; break;
case source_query_header::A2S_PLAYER: case source_query_header::A2S_PLAYER:
PRINT_DEBUG("Source_Query::handle_source_query got request for player info\n");
if (len >= a2s_query_challenge_size) if (len >= a2s_query_challenge_size)
{ {
if (query.challenge == 0xFFFFFFFFul) if (query.challenge == 0xFFFFFFFFul)
@ -240,6 +241,7 @@ std::vector<uint8_t> Source_Query::handle_source_query(const void* buffer, size_
break; break;
case source_query_header::A2S_RULES: case source_query_header::A2S_RULES:
PRINT_DEBUG("Source_Query::handle_source_query got request for rules info\n");
if (len >= a2s_query_challenge_size) if (len >= a2s_query_challenge_size)
{ {
if (query.challenge == 0xFFFFFFFFul) if (query.challenge == 0xFFFFFFFFul)
@ -262,6 +264,10 @@ std::vector<uint8_t> Source_Query::handle_source_query(const void* buffer, size_
} }
} }
break; break;
default:
PRINT_DEBUG("Source_Query::handle_source_query got unknown request\n");
break;
} }
return output_buffer; return output_buffer;
} }

View file

@ -15,7 +15,7 @@
License along with the Goldberg Emulator; if not, see License along with the Goldberg Emulator; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "dll/steam_matchmaking_servers.h" #include "dll/dll.h"
static void network_callback(void *object, Common_Message *msg) static void network_callback(void *object, Common_Message *msg)
@ -652,16 +652,14 @@ void Steam_Matchmaking_Servers::RunCallbacks()
if (r.players_response) { if (r.players_response) {
uint32_t number_players = g.server.num_players(); uint32_t number_players = g.server.num_players();
PRINT_DEBUG("Steam_Matchmaking_Servers players: %i\n", number_players); PRINT_DEBUG("Steam_Matchmaking_Servers players: %u\n", number_players);
// const auto &players = get_steam_client()->steam_gameserver->get_players(); const auto &players = get_steam_client()->steam_gameserver->get_players();
// auto &player = players->begin(); auto &player = players->cbegin();
for (int i = 0; i < number_players && player != players->end(); ++i, ++player) {
// for (int i = 0; i < number_players && i < players->size(); i++) { float playtime = static_cast<float>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - player->second.join_time).count());
// float playtime = static_cast<float>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - player->second.join_time).count()); PRINT_DEBUG("Steam_Matchmaking_Servers PLAYER [%u] '%s' %u %f\n", i, player->second.name.c_str(), player->second.score, playtime);
// PRINT_DEBUG("Steam_Matchmaking_Servers PLAYER [%u] '%s' %u %f\n", i, player->second.name.c_str(), player->second.score, playtime); r.players_response->AddPlayerToList(player->second.name.c_str(), player->second.score, playtime);
// r.players_response->AddPlayerToList(player->second.name.c_str(), player->second.score, playtime); }
// ++player;
// }
r.players_response->PlayersRefreshComplete(); r.players_response->PlayersRefreshComplete();
r.players_response = NULL; r.players_response = NULL;
} }