Compare commits

..

8 Commits
main ... main

16 changed files with 1222 additions and 1145 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
* text=auto eof=lf
_assets/ linguist-vendored

7
_assets/bootstrap.bundle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
_assets/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
_assets/censorcanary.min.js vendored Normal file
View File

@ -0,0 +1 @@
const censorcanary={checkIpfs:async()=>{let e="";try{e=await(await fetch("https://ipfs.io/ipfs/QmWfVY9y3xjsixTgbd9AorQxH7VtMpzfx2HaWtsoUYecaX")).text()}catch(e){console.warn("censorship canary request failed",e)}return"hello"==e},message:{en:'Sorry for the interruption, but we failed to verify that you have access to a free & open internet. We strongly recommend using a mitigation like <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS over HTTPS</a> or even a VPN.',de:'Entschuldigung für die Unterbrechung, aber wir konnten nicht bestätigen, dass Sie Zugang zu einem freien und offenen Internet haben. Wir empfehlen dringend, eine Maßnahme wie <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS über HTTPS</a> oder sogar ein VPN zu verwenden.',es:'Perdón por la interrupción, pero no pudimos verificar que tengas acceso a un internet libre y abierto. Te recomendamos encarecidamente usar una solución como <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS sobre HTTPS</a> o incluso una VPN.',fr:'Désolé pour linterruption, mais nous navons pas pu vérifier que vous avez accès à un Internet libre et ouvert. Nous vous recommandons vivement dutiliser une solution comme <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS over HTTPS</a> ou même un VPN.',hi:'असुविधा के लिए क्षमा करें, लेकिन हम यह सत्यापित नहीं कर पाए कि आपके पास मुक्त और खुले इंटरनेट की पहुँच है। हम दृढ़ता से सलाह देते हैं कि आप <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS over HTTPS</a> या फिर VPN का उपयोग करें।',it:'Scusa per linterruzione, ma non siamo riusciti a verificare che tu abbia accesso a un Internet libero e aperto. Ti consigliamo vivamente di utilizzare una soluzione come <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS over HTTPS</a> o persino una VPN.',ja:'ご迷惑をおかけして申し訳ありませんが、自由でオープンなインターネットにアクセスできるか確認できませんでした。推奨として <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS over HTTPS</a> や VPN の利用を強くお勧めします。',pt:'Desculpe a interrupção, mas não conseguimos verificar se você tem acesso a uma internet livre e aberta. Recomendamos fortemente usar uma solução como <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS sobre HTTPS</a> ou até mesmo uma VPN.',ru:'Извините за неудобство, но мы не смогли подтвердить, что у вас есть доступ к свободному и открытому интернету. Мы настоятельно рекомендуем использовать такие меры, как <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">DNS через HTTPS</a> или даже VPN.',zh:'抱歉打扰,但我们无法验证您是否可以访问自由开放的互联网。我们强烈建议使用 <a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/" target="_blank" rel="noreferrer">基于 HTTPS 的 DNS</a> 或者 VPN。'},showBanner:e=>{const r=()=>{if(!document.querySelector(".censorcanary-alert")){const r=document.createElement("div");r.className="alert alert-warning censorcanary-alert",r.setAttribute("role","alert"),r.innerHTML=censorcanary.message[e??(navigator.language||"en").split("-")[0].toLowerCase()]??censorcanary.message.en,(document.querySelector("body > .container")||document.querySelector("body > .container-fluid")||document.body).prepend(r)}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r()}};localStorage.getItem("censorcanary")||censorcanary.checkIpfs().then(e=>{e?localStorage.setItem("censorcanary","1"):censorcanary.showBanner()});

View File

@ -4,7 +4,7 @@
<title>Asset Replacements Guide | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
@ -23,7 +23,7 @@
<li>Finally, to get the assets into the game, you can copy the <code>Content Replacements</code> folder from warframe-cache-tools into the OpenWF folder of your client. The Bootstrapper will automatically patch the game to use your modified content, and if you ever wanna stop using it, you can simply remove the client's <code>Content Replacements</code> folder.</li>
</ol>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

View File

@ -75,9 +75,9 @@
</head>
<body>
<h1>OpenWF Bootstrapper Manual</h1>
<p>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.</p>
<p>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.</p>
<h2>Client Config.json</h2>
<p>The bootstrapper's configuration is in <code>OpenWF/Client Config.json</code> relative to your game folder. It has the following fields:</p>
<p>The Bootstrapper's configuration is in <code>OpenWF/Client Config.json</code> relative to your game folder. It has the following fields:</p>
<ul>
<li><code>fallback_language</code> — If not empty, this language will be used when Warframe.x64.exe is invoked without a <code>language</code> command line argument.</li>
<li><code>fallback_languageVO</code> — If not empty, this voiceover language will be used when Warframe.x64.exe is invoked without a <code>languageVO</code> command line argument.</li>
@ -114,11 +114,11 @@
<h2>HTTP Interface</h2>
<p>While the game is running, you can visit <a href="http://localhost:6155/" target="_blank">http://localhost:6155/</a> to modify some of the above options, access additional features like teleportation, and use scripts.</p>
<p>This web interface uses the game's language or <code>?lang=</code> query parameter to check for translations. The builtin translations are mirrored from <a href="https://onlyg.it/OpenWF/Translations">https://onlyg.it/OpenWF/Translations</a>. You can provide a <code>OpenWF/dict.cat.txt</code> file to provide a custom work-in-progress translation.</p>
<p>Developers can also use the HTTP interface to interact with the bootstrapper. In addition to commands (documented below), the following routes are available: <code>/ping</code>, <code>/save_all_metadata</code>, <code>/write_all_metadata_reads_to_console</code>, <code>/write_all_metadata_reads_to_ee_log</code>, <code>/write_patched_metadata_reads_to_console</code>, <code>/write_patched_metadata_reads_to_ee_log</code>, <code>/pause_always_stops_time</code>, <code>/server_host</code>, <code>/status</code>, <code>/toggle_console</code>, <code>/scripts</code>, <code>/start_script</code>, <code>/start_script_inline</code>, <code>/autostart_scripts</code>, <code>/add_autostart_script</code>, <code>/remove_autostart_script</code>, <code>/apply_hotfix</code>, <code>/version</code>, <code>/game_version</code>, <code>/check_label_replacements</code>, <code>/memory</code>, <code>/get_effective_metadata</code></p>
<p>Developers can also use the HTTP interface to interact with the Bootstrapper. In addition to commands (documented below), the following routes are available: <code>/ping</code>, <code>/save_all_metadata</code>, <code>/write_all_metadata_reads_to_console</code>, <code>/write_all_metadata_reads_to_ee_log</code>, <code>/write_patched_metadata_reads_to_console</code>, <code>/write_patched_metadata_reads_to_ee_log</code>, <code>/pause_always_stops_time</code>, <code>/server_host</code>, <code>/status</code>, <code>/toggle_console</code>, <code>/scripts</code>, <code>/start_script</code>, <code>/start_script_inline</code>, <code>/autostart_scripts</code>, <code>/add_autostart_script</code>, <code>/remove_autostart_script</code>, <code>/apply_hotfix</code>, <code>/version</code>, <code>/game_version</code>, <code>/check_label_replacements</code>, <code>/memory</code>, <code>/get_effective_metadata</code></p>
<h2>Command Line Arguments</h2>
<p>The bootstrapper adds the <code>owfServerHost</code> command line argument, which can be used to override the <code>server_host</code> in the config.</p>
<p>The Bootstrapper adds the <code>owfServerHost</code> command line argument, which can be used to override the <code>server_host</code> in the config.</p>
<h2>Tunables</h2>
<p>When connecting to a server, the bootstrapper requests <code>/custom/tunables.json</code>. The resulting JSON object may provide the following fields:</p>
<p>When connecting to a server, the Bootstrapper requests <code>/custom/tunables.json</code>. The resulting JSON object may provide the following fields:</p>
<ul>
<li><code>token</code> — if given, this string will be provided as a query parameter in the login request to indicate acknowledgement of the tunables</li>
<li><code>prohibit_skip_mission_start_timer</code> — if true, prohibits <code>skip_mission_start_timer</code></li>
@ -127,7 +127,7 @@
<li><code>prohibit_teleport</code> — if true, prohibits <code>teleport</code></li>
<li><code>prohibit_scripts</code> — if true, prohibits the execution of user-defined scripts</li>
</ul>
<p>To 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.</p>
<p>To 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.</p>
<h2>Traffic Deviations</h2>
<ul>
<li>login.php & worldState.php requests have the extra query parameter <code>buildLabel</code> to indicate the client's buildLabel.</li>
@ -137,30 +137,31 @@
</ul>
<h2>Metadata Patches</h2>
<p>Metadata Patches are loaded from <code>.txt</code> files in the <code>OpenWF/Metadata Patches/</code> folder.</p>
<p>They are parsed line by line, with leading and trailing spaces and tabs being ignored:</p>
<p>They are parsed line by line. If a line starts with <code>/</code>, a new patch for the given absolute path is started.</p>
<p>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.</p>
<p>For the remaining processing, leading and trailing spaces and tabs are ignored:</p>
<ul>
<li><code>&gt; /Path/Here</code> starts a patch that will be applied to <code>/Path/Here</code>.</li>
<li><code>&gt; /First/Path &amp; /Second/Path</code> starts a patch that will be applied to <code>/First/Path</code> and <code>/Second/Path</code>. It is possible to stretch this over multiple lines by either ending a line with <code>&amp;</code> or starting the new line <code>&amp;</code>.</li>
<li>Any line not starting with a special token (<code>&gt;</code>, <code>r|</code>, ...) is added as a prefix to all affected metadata. This works to add top-level properties but also to replace them because the game resolves duplicates by ignoring subsequent entries.</li>
<li>Lines starting with <code>&gt;</code> also start a new patch but can be used at any indentation level.</li>
<li>Any line not starting with a special token (<code>&gt;</code>, <code>r|</code>, ...) 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.</li>
<li>Lines starting with <code>r|</code> create replacements, e.g. <code>r|A|Z</code> replaces all instances of <code>A</code> with <code>Z</code> in affected metadata.</li>
<li>Lines starting with <code>s|</code> create regex substitutions, e.g. <code>s|(?m)^(.+)=1$|$1=0</code> 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 <a href="https://github.com/calamity-inc/Soup/blob/senpai/docs/user/regex.md" target="_blank">here</a> for more information about the Regex engine.</li>
</ul>
<p>If multiple patches affect the same absolute path, they are combined.</p>
<h2>Content Management</h2>
<p>The bootstrapper handles the client's content requests by consulting the <code>OpenWF/Content/</code> folder, forwarding the request to the configured server in case a file is not found.</p>
<p>At minimum, the client will request <code>/0/H.Cache.bin!D_---------------------w</code>. The bootstrapper has 3 modes for managing this file:</p>
<p>The Bootstrapper handles the client's content requests by consulting the <code>OpenWF/Content/</code> folder, forwarding the request to the configured server in case a file is not found.</p>
<p>At minimum, the client will request <code>/0/H.Cache.bin!D_---------------------w</code>. The Bootstrapper has 3 modes for managing this file:</p>
<ul>
<li><b>Managed</b> — If content replacements are in use, they are copied over into the content folder along with backups, and new cache manifests (<code>B.Cache.Windows.bin</code> and <code>H.Cache.bin</code>) will be created to ensure your content is loaded. Otherwise,</li>
<li><b>Unmanaged</b> — If <code>OpenWF/Content/0/UNMANAGED</code> exists, it is assumed that <code>OpenWF/Content/0/H.Cache.bin!D_---------------------w</code> is correctly in place and no attempts to correct it will be made. Otherwise,</li>
<li><b>Default</b> — The bootstrapper will provide a <code>OpenWF/Content/0/H.Cache.bin!D_---------------------w</code> file that should require no extra content requests except for undoing content replacements.</li>
<li><b>Default</b> — The Bootstrapper will provide a <code>OpenWF/Content/0/H.Cache.bin!D_---------------------w</code> file that should require no extra content requests except for undoing content replacements.</li>
</ul>
<h2>WebSocket Connection to Server</h2>
<p>After login, the bootstrapper will attempt to establish a WebSocket connection with <code>ws://server_host:http_port/custom/ws</code>. If the WebSocket upgrade succeeds, the bootstrapper sends <code>{"auth_game":{"accountId":...,"nonce":...}}</code>. With this connection in place, the server can send <code>{"sync_inventory":true}</code> to cause the client to resync from <code>inventory.php</code> or <code>{"tunables":{...}}</code> to send updated tunables.</p>
<p>After login, the Bootstrapper will attempt to establish a WebSocket connection with <code>ws://server_host:http_port/custom/ws</code>. If the WebSocket upgrade succeeds, the Bootstrapper sends <code>{"auth_game":{"accountId":...,"nonce":...}}</code>. With this connection in place, the server can send <code>{"sync_inventory":true}</code> to cause the client to resync from <code>inventory.php</code> or <code>{"tunables":{...}}</code> to send updated tunables.</p>
<h2>Command API</h2>
<p>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 <code>skip_mission_start_timer</code>, one can use HTTP with <code>/skip_mission_start_timer?true</code>, WebSocket with <code>send("skip_mission_start_timer?true")</code> or scripting with <code>owf_command("skip_mission_start_timer?true")</code>.</p>
<p>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 <code>skip_mission_start_timer</code>, one can use HTTP with <code>/skip_mission_start_timer?true</code>, WebSocket with <code>send("skip_mission_start_timer?true")</code> or scripting with <code>owf_command("skip_mission_start_timer?true")</code>.</p>
<p>The following commands are available: <code>logout</code>, <code>save_config</code>, <code>reload_hotkeys</code>, <code>reload_label_replacements</code>, <code>reload_metadata_patches</code>, <code>available_scripts</code>, <code>running_scripts</code>, <code>autostart_scripts</code>, <code>script_log</code>, <code>clear_script_log</code>, <code>stop_script</code>, <code>high_damage_numbers_patch</code>, <code>skip_mission_start_timer</code>, <code>simulacrum_blacklisted</code>, <code>simulacrum_whitelisted</code>, <code>alternative_loading</code>, <code>ee_log_in_console</code>, <code>dont_resolve_labels</code>, <code>fov_override</code>, <code>freecam</code>, <code>lockcam</code>, <code>gamecam</code>, <code>teleport</code>, <code>enable_pause_always_stops_time</code>, <code>disable_pause_always_stops_time</code>, <code>request_bgscript_broadcasts</code>, <code>download_latest_hotfix</code>, <code>check_for_updates</code></p>
<h2>Feedback</h2>
<p>I hope this document was useful. If you have any feature requests or bug reports regarding the bootstrapper, feel free to submit them at <a href="https://onlyg.it/OpenWF/Bootstrapper/issues">https://onlyg.it/OpenWF/Bootstrapper/issues</a>.</p>
<p>I hope this document was useful. If you have any feature requests or bug reports regarding the Bootstrapper, feel free to submit them at <a href="https://onlyg.it/OpenWF/Bootstrapper/issues">https://onlyg.it/OpenWF/Bootstrapper/issues</a>.</p>
<br>
</body>
</html>

View File

@ -4,7 +4,7 @@
<title>Contributing to OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
@ -25,7 +25,7 @@
</ul>
<p>Note that IPNS names are resolved to their CID when pinning, so an hourly cronjob is recommended.</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

131
guide.php
View File

@ -4,51 +4,110 @@
<title>OpenWF Setup Guide</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<h2>Server Prerequisites</h2>
<ul>
<li>Git (<a href="https://git-scm.com/downloads" target="_blank">Download</a>)</li>
<li>Node.js (<a href="https://nodejs.org/en/download" target="_blank">Download</a></a>)</li>
<li>MongoDB (<a href="https://www.mongodb.com/try/download/community" target="_blank">Download</a></a>)</li>
</ul>
<h2>Server Installation</h2>
<ol>
<li>Run <code>git clone https://openwf.io/SpaceNinjaServer.git</code> in a command prompt to download SpaceNinjaServer in the current working directory</li>
<li>Open the SpaceNinjaServer folder (<code>cd SpaceNinjaServer</code>)</li>
<li>Copy config-vanilla.json to create a config.json</li>
<li>(Optional) Edit the config.json to match your MongoDB settings (if not default) and however else you would like to configure the server</li>
<li>(Optional) If you have a GB of free space, you might want to download stripped assets such as <abbr title="Ability videos show a brief clip of an ability in action. They can be seen by hovering over an ability in the Arsenal, Codex, etc.">ability videos</abbr> so the client can request them on-demand: Run <code>git clone https://openwf.io/0.git</code> in the <code>static/data</code> folder</li>
<li>Run <code>npm install --omit=dev --omit=optional</code> to install library dependencies</li>
<li>Now you can run <code>npm run raw</code> to start the server anytime</li>
</ol>
<h2>Server Update</h2>
<p>You can simply run the <code>UPDATE AND START SERVER</code> script for this, but otherwise the steps are pretty simple:</p>
<ol>
<li>Run <code>git pull</code> in the SpaceNinjaServer folder</li>
<li>(Optional) If you have the stripped assets, run <code>git pull</code> in the <code>static/data/0</code> folder</li>
<li>Run <code>npm install --omit=dev --omit=optional</code> to synchronize library dependencies</li>
<li>Now you can use <code>npm run raw</code> to start the server again</li>
</ol>
<h2>Guide Settings</h2>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="docker-toggle" />
<label class="form-check-label" for="docker-toggle">Use Docker</label>
</div>
<div id="web-server-guide">
<h2>Server Prerequisites</h2>
<ul>
<li>Git (<a href="https://git-scm.com/downloads" target="_blank">Download</a>)</li>
<li>Node.js (<a href="https://nodejs.org/en/download" target="_blank">Download</a></a>)</li>
<li>MongoDB (<a href="https://www.mongodb.com/try/download/community" target="_blank">Download</a></a>)</li>
</ul>
<h2>Server Installation</h2>
<ol>
<li>Run <code>git clone https://openwf.io/SpaceNinjaServer.git</code> in a command prompt to download SpaceNinjaServer in the current working directory</li>
<li>Open the SpaceNinjaServer folder</li>
<li>Copy config-vanilla.json to create a config.json</li>
<li>(Optional) Edit the config.json to match your MongoDB settings (if not default) and however else you would like to configure the server</li>
<li>(Optional) If you have a GB of free space, you might want to download stripped assets such as <abbr title="Ability videos show a brief clip of an ability in action. They can be seen by hovering over an ability in the Arsenal, Codex, etc.">ability videos</abbr> so the client can request them on-demand: Run <code>git clone https://openwf.io/0.git</code> in the <code>static/data</code> folder</li>
<li>Run <code>npm install --omit=dev --omit=optional</code> to install library dependencies</li>
<li>Now you can run <code>npm run raw</code> to start the server anytime</li>
</ol>
<h2>Server Update</h2>
<p>You can simply run the <code>UPDATE AND START SERVER</code> script for this, but otherwise the steps are pretty simple:</p>
<ol>
<li>Run <code>git pull</code> in the SpaceNinjaServer folder</li>
<li>(Optional) If you have the stripped assets, run <code>git pull</code> in the <code>static/data/0</code> folder</li>
<li>Run <code>npm install --omit=dev --omit=optional</code> to synchronize library dependencies</li>
<li>Now you can use <code>npm run raw</code> to start the server again</li>
</ol>
</div>
<div id="docker-guide" class="d-none">
<h2>Server Prerequisites</h2>
<ul>
<li>Git (<a href="https://git-scm.com/downloads" target="_blank">Download</a>)</li>
<li>Docker (<a href="https://www.docker.com/" target="_blank">Download</a>)</li>
</ul>
<h2>Server Installation</h2>
<ol>
<li>Run <code>git clone https://onlyg.it/OpenWF/Docker-AIO "OpenWF Dockerized Server"</code> to set up an OpenWF Dockerized Server folder in the working directory</li>
<li>Open the OpenWF Dockerized Server folder</li>
<li>(Optional) If you have a GB of free space, you might want to download stripped assets such as <abbr title="Ability videos show a brief clip of an ability in action. They can be seen by hovering over an ability in the Arsenal, Codex, etc.">ability videos</abbr> so the client can request them on-demand: Run <code>git clone https://openwf.io/0.git</code> in the <code>static-data</code> folder</li>
<li>Now you can run <code>docker compose up</code> to start the server anytime</li>
</ol>
<h2>Server Update</h2>
<ol>
<li>Run <code>docker compose pull</code> in the OpenWF Dockerized Server folder</li>
<li>(Optional) If you have the stripped assets, run <code>git pull</code> in the <code>static-data/0</code> folder</li>
<li>Now you can use <code>docker compose up</code> to start the server again</li>
</ol>
</div>
<h2>Client Patch</h2>
<p>In order to connect to custom servers, the client needs to be patched, which is what the boostrapper is for.</p>
<p>In order to connect to custom servers, the client needs to be patched, which is what the Boostrapper is for.</p>
<ul>
<li><b>Prerequisite:</b> Because this is a project about preservation, we do not support the latest versions immediately. Please see <a href="old-versions<?=$ext;?>" target="_blank">here</a> for supported versions and download instructions.</li>
<li><b>Setup:</b> Download <a href="https://openwf.io/supplementals/client%20drop-in/latest_dll" target="_blank">the boostrapper DLL (wtsapi32.dll)</a> and put it in your game's installation folder (the one where Warframe.x64.exe is in). On Linux, you may need to rename it to dwmapi.dll and/or use <code>WINEDLLOVERRIDE</code>.</li>
<li><b>Setup:</b> Download <a href="https://openwf.io/supplementals/client%20drop-in/latest_dll" target="_blank">the Boostrapper DLL (wtsapi32.dll)</a> and put it in your game's installation folder (the one where Warframe.x64.exe is in). On Linux, you may need to rename it to dwmapi.dll and/or use <code>WINEDLLOVERRIDE</code>.</li>
<li><b>Usage:</b> With the DLL in place, you can double-click Warframe.x64.exe to start the game with OpenWF.<!-- Opening the game's launcher will revert it back to normal. --></li>
</ul>
<p>The bootstrapper is <a href="bootstrapper-manual<?=(!empty($ext) ? ".html" : "");?>" target="_blank">fully documented here</a>, but the most important point is that, while the game is running, you can visit <a href="http://localhost:6155/" target="_blank">http://localhost:6155/</a> to manage options, cheats, and scripts.</p>
<h2>IRC Server</h2>
<p>In addition to SpaceNinjaServer, you can also set up an IRC server for the in-game chat:</p>
<ul>
<li><a href="https://github.com/Sainan/warframe-irc-server/releases" target="_blank">warframe-irc-server</a> an IRC server specifically made for OpenWF. Talks to SpaceNinjaServer to give "chat moderator" permissions and report dropped connections.</li>
<li>InspIRCd a well-known IRC server implementation used by DE themselves (albeit with unknown modifications). A pre-configured Windows copy of it can be downloaded <a href="https://openwf.io/supplementals/IRC.zip" download>here</a>.</li>
</ul>
<p>The Bootstrapper is <a href="bootstrapper-manual<?=(!empty($ext) ? ".html" : "");?>" target="_blank">fully documented here</a>, but the most important point is that, while the game is running, you can visit <a href="http://localhost:6155/" target="_blank">http://localhost:6155/</a> to manage options, cheats, and scripts.</p>
<div id="irc-server-guide">
<h2>IRC Server</h2>
<p>In addition to SpaceNinjaServer, you can also set up an IRC server for the in-game chat:</p>
<ul>
<li><a href="https://github.com/Sainan/warframe-irc-server/releases" target="_blank">warframe-irc-server</a> an IRC server specifically made for OpenWF. Talks to SpaceNinjaServer to give "chat moderator" permissions and report dropped connections.</li>
<li>InspIRCd a well-known IRC server implementation used by DE themselves (albeit with unknown modifications). A pre-configured Windows copy of it can be downloaded <a href="https://openwf.io/supplementals/IRC.zip" download>here</a>.</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
<script>
window.onhashchange = function()
{
if (location.hash == "#docker")
{
document.getElementById("web-server-guide").classList.add("d-none");
document.getElementById("irc-server-guide").classList.add("d-none");
document.getElementById("docker-guide").classList.remove("d-none");
}
else
{
document.getElementById("web-server-guide").classList.remove("d-none");
document.getElementById("irc-server-guide").classList.remove("d-none");
document.getElementById("docker-guide").classList.add("d-none");
}
};
window.onhashchange();
document.getElementById("docker-toggle").onchange = function()
{
if (this.checked)
{
location.hash = "#docker";
}
else
{
location.hash = "#";
}
};
</script>
</body>
</html>

View File

@ -4,7 +4,7 @@
<title>Importing Guide | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
@ -19,7 +19,7 @@
<p>Now that you have your inventory, open the SpaceNinjaServer WebUI and select the Import tab. You can simply paste the entire thing in the textbox and press the Submit button.</p>
<p>If you have a getShip response, you can import it the same way. Otherwise, you are advised to use Unlock All Ship Features in the Cheats tab to avoid being locked out of most things.</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

View File

@ -4,21 +4,22 @@
<title>About OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<p>OpenWF is a software suite centered around customizing Warframe, including:</p>
<p>OpenWF is a community project to play Warframe offline, specifically for preservation and customization.</p>
<h3>Software</h3>
<ul>
<li><b>SpaceNinjaServer</b> an <a href="https://openwf.io/SpaceNinjaServer.git">open-source</a> reimplementation of the game's web services. As we have custom server software, OpenWF avoids interference with the live game while allowing full customization of savedata.</li>
<li>The <b>Bootstrapper</b> our main DLL patching the client to connect to custom servers, but for newer versions, it also has some QoL features and cheats as well as a scripting API, label replacements and metadata patches, allowing for extensive customization of the experience. <a href="https://onlyg.it/OpenWF/Mods" target="_blank">Browse mods.</a></li>
<li><b>SpaceNinjaServer</b> is a customizable, <a href="https://openwf.io/SpaceNinjaServer.git" target="_blank">open-source</a> reimplementation of the game's web services.</li>
<li>The <b>Bootstrapper</b> patches the game client to connect to custom servers, but for newer versions, it also has some QoL features and cheats as well as a scripting API, label replacements and metadata patches, allowing for extensive customization of the experience. <a href="https://onlyg.it/OpenWF/Mods" target="_blank">Browse mods.</a></li>
</ul>
<a href="guide<?=$ext;?>" class="btn btn-primary">Get Started</a>
<h3 class="mt-3">Preservation</h3>
<p>OpenWF works entirely offline, so the versions supported by OpenWF will always be available to play and revisit, and it is indeed already possible to <a href="old-versions<?=$ext;?>">revisit old versions</a>.</p>
<p>The versions supported by OpenWF will always be available to play and revisit. <a href="old-versions<?=$ext;?>">Browse versions.</a></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

View File

@ -4,13 +4,13 @@
<title>Old Versions | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="_assets/bootstrap.min.css">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<div id="main-view">
<h3>Bootstrapper + SpaceNinjaServer Suported Versions</h3>
<h3>Bootstrapper + SpaceNinjaServer Supported Versions</h3>
<p>The following is a list of game versions that have been verified to at least be able to login and play when using the Bootstrapper and SpaceNinjaServer.</p>
<table class="table table-sm">
<thead>
@ -27,35 +27,35 @@
<td><code>2025.09.02.14.13</code></td>
<td>=&nbsp;39.1.3</td>
<td>Caliban&nbsp;Prime<!-- Login screen says "Isleweaver" --></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the bootstrapper.">Full modding support</abbr></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the Bootstrapper.">Full modding support</abbr></td>
<td><a href="#39.1.3">Download</a></td>
</tr>
<tr>
<td><code>2025.06.23.11.39</code></td>
<td>&lt;&nbsp;39.0.0</td>
<td>Isleweaver</td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the bootstrapper.">Full modding support</abbr></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the Bootstrapper.">Full modding support</abbr></td>
<td><a href="#8391191747297658560">Download</a></td>
</tr>
<tr>
<td><code>2025.03.18.09.51</code></td>
<td>&lt;&nbsp;38.6.0</td>
<td>Yareli&nbsp;Prime<!-- Login screen says "Techrot Encore" --></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the bootstrapper.">Full modding support</abbr>, Warframe.x64.exe needs to be dropped onto <a href="https://github.com/Sainan/Sideloadify/releases/latest/download/sideloadify.exe" download>sideloadify.exe</a></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the Bootstrapper.">Full modding support</abbr>, Warframe.x64.exe needs to be dropped onto <a href="https://github.com/Sainan/Sideloadify/releases/latest/download/sideloadify.exe" download>sideloadify.exe</a></td>
<td><a href="#6046892458385712496">Download</a></td>
</tr>
<tr>
<td><code>2025.03.18.09.51</code></td>
<td>&lt;&nbsp;38.5.0</td>
<td>Techrot&nbsp;Encore</td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the bootstrapper.">Full modding support</abbr></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the Bootstrapper.">Full modding support</abbr></td>
<td><a href="#4212893560910494140">Download</a></td>
</tr>
<tr>
<td><code>2024.12.11.14.26</code></td>
<td>&lt;&nbsp;38.0.0</td>
<td>1999</td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the bootstrapper.">Full modding support</abbr></td>
<td><abbr title="Metadata Patches, Scripting API, etc. are fully functional in the Bootstrapper.">Full modding support</abbr></td>
<td><a href="#3864063200081954630">Download</a></td>
</tr>
<tr>
@ -706,7 +706,7 @@
<p>With that sorted out:</p>
<ol>
<li>
Download the base version by running <code>DepotDownloader -app 230410 -depot 230411 -manifest <span class="manifest-id"></span> -username &lt;your steam username&gt; remember-password</code>
Download the base version by running <code>DepotDownloader -app 230410 -depot 230411 -manifest <span class="manifest-id"></span> -username &lt;your steam username&gt; -remember-password</code>
<ul>
<li>Note that DepotDownloader may report errors; these are generally only temporary and it will try again.</li>
</ul>
@ -722,8 +722,8 @@
</ol>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
<script src="https://censorcanary.org/censorcanary.js" defer></script>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
<script>
window.onhashchange = function()
{