4.8 KiB
scum_simple_rcon_ue4ss
Minimal UE4SS C++ Mod that exposes a Source RCON listener and dispatches raw SCUM admin command text on the game thread.
This intentionally implements only the scope requested:
- UE4SS C++ mod lifecycle:
start_mod,uninstall_mod,on_unreal_init. - Source RCON server: TCP listener, password auth, request/response packet framing, multi-packet replies.
- Game-thread queue: RCON worker threads enqueue commands; EngineTick drains and executes them.
- Offline AdminCommand execution: builds a synthetic
BP_ConZPlayerController+ConZCharacterin the dedicated-server world, then invokes SCUM's nativeAdminCommandexecutor. An administrator does not need to be online. - Unified RCON endpoint: normal admin commands and notifications enter through the authenticated, game-thread queue.
SendChathas a deliberate chat-only branch: it uses SCUMMiscStatics:SendChatLineToPlayeragainst real, online target controllers, never a fabricated or arbitraryPlayerRpcChannel. - Admin identity guard: reads
SCUM/Saved/Config/WindowsServer/AdminUsers.iniand refuses game commands when no configured admin SteamID64 exists, unless disabled in config.
The implementation fails closed when a required SCUM binding, native executor signature, or reflected function schema does not match the expected runtime shape. It reports the mismatch instead of guessing an address, object, or network channel.
Runtime behavior
- UE4SS loads
ue4ss/Mods/scum_simple_rcon/dlls/main.dll. - The mod reads
ue4ss/Mods/scum_simple_rcon/config.ini. - If the password is still
CHANGE_ME_BEFORE_USE, the listener refuses to start. - After RCON auth, any command except
rcon.status,rcon.admins, andrcon.helpis queued to the game thread.rcon.dispatchandrcon.chatare safe game-thread diagnostics. - The game thread checks
AdminUsers.ini, discovers SCUMAdminCommandclasses, and creates/reuses a synthetic server-only caller. - The mod resolves SCUM's native AdminCommand executor with one exact signature. It only calls the executor when exactly one match is found; otherwise it returns a clear error. Non-AdminCommand Unreal console commands use the server-console fallback.
Normal server admin commands can therefore run while the player count is zero. SendChat is not an admin command in this mod: it does not need AdminUsers.ini, but it does require each recipient to be online with a real network-backed controller. A player-targeted notification likewise needs its recipient online in order to be delivered/displayed; neither feature requires the administrator to be online.
Example commands
rcon.status
rcon.admins
rcon.dispatch
rcon.chat
Announce Hello from RCON
SendChat 4 "Bounty claimed: +500" 7656119XXXXXXXXXX
SendChat 2 "xxx killed xxx"
SendNotification 2 0 "Welcome!" 7656119XXXXXXXXXX
For SendChat, an omitted SteamID broadcasts by resolving and sending once to
each real online controller. A supplied SteamID routes only to that controller.
The implementation requires the controller's inherited Player object to be
a real UNetConnection, so synthetic offline admin controllers and
class-default objects are deliberately excluded.
The last example is a broadcast only to real online players. Do not add an
inline # ... comment to an RCON command: it is command text, not a shell
script, so it would become part of the message/argument stream.
Run rcon.chat after world load to validate the non-admin chat route without
sending anything. A healthy result contains real chat dispatcher ready and
reports the number of real online controllers; zero is valid on an empty server.
Do not prefix commands with #; if you do, this mod strips one leading # before dispatch.
AdminUsers.ini
Default lookup:
<ServerInstall>\SCUM\Saved\Config\WindowsServer\AdminUsers.ini
The parser accepts any line containing a 17-digit SteamID64, so these all work:
7656119XXXXXXXXXX
Admin=7656119XXXXXXXXXX
+AdminUsers=7656119XXXXXXXXXX
No SteamID is compiled into the DLL and no online PlayerRpcChannel is used as
an admin surrogate. The file is re-read after changes; with multiple configured
admins the dispatcher selects the lexicographically first valid ID, unless the
optional [admin] preferred_steam_id names one that is also present in the file.
An already-created synthetic caller refreshes its selected identity after a file
change.
Offline-dispatch diagnostics
Run rcon.dispatch after the world has loaded. A healthy result contains:
synthetic=ready; executor=native AdminCommand executor resolved by exact signature
If SCUM changes its executable code, the signature may no longer match. In that case the mod deliberately refuses to call a guessed address; update the signature for that SCUM build and retest on a non-production server.