While the main feature of the Bootstrapper (wtsapi32.dll, dwmapi.dll, or version.dll) is to use a custom server with the game, it has other features as well.
The Bootstrapper's configuration is in OpenWF/Client Config.json relative to your game folder. It has the following fields:
fallback_language — If not empty, this language will be used when Warframe.x64.exe is invoked without a language command line argument.fallback_languageVO — If not empty, this voiceover language will be used when Warframe.x64.exe is invoked without a languageVO command line argument.fallback_graphicsDriver — If not empty, this graphics driver will be used when Warframe.x64.exe is invoked without a graphicsDriver command line argument.fallback_cluster — The cluster to use when Warframe.x64.exe was double-clicked or the argument was simply omitted. Can be public, test, or dev — the latter two enable some more logging.server_host — The hostname or IP address to redirect game traffic to. This should match myAddress in SpaceNinjaServer.http_port — The port to use for HTTP traffic. This should match httpPort in SpaceNinjaServer.https_port — The port to use for HTTPS traffic. This should match httpsPort in SpaceNinjaServer.autologin — Uses the provided credentials to automatically login on startup. If another instance is logged in on the same account, it will be forcefully logged out.autologin_emailautologin_password — The whirlpool hash of the password to use for autologin. You can simply enter your password and it will automatically be hashed and overwritten.high_damage_numbers_patch — If true, patches the game to display the exact number of damage that you dealt to fix -2147483648 showing up on high damage.simulacrum_blacklisted — If true, blacklisted enemies are shown in the Simulacrum. Defaults to false to match the game.simulacrum_whitelisted — If true, whitelisted enemies are shown in the Simulacrum. Defaults to true to match the game.pause_always_stops_timedisable_nrs_connection — If true, disables NRS connections, preventing the game from showing "Please ensure that your firewall permits UDP ports 4950 & 4955."ee_log_in_console — If true, writes everything that gets written to EE.log to the console as well.skip_mission_start_timer — If true, disables the 5 second wait before a mission starts.logout_on_request_failure — If false, the game will ignore HTTP request failures/timeouts instead of forcing a logout.fov_override — If not 0, overrides the game's FOV setting. You can use any value from 1 to 226.forced_profile_dir — An absolute path to a folder that will be used to read and write your game settings. Notably, this can be used to have the same settings regardless of username.auto_start_scripts — A list of scripts to automatically start.alternative_loading — Enables an alternative loading mode (Server.FastLoad) which also skips intro cutscenes when loading into a relay. However, this breaks some parts of The New War and possibly other missions.dont_resolve_labels — If true, shows language tags instead of their associated value, e.g. /Menu/Confirm_Item_Yes instead of YES.save_all_metadata — If true, implicitly creates an empty patch on every metadata read to make it available for get_effective_metadata requests. May degrade performance.write_all_metadata_reads_to_console — If true, writes all metadata reads to the console. May degrade performance.write_all_metadata_reads_to_ee_log — If true, writes all metadata reads to EE.log. May degrade performance.write_patches_metadata_reads_to_console — If true, writes patched metadata reads to the console. May degrade performance.write_patches_metadata_reads_to_ee_log — If true, writes patched metadata reads to EE.log. May degrade performance.While the game is running, you can visit http://localhost:6155/ to modify some of the above options, access additional features like teleportation, and use scripts.
This web interface uses the game's language or ?lang= query parameter to check for translations. The builtin translations are mirrored from https://onlyg.it/OpenWF/Translations. You can provide a OpenWF/dict.cat.txt file to provide a custom work-in-progress translation.
Developers can also use the HTTP interface to interact with the Bootstrapper. In addition to commands (documented below), the following routes are available: /ping, /save_all_metadata, /write_all_metadata_reads_to_console, /write_all_metadata_reads_to_ee_log, /write_patched_metadata_reads_to_console, /write_patched_metadata_reads_to_ee_log, /pause_always_stops_time, /server_host, /status, /toggle_console, /scripts, /start_script, /start_script_inline, /autostart_scripts, /add_autostart_script, /remove_autostart_script, /apply_hotfix, /version, /game_version, /check_label_replacements, /memory, /get_effective_metadata
The Bootstrapper adds the owfServerHost command line argument, which can be used to override the server_host in the config.
When connecting to a server, the Bootstrapper requests /custom/tunables.json. The resulting JSON object may provide the following fields:
token — if given, this string will be provided as a query parameter in the login request to indicate acknowledgement of the tunablesprohibit_skip_mission_start_timer — if true, prohibits skip_mission_start_timerprohibit_fov_override — if true, prohibits fov_overrideprohibit_freecam — if true, prohibits freecamprohibit_teleport — if true, prohibits teleportprohibit_scripts — if true, prohibits the execution of user-defined scriptsTo aid in troubleshooting, the Bootstrapper assumes that a compatible server responds to this request with status code 200 and a valid JSON object, otherwise showing a warning popup.
buildLabel to indicate the client's buildLabel.clientMod parameter indicating the Bootstrapper's name and version. If Metadata Patches are in use, metadataPatchesInUse=1 is added as well.xpBasedLevelCapDisabled to indicate that the client has been patched to accept any PlayerLevel and doesn't need XPInfo to match.USER message is adjusted to contain nonce=... in the 'realname' field.Metadata Patches are loaded from .txt files in the OpenWF/Metadata Patches/ folder.
They are parsed line by line. If a line starts with /, a new patch for the given absolute path is started.
It is possible to have a single patch affect multiple paths by using ampersands. The start of a patch can also take up multiple lines if the ampersand is at the end of the line or the beginning of the next line.
For the remaining processing, leading and trailing spaces and tabs are ignored:
> also start a new patch but can be used at any indentation level.>, r|, ...) is added as a prefix to the effective metadata. This works to add top-level properties but also to replace them because the game resolves duplicates by ignoring subsequent entries.r| create replacements, e.g. r|A|Z replaces all instances of A with Z in affected metadata.s| create regex substitutions, e.g. s|(?m)^(.+)=1$|$1=0 would replace a value of 1 on any line with a 0, using the 'm' flag here so ^ and $ also match on line boundaries. See here for more information about the Regex engine.If multiple patches affect the same absolute path, they are combined.
The Bootstrapper handles the client's content requests by consulting the OpenWF/Content/ folder, forwarding the request to the configured server in case a file is not found.
At minimum, the client will request /0/H.Cache.bin!D_---------------------w. The Bootstrapper has 3 modes for managing this file:
B.Cache.Windows.bin and H.Cache.bin) will be created to ensure your content is loaded. Otherwise,OpenWF/Content/0/UNMANAGED exists, it is assumed that OpenWF/Content/0/H.Cache.bin!D_---------------------w is correctly in place and no attempts to correct it will be made. Otherwise,OpenWF/Content/0/H.Cache.bin!D_---------------------w file that should require no extra content requests except for undoing content replacements.After login, the Bootstrapper will attempt to establish a WebSocket connection with ws://server_host:http_port/custom/ws. If the WebSocket upgrade succeeds, the Bootstrapper sends {"auth_game":{"accountId":...,"nonce":...}}. With this connection in place, the server can send {"sync_inventory":true} to cause the client to resync from inventory.php or {"tunables":{...}} to send updated tunables.
The command API is a versatile way for developers to interact with the Bootstrapper. Commands are available via HTTP, WebSocket, and the scripting API. For example, to enable skip_mission_start_timer, one can use HTTP with /skip_mission_start_timer?true, WebSocket with send("skip_mission_start_timer?true") or scripting with owf_command("skip_mission_start_timer?true").
The following commands are available: logout, save_config, reload_hotkeys, reload_label_replacements, reload_metadata_patches, available_scripts, running_scripts, autostart_scripts, script_log, clear_script_log, stop_script, high_damage_numbers_patch, skip_mission_start_timer, simulacrum_blacklisted, simulacrum_whitelisted, alternative_loading, ee_log_in_console, dont_resolve_labels, fov_override, freecam, lockcam, gamecam, teleport, enable_pause_always_stops_time, disable_pause_always_stops_time, request_bgscript_broadcasts, download_latest_hotfix, check_for_updates
I hope this document was useful. If you have any feature requests or bug reports regarding the Bootstrapper, feel free to submit them at https://onlyg.it/OpenWF/Bootstrapper/issues.