This commit is contained in:
wxhn1225 2025-10-06 18:27:00 +08:00
commit 3a3257fa37
30 changed files with 1515 additions and 0 deletions

33
Client Config.json Normal file
View File

@ -0,0 +1,33 @@
{
"fallback_language": "zh",
"fallback_languageVO": "",
"fallback_graphicsDriver": "dx12",
"fallback_cluster": "public",
"server_host": "127.0.0.1",
"http_port": 80,
"https_port": 443,
"autologin": false,
"autologin_email": "",
"autologin_password": "",
"high_damage_numbers_patch": true,
"simulacrum_blacklisted": false,
"simulacrum_whitelisted": true,
"pause_always_stops_time": false,
"disable_nrs_connection": true,
"ee_log_in_console": false,
"skip_mission_start_timer": false,
"logout_on_request_failure": true,
"fov_override": 0.0,
"forced_profile_dir": "",
"auto_start_scripts": [
"samples/Chat Commands.pluto"
],
"alternative_loading": false,
"dont_resolve_labels": false,
"save_all_metadata": false,
"write_all_metadata_reads_to_console": false,
"write_all_metadata_reads_to_ee_log": false,
"write_patched_metadata_reads_to_console": false,
"write_patched_metadata_reads_to_ee_log": false,
"client_http_port": 6155
}

Binary file not shown.

Binary file not shown.

65
Download Latest DLL.ps1 Normal file
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
}

28
Hotkeys.json Normal file
View File

@ -0,0 +1,28 @@
[
// By default, O opens the in-game settings:
{
"key": "O",
"script": "owf_toggle_script[[samples/Settings.pluto]]"
},
// Some additional samples:
// {
// "key": "K",
// "script": "owf_toggle_script[[samples/Cycle Camera.pluto]]"
// },
// {
// "key": "N",
// "script": "owf_toggle_script[[samples/Noclip.pluto]]"
// },
// {
// "key": 186, // the key to the right of L
// "shift": false,
// "script": "set_ee_log_in_console(not get_ee_log_in_console())"
// },
// The presence of a modifier (ctrl, shift, or alt) means it must be pressed/released depending on the value (true/false).
]

View File

@ -0,0 +1 @@
/Menu/ProjectName: Warframe [OpenWF]

View File

@ -0,0 +1,13 @@
# Lines starting with # are a comment.
#
# An example patch that renames "Vitality" to "Moar Health" and changes it from +9% to +100%:
#
# /Lotus/Upgrades/Mods/Warframe/AvatarHealthMaxMod
# LocalizeTag=Moar Health
# r|Value=0.090910003|Value=1
#
# When this patch is applied and the type has been loaded by the game, you can get the effective metadata via the http interface:
# http://localhost:6155/get_effective_metadata?/Lotus/Upgrades/Mods/Warframe/AvatarHealthMaxMod
# For logging only, you can supply an empty patch or enable "save_all_metadata" in the Client Config at the expense of slower loading.
#
# Modifications to this file will only apply after a restart of the game.

149
Reference Manual.html Normal file
View File

@ -0,0 +1,149 @@
<!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>
<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>
<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, with leading and trailing spaces and tabs being ignored:</p>
<ul>
<li><code>&gt; /Path/Here</code> starts a patch that will be applied to <code>/Path/Here</code>.</li>
<li><code>&gt; /First/Path &amp; /Second/Path</code> starts a patch that will be applied to <code>/First/Path</code> and <code>/Second/Path</code>. It is possible to stretch this over multiple lines by either ending a line with <code>&amp;</code> or starting the new line <code>&amp;</code>.</li>
<li>Any line not starting with a special token (<code>&gt;</code>, <code>r|</code>, ...) is added as a prefix to all affected metadata. This works to add top-level properties but also to replace them because the game resolves duplicates by ignoring subsequent entries.</li>
<li>Lines starting with <code>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>
<br>
</body>
</html>

797
Script API Reference.pluto Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,9 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
for gRegion:GetLocalPlayer():GetHudStatus():GetFlashMarkers() as marker do
if marker.markerType == 49 and not marker.garbage then
gRegion:GetLocalPlayerAvatar():SetPosition(marker.baseMarkerInfo:GetPosition())
marker.baseMarkerInfo:Destroy()
end
end
until yield()

View File

