From 272e9e0f651e288a80d8f1b5d442b89013d52d4c Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 23 Sep 2026 05:55:52 -0500 Subject: [PATCH] feat(bridge): clan.disbanded carries the roster it ended The website tells a disbanded clan's members, but the clan board that follows the event (and, after an outage, precedes the backlog) has already removed that roster from its store. The game walks Members to drop each membership and never empties the list, so it is still whole when OnClanDisbanded fires. Part of protocol 7. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- overlay/oxide/plugins/RunicGateway.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/overlay/oxide/plugins/RunicGateway.cs b/overlay/oxide/plugins/RunicGateway.cs index c21244b..6c7560c 100644 --- a/overlay/oxide/plugins/RunicGateway.cs +++ b/overlay/oxide/plugins/RunicGateway.cs @@ -1975,6 +1975,23 @@ namespace Oxide.Plugins Dictionary frame = ClanFrame("clan.disbanded", clan); PutPlayer(frame, "steamId", "name", steamId); + + // Protocol 7: who was in it. The website tells a disbanded clan's members, and by the + // time it reads this frame the next board may already have removed the roster it would + // otherwise ask — the board is re-sent seconds after this, and after an outage it is + // applied before the backlog. The game has deleted the clan from its database by now, + // and walked `Members` to drop each one's membership, but it never empties the list + // itself — so it is still whole here, bounded by the clan's own member limit. + if (clan.Members != null) + { + List members = new List(); + + foreach (ClanMember member in clan.Members) + members.Add(member.SteamId.ToString()); + + frame["members"] = members; + } + EmitFrame(frame); ScheduleClansBoard();