Compare commits

...

101 Commits
main ... main

Author SHA1 Message Date
6892de7542 Capitalise the name Bootstrapper 2025-10-30 11:26:41 +01:00
74da1af12f Guide: Add docker variant 2025-10-28 08:56:19 +01:00
9903058750 Update homepage to better reflect the current state of the project 2025-10-27 17:29:05 +01:00
492cd03af1 Fix typo 2025-10-27 17:07:09 +01:00
ee0181c92b Vendor stylesheets & scripts 2025-10-27 09:17:26 +01:00
d2bf421ef8 Use LF instead of CRLF 2025-10-25 18:53:20 +02:00
70e6e7362a Update bootstrapper-manual for 0.11.13 hotfix 1 2025-10-22 09:46:12 +02:00
270355448e Fix remember-password in 39.1.3 guide 2025-10-19 16:57:22 +02:00
aa95f99123 Guide: Update client patch section 2025-10-16 11:57:30 +02:00
5033afed0b Fix manual link for PHP dev server 2025-10-16 11:52:26 +02:00
d7d505bf2f Old versions: Add 39.1.3 2025-10-16 11:47:54 +02:00
efe35c59d8 Update old-versions to provide more specific download instructions 2025-10-16 11:21:43 +02:00
4e992be111 Update bootstrapper-manual for 0.11.13 2025-10-15 18:02:30 +02:00
a9185964c3 Fix typo 2025-10-12 09:59:11 +02:00
d70daf658b Clarification on warframe-irc-server 2025-10-09 21:03:47 +02:00
b4f8c427a6 Old versions: Improve DepotDownloader guidance 2025-09-27 20:22:51 +02:00
2043b6181a Simplify bootstrapper setup
The EXE is a bit useless given that sideloadify hasn't been needed for a while now and it may prevent people from properly preserving/archiving OpenWF.
2025-09-27 14:15:24 +02:00
c3844e8732 Be more realistic about bootstrapper manual 2025-09-27 13:36:20 +02:00
b98e7b6672 Update bootstrapper-manual for 0.11.11 2025-09-09 06:19:25 +02:00
17a7970d6d Improve import guide 2025-09-07 08:04:47 +02:00
a2da672347 Update guide to use raw running 2025-09-07 08:04:47 +02:00
3df5097121 Update bootstrapper-manual for 0.11.10 2025-08-27 01:35:33 +02:00
24387a3333 Embed CensorCanary 2025-08-21 01:15:03 +02:00
9e8f280613 Update IPFS contribution info 2025-08-19 20:48:00 +02:00
b2f7891911 Support static build 2025-08-19 20:29:39 +02:00
281de53520 Use relative paths 2025-08-19 20:15:32 +02:00
5b561b9a27 Add <meta charset="UTF-8"> 2025-08-19 20:11:50 +02:00
67860b2bbb Add IPFS note / seeding to contribute page 2025-08-17 07:01:09 +02:00
8a97cf0b18 Add audio note for old versions 2025-08-17 07:01:02 +02:00
df38407dc9 Fix bootstrapper download not using local IPFS node with IPFS companion 2025-08-16 16:19:43 +02:00
fea615e322 Use IPFS for Bootstrapper Setup.exe download 2025-08-16 16:09:12 +02:00
b4c5801966 Use absolute path for non-mirrored file 2025-08-16 15:51:01 +02:00
e849452b4e Update link to bootstrapper translations 2025-08-07 01:44:19 +02:00
0170ceec21 Update import guide given that warframe-api-helper now supports Linux 2025-07-30 22:39:17 +02:00
1c48dd8e21 Update shebang to be more portable 2025-07-30 20:06:22 +02:00
a0a9952947 Apply "rename config.json.example to config-vanilla.json" in guide 2025-07-30 13:02:06 +02:00
36c70da9a8 Remove M2087739745223261142 from old versions list 2025-07-20 14:10:30 +02:00
27c994ede8 Add shortlink for mods repo 2025-07-16 13:57:58 +02:00
72677e7212 Update bootstrapper manual for 0.11.7 hotfix 1 2025-07-11 07:13:16 +02:00
bb0f859300 Update for bootstrapper 0.11.7 2025-07-03 06:38:16 +02:00
3f7780e116 Remove outdated example 2025-07-01 22:31:25 +02:00
3fa4df51cb Fix typo 2025-07-01 21:40:04 +02:00
717fe31b03 Note WFClassic 2025-06-30 21:33:48 +02:00
867ccb8886 Import: Note ship features 2025-06-29 19:54:10 +02:00
33e1879895 Update stripped assets step in guide because the file size was outdated 2025-06-29 19:02:42 +02:00
0b800eca84 Note 8391191747297658560 2025-06-26 22:46:48 +02:00
ef861abe36 Note 2025-06-25 17:31:01 +02:00
c54b1d87e9 Remove platform-specific copy command 2025-06-16 00:39:27 +02:00
0b66cc9543 Note that alternative_loading may break quest missions 2025-06-16 00:38:14 +02:00
383d6a8b55 Update bootstrapper manual for 0.11.3 hotfix 1 2025-06-12 19:46:51 +02:00
9b7d1d188b Add link to mods directory 2025-06-10 14:50:12 +02:00
4e7d829129 Be more vague about support for new versions 2025-06-10 14:07:37 +02:00
28ab0860a7 Note versions that have full modding support 2025-06-10 14:06:54 +02:00
51456c0af2 Remove DLL renaming note because wtsapi32.dll is now the default 2025-06-10 14:04:11 +02:00
7d4dab61c3 Prefer wtsapi32.dll for Windows users 2025-06-04 12:47:46 +02:00
ca7bd6e702 Update for bootstrapper v0.11.2 2025-06-03 20:15:50 +02:00
8b2bd63a05 Use an EXE for setup instead of a powershell script
The execution restrictions applied to powershell script are honestly so damn stupid, they're basically unusable if they're tainted with the mark of the web.
2025-06-02 01:48:57 +02:00
3ddcbbd0cb Remove unused variables from guide.php 2025-05-31 15:05:10 +02:00
351cbe26f9 Switch client guide to exclusively rely on a setup script 2025-05-31 15:03:28 +02:00
872681a332 Avoid OS-specific language around update server script 2025-05-31 14:59:38 +02:00
4bcb61f340 Move client guide below server guide 2025-05-31 14:59:38 +02:00
fd9b8732b7 Update for bootstrapper v0.11.0 2025-05-26 16:10:22 +02:00
cf0e7a933e Remove "Recent Versions" header 2025-05-26 06:10:41 +02:00
0e414f28ad Add bootstrapper setup powershell script 2025-05-22 10:21:37 +02:00
4aefca85c3 Note that sideloadify is not needed on Linux 2025-05-22 10:06:49 +02:00
be4fdea6ec Note manifest 6046892458385712496 2025-05-22 09:52:46 +02:00
c74b921431 Update client guide for 38.6.0 2025-05-21 23:17:08 +02:00
db5f3dd37f Note bootstrapper is no longer just targeting the latest version 2025-05-21 22:59:25 +02:00
dfbe9fe504 Note 6636116079410913663 2025-05-14 13:44:39 +02:00
a9c97938eb Hoist explanation for how to download old versions 2025-05-14 11:24:31 +02:00
1b251f2ef8 Update for bootstrapper v0.10.15 2025-05-11 08:21:16 +02:00
5766fcc098 Note remaining U22 manifests 2025-05-10 06:48:05 +02:00
07fff3ae87 Note 3725569727599851360 2025-05-10 06:32:40 +02:00
cbbf2aba46 Note 5869273198520287595 2025-05-09 14:19:11 +02:00
483c37a2d0 Note 2970877824413815022 2025-05-09 12:08:55 +02:00
df6a7cfaf6 Note 3099723078202393524 2025-05-09 11:03:10 +02:00
605cb89e98 Note 4404971551504983924 2025-05-09 02:18:12 +02:00
5c53d359d1 Note 4942488930993990244 2025-05-08 15:44:42 +02:00
ae9167d5b4 Note 896988770099174429 2025-05-08 14:45:23 +02:00
0d834151e4 Note 3078917755629993445 2025-05-08 05:23:17 +02:00
5cf3da534a Note 1659398175797234554 2025-05-08 05:21:21 +02:00
2645b5a6c4 Note 4538343592657854566 2025-05-07 12:29:52 +02:00
c41f47d7a2 Update bootstrapper manual for 0.10.14 2025-05-07 07:33:10 +02:00
dc51c60b61 Update for booststrapper 0.10.13 2025-05-06 16:43:36 +02:00
e5ecc596dc Note versions which load into tutorial 2025-05-05 14:04:58 +02:00
25856e7077 Update old versions for bootstrapper 0.10.12 2025-05-05 04:05:44 +02:00
16071ecacc Update old versions for bootstrapper 0.10.11 2025-05-03 07:13:14 +02:00
a73b7956f5 Note 2084947150827453084 2025-05-02 07:08:11 +02:00
ed52d3f902 Note 3864063200081954630 2025-05-02 06:00:21 +02:00
415bc087d6 Update for booststrapper 0.10.10 hotfix 1 2025-05-01 13:31:55 +02:00
e26672e0c9 Note jade shadows hotfix 7 2025-05-01 06:43:13 +02:00
be97927c8d Update old versions for bootstrapper 0.10.10 2025-05-01 05:50:46 +02:00
208ae1ff8a Note another somewhat-interesting supported version 2025-04-29 11:08:06 +02:00
5bb7685559 Fix missing tbody 2025-04-29 04:18:34 +02:00
f0f2237e7e Fix get started link 2025-04-29 01:54:12 +02:00
629f6c0e0b Fix navbar dropdown active indicator for import & old versions page 2025-04-29 01:51:42 +02:00
e39a89cdda Note initial backwards compat 2025-04-29 01:45:20 +02:00
747b260d2c Update bootstrapper-manual for 0.10.9 2025-04-29 01:44:28 +02:00
0ae31d3d5f Slightly better wording 2025-04-29 00:50:45 +02:00
439d88418e Remove _lang folder
Missing cleanup from b040366e655fe81b2c865a345d61abfb59cc0447
2025-04-24 20:27:58 +02:00
03f367699b Link api helper shell script for Linux users 2025-04-24 07:05:30 +02:00
24 changed files with 1346 additions and 503 deletions

3
.dynstat.json Normal file
View File

@ -0,0 +1,3 @@
{
"dirs": [".", "supplementals"]
}

2
.gitattributes vendored Normal file
View File

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

7
.gitignore vendored
View File

@ -1 +1,6 @@
supplementals/
supplementals/client drop-in
supplementals/static data
supplementals/IRC.zip
build/
dynstat.php

View File

@ -1,2 +1,2 @@
<?php
header("Location: https://github.com/de-eznuts/stripped-assets.git".substr($_SERVER["REQUEST_URI"], 6)); // "/0.git"
<?php
header("Location: https://github.com/de-eznuts/stripped-assets.git".substr($_SERVER["REQUEST_URI"], 6)); // "/0.git"

View File

