Skip to content

fix: consolidate startup, navigator, LAN administration, RP speed limits and graphics defaults - #3481

Merged
thibautgnt merged 36 commits into
openOMSI-org:mainfrom
isaacsa2:fix/combined-startup-navigator-lan-rp-upstream-20261030
Oct 31, 2026
Merged

thibautgnt merged 36 commits into
openOMSI-org:mainfrom
isaacsa2:fix/combined-startup-navigator-lan-rp-upstream-20261030

Conversation

@isaacsa2

@isaacsa2 isaacsa2 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What changes for the player?

This PR consolidates multiple fixes and improvements for openOMSI, focusing on vehicle startup compatibility, navigator geometry, multiplayer administration, optional RP driving rules, performance defaults, plugin stability and build reliability.

The changes are intended for upstream integration while preserving existing player configurations and compatibility wherever possible.

1. Vehicle startup and ignition improvements

Improves automatic startup for vehicles using different electrical and ignition systems.

  • Supports separate battery-master switches.
  • Handles multi-stage ignition keys.
  • Supports ignition stages that start the engine without a dedicated starter trigger.
  • Prevents reverse and engine-stop commands from being selected as startup actions.
  • Improves recovery after engine stalls.
  • Adds regression tests for different startup sequences.

2. Navigator geometry improvements

Improves rendering of dense maps without prematurely discarding roads or ground geometry.

Updated geometry limits:

Component Vertex limit
Ground 2,000,000
Building shadows 750,000
Building walls 750,000
Building roofs 750,000
Combined maximum 4,250,000

The combined raw vertex-data ceiling is approximately 243 MiB at 60 bytes per vertex. This is not a preallocated allocation.

  • Normal maps preserve exact geometry while under budget.
  • Extremely dense maps can use reduced ground geometry rather than simply losing later ground layers.
  • The larger limits reduce the risk of unnecessary visual degradation on maps such as Berlin-Spandau.
  • Existing Classic 2D navigation and GPU device-loss recovery are preserved.
  • The launcher city map retains its separate geometry path.

The fallback can still reduce visual fidelity when triggered, so real-map comparisons remain important.

3. Dedicated-server administration and teleportation

Restores and improves server-authorized multiplayer relocation.

Supported operations include:

  • F4 map teleportation.
  • Navigator/city-map teleportation.
  • Teleportation to entry points.
  • Going to another player's vehicle.
  • Bringing players to the administrator.
  • Bringing all players to the administrator.
  • Recovering overturned vehicles.

Teleport requests are validated using the authenticated network peer and server-side permissions.

The server rejects invalid destinations and unauthorized actions.

Configuration:

```ini allow_player_teleport = 0 ```

The default remains restricted.

Setting it to 1 permits ordinary players to relocate their own vehicles, without granting authority over other players.

Player-hosted LAN sessions retain their previous host-only behavior.

4. Optional RP speed limiter

Dedicated servers may configure:

```ini speed_limit_kmh = 60 ```

Supported values: 0, 60, 75, 80.

  • Progressive throttle reduction near the configured limit.
  • Limited braking assistance when exceeding the limit.
  • No abrupt velocity clamping.
  • Normal steering, reverse and braking remain available.
  • Server policy is requested on connection and reconnection instead of repeatedly during gameplay.

This remains a cooperative client-side RP mechanism, not server-enforced anti-cheat.

0 disables the feature and remains the default.

5. Graphics performance defaults

Fresh configurations disable certain optional GPU-intensive effects by default:

  • Accumulated snow on roads and roofs.
  • Enhanced light-shadow maps.

These features remain fully selectable in the graphics settings.

Existing saved preferences are preserved.

Performance improvements depend on the rendering mode, season, weather and hardware. No universal FPS increase is claimed.

6. Temporary plugin safety defaults

Important: Disabling optional plugins by default is a temporary safety and stability measure until the existing plugin compatibility issues are properly resolved.

Some legacy OMSI plugins and external integrations have been reported to cause freezes, stalls or unexpected behavior under openOMSI.

Potential main-thread blocking and plugin compatibility issues are still being investigated.

The temporary default reduces the likelihood of exposing new installations to these problems before the underlying causes are fixed.

Compatibility policy:

  • Fresh installations without a settings file: optional plugins disabled by default.
  • Existing settings files without disable_plugins: previous plugin behavior preserved.
  • Explicit settings: user preferences always respected.
  • Trusted plugins: users may enable them manually.
  • Standard OMSI bus scripts: remain operational.