@ -0,0 +1,9 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local name = "/Lotus/Powersuits/Stalker/Stalker"
local loader = UISys.ScriptResLoader_Create({ name })
repeat yield() until loader:IsDone()
gRegion:GetLocalPlayerAvatar():InventoryControl():RemoveItem(Engine.SLOT_4, true)
gRegion:GetLocalPlayerAvatar():GiveItem(Type(name), true)
gRegion:GetLocalPlayerAvatar():InventoryControl():GetActivePowerSuit():SetXP(1600000)

View File

@ -0,0 +1,140 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local function streaming_request(names)
local loader = UISys.ScriptResLoader_Create(names)
repeat yield() until loader:IsDone()
end
local commands = {}
commands["god"] = function()
local avatar = gRegion:GetLocalPlayerAvatar()
if avatar instanceof LotusVehicleAvatar then
avatar = avatar:GetRider()
end
if avatar:DamageControl():HasTemporaryImmunity() then
avatar:DamageControl():RemoveTemporaryImmunity()
chat_system_reply("Removed immunity.")
else
avatar:DamageControl():GiveTemporaryImmunity(500000, 500000)
chat_system_reply("Granted immunity.")
end
end
commands["suicide"] = function()
if gGameRules instanceof LotusGameRules then
gRegion:GetLocalPlayerAvatar():Suicide()
else
chat_system_reply("That's not a good idea.")
end
end
commands["killall"] = function()
local player = gRegion:GetLocalPlayerAvatar()
for gRegion:GetAvatars() as avatar do
if not avatar:IsAvatarFriendly(player) then
avatar:Suicide()
end
end
end
commands["kdrive"] = function()
streaming_request({ "/Lotus/Types/Enemies/Corpus/Venus/Hoverboard/CrpHoverboardUnmannedAvatar" })
gRegion:CreateEntity(Type("/Lotus/Types/Enemies/Corpus/Venus/Hoverboard/CrpHoverboardUnmannedAvatar"))
end
commands["dargyn"] = function()
streaming_request({ "/Lotus/Types/Enemies/Grineer/Eidolon/GrineerSkiff/GrineerSkiffUnmannedAvatar" })
gRegion:CreateEntity(Type("/Lotus/Types/Enemies/Grineer/Eidolon/GrineerSkiff/GrineerSkiffUnmannedAvatar"))
end
commands["kaithe"] = function()
gRegion:GetNpcMgr():CreateAgentAtPosition(Type("/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorseUnmannedGearSummonItemAgent"), gRegion:GetLocalPlayerAvatar():GetPosition(), ZERO_ROTATION)
end
commands["simulacrum"] = function()
local args = Engine.OpenLevelArgs()
args:SetLevel("/Lotus/Levels/Tenno/SimulacrumEnemySpawnerC.level")
args:SetGameRules("/Lotus/Types/GameRules/LotusDangerRoomGameRules")
Engine.OpenLevel(args)
end
commands["level"] = function(text)
local level = text:split(" ")[2]
chat_system_reply("Loading level "..level)
local args = Engine.OpenLevelArgs()
args:SetLevel(level)
Engine.OpenLevel(args)
end
commands["captura"] = function(text)
local level = text:split(" ")[2]
chat_system_reply("Opening Captura in "..level)
local args = Engine.OpenLevelArgs()
args:SetLevel(level)
args:SetGameRules("/Lotus/Types/GameRules/LotusPhotoBoothGameRules")
Engine.OpenLevel(args)
end
commands["energy"] = function()
local avatar = gRegion:GetLocalPlayerAvatar()
if avatar instanceof LotusVehicleAvatar then
avatar = avatar:GetRider()
end
avatar:InventoryControl():GetActivePowerSuit():SetMaxEnergy(1000000)
avatar:InventoryControl():GetActivePowerSuit():SetEnergy(1000000)
end
commands["scale"] = function(text)
local scale = tonumber(text:split(" ")[2])
if scale ~= 0 then
gRegion:GetLocalPlayerAvatar():SetMeshScale(scale)
else
chat_system_reply("That's not a good idea.")
end
end
commands["timescale"] = function(text)
local scale = tonumber(text:split(" ")[2])
if scale == 1 then
gGameRules:CancelSlomo()
elseif scale > 0 then
gGameRules:RequestSlomo(scale)
else
chat_system_reply("That's not a good idea.")
end
end
commands["pause"] = function()
gGameRules:RequestPause()
end
commands["unpause"] = function()
gGameRules:RequestUnpause()
end
commands["script"] = function(text)
local query = text:sub(text:find(" ") + 1):lower()
if query:sub(-6) ~= ".pluto" then
query ..= ".pluto"
end
if script := owf_get_running_scripts():find(|x| -> x:lower() == query) then
owf_stop_script(script)
chat_system_reply($"Stopped {script}.")
elseif script := owf_get_available_scripts():find(|x| -> x:lower() == query) then
owf_start_script(script)
chat_system_reply($"Started {script}.")
else
chat_system_reply($"No such script: {query}")
end
end
commands["sync"] = function()
gGameData:SyncInventoryFromDB()
end
commands["resync"] = commands["sync"]
commands["unstick"] = function()
gGameRules:UnstickLocalPlayer()
end
commands["quit"] = function()
gFlashMgr:ExecuteToolMenuCommand(Resource("/EE/Editor/ToolMenus/Commands/CmdQuit"))
end
for prefix in commands do
chat_subscribe_prefix("/"..prefix, true)
chat_subscribe_outgoing_prefix("$"..prefix)
end
repeat
while evt := owf_next_event() do
if evt.type == OWF_EVT_SUBMIT_CHAT_MESSAGE or evt.type == OWF_EVT_OUTGOING_CHAT_MESSAGE then
for prefix, f in commands do
if evt.text:sub(2, #prefix + 1) == prefix then
f(evt.text)
break
end
end
end
end
until yield()

View File

@ -0,0 +1,6 @@
-- Modifications to sample scripts will be lost the next time you start the game.
if gGameRules instanceof LotusGameRules then
gGameRules:OpenMissionContinueDialog(nil)
else
print("Not available in the current mission")
end

View File

@ -0,0 +1,13 @@
-- Modifications to sample scripts will be lost the next time you start the game.
if gRegion:GetLocalPlayerAvatar():isFollowedByCamera() then
-- Normal -> Freecam
gRegion:GetLocalPlayer():setControllingCamera(true)
gRegion:GetLocalPlayerAvatar():ControlCamera(false)
elseif gRegion:GetLocalPlayer():isControllingCamera() then
-- Freecam -> Locked In Place
gRegion:GetLocalPlayer():setControllingCamera(false)
else
-- Locked In Place -> Normal
gRegion:GetLocalPlayer():setControllingCamera(false)
gRegion:GetLocalPlayerAvatar():ControlCamera(true)
end

View File

@ -0,0 +1,26 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local Health = Localize("/Lotus/Language/Labels/HUD_COLOR_HEALTH")
local Shield = Localize("/Lotus/Language/Labels/HUD_COLOR_SHIELD")
local Armor = Localize("/Lotus/Language/Labels/HUD_COLOR_ARMOR")
local Overguard = Localize("/Lotus/Language/Labels/HUD_COLOR_PROTECTED_HEALTH")
repeat
for gRegion:FindAll(Type("/Lotus/Types/Game/LotusNpcAvatar")) as ent do
local dc = ent:DamageControl()
local name = Localize(ent:GetLocTag():c_str())
if ent:GetEnhancementCount() ~= 0 then
name = Localize(ent:GetEnhancementLocTag():c_str(), {
ENEMY = name
})
end
ent:SetDynamicUIName(true)
ent:SetUIName(
name
.."\r\n"..Health..": "..string.formatint(ent:GetHealth()).." / "..string.formatint(ent:GetMaxHealth())
.."\r\n"..Shield..": "..string.formatint(dc:GetShield()).." / "..string.formatint(dc:GetMaxShield())
.."\r\n"..Armor..": "..string.formatint(dc:GetArmourRating())
.."\r\n"..Overguard..": "..string.formatint(dc:GetOverguardAmount())
)
end
until yield()

View File

@ -0,0 +1,8 @@
-- Modifications to sample scripts will be lost the next time you start the game.
while not gPlayerProfileMgr:IsLoggedIn() do
yield()
end
local args = Engine.OpenLevelArgs()
args:SetLevel("/Lotus/Levels/Tenno/SimulacrumEnemySpawnerC.level")
args:SetGameRules("/Lotus/Types/GameRules/LotusDangerRoomGameRules")
Engine.OpenLevel(args)

View File

@ -0,0 +1,22 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local in_air_toggle = owf_script_add_toggle("In Air")
repeat
local cc = gRegion:GetLocalPlayer():CameraControl()
cc:SetViewOffset(Vector(0, -0.1, 0.5))
cc:SetAimViewOffset(Vector(0, -0.1, 0.5))
cc:SetRunViewOffset(Vector(0, -0.1, 0.5))
cc:SetDodgeOffset(Vector(0, -0.1, 0.5))
if in_air_toggle.value then
cc:SetInAirViewOffset(Vector(0, -0.1, 0.5))
cc:SetInAirAimViewOffset(Vector(0, -0.1, 0.5))
end
cc:SetMeleeOffset(Vector(0, -0.1, 0.5))
cc:SetCoverLeftViewOffset(Vector(0, -0.1, 0.5))
cc:SetCoverRightViewOffset(Vector(0, -0.1, 0.5))
cc:SetCrouchCoverAimLeftViewOffset(Vector(0, -0.1, 0.5))
cc:SetCrouchCoverAimRightViewOffset(Vector(0, -0.1, 0.5))
cc:SetWallRunLeftViewOffset(Vector(0, -0.1, 0.5))
cc:SetWallRunRightViewOffset(Vector(0, -0.1, 0.5))
cc:SetWallRunLeftAimViewOffset(Vector(0, -0.1, 0.5))
cc:SetWallRunRightAimViewOffset(Vector(0, -0.1, 0.5))
until yield()

View File

@ -0,0 +1,17 @@
local was_in_freecam = false
local last_pos
repeat
if avatar := gRegion:GetLocalPlayerAvatar() then
if avatar:isFollowedByCamera() then
if was_in_freecam then
was_in_freecam = false
avatar:SetPosition(last_pos)
end
else
was_in_freecam = gRegion:GetLocalPlayer():isControllingCamera()
if was_in_freecam then
last_pos = gRegion:GetGameCamera():GetPosition()
end
end
end
until yield()

View File

@ -0,0 +1,19 @@
-- Modifications to sample scripts will be lost the next time you start the game.
$define VK_CONTROL = 0x11
$define VK_SPACE = 0x20
local Y_STEP <const> = Vector(0, 0.01, 0)
local t = os.millis()
repeat
local delta = os.millis() - t
if gRegion:GetLocalPlayer():isControllingCamera() then
if owf_is_key_down(VK_SPACE) then
gRegion:GetGameCamera():SetPosition(gRegion:GetGameCamera():GetPosition() + Y_STEP * delta)
end
if owf_is_key_down(VK_CONTROL) then
gRegion:GetGameCamera():SetPosition(gRegion:GetGameCamera():GetPosition() - Y_STEP * delta)
end
end
t = os.millis()
until yield()

View File

@ -0,0 +1,15 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
if avatar := gRegion:GetLocalPlayerAvatar() then
if avatar instanceof LotusVehicleAvatar then
avatar = avatar:GetRider()
end
avatar:DamageControl():GiveTemporaryImmunity(500000, 500000)
end
until not pcall(yield)
local avatar = gRegion:GetLocalPlayerAvatar()
if avatar instanceof LotusVehicleAvatar then
avatar = avatar:GetRider()
end
avatar:DamageControl():RemoveTemporaryImmunity()

View File

@ -0,0 +1,9 @@
-- Modifications to sample scripts will be lost the next time you start the game.
if weapon := gRegion:GetLocalPlayerAvatar():InventoryControl():GetWeaponInHand(0) then
local impactBehavior = weapon:GetActiveImpactBehavior()
impactBehavior.criticalHitChance = 10000
impactBehavior.criticalHitDamageMultiplier = 10000
print("Your weapon damage has been increased!")
else
print("You don't seem to have a weapon in hand.")
end

View File

@ -0,0 +1,9 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
local player = gRegion:GetLocalPlayerAvatar()
for gRegion:GetAvatars() as avatar do
if not avatar:IsAvatarFriendly(player) then
avatar:Suicide()
end
end
until yield()

View File

@ -0,0 +1,8 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
for gRegion:GetAvatars() as avatar do
if inventory := avatar:InventoryControl() then
inventory:DoItemDrop()
end
end
until yield()

View File

@ -0,0 +1,10 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
if suit := gRegion:GetLocalPlayerAvatar():InventoryControl():GetActivePowerSuit() then
for i = 0, 3 do
if ability := suit:GetAbilityByIndex(i) then
ability:SetCooldownTime(0)
end
end
end
until yield()

View File

@ -0,0 +1,27 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local avatar
local function disable()
if not IsNull(avatar) then
avatar:SetCustomAnimController(nil)
avatar:SetCustomMotionController(nil)
if (mc := avatar:MotionControl()) instanceof LotusSpaceFlightMotionController then
mc:EnableFlight(false)
end
avatar:SetCustomCameraController(nil)
avatar:SetPostureModifier(PostureModifier.PM_AIRBORNE, false)
avatar:SetCollisionEnabled(true)
end
end
repeat
if avatar ~= gRegion:GetLocalPlayerAvatar() then
disable()
avatar = gRegion:GetLocalPlayerAvatar()
end
if not IsNull(avatar) then
avatar:SetCustomAnimController(Type("/Lotus/Powersuits/Fairy/FairyFlightAnimController"))
avatar:SetCustomMotionController(Type("/Lotus/Types/Game/LotusGroundFlightMotionController"))
avatar:SetCustomCameraController(Type("/Lotus/Types/Player/SpaceBattle/SpaceMoveCameraController"))
avatar:SetCollisionEnabled(false)
end
until not pcall(yield)
disable()

View File

@ -0,0 +1,59 @@
-- Modifications to sample scripts will be lost the next time you start the game.
local { CHECKBOX, INPUTBOX } = require "Lotus.Interface.LotusUtilities"
local dict = get_lang_dict()
local options = {
{ dict.high_damage_numbers_patch, get_high_damage_numbers_patch, set_high_damage_numbers_patch },
{ dict.skip_mission_start_timer, get_skip_mission_start_timer, set_skip_mission_start_timer },
{ dict.simulacrum_blacklisted, get_simulacrum_blacklisted, set_simulacrum_blacklisted },
{ dict.simulacrum_whitelisted, get_simulacrum_whitelisted, set_simulacrum_whitelisted },
{ dict.alternative_loading, get_alternative_loading, set_alternative_loading },
{ dict.ee_log_in_console, get_ee_log_in_console, set_ee_log_in_console },
{ dict.dont_resolve_labels, get_dont_resolve_labels, set_dont_resolve_labels },
{ dict.fov_override, get_fov_override, |s| -> set_fov_override(tonumber(s) or 0) },
}
local done = false
local movie = _T.OpenScreen("GenericSettings")
movie:Execute("SetTitle", "OpenWF In-Game Options")
function _T.owfSampleSettingsChangesDone(inputs, cancel)
if not cancel then
for i, opt in options do
local value = type(opt[4]) == "boolean" ? inputs[i].mValue : inputs[i].mContent
if opt[4] ~= value then
print(opt[1].." set to "..value)
opt[3](value)
end
end
end
done = true
end
movie:Execute("SetCallBack", "owfSampleSettingsChangesDone")
function _T.owfSampleGetSettings()
return options:mapped(function(opt)
opt[4] = opt[2]()
if type(opt[4]) == "boolean" then
return {
mLabel = opt[1],
mType = CHECKBOX,
mValue = opt[4],
}
end
return {
mLabel = opt[1],
mType = INPUTBOX,
mContent = opt[4],
mMaxChars = 500,
mMultiLine = false,
mSkipAutoFocus = true,
}
end)
end
movie:Execute("SetElementsFunction", "owfSampleGetSettings")
movie:Execute("SetConfirmButtonActive", "true")
movie:Execute("EnableHints", "")
repeat
until done or not pcall(yield)
if not IsNull(movie) then
movie:Close()
end

View File

@ -0,0 +1,7 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
if _T.AddHudTracker then
require("Lotus.Scripts.Libs.ObjectiveText").SetPrimaryObjText(string.format("%.2f KMH", (gRegion:GetLocalPlayerAvatar():GetSpeed() * 3.6)))
end
until not pcall(yield)
require("Lotus.Scripts.Libs.ObjectiveText").ClearPrimaryObjText()

View File

@ -0,0 +1,11 @@
-- Modifications to sample scripts will be lost the next time you start the game.
repeat
local npcAvatars = gRegion:FindAll(gLotusNpcAvatarType)
for npcAvatars as avatar do
if IsNull(avatar:GetAttachment(Type("/Lotus/Fx/Gameplay/Fishing/FishHighlightVision"))) then
local proj = avatar:Attach(Type("/Lotus/Fx/Gameplay/Fishing/FishHighlightVision"), EMPTY_SYMBOL, ZERO_VECTOR, ZERO_ROTATION)
proj:SetTint(Color(255, 0, 0))
proj:SetMaterialParam(Symbol("FadeParams"), 0, 100)
end
end
until yield()

View File

@ -0,0 +1,5 @@
-- Modifications to sample scripts will be lost the next time you start the game.
owf_overlay_add_text(12, 12, "OpenWF", OWF_FONT_SIMPLE8, 0, 0, 0, 2) -- shadow
owf_overlay_add_text(10, 10, "OpenWF", OWF_FONT_SIMPLE8, 90, 253, 123, 2) -- text
owf_overlay_update()
while pcall(yield) do end -- keep the script running

BIN
sideloadify-cli.cache Normal file

Binary file not shown.