Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
LoadingWidgetREPO
Loading-screen panel for every player: live load states with stuck detection, talking bars, local voice volume; kick/ban and stuck-load lobby rescue for moderators. Works standalone; full SharePermissions integration when installed
| Date uploaded | 20 hours ago |
| Version | 1.1.0 |
| Download link | redos7-LoadingWidgetREPO-1.1.0.zip |
| Downloads | 144 |
| Dependency string | redos7-LoadingWidgetREPO-1.1.0 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
LoadingWidget
A panel on the R.E.P.O. loading screen — the one place the normal menus can't reach. Every player running the mod sees it while a multiplayer level load is in flight — between levels in the game itself, including through the scene-swap gap where even the game's own UI is gone; never on the boot/menu loads or in singleplayer. Works on its own; SharePermissions is an optional companion that unlocks its full moderation stack.
Everyone sees:
- every connected player with their live load state — LOADING / BUILDING / LOADED / READY — so the one player hanging the load is visible at a glance. When a load is genuinely stuck (the game's own ~25s verdict, or the panel's own backstop for the Start/reload phases it misses), the header flags STUCK and the blocking rows burn red
- a talking-volume bar per player
- a per-player local voice volume slider (0–200%, this machine only, resets on room leave)
Moderators (the host — plus SharePermissions moderators when it's installed) additionally get:
- Kick / Ban for stuck or misbehaving players
- a Lobby button that brings the whole room back to the lobby even when a load is stuck — with the host-side QUEUED / FORCE rescue escalation for a wedged transition (the vanilla stuck prompt only offers leaving the room; this bail keeps the room intact)
Standalone vs. with SharePermissions
The mod detects SharePermissions at startup and uses all of it when found:
| Standalone | With SharePermissions v1.17.0+ | |
|---|---|---|
| Who sees the panel | Everyone in the room running the mod | Everyone in the room running the mod |
| Who gets moderation actions | Host only | Host and SharePermissions moderators |
| Kick / Ban | The game's own kick & ban (host) | SharePermissions rules & wire protocol — moderators can kick remotely, bans are audited |
| Role icons | Host crown only | Full tiers: host / moderator / mod user / no mod |
| Lobby + QUEUED/FORCE rescue | Yes (host) | Yes, plus moderator-initiated via wire command |
| Load states, talking bars, local volume | Yes | Yes |
| Panel on/off toggle | This mod's config: UI / ShowLoadingPanel in BepInEx/config/RED.LoadingWidget.cfg |
SharePermissions' Settings tab "Loading panel" (config: UI / ShowLoadingPanel in SharePermissions' config file) — live, mid-load included |
Note on older SharePermissions (≤ 1.16.x): those versions ship this panel inside SharePermissions itself, so LoadingWidget stays dormant (one log line, no double panel). Update SharePermissions to 1.17.0+ — or uninstall it — to activate LoadingWidget.
Quick start
- Install this mod. That's it — the panel appears on multiplayer loading screens for everyone running it; the kick/ban and lobby controls light up for the host.
- Optional: install SharePermissions v1.17.0+ (and set it up as usual, secret code etc.) to get moderator access, role tiers, and its kick/ban machinery on the panel.
For developers
This mod is the panel UI plus the native FORCE lobby rescue, talking to a backend picked once
at startup (Plugin.ResolveBackend, soft [BepInDependency] so SharePermissions loads first when
present):
- Bridged — SharePermissions v1.17.0+ installed: moderation goes through its public facade
SharePermissions.Api.LoadingWidgetBridge(additive-only stability contract). - Standalone — SharePermissions absent: host-only moderation fallbacks on the game's own
machinery (native kick/ban wire events, replicated lobby-return, own
PlayerVoiceChatpostfix for talking bars and local volume — applied only in this mode so the two mods never double-apply volume factors). - FORCE is native in both modes (
src/StandaloneLobby.cs): the wedged-transition restart acts on the game's pipeline, not on backend state, so it lives here; the backend that owns the queued return finishes the trip after the reboot.
src/SharePermissionsBackend.cs is the only file allowed to reference SharePermissions.*
types (JIT isolation is what lets the mod run without the assembly on disk — keep it that way).
-
libs/SharePermissions.dllis the vendored compile-time copy of the bridge contract. It is not bundled at runtime (Private=false) — BepInEx loads the real installed mod. Whenever the bridge gains members this mod needs, rebuild SharePermissions and refresh the vendored DLL:dotnet build <SharePermissions repo>\SharePermissions.csproj copy <SharePermissions repo>\bin\Debug\netstandard2.1\SharePermissions.dll libs\...then raise
PluginInfo.SharePermissionsMinVersionif the new members are required — installs below the minimum fall back to standalone-or-dormant instead of crashing. -
dotnet builddeploys straight into the r2modman profile configured inDirectory.Repo.props(per-machine overrides go inDirectory.Repo.props.user, via the Linkoid.Repo.Plugin.Build SDK). -
Design notes: the extraction spec lives in the SharePermissions repo (
docs/superpowers/specs/2026-07-13-loading-widget-extraction-design.md); the optional-dependency design lives here (docs/superpowers/specs/2026-07-13-optional-sharepermissions-design.md).
CHANGELOG
Changelog
1.1.0
- SharePermissions is now optional. The mod detects it at startup: with SharePermissions
v1.17.0+ installed, everything works exactly as before through its
LoadingWidgetBridge(moderators get the panel's actions, its rules/wire protocol drive kick/ban, role tiers, its config toggle). Without it, the panel works standalone on the game's own machinery: host-only moderation with native kick/ban (bans enforced by the room's exclusion list), the Lobby button with the same QUEUED/FORCE stuck-load rescue, talking bars, and the per-player local voice volume slider.- Standalone panel toggle:
UI / ShowLoadingPanelinBepInEx/config/RED.LoadingWidget.cfg(bound only when SharePermissions is absent; its own toggle governs otherwise). - With an older SharePermissions (≤ 1.16.x, which ships this panel itself) the mod stays dormant with a clean log line instead of drawing a second panel.
- The Thunderstore package no longer hard-depends on SharePermissions.
- Standalone panel toggle:
- The panel is visible to EVERY client running the mod, not only the host and moderators - the load display is informational, so anyone stuck in a load can see who is holding it up. It is strictly scoped to loading between levels in the game itself: it requires an active Photon room and never appears on the boot/splash/menu loads or in singleplayer (in-room, the local player is always listed, so it can never render empty). Moderation actions stay gated: Kick/Ban per-target and the Lobby/FORCE bail only for the host (and SharePermissions moderators when bridged).
- Load-state truth (a decompile-verified audit of what each per-player tier really means):
- BUILDING now reads the real per-client build barriers (
LevelGenerator.SpawnedReadyPlayerListand, on enemy levels,EnemyReadyPlayerList- each sent by a client only after real local work) instead ofModulesReadyPlayerList, which a non-master reports on a ~0.3s timer regardless of progress. A client genuinely stuck building the level used to show LOADED and count toward "N/N loaded"; it now stays BUILDING and drops the header count, for every viewer. - The final loading-animation barrier is recognized as a real all-players gate (it blocks every client's Start->Main), not a cosmetic flourish.
- STUCK detection: the panel surfaces the game's own ~25s stuck verdict and adds its own long-window backstop for the phases that verdict never covers (the Start animation barrier, the unbounded Reload gap). While stuck, the header flags STUCK and the rows the room is actually waiting on burn in the blocker accent - the vanilla stuck prompt only offers leaving the room; the panel points at the room-intact rescue instead.
- The panel no longer vanishes during lobby-bound transitions (arena/game-over and its own LOBBY/FORCE rescue): the window gate keyed on the transition DESTINATION, hiding the rescue UI the moment it launched. It now rides the whole transition, and the game-over return opens the panel properly through its outro.
- BUILDING now reads the real per-client build barriers (
- The FORCE rescue is native to this mod in both modes (
StandaloneLobby): it acts on the game's transition pipeline, not on backend state. In bridged mode the panel no longer calls SharePermissions'ForceLobbyReload; SharePermissions still owns the queued return that gates FORCE and finishes the trip after the reboot. - Hardening against game updates and backend failures: a failing patch no longer kills the mod at
startup (per-patch guards, degrade to a log line);
SemiFuncchecks joined the JIT-isolated raw helpers; the outro phase check resolvesgameStatevalues by name, so a reordered enum can no longer silently mislabel players; and an exception from the backend now hides the panel instead of freezing it or leaving it stuck over gameplay. - Fixed: the plugin no longer stamps
HideAndDontSaveon the shared BepInEx manager object (which hid every mod's plugin component from debug tools); an expanded row no longer survives a mid-load toggle-off / moderation revoke to reopen by itself on the next load; the volume slider now arms on the thumb's full height instead of only the thin track; the loading-screen check readsactiveInHierarchyso a parent-level deactivation can't leave the panel stuck visible. - Performance: the per-frame redraw is allocation-free in the steady state (header, name, and
percent strings rebuilt only on change; the Photon player list fetched once per frame),
per-player load states are computed once per frame instead of twice, and unbounded per-frame
retries (
FindObjectOfType<ReloadScene>in the scene-swap gap, the font resolve walk) are throttled to timers. - New config
Debug / StateDiagnostics(default off): the[LoadPanel diag]load-state dump no longer spams the log every 2 seconds - enable it only when diagnosing wrong LOADING/BUILDING/LOADED/READY states. - Dev/packaging: pinned the floating NuGet versions (build SDK 0.2.2, gamelibs 0.4.4-ngd.0) so a
game update can't silently shift the compile-time surface; per-machine paths now go in
Directory.Repo.props.userinstead of editing the committed file; filled in the LICENSE copyright line.
1.0.0
- Initial release: the loading-screen moderation panel, extracted from SharePermissions (it shipped
inside SharePermissions through v1.16.0; from v1.17.0 it lives here). Requires SharePermissions
v1.17.0+ and talks to it through
SharePermissions.Api.LoadingWidgetBridge. - Same panel, unchanged: per-player load states (LOADING / BUILDING / LOADED / READY across normal loads, the outro, and the Reload barrier), talking bars, per-player local voice volume (0–200%, this machine only), Kick/Ban with SharePermissions' rules, and the Lobby button with the host-side QUEUED/FORCE stuck-load rescue.
- The panel's on/off toggle stays in SharePermissions (Settings tab "Loading panel" /
UI / ShowLoadingPanel), read live through the bridge.