This is not intended to permanently disable plugin support.

Once the execution and compatibility problems have been corrected and validated, the temporary default should be reassessed.

7. Build and test reliability

  • Adds retry handling for transient Android SDK/NDK installation failures in GitHub Actions.
  • Improves Windows test-port selection by handling PermissionDenied and AddrInUse.
  • Does not change release signing, publishing permissions or download sources.

8. Localization and compatibility fixes

  • Adds 29 language translations for dedicated-server teleport feedback.
  • Preserves existing reusable translation keys where possible.
  • Restores successful local teleport messages.
  • Preserves player-hosted LAN feedback.
  • Adds dedicated-server capability negotiation.
  • Updates the CHANGELOG to document the fixes and changes to defaults.

How to test

Vehicle startup

  • Test conventional ignition and multi-stage ignition.
  • Verify battery-master initialization.
  • Test engine-stall recovery.
  • Confirm reverse and stop triggers are never incorrectly activated.

Navigator

  • Compare Berlin-Spandau and Xiahai against upstream main.
  • Test navigator panel and city map.
  • Inspect roads, building geometry, shadows and ground coverage.
  • Check zooming, panning, memory usage and rebuild performance.
  • Verify Classic 2D and GPU recovery.

Dedicated server and multiplayer

  • Test administrator, moderator and regular player permissions.
  • Test F4, city-map and entry-point teleportation.
  • Test goto, bring, bringall and unstick.
  • Test invalid coordinates and unauthorized requests.
  • Verify player-hosted LAN and older-server compatibility.

Speed limiter

  • Test 60, 75, 80 and 0 km/h.
  • Verify throttle reduction and downhill braking assistance.
  • Test reverse, steering, reconnecting and legacy servers.
  • Confirm there is no repeated speed-limit command spam.

Plugin compatibility

  • Test a fresh installation without a settings file.
  • Test a legacy configuration without disable_plugins.
  • Test explicit enabled and disabled preferences.
  • Test new drives, restored situations and tutorials.
  • Verify standard vehicle scripts remain functional.
  • Test optional plugins separately and collect evidence of freezes or blocking behavior.

Graphics settings

  • Verify new-install defaults.
  • Verify existing settings remain preserved.
  • Test accumulated snow and Enhanced light shadows manually.
  • Compare performance with effects enabled and disabled.

Automated validation

At commit 666cf6a4cef4a2f75a41ab4734310c4f812c7baa:

  • Linux x64: passed.
  • Windows x64: passed.
  • Windows tests: passed.
  • Android: passed.
  • macOS ARM64: passed.
  • CodeQL JavaScript/Actions analysis: passed.
  • Secret scanning: passed.
  • Separate build check: still running at the last verification.

Screenshots and remaining validation

Comparative screenshots on Berlin-Spandau and Xiahai, including both the navigator panel and city map, are still pending.

Real-world multiplayer compatibility and visual/performance regression testing also require further validation.

No screenshots or performance results are claimed without supporting evidence.

Review notes

Feedback on the temporary plugin default is welcome from @turbo-devv.

Feedback on optional snow and lighting defaults is welcome from @Bulekoo and @usonskyyyy.

The aim is to merge these improvements upstream once remaining review concerns and validation requirements have been addressed.

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Test builds for 4ee3e71

Platform Download
Android (arm64) android.zip
Linux x64 (game and dedicated server) linux-x64.zip
macOS (Apple silicon) macos-arm64.zip
Windows x64 (game and dedicated server) windows-x64.zip
  • Unpack the download into a new folder, not over your openOMSI. The launcher shows the version as ...-pr3481, and a test build is never updated. It shares your settings and OMSI 2 folder; mods you installed into your openOMSI folder are only seen when you unpack it into a copy of that folder.
  • Android: the download holds an APK that installs as a separate app, openOMSI PR fix: consolidate startup, navigator, LAN administration, RP speed limits and graphics defaults #3481, beside the release, and shares its openOMSI folder.
  • What to try is under How to test in the description. Please comment with what you found and the version the launcher shows.
  • The links work for 14 days after the build.

