netcode-revival: log relay sweeps + show netcode transport state in the M menu

- Relay --verbose now logs which client timed out (ip:port, session, room)
  instead of silently dropping, so '2 client(s) -> 1 client(s)' is
  explainable.
- The M menu Status block shows the netcode transport state: 'Netcode:
  relay joined / not connected' and how many sessions are discoverable,
  so the RakNet pipeline is visible without grepping logs.
- Pin rexglue to 3ec27d1 (transport receive timeout - the silent-client
  disconnect fix).
This commit is contained in:
MiTHRAL 2026-08-28 13:29:08 -04:00
parent 658d727aba
commit dea4c3c5f4
3 changed files with 31 additions and 5 deletions

View file

@ -489,10 +489,20 @@ void GhostRelay::Sweep(double now) {
if (now <= 0.0) {
return;
}
clients_.erase(std::remove_if(clients_.begin(), clients_.end(),
[now](const Client& c) {
return now - c.last_seen > kClientTimeoutSec;
}),
const bool verbose = verbose_.load(std::memory_order_relaxed);
clients_.erase(std::remove_if(
clients_.begin(), clients_.end(),
[now, verbose](const Client& c) {
const bool stale = now - c.last_seen > kClientTimeoutSec;
if (stale && verbose) {
GHOST_RELAY_INFO("{} timed out ({}s silence; {} joined "
"room '{}')",
GhostAddrStr(c.addr),
int(now - c.last_seen), c.session_id,
std::string(c.room, c.room_len));
}
return stale;
}),
clients_.end());
}

View file

@ -3,11 +3,13 @@
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <imgui.h>
#include <rex/cvar.h>
#include <rex/logging.h>
#include <rex/system/xnet_transport.h>
#include "native/skate3_native_ghost.h"
#include "skate3_native_scene.h"
@ -216,6 +218,20 @@ void GhostDialog::OnDraw(ImGuiIO& io) {
if (st.peer[0] != '\0') {
ImGui::Text(" Relay: %s", st.peer);
}
// netcode-revival: the game's own netcode transport (RakNet via the relay).
{
using rex::system::XNetTransport;
ImGui::Text(" Netcode: %s",
XNetTransport::Instance().Active()
? "relay joined"
: "not connected");
const std::vector<rex::system::XNetSession> xnet_sessions =
XNetTransport::Instance().Sessions();
if (!xnet_sessions.empty()) {
ImGui::Text(" Sessions: %zu discoverable",
xnet_sessions.size());
}
}
if (st.refused) {
ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.3f, 1.0f),
" Refused by relay (protocol version mismatch)");

@ -1 +1 @@
Subproject commit 01fe706c13038c861e028b52384c3922c98e80da
Subproject commit 3ec27d115b0a6ff3ac20fe4486239150c3872e25