@ -1,4 +1,4 @@
<?php
//header("Location: https://github.com/spaceninjaserver/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"
//header("Location: http://209.141.38.3/OpenWF/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"
header("Location: https://onlyg.it/OpenWF/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"
<?php
//header("Location: https://github.com/spaceninjaserver/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"
//header("Location: http://209.141.38.3/OpenWF/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"
header("Location: https://onlyg.it/OpenWF/SpaceNinjaServer".substr($_SERVER["REQUEST_URI"], 21)); // "/SpaceNinjaServer.git"

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

@ -1,39 +1,40 @@
<?php
$ext = (substr($_SERVER["SERVER_SOFTWARE"] ?? "", 0, 3) == "PHP" ? ".php" : "");
$path = strtok($_SERVER["REQUEST_URI"], '?');
?>
<nav class="navbar navbar-expand-sm bg-body-tertiary">
<div class="container">
<a class="navbar-brand" href="/" <?php if ($path == "/"): ?> onclick="event.preventDefault();" <?php endif; ?>>OpenWF</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-content" aria-controls="navbar-content" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar-content">
<ul class="navbar-nav me-auto mb-0">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle<?=((substr($path, 0, 6) == "/guide" || substr($path, 0, 25) == "/asset-replacements-guide") ? " active" : ""); ?>" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Guides</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item<?=(substr($path, 0, 6) == "/guide" ? " active" : ""); ?>" href="/guide<?=$ext;?>">Setup</a></li>
<li><a class="dropdown-item<?=(substr($path, 0, 7) == "/import" ? " active" : ""); ?>" href="/import<?=$ext;?>">Importing</a></li>
<li><a class="dropdown-item<?=(substr($path, 0, 25) == "/asset-replacements-guide" ? " active" : ""); ?>" href="/asset-replacements-guide<?=$ext;?>">Asset Replacements</a></li>
</ul>
</li>
<li class="nav-item"><a class="nav-link<?=(substr($path, 0, 11) == "/contribute" ? " active" : ""); ?>" href="/contribute<?=$ext;?>">Contribute</a></li>
<li class="nav-item"><a class="nav-link" href="https://discord.gg/PNNZ3asUuY" target="_blank">Discord</a></li>
</ul>
</div>
</div>
</nav>
<script>
// Disable navbar links that point back to this page.
document.querySelectorAll(".navbar-nav .nav-link.active, .navbar-nav .dropdown-item.active").forEach(elm =>
{
elm.onclick = (event) => { event.preventDefault() };
});
// User-facing stuff really has no reason to be served over insecure HTTP.
if (location.host == "openwf.io" && location.protocol == "http:")
{
location.protocol = "https:";
}
<?php
$ext = (!empty($_DYNSTAT) ? ".html" : (substr($_SERVER["SERVER_SOFTWARE"] ?? "", 0, 3) == "PHP" ? ".php" : ""));
$path = strtok($_SERVER["REQUEST_URI"], '?');
?>
<nav class="navbar navbar-expand-sm bg-body-tertiary">
<div class="container">
<a class="navbar-brand" href="." <?php if ($path == "/"): ?> onclick="event.preventDefault();" <?php endif; ?>>OpenWF</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-content" aria-controls="navbar-content" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar-content">
<ul class="navbar-nav me-auto mb-0">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle<?=((substr($path, 0, 6) == "/guide" || substr($path, 0, 7) == "/import" || substr($path, 0, 25) == "/asset-replacements-guide" || substr($path, 0, 13) == "/old-versions") ? " active" : ""); ?>" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Guides</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item<?=(substr($path, 0, 6) == "/guide" ? " active" : ""); ?>" href="guide<?=$ext;?>">Setup</a></li>
<li><a class="dropdown-item<?=(substr($path, 0, 7) == "/import" ? " active" : ""); ?>" href="import<?=$ext;?>">Importing</a></li>
<li><a class="dropdown-item<?=(substr($path, 0, 25) == "/asset-replacements-guide" ? " active" : ""); ?>" href="asset-replacements-guide<?=$ext;?>">Asset Replacements</a></li>
<li><a class="dropdown-item<?=(substr($path, 0, 13) == "/old-versions" ? " active" : ""); ?>" href="old-versions<?=$ext;?>">Old Versions</a></li>
</ul>
</li>
<li class="nav-item"><a class="nav-link<?=(substr($path, 0, 11) == "/contribute" ? " active" : ""); ?>" href="contribute<?=$ext;?>">Contribute</a></li>
<li class="nav-item"><a class="nav-link" href="https://discord.gg/PNNZ3asUuY" target="_blank">Discord</a></li>
</ul>
</div>
</div>
</nav>
<script>
// Disable navbar links that point back to this page.
document.querySelectorAll(".navbar-nav .nav-link.active, .navbar-nav .dropdown-item.active").forEach(elm =>
{
elm.onclick = (event) => { event.preventDefault() };
});
// User-facing stuff really has no reason to be served over insecure HTTP.
if (location.host == "openwf.io" && location.protocol == "http:")
{
location.protocol = "https:";
}
</script>

View File

@ -1,21 +0,0 @@
<?php
php_sapi_name() == "cli" or die("CLI only!");
$source = json_decode(file_get_contents("en.json"), true);
foreach (["de"] as $code)
{
$target = json_decode(file_get_contents("$code.json"), true);
$rewritten = [];
foreach ($source as $key => $value)
{
if (array_key_exists($key, $target))
{
$rewritten[$key] = $target[$key];
}
else
{
$rewritten[$key] = "[UNTRANSLATED] ".$source[$key];
}
}
file_put_contents("$code.json", json_encode($rewritten, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
}

View File

@ -1,68 +0,0 @@
{
"about.title": "Über OpenWF",
"about.0": "OpenWF ist eine Software-Suite zur Anpassung von Warframe, die Folgendes umfasst:",
"about.1": "<b>SpaceNinjaServer</b> — eine <a href=\"https://openwf.io/SpaceNinjaServer.git\">Open-Source</a>-Reimplementierung der Webdienste des Spiels. Da wir eigene Server-Software haben, vermeidet OpenWF Eingriffe in das Live-Spiel und ermöglicht gleichzeitig eine vollständige Anpassung der Spieldaten.",
"about.2": "Der <b>Bootstrapper</b> — unsere Haupt-DLL für die neueste Spielversion. Ihr Hauptzweck ist die Verbindung zu benutzerdefinierten Servern, aber sie bietet auch einige QoL-Funktionen und Cheats sowie eine Skripting-API, Label-Ersetzungen und Metadaten-Patches an, die eine umfassende Anpassung des Spiels ermöglichen.",
"about.cta": "Jetzt Loslegen",
"preservation.title": "Warframe bewahren",
"preservation.0": "Ein langfristiges Ziel des Projekts ist es, Warframe auch nach der Abschaltung der offiziellen Server zu erhalten und tatsächlich jedes Update spielbar zu machen.",
"preservation.1": "Unser Hauptfokus liegt derzeit darauf, mit dem Spiel aktuell zu bleiben. Es gibt jedoch eine DLL + einen Fork von SpaceNinjaServer, mit dem man Warframe aus dem Jahr 2013 erneut erleben kann. Weitere Informationen dazu findest du <a href=\"https://discord.gg/PNNZ3asUuY\">auf unserem Discord</a>, insbesondere <a href=\"https://discord.com/channels/1108159019635462206/1280628166825873510/1280628233355923497\">in diesem Thread</a>.",
"tm_disclaimer": "Warframe ist eine eingetragene Marke von Digital Extremes. Die Verwendung dient ausschließlich zur Identifikation und impliziert keine Zugehörigkeit zu oder Unterstützung durch Digital Extremes.",
"guides": "Anleitungen",
"setup": "[UNTRANSLATED] Setup",
"setup.title": "[UNTRANSLATED] OpenWF Setup Guide",
"setup.c.title": "[UNTRANSLATED] Client/Boostrapper",
"setup.c.simple": "[UNTRANSLATED] To use OpenWF, you only need to download the |DLL| and put it in your game's installation folder (the one where Warframe.x64.exe is in).",
"setup.c.dblclk": "[UNTRANSLATED] As long as this DLL is in the game folder, you can double-click Warframe.x64.exe to start the game with OpenWF.",
"setup.c.laurvt": "[UNTRANSLATED] Opening the game's launcher will revert it back to normal.",
"setup.c.docshttp": "[UNTRANSLATED] The DLL is <a href=\"bootstrapper-manual\" 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.",
"setup.c.next": "[UNTRANSLATED] <b>Next steps:</b> By default, the DLL redirects requests to localhost — meaning the same machine you're playing on — so you'll either need to set up a server or change the server_host to point to a different machine that's already got a server running.",
"setup.s.prereq": "[UNTRANSLATED] Server Prerequisites",
"download": "[UNTRANSLATED] Download",
"setup.s.install": "[UNTRANSLATED] Server Installation",
"setup.s.install.1": "[UNTRANSLATED] Run <code>git clone https://openwf.io/SpaceNinjaServer.git</code> in a command prompt to download SpaceNinjaServer in the current working directory",
"setup.s.install.2": "[UNTRANSLATED] Open the SpaceNinjaServer folder (<code>cd SpaceNinjaServer</code>)",
"setup.s.install.3": "[UNTRANSLATED] Run <code>copy config.json.example config.json</code> to create a config.json from config.json.example",
"setup.s.install.4": "[UNTRANSLATED] (Optional) Edit the config.json to match your MongoDB settings (if not default) and however else you would like to configure the server",
"setup.s.install.5": "[UNTRANSLATED] (Optional) If you want stripped assets (~622 <abbr title=\"mebibytes (1 MiB = 1048576 bytes)\">MiB</abbr>) which the client will request from the server on-demand (most notably, <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>), run <code>git clone https://openwf.io/0.git</code> in the <code>static/data</code> folder",
"setup.s.install.6": "[UNTRANSLATED] Run <code>npm install --omit=dev</code> to install library dependencies",
"setup.s.install.7": "[UNTRANSLATED] Run <code>npm run build</code> to build the server",
"setup.s.install.8": "[UNTRANSLATED] Now you can run <code>npm run start</code> to start the server anytime",
"setup.s.update": "[UNTRANSLATED] Server Update",
"setup.s.update.wineasy": "[UNTRANSLATED] Windows users can simply double-click the <code>UPDATE AND START SERVER.bat</code>, but otherwise the steps are pretty simple:",
"setup.s.update.1": "[UNTRANSLATED] Run <code>git pull</code> in the SpaceNinjaServer folder",
"setup.s.update.2": "[UNTRANSLATED] (Optional) If you have the stripped assets, run <code>git pull</code> in the <code>static/data/0</code> folder",
"setup.s.update.3": "[UNTRANSLATED] Run <code>npm install --omit=dev</code> to synchronize library dependencies",
"setup.s.update.5": "[UNTRANSLATED] Now you can use <code>npm run start</code> to start the server again",
"setup.irc": "[UNTRANSLATED] IRC Server",
"setup.irc.leadin": "[UNTRANSLATED] In addition to SpaceNinjaServer, you can also set up an IRC server for the in-game chat:",
"setup.irc.wheel": "[UNTRANSLATED] <a href=\"https://github.com/Sainan/warframe-irc-server/releases\" target=\"_blank\">warframe-irc-server</a> — an IRC server specifically made for Warframe. Talks to SpaceNinjaServer to give \"chat moderator\" permissions and report dropped connections.",
"setup.irc.inspircd": "[UNTRANSLATED] 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=\"/supplementals/IRC.zip\" download>here</a>.",
"arep": "[UNTRANSLATED] Asset Replacements",
"arep.title": "[UNTRANSLATED] Asset Replacements Guide | OpenWF",
"arep.desc": "[UNTRANSLATED] This guide will go through the steps to modify a texture used by Warframe via the OpenWF Bootstrapper.",
"arep.what": "[UNTRANSLATED] Before we start: <b>know what you're replacing</b>. I am going to be using <code>/Lotus/Interface/PolarityPoint.png</code> as an example, which is the icon for the Vazarin polarity.",
"arep.explore": "[UNTRANSLATED] To explore textures, I can recommend using the GUI of <a href=\"https://github.com/Puxtril/Warframe-Exporter\" target=\"_blank\">Puxtril's Warframe Exporter</a>.",
"arep.1": "[UNTRANSLATED] Clone <a href=\"https://github.com/Sainan/warframe-cache-tools\" target=\"_blank\">warframe-cache-tools</a>.",
"arep.2": "[UNTRANSLATED] Within your copy of warframe-cache-tools, you can now run <code>pluto extract.pluto /Lotus/Interface/PolarityPoint.png</code> to download & export the texture to the <code>assets</code> folder.",
"arep.3": "[UNTRANSLATED] Head inside of the <code>assets</code> folder until you find <code>PolarityPoint.png.dds</code>.",
"arep.4": "[UNTRANSLATED] Open the DDS file inside of a hex editor like <a href=\"https://hexed.it/\" target=\"_blank\">HexEd.it</a> or <a href=\"https://mh-nexus.de/en/hxd/\" target=\"_blank\">HxD</a> and take note of the format, e.g. you will see the string <code>DXT1</code> or <code>DXT5</code> in the 6th row.",
"arep.5": "[UNTRANSLATED] You are now free to modify the image however you want. Just take care that the file has the same name, dimensions/resolution, and format/encoding as seen before.",
"arep.6": "[UNTRANSLATED] To build your assets, run <code>pluto build.pluto</code> within the warframe-cache-tools directory.",
"arep.7": "[UNTRANSLATED] Finally, to get the assets into the game, you can copy the <code>content (managed)</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 (managed)</code> folder.",
"import": "[UNTRANSLATED] Importing",
"import.title": "[UNTRANSLATED] Importing Guide | OpenWF",
"import.intro": "[UNTRANSLATED] This guide will go over how to get your inventory data from live servers and import it in SpaceNinjaServer.",
"import.export.title": "[UNTRANSLATED] Exporting Your Inventory From Live",
"import.export.alecaframe": "[UNTRANSLATED] If you use AlecaFrame, you already have an encrypted version of your inventory. You can use <a href=\"https://sainan.github.io/alecaframe-inventory-parser/\" target=\"_blank\">this tool</a> to help you locate and decrypt it.",
"import.export.helper": "[UNTRANSLATED] Alternatively, you can use |warframe-api-helper| to get a fresh copy by running it while the game is running & logged in on live. It will store it in <code>inventory.json</code>.",
"import.import.title": "[UNTRANSLATED] Importing Your Inventory To SpaceNinjaServer",
"import.import.desc": "[UNTRANSLATED] Now that you have your inventory, open the SpaceNinjaServer WebUI and locate the \"Import\" tab. You can simply paste the entire thing in the textbox and press the \"Submit\" button.",
"contribute": "[UNTRANSLATED] Contribute",
"contribute.title": "[UNTRANSLATED] Contributing to OpenWF",
"contribute.code": "[UNTRANSLATED] Code",
"contribute.code.desc": "[UNTRANSLATED] Code contributions would be most welcome, especially on SpaceNinjaServer, with <a href='https://onlyg.it/OpenWF/SpaceNinjaServer/issues' target='_blank'>many open issues</a>.",
"contribute.trans": "[UNTRANSLATED] Translations",
"contribute.trans.desc": "[UNTRANSLATED] Most OpenWF software has support for translations:",
"contribute.trans.this": "[UNTRANSLATED] The website you're on right now"
}

View File

@ -1,68 +0,0 @@
{
"about.title": "About OpenWF",
"about.0": "OpenWF is a software suite centered around customizing Warframe, including:",
"about.1": "<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.",
"about.2": "The <b>Bootstrapper</b> — our main DLL targeting the latest game version. Its core precept is connecting to custom servers, but 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 game.",
"about.cta": "Get Started",
"preservation.title": "Preserving Warframe",
"preservation.0": "A long-term goal of the project is to preserve Warframe after the official servers have shut down, and indeed being able to play any update.",
"preservation.1": "Our main focus right now is on staying up-to-date with the game, but there is a DLL + fork of SpaceNinjaServer that can be used to revisit 2013 Warframe. More information about this can be found <a href=\"https://discord.gg/PNNZ3asUuY\">on our Discord</a>, specifically <a href=\"https://discord.com/channels/1108159019635462206/1280628166825873510/1280628233355923497\">in this thread</a>.",
"tm_disclaimer": "Warframe is a registered trademark of Digital Extremes. Its use is for identification purposes only and does not imply any affiliation with or endorsement by Digital Extremes.",
"guides": "Guides",
"setup": "Setup",
"setup.title": "OpenWF Setup Guide",
"setup.c.title": "Client/Boostrapper",
"setup.c.simple": "To use OpenWF, you only need to download the |DLL| and put it in your game's installation folder (the one where Warframe.x64.exe is in).",
"setup.c.dblclk": "As long as this DLL is in the game folder, you can double-click Warframe.x64.exe to start the game with OpenWF.",
"setup.c.laurvt": "Opening the game's launcher will revert it back to normal.",
"setup.c.docshttp": "The DLL is <a href=\"bootstrapper-manual\" 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.",
"setup.c.next": "<b>Next steps:</b> By default, the DLL redirects requests to localhost — meaning the same machine you're playing on — so you'll either need to set up a server or change the server_host to point to a different machine that's already got a server running.",
"setup.s.prereq": "Server Prerequisites",
"download": "Download",
"setup.s.install": "Server Installation",
"setup.s.install.1": "Run <code>git clone https://openwf.io/SpaceNinjaServer.git</code> in a command prompt to download SpaceNinjaServer in the current working directory",
"setup.s.install.2": "Open the SpaceNinjaServer folder (<code>cd SpaceNinjaServer</code>)",
"setup.s.install.3": "Run <code>copy config.json.example config.json</code> to create a config.json from config.json.example",
"setup.s.install.4": "(Optional) Edit the config.json to match your MongoDB settings (if not default) and however else you would like to configure the server",
"setup.s.install.5": "(Optional) If you want stripped assets (~622 <abbr title=\"mebibytes (1 MiB = 1048576 bytes)\">MiB</abbr>) which the client will request from the server on-demand (most notably, <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>), run <code>git clone https://openwf.io/0.git</code> in the <code>static/data</code> folder",
"setup.s.install.6": "Run <code>npm install --omit=dev</code> to install library dependencies",
"setup.s.install.7": "Run <code>npm run build</code> to build the server",
"setup.s.install.8": "Now you can run <code>npm run start</code> to start the server anytime",
"setup.s.update": "Server Update",
"setup.s.update.wineasy": "Windows users can simply double-click the <code>UPDATE AND START SERVER.bat</code>, but otherwise the steps are pretty simple:",
"setup.s.update.1": "Run <code>git pull</code> in the SpaceNinjaServer folder",
"setup.s.update.2": "(Optional) If you have the stripped assets, run <code>git pull</code> in the <code>static/data/0</code> folder",
"setup.s.update.3": "Run <code>npm install --omit=dev</code> to synchronize library dependencies",
"setup.s.update.5": "Now you can use <code>npm run start</code> to start the server again",
"setup.irc": "IRC Server",
"setup.irc.leadin": "In addition to SpaceNinjaServer, you can also set up an IRC server for the in-game chat:",
"setup.irc.wheel": "<a href=\"https://github.com/Sainan/warframe-irc-server/releases\" target=\"_blank\">warframe-irc-server</a> — an IRC server specifically made for Warframe. Talks to SpaceNinjaServer to give \"chat moderator\" permissions and report dropped connections.",
"setup.irc.inspircd": "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=\"/supplementals/IRC.zip\" download>here</a>.",
"arep": "Asset Replacements",
"arep.title": "Asset Replacements Guide | OpenWF",
"arep.desc": "This guide will go through the steps to modify a texture used by Warframe via the OpenWF Bootstrapper.",
"arep.what": "Before we start: <b>know what you're replacing</b>. I am going to be using <code>/Lotus/Interface/PolarityPoint.png</code> as an example, which is the icon for the Vazarin polarity.",
"arep.explore": "To explore textures, I can recommend using the GUI of <a href=\"https://github.com/Puxtril/Warframe-Exporter\" target=\"_blank\">Puxtril's Warframe Exporter</a>.",
"arep.1": "Clone <a href=\"https://github.com/Sainan/warframe-cache-tools\" target=\"_blank\">warframe-cache-tools</a>.",
"arep.2": "Within your copy of warframe-cache-tools, you can now run <code>pluto extract.pluto /Lotus/Interface/PolarityPoint.png</code> to download & export the texture to the <code>assets</code> folder.",
"arep.3": "Head inside of the <code>assets</code> folder until you find <code>PolarityPoint.png.dds</code>.",
"arep.4": "Open the DDS file inside of a hex editor like <a href=\"https://hexed.it/\" target=\"_blank\">HexEd.it</a> or <a href=\"https://mh-nexus.de/en/hxd/\" target=\"_blank\">HxD</a> and take note of the format, e.g. you will see the string <code>DXT1</code> or <code>DXT5</code> in the 6th row.",
"arep.5": "You are now free to modify the image however you want. Just take care that the file has the same name, dimensions/resolution, and format/encoding as seen before.",
"arep.6": "To build your assets, run <code>pluto build.pluto</code> within the warframe-cache-tools directory.",
"arep.7": "Finally, to get the assets into the game, you can copy the <code>content (managed)</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 (managed)</code> folder.",
"import": "Importing",
"import.title": "Importing Guide | OpenWF",
"import.intro": "This guide will go over how to get your inventory data from live servers and import it in SpaceNinjaServer.",
"import.export.title": "Exporting Your Inventory From Live",
"import.export.alecaframe": "If you use AlecaFrame, you already have an encrypted version of your inventory. You can use <a href=\"https://sainan.github.io/alecaframe-inventory-parser/\" target=\"_blank\">this tool</a> to help you locate and decrypt it.",
"import.export.helper": "Alternatively, you can use |warframe-api-helper| to get a fresh copy by running it while the game is running & logged in on live. It will store it in <code>inventory.json</code>.",
"import.import.title": "Importing Your Inventory To SpaceNinjaServer",
"import.import.desc": "Now that you have your inventory, open the SpaceNinjaServer WebUI and locate the \"Import\" tab. You can simply paste the entire thing in the textbox and press the \"Submit\" button.",
"contribute": "Contribute",
"contribute.title": "Contributing to OpenWF",
"contribute.code": "Code",
"contribute.code.desc": "Code contributions would be most welcome, especially on SpaceNinjaServer, with <a href='https://onlyg.it/OpenWF/SpaceNinjaServer/issues' target='_blank'>many open issues</a>.",
"contribute.trans": "Translations",
"contribute.trans.desc": "Most OpenWF software has support for translations:",
"contribute.trans.this": "The website you're on right now"
}

View File

@ -1,27 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<title>Asset Replacements Guide | OpenWF</title>
<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">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<p>This guide will go through the steps to modify a texture used by Warframe via the OpenWF Bootstrapper.</p>
<p>
Before we start: <b>know what you're replacing</b>. I am going to be using <code>/Lotus/Interface/PolarityPoint.png</code> as an example, which is the icon for the Vazarin polarity.<br/>
To explore textures, I can recommend using the GUI of <a href="https://github.com/Puxtril/Warframe-Exporter" target="_blank">Puxtril's Warframe Exporter</a>. </p>
<ol>
<li>Clone <a href="https://github.com/Sainan/warframe-cache-tools" target="_blank">warframe-cache-tools</a>.</li>
<li>Within your copy of warframe-cache-tools, you can now run <code>pluto extract.pluto /Lotus/Interface/PolarityPoint.png</code> to download & export the texture to the <code>assets</code> folder.</li>
<li>Head inside of the <code>assets</code> folder until you find <code>PolarityPoint.png.dds</code>.</li>
<li>Open the DDS file inside of a hex editor like <a href="https://hexed.it/" target="_blank">HexEd.it</a> or <a href="https://mh-nexus.de/en/hxd/" target="_blank">HxD</a> and take note of the format, e.g. you will see the string <code>DXT1</code> or <code>DXT5</code> in the 6th row.</li>
<li>You are now free to modify the image however you want. Just take care that the file has the same name, dimensions/resolution, and format/encoding as seen before.</li>
<li>To build your assets, run <code>pluto build.pluto</code> within the warframe-cache-tools directory.</li>
<li>Finally, to get the assets into the game, you can copy the <code>content (managed)</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 (managed)</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>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Asset Replacements Guide | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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>This guide will go through the steps to modify a texture used by Warframe via the OpenWF Bootstrapper.</p>
<p>
Before we start: <b>know what you're replacing</b>. I am going to be using <code>/Lotus/Interface/PolarityPoint.png</code> as an example, which is the icon for the Vazarin polarity.<br/>
To explore textures, I can recommend using the GUI of <a href="https://github.com/Puxtril/Warframe-Exporter" target="_blank">Puxtril's Warframe Exporter</a>. </p>
<ol>
<li>Clone <a href="https://github.com/Sainan/warframe-cache-tools" target="_blank">warframe-cache-tools</a>.</li>
<li>Within your copy of warframe-cache-tools, you can now run <code>pluto extract.pluto /Lotus/Interface/PolarityPoint.png</code> to download & export the texture to the <code>assets</code> folder.</li>
<li>Head inside of the <code>assets</code> folder until you find <code>PolarityPoint.png.dds</code>.</li>
<li>Open the DDS file inside of a hex editor like <a href="https://hexed.it/" target="_blank">HexEd.it</a> or <a href="https://mh-nexus.de/en/hxd/" target="_blank">HxD</a> and take note of the format, e.g. you will see the string <code>DXT1</code> or <code>DXT5</code> in the 6th row.</li>
<li>You are now free to modify the image however you want. Just take care that the file has the same name, dimensions/resolution, and format/encoding as seen before.</li>
<li>To build your assets, run <code>pluto build.pluto</code> within the warframe-cache-tools directory.</li>
<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="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

View File

@ -1,147 +1,167 @@
<!DOCTYPE html>
<html>
<head>
<title>OpenWF Bootstrapper Manual</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
/* https://calamity-inc.github.io/Silver/base.css */
html
{
background: #111;
color: #fff;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
body
{
margin: 8px 12px;
}
h1
{
font-weight: 400;
font-size: 2.5em;
margin-block: 0.3em;
}
h2
{
font-weight: 350;
font-size: 2em;
margin-block-end: 0.4em;
}
h3
{
font-weight: 300;
font-size: 1.5em;
margin-block-end: 0.4em;
}
p
{
margin-block: 0.5em;
}
code
{
padding: 1px 2px;
border: 1px solid #2f2f2f;
}
li:not(:last-child)
{
margin-bottom: 4px;
}
a
{
color: #257afb
}
a:hover
{
color: #3586ff;
}
a:focus
{
color: #4791ff;
}
</style>
</head>
<body>
<h1>OpenWF Bootstrapper Manual</h1>
<p>While the main feature of the bootstrapper (dwmapi.dll or wtsapi32.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>
<ul>
<li><code>fallback_language</code> — The language to use when Warframe.x64.exe was double-clicked or the argument was simply omitted.</li>
<li><code>fallback_graphicsDriver</code> — The graphics driver to use when Warframe.x64.exe was double-clicked or the argument was simply omitted.</li>
<li><code>fallback_cluster</code> — The cluster to use when Warframe.x64.exe was double-clicked or the argument was simply omitted. Can be <code>public</code>, <code>test</code>, or <code>dev</code> — the latter two enable some more logging.</li>
<li><code>server_host</code> — The hostname or IP address to redirect game traffic to. This should match <code>myAddress</code> in SpaceNinjaServer.</li>
<li><code>http_port</code> — The port to use for HTTP traffic. This should match <code>httpPort</code> in SpaceNinjaServer.</li>
<li><code>https_port</code> — The port to use for HTTPS traffic. This should match <code>httpsPort</code> in SpaceNinjaServer.</li>
<li><code>autologin</code> — 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.</li>
<li><code>autologin_email</code></li>
<li><code>autologin_password</code> — The whirlpool hash of the password to use for autologin. You can simply enter your password and it will automatically be hashed and overwritten.</li>
<li><code>high_damage_numbers_patch</code> — If true, patches the game to display the exact number of damage that you dealt to fix -2147483648 showing up on high damage.</li>
<li><code>simulacrum_blacklisted</code> — If true, blacklisted enemies are shown in the Simulacrum. Defaults to false to match the game.</li>
<li><code>simulacrum_whitelisted</code> — If true, whitelisted enemies are shown in the Simulacrum. Defaults to true to match the game.</li>
<li><code>pause_always_stops_time</code></li>
<li><code>disable_nrs_connection</code> — If true, disables NRS connections, preventing the game from showing "Please ensure that your firewall permits UDP ports 4950 & 4955."</li>
<li><code>ee_log_in_console</code> — If true, writes everything that gets written to EE.log to the console as well.</li>
<li><code>skip_mission_start_timer</code> — If true, disables the 5 second wait before a mission starts.</li>
<li><code>logout_on_request_failure</code> — If false, the game will ignore HTTP request failures/timeouts instead of forcing a logout.</li>
<li><code>fov_override</code> — If not 0, overrides the game's FOV setting. You can use any value from 1 to 226.</li>
<li><code>forced_profile_dir</code> — 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.</li>
<li><code>auto_start_scripts</code> — A list of scripts to automatically start, e.g. <code>["samples/Cycle Camera Hotkey (K).pluto"]</code>.</li>
<li><code>dont_resolve_labels</code> — If true, shows language tags instead of their associated value, e.g. <code>/Menu/Confirm_Item_Yes</code> instead of <code>YES</code>.</li>
<li><code>save_all_metadata</code> — If true, implicitly creates an empty patch on every metadata read to make it available for get_effective_metadata requests. May degrade performance.</li>
<li><code>write_all_metadata_reads_to_console</code> — If true, writes all metadata reads to the console. May degrade performance.</li>
<li><code>write_all_metadata_reads_to_ee_log</code> — If true, writes all metadata reads to EE.log. May degrade performance.</li>
<li><code>write_patches_metadata_reads_to_console</code> — If true, writes patched metadata reads to the console. May degrade performance.</li>
<li><code>write_patches_metadata_reads_to_ee_log</code> — If true, writes patched metadata reads to EE.log. May degrade performance.</li>
</ul>
<h2>HTTP Interface</h2>
<p>While the game is running, the 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>
<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>
<h2>Tunables</h2>
<p>When connecting to a server, the bootstrapper requests <code>/custom/tunables.json</code> to check the JSON object for the presence of the following fields:</p>
<ul>
<li><code>prohibit_skip_mission_start_timer</code></li>
<li><code>prohibit_fov_override</code></li>
<li><code>prohibit_freecam</code></li>
<li><code>prohibit_teleport</code></li>
<li><code>prohibit_scripts</code></li>
</ul>
<p>The presence of a field disables the respective feature.</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>
<li>login.php requests also have an extra <code>clientMod</code> parameter indicating the Bootstrapper's name and version. If Metadata Patches are in use, <code>metadataPatchesInUse=1</code> is added as well.</li>
<li>inventory.php & missionInventoryUpdate.php requests have the extra query parameter <code>xpBasedLevelCapDisabled</code> to indicate that the client has been patched to accept any PlayerLevel and doesn't need XPInfo to match.</li>
<li>The IRC <code>USER</code> message is adjusted to contain <code>nonce=...</code> in the 'realname' field.</li>
</ul>
<h2>Metadata Patches</h2>
<p>Metadata Patches are loaded from <code>OpenWF/Metadata Patches.txt</code>, although you can also create a <code>OpenWF/Metadata Patches/</code> folder and any text file inside of that will be loaded as well.</p>
<p>They are generally parsed line by line, with roughly the following steps being taken for each line:</p>
<ol>
<li>If the line starts with <code>/</code>, a new patch for the given absolute path is started. If the line ends on <code>&</code>, the next line that also starts with <code>/</code> will be added to this patch instead of creating a new patch.</li>
<li>Leading and trailing tabs and spaces are removed from the line.</li>
<li>If the line starts with <code>&</code>, that character is removed from the line and the rest of the line is assumed to be an absolute path to be added to the current patch.</li>
<li>If the line starts with <code>></code>, that character is removed from the line and the rest of the line is assumed to be an absolute path for which a new patch is created.</li>
<li>If the line starts with <code>r|</code>, a replacement is added to the current patch in the form <code>r|A|Z</code> which means <code>A</code> in the metadata will be replaced with <code>Z</code>.</li>
<li>If the line starts with <code>s|</code>, a regex substitution is added to the current patch, e.g. <code>s|(.+)=1|$1=0</code> would change <code>HasCooldown=1</code> to be <code>HasCooldown=0</code>.</li>
<li>The line is added as a metadata prefix to the current patch. This works to add top-level properties but also to replace them because the game resolves duplicates by ignoring subsequent entries.</li>
</ol>
<p>If multiple patches affect the same absolute path, they are combined.</p>
<br>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>OpenWF Bootstrapper Manual</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
/* https://calamity-inc.github.io/Silver/base.css */
html
{
background: #111;
color: #fff;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
body
{
margin: 8px 12px;
}
h1
{
font-weight: 400;
font-size: 2.5em;
margin-block: 0.3em;
}
h2
{
font-weight: 350;
font-size: 2em;
margin-block-end: 0.4em;
}
h3
{
font-weight: 300;
font-size: 1.5em;
margin-block-end: 0.4em;
}
p
{
margin-block: 0.5em;
}
code
{
padding: 1px 2px;
border: 1px solid #2f2f2f;
}
li:not(:last-child)
{
margin-bottom: 4px;
}
a
{
color: #257afb
}
a:hover
{
color: #3586ff;
}
a:focus
{
color: #4791ff;
}
</style>
</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>
<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>
<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>
<li><code>fallback_graphicsDriver</code> — If not empty, this graphics driver will be used when Warframe.x64.exe is invoked without a <code>graphicsDriver</code> command line argument.</li>
<li><code>fallback_cluster</code> — The cluster to use when Warframe.x64.exe was double-clicked or the argument was simply omitted. Can be <code>public</code>, <code>test</code>, or <code>dev</code> — the latter two enable some more logging.</li>
<li><code>server_host</code> — The hostname or IP address to redirect game traffic to. This should match <code>myAddress</code> in SpaceNinjaServer.</li>
<li><code>http_port</code> — The port to use for HTTP traffic. This should match <code>httpPort</code> in SpaceNinjaServer.</li>
<li><code>https_port</code> — The port to use for HTTPS traffic. This should match <code>httpsPort</code> in SpaceNinjaServer.</li>
<li><code>autologin</code> — 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.</li>
<li><code>autologin_email</code></li>
<li><code>autologin_password</code> — The whirlpool hash of the password to use for autologin. You can simply enter your password and it will automatically be hashed and overwritten.</li>
<li><code>high_damage_numbers_patch</code> — If true, patches the game to display the exact number of damage that you dealt to fix -2147483648 showing up on high damage.</li>
<li><code>simulacrum_blacklisted</code> — If true, blacklisted enemies are shown in the Simulacrum. Defaults to false to match the game.</li>
<li><code>simulacrum_whitelisted</code> — If true, whitelisted enemies are shown in the Simulacrum. Defaults to true to match the game.</li>
<li><code>pause_always_stops_time</code></li>
<li><code>disable_nrs_connection</code> — If true, disables NRS connections, preventing the game from showing "Please ensure that your firewall permits UDP ports 4950 & 4955."</li>
<li><code>ee_log_in_console</code> — If true, writes everything that gets written to EE.log to the console as well.</li>
<li><code>skip_mission_start_timer</code> — If true, disables the 5 second wait before a mission starts.</li>
<li><code>logout_on_request_failure</code> — If false, the game will ignore HTTP request failures/timeouts instead of forcing a logout.</li>
<li><code>fov_override</code> — If not 0, overrides the game's FOV setting. You can use any value from 1 to 226.</li>
<li><code>forced_profile_dir</code> — 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.</li>
<li><code>auto_start_scripts</code> — A list of scripts to automatically start.</li>
<li><code>alternative_loading</code> — Enables an alternative loading mode (<code>Server.FastLoad</code>) which also skips intro cutscenes when loading into a relay. However, this breaks some parts of The New War and possibly other missions.</li>
<li><code>dont_resolve_labels</code> — If true, shows language tags instead of their associated value, e.g. <code>/Menu/Confirm_Item_Yes</code> instead of <code>YES</code>.</li>
<li><code>save_all_metadata</code> — If true, implicitly creates an empty patch on every metadata read to make it available for get_effective_metadata requests. May degrade performance.</li>
<li><code>write_all_metadata_reads_to_console</code> — If true, writes all metadata reads to the console. May degrade performance.</li>
<li><code>write_all_metadata_reads_to_ee_log</code> — If true, writes all metadata reads to EE.log. May degrade performance.</li>
<li><code>write_patches_metadata_reads_to_console</code> — If true, writes patched metadata reads to the console. May degrade performance.</li>
<li><code>write_patches_metadata_reads_to_ee_log</code> — If true, writes patched metadata reads to EE.log. May degrade performance.</li>
</ul>
<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>
<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>
<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>
<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>
<li><code>prohibit_fov_override</code> — if true, prohibits <code>fov_override</code></li>
<li><code>prohibit_freecam</code> — if true, prohibits <code>freecam</code></li>
<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>
<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>
<li>login.php requests also have an extra <code>clientMod</code> parameter indicating the Bootstrapper's name and version. If Metadata Patches are in use, <code>metadataPatchesInUse=1</code> is added as well.</li>
<li>inventory.php & missionInventoryUpdate.php requests have the extra query parameter <code>xpBasedLevelCapDisabled</code> to indicate that the client has been patched to accept any PlayerLevel and doesn't need XPInfo to match.</li>
<li>The IRC <code>USER</code> message is adjusted to contain <code>nonce=...</code> in the 'realname' field.</li>
</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. 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>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>
<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>
</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>
<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 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>
<br>
</body>
</html>

View File

@ -1,22 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>Contributing to OpenWF</title>
<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">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<h2>Code</h2>
<p>Code contributions would be most welcome, especially on SpaceNinjaServer, with <a href='https://onlyg.it/OpenWF/SpaceNinjaServer/issues' target='_blank'>many open issues</a>.</p>
<h2>Translations</h2>
<p>Most OpenWF software has support for translations:</p>
<ul>
<li><a href="https://onlyg.it/OpenWF/SpaceNinjaServer/src/branch/main/static/webui/translations" target="_blank">SpaceNinjaServer WebUI</a></li>
<li><a href="https://onlyg.it/OpenWF/Translations/src/branch/main/client-webui" target="_blank">Bootstrapper WebUI</a></li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
<!DOCTYPE html>
<html>
<head>
<title>Contributing to OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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>Code</h2>
<p>Code contributions would be most welcome, especially on SpaceNinjaServer, with <a href='https://onlyg.it/OpenWF/SpaceNinjaServer/issues' target='_blank'>many open issues</a>.</p>
<h2>Translations</h2>
<p>Most OpenWF software has support for translations:</p>
<ul>
<li><a href="https://onlyg.it/OpenWF/SpaceNinjaServer/src/branch/main/static/webui/translations" target="_blank">SpaceNinjaServer WebUI</a></li>
<li><a href="https://onlyg.it/OpenWF/Translations/src/branch/main/bootstrapper" target="_blank">Bootstrapper WebUI</a></li>
</ul>
<h2>Seeding</h2>
<p>We are looking into IPFS for censorship-resistance. You could help the project out by pinning some things to your own node(s):</p>
<ul>
<li>OpenWF Website: <code>ipfs pin add /ipns/openwf.io</code></li>
<li>SpaceNinjaServer git mirror: <code>ipfs pin add /ipns/sns.openwf.io</code> (<a href="https://ipfs.io/ipns/k51qzi5uqu5diybf2prwdxnyiewvnjn5jshwiv5awoqrn9z5tfen8p31x15jk9/#repo=https%3A%2F%2Fipfs.io%2Fipns%2Fsns.openwf.io" target="_blank">gitview</a>)</li>
</ul>
<p>Note that IPNS names are resolved to their CID when pinning, so an hourly cronjob is recommended.</p>
</div>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

171
guide.php
View File

@ -1,58 +1,113 @@
<?php
$dll_version = @file_get_contents("supplementals/client drop-in/latest.txt");
$version = ""; //json_decode(file_get_contents("supplementals/static data/buildConfig.json"), true)["version"];
?>
<!DOCTYPE html>
<html>
<head>
<title>OpenWF Setup Guide</title>
<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">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<h2>Client/Boostrapper</h2>
<p>To use OpenWF, you only need to download the <a href="/supplementals/client%20drop-in/<?=$dll_version;?>/dwmapi.dll" download>dwmapi.dll</a> and put it in your game's installation folder (the one where Warframe.x64.exe is in).</p>
<ul>
<li>As long as this DLL is in the game folder, you can double-click Warframe.x64.exe to start the game with OpenWF.</li>
<li>Opening the game's launcher will revert it back to normal.</li>
</ul>
<p>The DLL is <a href="bootstrapper-manual" 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>
<p><b>Next steps:</b> By default, the DLL redirects requests to localhost meaning the same machine you're playing on — so you'll either need to set up a server or change the server_host to point to a different machine that's already got a server running.</p>
<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>Run <code>copy config.json.example config.json</code> to create a config.json from config.json.example</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 want stripped assets (~622 <abbr title="mebibytes (1 MiB = 1048576 bytes)">MiB</abbr>) which the client will request from the server on-demand (most notably, <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>), 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</code> to install library dependencies</li>
<li>Run <code>npm run build</code> to build the server</li>
<li>Now you can run <code>npm run start</code> to start the server anytime</li>
</ol>
<h2>Server Update</h2>
<p>Windows users can simply double-click the <code>UPDATE AND START SERVER.bat</code>, 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</code> to synchronize library dependencies</li>
<li>Run <code>npm run build</code> to build the server</li>
<li>Now you can use <code>npm run start</code> to start the server again</li>
</ol>
<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 Warframe. 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="/supplementals/IRC.zip" download>here</a>.</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>OpenWF Setup Guide</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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>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>
<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>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>
<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="_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

@ -1,22 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Importing Guide | OpenWF</title>
<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">
</head>
<body data-bs-theme="dark">
<?php require "_components/navbar.php"; ?>
<div class="container mt-3">
<p>This guide will go over how to get your inventory data from live servers and import it in SpaceNinjaServer.</p>
<h2>Exporting Your Inventory From Live</h2>
<ul>
<li>If you use AlecaFrame, you already have an encrypted version of your inventory. You can use <a href="https://sainan.github.io/alecaframe-inventory-parser/" target="_blank">this tool</a> to help you locate and decrypt it.</li>
<li>Alternatively, you can use <a href="https://github.com/Sainan/warframe-api-helper/releases/latest/download/warframe-api-helper.exe">warframe-api-helper</a> to get a fresh copy by running it while the game is running & logged in on live. It will store it in <code>inventory.json</code>.</li>
</ul>
<h2>Importing Your Inventory To SpaceNinjaServer</h2>
<p>Now that you have your inventory, open the SpaceNinjaServer WebUI and locate the "Import" tab. You can simply paste the entire thing in the textbox and press the "Submit" button.</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>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Importing Guide | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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>This guide will go over how to get your inventory data from live servers and import it in SpaceNinjaServer.</p>
<h2>Export via AlecaFrame</h2>
<p>If you use AlecaFrame, you already have an encrypted version of your inventory. You can use <a href="https://sainan.github.io/alecaframe-inventory-parser/" target="_blank">this tool</a> to help you locate and decrypt it.</p>
<h2>Export via warframe-api-helper</h2>
<p>You can use <a href="https://github.com/Sainan/warframe-api-helper/releases/latest">warframe-api-helper</a> to get your credentials while the game is running & logged in on live. It will download your inventory for you and store it in <code>inventory.json</code>.</p>
<p>However, using the credentials (<code>?accountId=...&nonce=...</code>), it is also possible to get your personal rooms: <code>https://api.warframe.com/api/getShip.php?accountId=...&nonce=...</code></p>
<h2>Import to SpaceNinjaServer</h2>
<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="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

View File

@ -1,26 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>About OpenWF</title>
<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">
</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>
<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 targeting the latest game version. Its core precept is connecting to custom servers, but 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 game.</li>
</ul>
<a href="/guide.php" class="btn btn-primary">Get Started</a>
<h3 class="mt-3">Preserving Warframe</h3>
<p>
A long-term goal of the project is to preserve Warframe after the official servers have shut down, and indeed being able to play any update.<br/>
Our main focus right now is on staying up-to-date with the game, but there is a DLL + fork of SpaceNinjaServer that can be used to revisit 2013 Warframe. More information about this can be found <a href="https://discord.gg/PNNZ3asUuY">on our Discord</a>, specifically <a href="https://discord.com/channels/1108159019635462206/1280628166825873510/1280628233355923497">in this thread</a>. </p>
<hr>
<p>Warframe is a registered trademark of Digital Extremes. Its use is for identification purposes only and does not imply any affiliation with or endorsement by Digital Extremes.</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>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>About OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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 community project to play Warframe offline, specifically for preservation and customization.</p>
<h3>Software</h3>
<ul>
<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>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="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
</body>
</html>

1
mods.html Normal file
View File

@ -0,0 +1 @@
<meta http-equiv="refresh" content="0;url=https://onlyg.it/OpenWF/Mods">

758
old-versions.php Normal file
View File

@ -0,0 +1,758 @@
<!DOCTYPE html>
<html>
<head>
<title>Old Versions | OpenWF</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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 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>
<tr>
<th colspan="2">Version</th>
<th>Title</th>
<th>Notes</th>
<th>Download</th>
</tr>
</thead>
<tbody>
<!-- https://steamdb.info/depot/230411/manifests/ -->
<tr>
<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><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><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><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><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><a href="#3864063200081954630">Download</a></td>
</tr>
<tr>
<td><code>2024.10.11.10.06</code></td>
<td>=&nbsp;37.0.6</td>
<td>Koumei&nbsp;&amp;&nbsp;the&nbsp;Five&nbsp;Fates</td>
<td></td>
<td><a href="#513490184226321110">Download</a></td>
</tr>
<tr>
<td><code>2024.09.30.16.56</code></td>
<td>&lt;&nbsp;37.0.0</td>
<td>Koumei&nbsp;&amp;&nbsp;the&nbsp;Five&nbsp;Fates</td>
<td></td>
<td><a href="#2655930801276651913">Download</a></td>
</tr>
<tr>
<td><code>2024.08.21.20.02</code></td>
<td>=&nbsp;36.1.2</td>
<td>The&nbsp;Lotus&nbsp;Eaters</td>
<td></td>
<td><a href="#8111233839173446959">Download</a></td>
</tr>
<tr>
<td><code>2024.07.17.17.07</code></td>
<td>=&nbsp;36.0.7</td>
<td>Jade&nbsp;Shadows</td>
<td></td>
<td><a href="#7104716125379362906">Download</a></td>
</tr>
<tr>
<td><code>2024.06.25.16.44</code></td>
<td>=&nbsp;36.0.4</td>
<td>Jade&nbsp;Shadows</td>
<td></td>
<td><a href="#8456987056335242580">Download</a></td>
</tr>
<tr>
<td><code>2024.06.12.18.42</code></td>
<td>&lt;&nbsp;36.0.0</td>
<td>Jade&nbsp;Shadows</td>
<td></td>
<td><a href="#8444137865636064549">Download</a></td>
</tr>
<tr>
<td><code>2024.03.24.20.00</code></td>
<td>=&nbsp;35.5.0</td>
<td>Dante&nbsp;Unbound</td>
<td></td>
<td><a href="#4262681179882731333">Download</a></td>
</tr>
<tr>
<td><code>2024.02.16.17.13</code></td>
<td>=&nbsp;35.1.0</td>
<td>Whispers&nbsp;in&nbsp;the&nbsp;Walls</td>
<td></td>
<td><a href="#3417254152679980994">Download</a></td>
</tr>
<!-- Also verified that 34.0.8 works, but sadly there's no manifest id for any of U34.-->
<tr>
<td><code>2023.07.26.16.38</code></td>
<td>&nbsp;33.6.0</td>
<td>Echoes&nbsp;of&nbsp;Duviri</td>
<td></td>
<td><a href="#4487452668036984689">Download</a></td>
</tr>
<tr>
<td><code>2023.06.22.13.21</code></td>
<td>&nbsp;33.5.2</td>
<td>The&nbsp;Seven&nbsp;Crimes&nbsp;of&nbsp;Kullervo</td>
<td></td>
<td><a href="#7706746084885057576">Download</a></td>
</tr>
<tr>
<td><code>2023.06.21.07.11</code></td>
<td>&nbsp;33.5.0</td>
<td>The&nbsp;Seven&nbsp;Crimes&nbsp;of&nbsp;Kullervo</td>
<td></td>
<td><a href="#1040973097284770411">Download</a></td>
</tr>
<tr>
<td><code>2023.04.25.23.40</code></td>
<td>&nbsp;33.0.0</td>
<td>The&nbsp;Duviri&nbsp;Paradox</td>
<td></td>
<td><a href="#503269306359201928">Download</a></td>
</tr>
<tr>
<td><code>2023.02.13.10.22</code></td>
<td>&nbsp;32.3.0</td>
<td>Citrine's&nbsp;Last&nbsp;Wish</td>
<td></td>
<td><a href="#2084947150827453084">Download</a></td>
</tr>
<tr>
<td><code>2022.11.30.08.13</code></td>
<td>&nbsp;32.2.0</td>
<td>Lua's&nbsp;Prey</td>
<td></td>
<td><a href="#1591604753021484150">Download</a></td>
</tr>
<tr>
<td><code>2022.09.06.19.24</code></td>
<td>&nbsp;32.0.0</td>
<td>Veilbreaker</td>
<td></td>
<td><a href="#2433324865707385268">Download</a></td>
</tr>
<tr>
<td><code>2022.07.25.16.59</code></td>
<td>&nbsp;31.7.1</td>
<td>Echoes&nbsp;of&nbsp;the&nbsp;Zariman</td>
<td></td>
<td><a href="#7280281005656793707">Download</a></td>
</tr>
<tr>
<td><code>2022.06.09.08.45</code></td>
<td>&nbsp;31.6.0</td>
<td>Echoes&nbsp;of&nbsp;the&nbsp;Zariman</td>
<td></td>
<td><a href="#8725083537193522917">Download</a></td>
</tr>
<tr>
<td><code>2022.04.29.12.53</code></td>
<td>&nbsp;31.5.0</td>
<td>Angels&nbsp;of&nbsp;the&nbsp;Zariman</td>
<td></td>
<td><a href="#4634493262513910961">Download</a></td>
</tr>
<tr>
<td><code>2022.02.09.08.55</code></td>
<td>&nbsp;31.1.0</td>
<td>The&nbsp;New&nbsp;War</td>
<td></td>
<td><a href="#1198361709927223847">Download</a></td>
</tr>
<tr>
<td><code>2021.12.15.00.15</code></td>
<td>&nbsp;31.0.0</td>
<td>The&nbsp;New&nbsp;War</td>
<td></td>
<td><a href="#563653176338996292">Download</a></td>
</tr>
<tr>
<td><code>2021.09.08.19.27</code></td>
<td>&nbsp;30.7.2</td>
<td>Sisters&nbsp;of&nbsp;Parvos</td>
<td></td>
<td><a href="#8243603931064121923">Download</a></td>
</tr>
<tr>
<td><code>2021.09.08.19.27</code></td>
<td>&nbsp;30.7.1</td>
<td>Sisters&nbsp;of&nbsp;Parvos</td>
<td></td>
<td><a href="#4538343592657854566">Download</a></td>
</tr>
<tr>
<td><code>2021.07.05.17.03</code></td>
<td>&nbsp;30.5.0</td>
<td>Sisters&nbsp;of&nbsp;Parvos</td>
<td></td>
<td><a href="#1659398175797234554">Download</a></td>
</tr>
<tr>
<td><code>2021.06.02.13.38</code></td>
<td>&nbsp;30.3.4</td>
<td>Call&nbsp;of&nbsp;the&nbsp;Tempestarii</td>
<td></td>
<td><a href="#896988770099174429">Download</a></td>
</tr>
<tr>
<td><code>2021.05.25.09.41</code></td>
<td>&nbsp;30.3.0</td>
<td>Call&nbsp;of&nbsp;the&nbsp;Tempestarii</td>
<td></td>
<td><a href="#1516755954909330587">Download</a></td>
</tr>
<tr>
<td><code>2021.04.13.19.58</code></td>
<td>&nbsp;30.0.0</td>
<td>Call&nbsp;of&nbsp;the&nbsp;Tempestarii</td>
<td></td>
<td><a href="#1471695976410467945">Download</a></td>
</tr>
<tr>
<td><code>2021.03.19.10.30</code></td>
<td>&nbsp;29.10.0</td>
<td>Orphix&nbsp;Venom</td>
<td></td>
<td><a href="#2360447165794825746">Download</a></td>
</tr>
<tr>
<td><code>2021.01.25.08.49</code></td>
<td>&nbsp;29.6.8</td>
<td>Orphix&nbsp;Venom</td>
<td></td>
<td><a href="#5695018007407901588">Download</a></td>
</tr>
<tr>
<td><code>2020.11.19.17.52</code></td>
<td>&nbsp;29.5.0</td>
<td>Echoes&nbsp;of&nbsp;Deimos<!-- Login screen says "Heart of Deimos" --></td>
<td></td>
<td><a href="#2281391866826940520">Download</a></td>
</tr>
<tr>
<td><code>2020.11.04.18.58</code></td>
<td>&nbsp;29.3.1</td>
<td>Heart&nbsp;of&nbsp;Deimos</td>
<td></td>
<td><a href="#4589169429267220816">Download</a></td>
</tr>
<tr>
<td><code>2020.08.25.18.35</code></td>
<td>&nbsp;29.0.0</td>
<td>Heart&nbsp;of&nbsp;Deimos</td>
<td></td>
<td><a href="#1198696432420157033">Download</a></td>
</tr>
<tr>
<td><code>2020.08.12.19.57</code></td>
<td>&nbsp;28.3.0</td>
<td>Derelict&nbsp;Shift<!-- Login screen says "The Deadlock Protocol" --></td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4862052161935324630">Download</a></td>
</tr>
<tr>
<td><code>2020.06.12.16.46</code></td>
<td>&nbsp;28.0.0</td>
<td>The&nbsp;Deadlock&nbsp;Protocol</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8322392782655512672">Download</a></td>
</tr>
<tr>
<td><code>2020.03.24.20.24</code></td>
<td>&nbsp;27.3.0</td>
<td>Empyrean</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#940429389442729133">Download</a></td>
</tr>
<tr>
<td><code>2020.03.05.16.06</code></td>
<td>&nbsp;27.2.0</td>
<td>Empyrean</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#3078917755629993445">Download</a></td>
</tr>
<tr>
<td><code>2019.12.13.15.04</code></td>
<td>&nbsp;27.0.0</td>
<td>Empyrean</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5383208407459190147">Download</a></td>
</tr>
<tr>
<td><code>2019.12.13.00.31</code></td>
<td>&nbsp;26.1.3</td>
<td>Rising&nbsp;Tide</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#1746499861411165604">Download</a></td>
</tr>
<tr>
<td><code>2019.11.22.21.24</code></td>
<td>&nbsp;26.1.0</td>
<td>Rising&nbsp;Tide</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5191423722994130705">Download</a></td>
</tr>
<tr>
<td><code>2019.11.05.12.52</code></td>
<td>&nbsp;26.0.4</td>
<td>The&nbsp;Old&nbsp;Blood</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4211752956119480973">Download</a></td>
</tr>
<tr>
<td><code>2019.10.31.22.42</code></td>
<td>&nbsp;26.0.0</td>
<td>The&nbsp;Old&nbsp;Blood</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5213493012981659231">Download</a></td>
</tr>
<tr>
<td><code>2019.09.09.12.43</code></td>
<td>&nbsp;25.7.5</td>
<td>Saint&nbsp;of&nbsp;Altra</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#6484357939617346090">Download</a></td>
</tr>
<tr>
<td><code>2019.08.29.21.58</code></td>
<td>&nbsp;25.7.0</td>
<td>Saint&nbsp;of&nbsp;Altra</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#6955217559566015186">Download</a>&nbsp;</td>
</tr>
<tr>
<td><code>2019.08.29.20.01</code></td>
<td>&nbsp;25.7.0</td>
<td>Saint&nbsp;of&nbsp;Altra</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8839989774604564585">Download</a></td>
</tr>
<tr>
<td><code>2019.05.22.23.12</code></td>
<td>&nbsp;25.0.0</td>
<td>The&nbsp;Jovian&nbsp;Concord</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#3318532863308652389">Download</a></td>
</tr>
<tr>
<td><code>2019.04.04.21.31</code></td>
<td>&nbsp;24.6.0</td>
<td>Buried&nbsp;Debts</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#192898029640470386">Download</a></td>
</tr>
<tr>
<td><code>2019.03.15.18.11</code></td>
<td>&nbsp;24.5.1</td>
<td>Buried&nbsp;Debts</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4942488930993990244">Download</a></td>
</tr>
<tr>
<td><code>2019.03.08.00.37</code></td>
<td>&nbsp;24.4.0</td>
<td>Buried&nbsp;Debts</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4404971551504983924">Download</a></td>
</tr>
<tr>
<td><code>2019.03.07.20.21</code></td>
<td>&nbsp;24.4.0</td>
<td>Fortuna</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#1904743723246597237">Download</a></td>
</tr>
<!-- 174676543101364914 is 2018.11.29.15.55, Fortuna, but has a broken font. -->
<tr>
<td><code>2018.11.29.15.55</code></td>
<td>&nbsp;24.1.2</td>
<td>Fortuna</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8040761247114336449">Download</a></td>
</tr>
<tr>
<td><code>2018.11.15.16.49</code></td>
<td>&nbsp;24.0.8</td>
<td>Fortuna</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#3725569727599851360">Download</a></td>
</tr>
<!-- 8461211368258506784 is 2018.11.15.16.49 but needs Tools folder from another manifest + has a broken font. -->
<tr>
<td><code>2018.11.08.14.45</code></td>
<td>&nbsp;24.0.0</td>
<td>Fortuna</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#6046541448142309692">Download</a></td>
</tr>
<tr>
<td><code>2018.10.11.23.29</code></td>
<td>&nbsp;23.10.0</td>
<td>Chimera</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8049567794324118250">Download</a></td>
</tr>
<tr>
<td><code>2018.09.28.19.09</code></td>
<td>&nbsp;23.9.1</td>
<td>Mask&nbsp;of&nbsp;the&nbsp;Revenant</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#1234607834806579897">Download</a></td>
</tr>
<tr>
<td><code>2018.08.01.08.09</code></td>
<td>&nbsp;23.2.0</td>
<td>The&nbsp;Sacrifice</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#677450530474051174">Download</a></td>
</tr>
<tr>
<td><code>2018.06.14.23.21</code></td>
<td>&nbsp;23.0.0</td>
<td>The&nbsp;Sacrifice<!-- Login screen says "Beasts of the Sanctuary" --></td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8058901711639962245">Download</a></td>
</tr>
<tr>
<td><code>2018.05.17.16.28</code></td>
<td>&nbsp;22.20.0</td>
<td>Beasts&nbsp;of&nbsp;the&nbsp;Sanctuary</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#566447983471491143">Download</a></td>
</tr>
<tr>
<td><code>2018.04.20.02.04</code></td>
<td>&nbsp;22.18.0</td>
<td>Beasts&nbsp;of&nbsp;the&nbsp;Sanctuary</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8448828347811631025">Download</a></td>
</tr>
<tr>
<td><code>2018.03.15.19.39</code></td>
<td>&nbsp;22.16.0</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5922375304465722812">Download</a></td>
</tr>
<tr>
<td><code>2018.03.07.14.18</code></td>
<td>&nbsp;22.15.0</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#6640882772717519747">Download</a></td>
</tr>
<tr>
<td><code>2018.02.22.14.34</code></td>
<td>&nbsp;22.13.4</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8004325165498360760">Download</a></td>
</tr>
<!-- 8621631773919294851 is 2018.01.26.12.22, can log in but then you're stuck due to Script Error: attempt to call method 'GetOperator' (a nil value): In ?(844) originating from /Lotus/Scripts/PlayerShip.lua::SpawnPets with owner /Layer0/ScriptTrigger2 -->
<tr>
<td><code>2018.01.04.13.12</code></td>
<td>&nbsp;22.8.2</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4946799727072561536">Download</a></td>
</tr>
<tr>
<td><code>2017.12.12.12.15</code></td>
<td>&nbsp;22.7.0</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5301169201249491747">Download</a></td>
</tr>
<!-- 5914709226935570547 is 2017.12.08.15.29, fails to start due to an assertion failure -->
<tr>
<td><code>2017.11.16.17.34</code></td>
<td>&nbsp;22.2.4</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. -->This version (and prior versions) requires an active voice chat session for audio.</td>
<td><a href="#5869273198520287595">Download</a></td>
</tr>
<tr>
<td><code>2017.10.12.17.04</code></td>
<td>&nbsp;22.0.0</td>
<td>Plains&nbsp;of&nbsp;Eidolon</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4661126446448856114">Download</a></td>
</tr>
<tr>
<td><code>2017.07.26.13.59</code></td>
<td>&nbsp;21.2.0</td>
<td>Chains&nbsp;of&nbsp;Harrow</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#1835327182756411758">Download</a></td>
</tr>
<tr>
<td><code>2017.06.29.03.54</code></td>
<td>&nbsp;21.0.1</td>
<td>Chains&nbsp;of&nbsp;Harrow</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#2970877824413815022">Download</a></td>
</tr>
<tr>
<td><code>2017.06.29.02.13</code></td>
<td>&nbsp;21.0.0</td>
<td>Chains&nbsp;of&nbsp;Harrow</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#9187782625344917768">Download</a></td>
</tr>
<tr>
<td><code>2017.05.05.15.41</code></td>
<td>&nbsp;20.4.0</td>
<td>Octavia's&nbsp;Anthem</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#3099723078202393524">Download</a></td>
</tr>
<tr>
<td><code>2017.03.26.04.21</code></td>
<td>&nbsp;20.0.3</td>
<td>Octavia's&nbsp;Anthem</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4574874014936523212">Download</a></td>
</tr>
<!-- 8705016425420648723 is 2017.03.24.17.25, ~20.0.0, seems to have a broken cache as the loading scaleform doesn't show properly and it doesn't proceed to the login screen -->
<tr>
<td><code>2017.03.06.15.49</code></td>
<td>&nbsp;19.13.0</td>
<td>The&nbsp;Glast&nbsp;Gambit</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#6263571497645662720">Download</a></td>
</tr>
<!-- 2663512682334598162 is 2017.03.03.17.01, ~19.12.1, fails to start due to an assertion failure -->
<!-- 4864838558963648894 is 2017.03.02.14.59, ~19.12.0, fails to start due to an assertion failure -->
<tr>
<td><code>2016.12.21.19.13</code></td>
<td>&nbsp;19.5.0</td>
<td>The&nbsp;Glast&nbsp;Gambit</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#4666421798085404101">Download</a></td>
</tr>
<!-- 6118281920152298389 only contains installscript.vdf -->
<tr>
<td><code>2016.12.16.14.33</code></td>
<td>&nbsp;19.4.1</td>
<td>The&nbsp;War&nbsp;Within</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#8998041413872250076">Download</a></td>
</tr>
<!-- 6784000424578492584 is 2016.11.11.17.46, ~19.0.0, fails to start due to an assertion failure -->
<tr>
<td><code>2016.09.30.12.04</code></td>
<td>&nbsp;18.22.1</td>
<td>The&nbsp;Silver&nbsp;Grove</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#7585839495921050946">Download</a></td>
</tr>
<tr>
<td><code>2016.08.26.11.08</code></td>
<td>&nbsp;18.18.5</td>
<td>The&nbsp;Silver&nbsp;Grove</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#2086935969100698619">Download</a></td>
</tr>
<tr>
<td><code>2016.08.19.17.12</code></td>
<td>&nbsp;18.18.0</td>
<td>The&nbsp;Silver&nbsp;Grove</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#3584168904277131181">Download</a></td>
</tr>
<!-- 8065552974390268707 is 2016.07.08.16.56. Seems to have a broken cache as everyone is A-posing and subtitle texts don't resolve. -->
<!-- 2087739745223261142 is 2016.03.31.15.16, ~18.7.1 Sands of Inaros. Chat scaleform is broken which steals UI focus so can't even access navigation. -->
<tr>
<td><code>2016.03.04.10.06</code></td>
<td>&nbsp;18.5.0</td>
<td>Sands&nbsp;of&nbsp;Inaros</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#1331043799698924734">Download</a></td>
</tr>
<tr>
<td><code>2015.12.09.17.09</code></td>
<td>&nbsp;18.0.6</td>
<td>The&nbsp;Second&nbsp;Dream</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#5378301586494814297">Download</a></td>
</tr>
<!-- 4603106986143048670 is 2015.12.08.16.01, same issues as previous version. -->
<!-- 5567085556474789237 is 2015.12.05.18.07, should be ~18.0.2 The Second Dream, but says The Jordas Precept on the login screen. Seems to have a broken cache as enemy spawns are broken. -->
<tr>
<td><code>2015.10.21.12.48</code></td>
<td>&nbsp;17.8.0</td>
<td>The&nbsp;Jordas&nbsp;Precept</td>
<td><!-- Rename dwmapi.dll to wtsapi32.dll or version.dll. --></td>
<td><a href="#2275730668734249647">Download</a></td>
</tr>
<tr>
<td><code>2015.10.15.12.24</code></td>
<td>&nbsp;17.7.1</td>
<td>The&nbsp;Jordas&nbsp;Precept</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#7055925076570413672">Download</a></td>
</tr>
<tr>
<td><code>2015.05.14.16.29</code></td>
<td>&nbsp;16.5.5</td>
<td>Tubemen&nbsp;of&nbsp;Regor</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#232461576962714068">Download</a></td>
</tr>
<tr>
<td><code>2015.03.21.08.17</code></td>
<td>&nbsp;16.0.2</td>
<td>Sanctuary</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#567734397704178704">Download</a></td>
</tr>
<tr>
<td><code>2015.02.13.10.41</code></td>
<td>&nbsp;15.14.1</td>
<td>Eyes&nbsp;of&nbsp;Blight</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#5952644847955190118">Download</a></td>
</tr>
<tr>
<td><code>2014.11.27.14.35</code></td>
<td>&nbsp;15.5.0</td>
<td>Mesa&nbsp;Update</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#7377933404197762308">Download</a></td>
</tr>
<tr>
<td><code>2014.10.29.18.19</code></td>
<td>&nbsp;15.0.8</td>
<td>Archwing</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#6368936033089773713">Download</a></td>
</tr>
<tr>
<td><code>2014.10.28.17.15</code></td>
<td>&nbsp;15.0.7</td>
<td>Archwing</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#1212629036031221707">Download</a></td>
</tr>
<tr>
<td><code>2014.10.27.17.07</code></td>
<td>&nbsp;15.0.6</td>
<td>Archwing</td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#1048315274024428186">Download</a></td>
</tr>
<tr>
<td><code>2014.10.24.08.24</code></td>
<td>&nbsp;15.0.0</td>
<td>Archwing<!-- Login screen says "The Mad Cephalon" --></td>
<td><!-- Rename DLL & -->Copy "Tools" folder from 2015.10.21.12.48</td>
<td><a href="#6636116079410913663">Download</a></td>
</tr>
</tbody>
</table>
<h3>2013 Warframe</h3>
<p>There is a DLL + fork of SpaceNinjaServer that can be used to revisit 2013 Warframe. More information about this can be found <a href="https://discord.gg/PNNZ3asUuY">on our Discord</a>, specifically <a href="https://discord.com/channels/1108159019635462206/1280628166825873510/1280628233355923497">in this thread</a>.</p>
<p>Another project in this niche is <a href="https://github.com/mekael/WFClassic">Mekael's WFClassic</a>.</p>
</div>
<div id="depot-download-view" class="d-none">
<h3>Downloading <span class="version-name"></span></h3>
<p>You will need:</p>
<ul>
<li>A Steam account with Warframe in its library</li>
<li><a href="https://github.com/SteamRE/DepotDownloader/releases" target="_blank">DepotDownloader</a></li>
</ul>
<p>Then, to download this version, simply run <code>DepotDownloader -app 230410 -depot 230411 -manifest <span class="manifest-id"></span> -username &lt;your steam username&gt; -remember-password</code>. Note that DepotDownloader may report errors; these are generally only temporary and it will try again.</p>
</div>
<div id="patch-download-view" class="d-none">
<h3>Downloading <span class="version-name"></span></h3>
<p>You will need:</p>
<ul>
<li>A Steam account with Warframe in its library</li>
<li><a href="https://github.com/SteamRE/DepotDownloader/releases" target="_blank">DepotDownloader</a></li>
</ul>
<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>
<ul>
<li>Note that DepotDownloader may report errors; these are generally only temporary and it will try again.</li>
</ul>
</li>
<li>
Download the update patch
<ul>
<li><a href="https://mega.nz/file/t1ImwaQY#fova1j0G6u5RUhksghiYCLDkCP_a2oLge-FQScKh30w" target="_blank">From Mega</a></li>
<li>Via BitTorrent v1 compatible software: <a href="magnet:?xt=urn:btih:04f15ff0082809b38804d2ccc6e2edadd6f40468&dn=39.1.3&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce">Magnet</a></li>
</ul>
</li>
<li>Now you can replace your Warframe.x64.exe and place the OpenWF/Content folder which the Bootstrapper (version 0.11.13 and up) will pick up</li>
</ol>
</div>
</div>
<script src="_assets/bootstrap.bundle.min.js"></script>
<script src="_assets/censorcanary.min.js" defer></script>
<script>
window.onhashchange = function()
{
document.getElementById("main-view").classList.add("d-none");
document.getElementById("depot-download-view").classList.add("d-none");
document.getElementById("patch-download-view").classList.add("d-none");
const hash = location.hash.toString().replace("#", "");
if (hash)
{
if (hash == "39.1.3")
{
document.getElementById("patch-download-view").classList.remove("d-none");
document.querySelectorAll(".version-name").forEach(x => x.textContent = hash);
document.querySelectorAll(".manifest-id").forEach(x => x.textContent = "8391191747297658560");
}
else
{
document.getElementById("depot-download-view").classList.remove("d-none");
document.querySelectorAll(".version-name").forEach(x => x.textContent = hash);
document.querySelectorAll(".manifest-id").forEach(x => x.textContent = hash);
}
}
else
{
document.getElementById("main-view").classList.remove("d-none");
}
};
window.onhashchange();
</script>
</body>
</html>

View File

@ -0,0 +1,12 @@
if (Test-Path "Warframe.x64.exe") {
if (!(Test-Path "OpenWF/Download Latest DLL.ps1")) {
[System.IO.Directory]::CreateDirectory("OpenWF") | Out-Null
Invoke-WebRequest -Uri "https://openwf.io/supplementals/Download%20Latest%20DLL.ps1" -OutFile "OpenWF/Download Latest DLL.ps1"
}
Set-Location -Path OpenWF
& "$PSScriptRoot\OpenWF\Download Latest DLL.ps1"
}
else {
Write-Host "Please put this script into your Warframe installation folder (the one where Warframe.x64.exe is in) before running it."
Start-Sleep -Seconds 864000
}

View File

@ -0,0 +1,13 @@
#!/usr/bin/env bash
if [[ -f "Warframe.x64.exe" ]]; then
if [[ ! -f "OpenWF/Download Latest DLL.sh" ]]; then
mkdir -p OpenWF
curl -L "https://openwf.io/supplementals/Download%20Latest%20DLL.sh" -o "OpenWF/Download Latest DLL.sh"
fi
cd OpenWF
chmod +x "Download Latest DLL.sh"
./Download\ Latest\ DLL.sh
else
echo "Please put this script into your Warframe installation folder (the one where Warframe.x64.exe is in) before running it."
fi

View File

@ -0,0 +1,65 @@
Write-Host "Fetching latest version..."
$latest = Invoke-RestMethod -Uri "https://openwf.io/supplementals/client%20drop-in/meta" -Method Get
$dll_path = "../wtsapi32.dll"
if (Test-Path "../dwmapi.dll") {
$dll_path = "../dwmapi.dll"
}
if (Test-Path "../version.dll") {
$dll_path = "../version.dll"
}
$sha256 = ""
if (Test-Path $dll_path) {
$sha256 = (Get-FileHash $dll_path -Algorithm SHA256).Hash.ToLower()
}
$hotfix_sha256 = ""
if (Test-Path "Hotfix.owf") {
$hotfix_sha256 = (Get-FileHash "Hotfix.owf" -Algorithm SHA256).Hash.ToLower()
}
$sideloadify_sha256 = ""
if (Test-Path "sideloadify-cli.cache") {
$sideloadify_sha256 = (Get-FileHash "sideloadify-cli.cache" -Algorithm SHA256).Hash
}
if ($sideloadify_sha256 -ne "EE990FF8366E49DE5AF5A80DB845A9BFE9285092365E3A887FDFC76EB20C61AF") {
Invoke-WebRequest -Uri "https://github.com/Sainan/Sideloadify/releases/download/1.1.0/sideloadify-cli.exe" -OutFile "sideloadify-cli.cache"
}
$should_sleep = $false
if ($sha256 -ne $latest.sha256 -or $hotfix_sha256 -ne $latest.hotfix_sha256) {
if ($latest.hotfix -ne "") {
Write-Host "Downloading OpenWF Bootstrapper v$($latest.version) $($latest.hotfix)..."
}
else {
Write-Host "Downloading OpenWF Bootstrapper v$($latest.version)..."
}
if ($sha256 -ne $latest.sha256) {
Invoke-WebRequest -Uri "https://openwf.io/supplementals/client%20drop-in/$($latest.version)/dwmapi.dll" -OutFile $dll_path
}
if ($hotfix_sha256 -ne $latest.hotfix_sha256) {
if ($latest.hotfix -ne "") {
Invoke-WebRequest -Uri "https://openwf.io/supplementals/client%20drop-in/$($latest.version)/$($latest.hotfix)/Hotfix.owf" -OutFile "Hotfix.owf"
}
else {
Remove-Item "Hotfix.owf"
}
}
}
else {
Write-Host "Your OpenWF Bootstrapper is up-to-date."
$should_sleep = $true
}
Rename-Item -Path "sideloadify-cli.cache" -NewName "sideloadify-cli.exe"
$sideloadified = (./sideloadify-cli.exe ../Warframe.x64.exe).Contains(" has successfully been sideloadified.")
Rename-Item -Path "sideloadify-cli.exe" -NewName "sideloadify-cli.cache"
if ($sideloadified) {
Write-Host "Warframe.x64.exe has successfully been sideloadified."
$should_sleep = $true
}
if ($should_sleep) {
Start-Sleep -Seconds 2
}

View File

@ -0,0 +1,38 @@
#!/usr/bin/env bash
echo "Fetching latest version..."
latest_version=$(curl -s "https://openwf.io/supplementals/client%20drop-in/latest.txt")
latest_hotfix=$(curl -s "https://openwf.io/supplementals/client%20drop-in/latest_hotfix.txt")
latest_sha256=$(curl -s "https://openwf.io/supplementals/client%20drop-in/sha256.txt")
latest_hotfix_sha256=$(curl -s "https://openwf.io/supplementals/client%20drop-in/sha256_hotfix.txt")
sha256=""
hotfix_sha256=""
if [[ -f "../dwmapi.dll" ]]; then
sha256=$(sha256sum "../dwmapi.dll" | awk '{print $1}')
fi
if [[ -f "Hotfix.owf" ]]; then
hotfix_sha256=$(sha256sum "Hotfix.owf" | awk '{print $1}')
fi
if [[ "$sha256" != "$latest_sha256" || "$hotfix_sha256" != "$latest_hotfix_sha256" ]]; then
if [[ -n "$latest_hotfix" ]]; then
echo "Downloading OpenWF Bootstrapper v$latest_version $latest_hotfix..."
else
echo "Downloading OpenWF Bootstrapper v$latest_version..."
fi
if [[ "$sha256" != "$latest_sha256" ]]; then
curl -L "https://openwf.io/supplementals/client%20drop-in/$latest_version/dwmapi.dll" -o "../dwmapi.dll"
fi
if [[ "$hotfix_sha256" != "$latest_hotfix_sha256" ]]; then
if [[ -n "$latest_hotfix" ]]; then
curl -L "https://openwf.io/supplementals/client%20drop-in/$latest_version/${latest_hotfix// /%20}/Hotfix.owf" -o "Hotfix.owf"
else
rm -f "Hotfix.owf"
fi
fi
else
echo "Your OpenWF Bootstrapper is up-to-date."
fi