@thibautgnt thibautgnt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @isaacsa2 for pulling all of this together. The server-side checks for self teleport are well built: the sender is the authenticated peer, never an id from the payload, coordinates are checked, bring/bringall stay admin-only on the server, and the F4 camera heading from #3421 is kept. The startup fixtures (staged key, battery master, a reverse trigger that must never be pressed) are good regression tests too.

Three things I would like fixed before merge:

  1. The navigator cap comes back at the numbers that were reverted (crates/omsi-navigator/src/build.rs:16-17, 73-74, 117). 10060f4 removed the 260 000 ground vertex cap because Berlin-Spandau goes over it. With this PR, Spandau doesn't lose its roads any more, but its whole ground becomes a grid of about 208 x 208 cells (ground_budget.rs:81, sqrt(260000 / 6)). That is a 6 m cell over the panel's 1280 m square (PANEL_REACH 640), and tens of metres per cell on the city map, so the small map on a popular map turns into a mosaic, while main draws it exactly today. The three house painters also still hard-drop everything after 90 000 vertices (room_for), which is the same "later geometry vanishes" failure the revert was about, now for houses. 260k x 60 B is about 15 MB, and #3249 was a 1 to 2 GB buffer. Please raise both caps so they only kick in on truly pathological builds (ground in the low millions, houses around 1M each, or a byte budget of a few hundred MB). Please also attach panel and city map screenshots on Berlin-Spandau and Xiahai, main vs this branch.

  2. Plugins get switched off for existing players too, not only new profiles (crates/omsi-launcher-core/src/lib.rs:2256, settings-schema.js:423, SettingsPage.swift:419). settings_from_text_on now defaults disable_plugins to true for every file without the key, and plugin_launch_tests.rs asserts exactly that for discord_status=1\n. So anyone whose settings were last written before #3379 (three days ago) starts without their Lua, OMSI and vehicle plugins after updating, with no hint in game and nothing in the CHANGELOG. The description says "new launcher profiles". Please make the code match it: default to true only when there is no settings file at all (text == None), keep false for an existing file without the key, and add a CHANGELOG line. Since this reverses the opt-in design of #3379, a quick ok from @turbo-devv would be good (or split it out).

  3. New texts have no translations (none are in crates/omsi-app/locales/app.yml):

    • crates/omsi-app/src/admin.rs:225 "Invalid teleport destination", :230 "Teleport requested from the server"
    • crates/omsi-lan/src/admin/panel.rs:195, 278, 280, 282 (the four new Players menu lines)
    • Server answers, which go through tr in admin_panel::take: crates/omsi-lan/src/admin.rs:325, 329, crates/omsi-app/src/app_impl/lan_tick.rs:123
    • The changed launcher and Apple labels and help texts ("Disable plugins (recommended)", the new light_shadows, road_snow and disable_plugins help) are new keys now, so the existing "Disable plugins" translations are lost. Either keep the old wording or add every language for the new one.

Non-blocking:

  • Ctrl+click on the city map (app_impl/vehicles.rs:146) and "Teleport to a start point" (game_lists.rs:1099) no longer say anything when they succeed in solo or as host. The "The bus stands ..." messages were dropped; only move_here.rs kept its message.
  • lan_tick.rs:27 sends speed-limit? every 180 frames for the whole session. Current release servers answer it with a "command not taken" log line each time, for every player. Asking once after connecting and again after a reconnect (like voice?) would be enough.
  • A client in a player-hosted session used to get "In a LAN session only the host moves vehicles on the map". Now it gets "Teleport requested from the server" and then a rejection that talks about administrator authentication (and from an older host, nothing at all). If the client can tell it is not on a dedicated server, keep the old local message.
  • crates/omsi-net/src/ws.rs:1219: on Windows a port that is excluded for TCP fails with PermissionDenied (os error 10013), not AddrInUse. That is exactly what made host_ports.rs fail in this run's windows-tests (a file this PR doesn't touch, so a re-run should pass). Retrying on PermissionDenied too would make the new helper hold up on Windows.
  • crates/omsi-lan/src/admin.rs:292: the doc comment of server_command now sits on PLAYER_TELEPORT_ALLOWED. Please move it back above the function.
  • CHANGELOG: the new entry cites #329 (a fork number) and leaves a double blank line. The new default changes (plugins, built-up snow, light shadows), the speed limiter and the admin teleport have no entries.
  • Built-up snow and light shadows defaults: light_shadows only matters in Enhanced (the default mode is Vanilla+), and road snow does nothing outside winter. The perf gain for most players is small, and it changes the defaults of features from @Bulekoo and @usonskyyyy, so they should hear about it.
  • .github/workflows/release.yml: only a retry loop around sdkmanager, with no permission, secret, signing or publishing change and no new download source. Fine to keep here. build.rs belongs with the navigator change (point 1).
  • The PR body was pasted as raw HTML. Plain markdown would be easier to read.

