Reference
Troubleshooting
Every common failure and what actually causes it.
Steam is not connected
Run steam.Status. The Failure line names the cause. The usual ones:
Steam is not running. Start the Steam client and log in. The plugin cannot provide Steam features by itself.
No App ID configured. Set one in Project Settings > Plugins > SteamForge.
Could not find steam_api64.dll. Set a Steamworks SDK path in Project Settings, or enable OnlineSubsystemSteam so the engine stages its own copy.
Run steam.Doctor for the full checklist with fix buttons.
Achievements do not unlock
The name is wrong. The node takes the API Name from the partner site, not the display name. This fails silently, because Steam simply rejects an ID it does not know.
The achievement does not exist yet. They are created on the partner site, not in the engine. Run steam.Achievements to list what this App ID actually defines.
You are on App ID 480. Spacewar has its own achievements, not yours.
Nothing happens when I search for lobbies
Different App IDs. Both players must be on the same one.
The lobby is not Public. Friends Only and Private lobbies never appear in searches.
Filters are excluding it. Clear all filters and try again.
Both clients share one Steam account. Two Play In Editor clients are one Steam user. Set Mock Mode to Always to give each client a distinct identity, or run two Standalone Game instances.
Seeing what is happening in a packaged build
Shipping compiles out every log line, so on the one configuration players actually run, the reasons a match fails are invisible. Get Session Diagnostics reports the same facts as text.
- Add a Text widget to your menu, with Is Variable ticked.
- Select it, and in Details find Content > Text and click Bind, then Create Binding.
- In the binding, add Get SteamForge Sessions, drag off it to Get Session Diagnostics, and wire that to Return Value.
It updates itself every frame, so you can watch it change as you host, join and start.
Steam available : yes
In session : yes (109775241234567)
Am I the host : yes
Session map : Lvl_ThirdPerson
Net mode : ListenServer (hosting)
This build uses : Steam relay (SteamSockets configured)
Travel to : steam.76561198012345678:7777
Following host : no
Build id : (none -- version gating off)Read it on both machines and compare. The line that differs is the problem:
| Line | What a wrong value means |
|---|---|
| In session | no on the joiner: the join never completed, so nothing later can work |
| Session map | EMPTY: the host published no map, so Start Match has nowhere to go |
| Net mode | Still Standalone on the host after Start: travel failed, usually a map missing from the package |
| This build uses | direct IP when you expected relay: the SteamSockets config did not take, and the two builds may disagree |
| Travel to | NOT PUBLISHED on the host after Start: the listen server never came up |
| Travel to | Differs between the two machines: they are not in the same session |
Start Match does nothing, and only in a packaged build
The map is not in the package. Map Name is a string, so nothing in your project references that level and the cooker leaves it out. Travel then has nowhere to go, and the game falls back to your default map, which looks like the menu resetting.
Add every level you travel to under Project Settings > Packaging > List of maps to include in a packaged build, then repackage. Working in the editor proves nothing here, because the editor has every map whether it is cooked or not.
If you package from the Project Launcher, fix it there instead. A launcher profile's map selection becomes -map= on the command line, and that replaces the project setting rather than adding to it. A profile with one map ticked cooks one map however many you listed in Project Settings.
To confirm before rebuilding, search the staged Content\Paks\*.utoc for your map name. If it is absent, that is the whole problem.
Both players are in the session but only the host is in the match
The host travels and the joiner stays on the menu, with no error on either side.
Check the host published an address. Filter the Output Log for LogSteamForge and look for Published session ... at .... If it is missing, the host never became a listen server, and the usual reason is a Map Name that does not match a real level's asset name.
Check the joiner is following. They should log Host started the match. Travelling to ... naming the same URL the host published. If there is no line at all, either they were not in the session, or they joined with Travel unticked, which disables the automatic follow.
Check they can reach the address. On one machine or one network this always works. Over the internet the host's port has to be reachable, exactly as for any listen server.
Kicked or banned players can rejoin immediately
Fixed. Earlier versions checked the ban list against the session you were already in rather than the one being joined, which meant it was empty during a join and matched nobody. Rebuild the plugin.
Version Mismatch never happens
Session Build Id is empty. It is empty by default, which switches version gating off entirely. Set it in Project Settings > Plugins > SteamForge on every build you want gated. An empty value on either side means opting out.
Invites do nothing
You are not handling On Lobby Join Requested. Steam does not join anything when a player accepts an invite. It asks your game to. Bind that event and call Join Lobby (Async).
No connect string published. For a Join Game button on a friends list, you must call Set Presence Connect String. Without it there is no way in.
The overlay does not appear
You are in Play In Editor. It cannot work there, ever. See The Steam overlay.
Run `steam.Overlay`. The RHI at Steam init line tells you whether Steam got in before the graphics device.
The player disabled it. Steam > Settings > In Game.
Steam says my game is running when I am only in the editor
Once the editor has initialised Steam, Steam sees your App ID as running until the editor exits. Stopping Play In Editor does not clear it. This is a property of how Steam tracks processes and cannot be fixed from inside one.
To avoid it entirely, set Mock Mode to Always for everyday editor work. Steam is then never initialised, so nothing shows as running and no playtime accrues.
Steam Input does nothing
No action manifest. Every handle is 0 without one. See Steam Input.
A space in an API name. The file format accepts it, your lookups will not match it. Run Validate Manifest.
A gamepad emulation layout. If the player's chosen configuration emulates a gamepad rather than driving Steam Input actions, every action reads as unbound and input arrives through Unreal's ordinary gamepad path instead. SteamForge logs a warning when it sees this, because it is indistinguishable from a missing manifest.
Cloud saves are not syncing
Cloud is off. Check Is Cloud Enabled For App. Writes succeed regardless, so a write that returned success proves nothing.
Quota is full. Check Get Cloud Quota. Going over makes writes fail rather than evicting anything.
You are on App ID 480, whose quota is 4096 bytes.
Some features report themselves unavailable
Run steam.Missing. If the loaded Steam library is older than the SDK SteamForge's bindings were generated from, functions added since then are not exported and the features needing them are disabled. Everything else works normally.
This is by design. A missing function costs you one feature instead of breaking your build.