From de5f0928bd2fd4b0b2f2d8f8e472aa4ed88abbd7 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Fri, 25 Sep 2026 01:05:51 -0500 Subject: [PATCH] fix(bridge): map.live names a player by userID, not UserIDString The phase 14 walk read `steamId: null` for every sleeper made on the server: UserIDString is a cached string the game fills for a player it has seen connect. An id the map cannot name is an own dot and a clan mate the site can never match, so the map reads the id from userID itself. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- overlay/oxide/plugins/RunicGateway.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/overlay/oxide/plugins/RunicGateway.cs b/overlay/oxide/plugins/RunicGateway.cs index cc4e961..be20606 100644 --- a/overlay/oxide/plugins/RunicGateway.cs +++ b/overlay/oxide/plugins/RunicGateway.cs @@ -9027,6 +9027,18 @@ namespace Oxide.Plugins CurrentPicture(); } + /// + /// A player's Steam id as text, from userID itself. UserIDString is a + /// cached string the game fills for a player it has seen connect, and the phase 14 walk + /// read it back empty from a sleeper made on the server: an id the map could not name + /// is an own dot and a clan mate the site can never find. + /// + private static string SteamIdOf(BasePlayer p) + { + ulong id = p.userID; + return id.ToString(System.Globalization.CultureInfo.InvariantCulture); + } + private static bool Gone(BaseEntity e) { return e == null || e.IsDestroyed || e.transform == null; @@ -9133,7 +9145,7 @@ namespace Oxide.Plugins continue; Dictionary row = At(p.transform.position); - row["steamId"] = p.UserIDString; + row["steamId"] = SteamIdOf(p); row["name"] = p.displayName; row["sleeping"] = p.IsSleeping(); row["online"] = true; @@ -9156,7 +9168,7 @@ namespace Oxide.Plugins } Dictionary row = At(p.transform.position); - row["steamId"] = p.UserIDString; + row["steamId"] = SteamIdOf(p); row["name"] = p.displayName; row["sleeping"] = true; row["online"] = false;