@isaacsa2

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed review, @thibautgnt!

I've pushed the follow-up fixes to this PR ("666cf6a"). Here's what has changed:

Navigator geometry

  • Increased the limits to 2,000,000 ground vertices + 750,000 vertices per house painter, approximately 4.25 million vertices combined.
  • This allows normal dense maps to retain their original geometry without unnecessarily triggering the reduction system.
  • The fallback remains available for exceptionally large maps, preventing uncontrolled geometry allocation.
  • The limits are upper bounds, not preallocated buffers.

Comparative screenshots of Berlin-Spandau and Xiahai (main vs this PR, navigator panel and city map) are still needed.

Plugin compatibility — temporary safety measure

Disabling optional plugins by default is intended as a temporary stability measure until the underlying plugin compatibility problems are fixed.

Some legacy OMSI plugins, including integrations such as OmniNavigation and AUXI, have been reported to cause freezes, stalls or unexpected behavior when running under openOMSI.

There are indications that certain plugin interactions may block the game's main thread, but the exact causes still require investigation.

The intention is not to remove plugin support or permanently force plugins off.

The updated behavior is:

  • Fresh installations: optional plugins disabled by default as a temporary precaution.
  • Existing installations: preserve legacy behavior when the configuration does not contain "disable_plugins".
  • Explicit user preferences: always respected.
  • Manual activation: users can still enable their trusted plugins.
  • Standard OMSI vehicle scripts: remain enabled.

Once plugin execution, compatibility and potential main-thread blocking issues have been resolved and tested, we should reassess this temporary default.

@turbo-devv, your feedback on this approach would be appreciated.

Localization

  • Added translations for the dedicated-server teleport feedback across 29 languages.
  • Reused existing translation keys where possible to avoid unnecessary localization regressions.

Additional fixes

  • Restored local teleport success messages.
  • Preserved player-hosted LAN behavior and feedback.
  • Added dedicated-server capability negotiation for teleportation.
  • Changed speed-limit negotiation to run on connection/reconnection instead of every 180 frames.
  • Updated Windows test port handling for "PermissionDenied" (10013).
  • Fixed the misplaced documentation comment.
  • Updated the CHANGELOG to cover the consolidated changes and their compatibility implications.

Graphics defaults

Accumulated snow and Enhanced light shadows remain available as optional effects.

Their default settings are intended to avoid unnecessary GPU work on fresh configurations, although the actual performance impact depends on weather conditions and rendering mode.

Existing saved preferences are respected.

Validation

At commit "666cf6a", Linux, Android, macOS ARM64, Windows x64, Windows tests, CodeQL analysis and secret scanning passed. The separate build check was still running at the last verification.

Real-map comparisons and multiplayer gameplay validation remain necessary before declaring the changes fully verified.

Thanks again for the review. The goal is to preserve backward compatibility while improving stability and avoiding regressions.

thibautgnt
thibautgnt previously approved these changes Oct 31, 2026

@thibautgnt thibautgnt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @isaacsa2 for working through all of this so quickly. The tp-policy? handshake is a neat way to tell a dedicated server from a player host without guessing, and it brings back the old local message for player-hosted sessions at no cost.

All three points from my last review are fixed:

  1. Navigator caps: 2M ground vertices and 750k per house painter (about 243 MiB worst case, crates/omsi-navigator/src/build.rs:18-19), with the grid clamp raised to 512. That is the "only on pathological builds" range I asked for, and nothing is preallocated.
  2. Plugins: disable_plugins now defaults to true only when there is no settings file (crates/omsi-launcher-core/src/lib.rs:2257), an existing file without the key keeps plugins on, and plugin_launch_tests.rs checks both cases. USER_GUIDE and CHANGELOG say so too.
  3. Translations: the launcher keeps the existing "Disable plugins" wording and help, which are translated, the Players menu and the teleport messages reuse existing keys, and the two new server answers have all 29 languages.

Before merging:

  • GitHub shows a conflict with main in crates/omsi-app/src/settings.rs:557 (Settings::default): #3427 added passenger_hailing: false to the same line. Keep your line and add passenger_hailing: false, after passenger_animation. With that, size budget and arch guard pass on the merged tree.
  • The Berlin-Spandau and Xiahai screenshots (panel and city map, main vs this branch) you mentioned would be good to have on the PR before it goes in.

Non-blocking:

  • crates/omsi-app/locales/teleport.yml: rust-i18n does load it, but everything else only reads app.yml: the locale check in pr_checks (.github/scripts/check_locales.py), omsi_launcher_lib::i18n::TABLES (the include_str! that makes cargo rebuild when translations change, so an edit to teleport.yml alone may not recompile), apple/Tools/gen-strings.py and the machine translation. Moving the two entries into app.yml would keep it all in one place.
  • apple/Shared/Pages/SettingsPage.swift:419: the new Apple "Disable plugins" toggle and its help are not in apple/Resources/Localizable.xcstrings yet, so the Apple launcher shows them in English. Running python3 apple/Tools/gen-strings.py picks them up from app.yml.
  • The tp-policy? / tp-policy 0|1 exchange has no test. A small one next to the existing server_command tests would protect it.
  • CHANGELOG: there is a blank line in the middle of the Fixes list (before "Dense navigator keeps dense maps intact"). Also, "Safer defaults on new installations" holds for plugins, but road_snow and light_shadows default off for any file without the key too, so files written before 10-25 / 10-27 also switch. That is minor, just worth knowing.

Thanks again, this is in good shape.

@Bulekoo

Bulekoo commented Oct 31, 2026

Copy link
Copy Markdown
Contributor

Thanks for asking, @isaacsa2, and @thibautgnt for raising it. I'm fine with the built-up snow being opt-in: it changes how the winter looks, not everyone will want that, and with the switch in Settings > Graphics each player decides for themselves.

For reference, from the measurements on #3237 (RTX 3060, DX12, 1080p): switching it off saves about 0.45 ms of the 0.55 ms it adds to the GPU main pass in snow (Enhanced, looking down a street), and nothing measurable outside winter. The remaining 0.09 ms is the snow code being in the scene shader, which stays either way, since the shader is picked by the device gate (road_snow_supported()), not by the setting. With it off, snowy roads use the season's WinterSnowfall textures as in OMSI 2.

@isaacsa2

Copy link
Copy Markdown
Contributor Author

Thanks again, @thibautgnt!

Just a quick note regarding the requested screenshots: unfortunately, I won't be able to provide comparisons using the Xiahai map at the moment, as the available download link is no longer working and I haven't been able to obtain a copy.

Berlin-Spandau is available, so it can still be used for the in-game visual comparisons of the navigator panel and city map, using the same locations and zoom levels on main and this PR branch.

I understand that the screenshots are intended to verify actual in-game rendering, particularly road coverage, terrain detail and building geometry, rather than just confirming that the geometry budgets are respected.

The Xiahai comparison will therefore remain unverified unless a working download or another copy of the map becomes available.

Thanks for understanding!

@thibautgnt thibautgnt left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @isaacsa2 for bringing this up to date with main so carefully. The merges are clean: the PR's net change against main is exactly what I approved on 666cf6a, nothing from main is lost.

  • Settings::default (crates/omsi-app/src/settings.rs) keeps all four passenger fields from #3427/#3428/#3429 (passenger_hailing, passenger_full_bus_reaction, passenger_connections, passenger_transfer_percent) next to your light_shadows: "off" and road_snow: false, and the room switch from #3488 is untouched.
  • The launcher parser change (dc4d83d) only shortens the comment above disable_plugins, the code is the same.
  • Size budget and arch guard pass on this head, which already contains current main, and CI is green.
  • The CHANGELOG blank line is gone and the defaults entry now says older files switch too, thanks.

Non-blocking: the Berlin-Spandau comparison screenshots (navigator panel and city map, main vs this branch) are not on the PR yet. Understood that Xiahai can't be downloaded any more, Spandau alone would be enough. The non-blocking notes from my last review (teleport.yml vs app.yml, the Apple strings, a tp-policy test) still stand if you want to pick them up later.

Approving, thanks again!

@thibautgnt
thibautgnt merged commit 05023dd into openOMSI-org:main Oct 31, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants