139,399 Commits over 4,505 Days - 1.29cph!
merge from automated_testing
S2P oilrigs, excavator and gas station
Add convar to toggle navmesh optis on and off
Gate per tile interlocked add needed for logging when logging is off
Fix ghostship A having no navmesh
Remove unused param in bake stats
Remove some spammy and uninformative logs
Adds lots of instrumentation, and increase navmesh build speed by around 30%, implemented common optimizations I've seen before or discussed with Lorenz:
- when rasterizing triangles, reuse values between neighbors instead of re-clipping the triangle against every column (7%)
- heightfield is supposed to have faster insertion than compact heightfield thanks to linked list, but because it wastes so much time pointer chasing during iteration it's actually slower, also instertion is not that bad when the column fits in cache (4%)
- fuse some span filtering operation to iterate once instead of 3 times on the spans (only 1% for rust maps sadly...) + the pooling from sbox doesn't really benefit us
As well as some new findings found from profiling:
- during heigthfield stage when comparing span A to span B for walkability tests, don't do everything from scratch when comparing B to A (9% whole map, but monuments and bases specifically x4 speed with this)
- watershed iterates through the whole list of regions multiple times, faster with lookup (7%)
Can get another 10% if we halve the detail mesh precision, automatically sampled lots of tiles for vertical differences to test and the difference is negligible
The real bigger order of magnitude gain is to not limit the number of threads and not time slice geometry collection, it stalls the server but goes 6x faster, could do it at server boot and just throttle the subsequent dynamic navmesh updates (player building bases, nodes etc).
New automated test to check for immortal entities starting with health <= 0.
Changed beancan max stacksize from 5 > 4
Tweaked steering values to make steering feel more responsive (hopefully better with some ping as well)
Added first itteration of a drift function, currently uses ctrl to lock the rear wheels
https://files.facepunch.com/el-hog/2026/August/23_13-18-PettyDingo.mp4
Reduced stack size for:
- F1s 5 > 3
- Bee nades 5 > 3
- Flashbangs 5 >3
- Molotovs 5 > 3
speculative - added a collsiion mesh to sleeping bag to prevent dropped items from passing through it.
re-centered gib parts again
- hot_air_balloon: 67 of 67 parts had their origin outside the piece, now 0
- got rid of a load of self intersections that caused the self intersected faces to be discarded despite unity triangulating on import. It can't triangulate self intersecting faces.
Re-centred gib part origins on 8 deployables
Same problem as the hot air balloon armour last commit - gib part origins weren't central to their mesh, so pieces rotated about a point outside themselves and the physics was inaccurate. Re-exported the gib meshes and re-assigned the collider boxes. should be much more accurate gib physics now.
Also on some gibs, they had parts that were self intersecting and were being discarded. Fixed that.
- HotAirBalloon basket: 43 of 55 parts had their origin outside the piece, now 0
- refinery_b (refinery_large_deployed): 24 of 83, now 0
- windmill_main: 22 of 53, now 0
- box.wooden.large: 19 of 33, now 0
- fireplace: 19 of 53, now 0
- lift_shaft_top (elevator): 18 of 33, now 0 - worst part sat 1183x its own half-extent off centre
- tool_cupboard: 15 of 44, now 0
- cannon: 14 of 24, now 0
- component_box_wood: boxes re-fitted
Fixed gib collider overrides on 7 deployables
Box overrides had drifted from their gib meshes, so colliders didn't match their mesh and clipped through the floor. Some overrides had more whilst others had less gib parts.
- io.table: override list resynced 44 -> 29, boxes re-fitted (29 of 29 boxes were not a fit for their own mesh, now 6)
- HotAirBalloon_armor_T1: gib FBX re-exported, list 52 -> 51 - their origins weren't central to the mesh causing innacurate physics
- sculpture.ice: list extended 30 -> 33; the last 3 parts had been falling back to convex mesh colliders
- mannequin: boxes re-fitted (18 of 18 mismatched, now 0)
- chandelier, component.box.charcoal.large: boxes re-fitted
Glass AR - material tweaks
frankenstein table now has gibs - it was setup to have them but there was no gib mesh.
now breaks apart as expected.
Fix parenting not working when set from the field.
removed ao from gibs on advanced lootbox and primitive lootbox variants.
ao looks great on the static asset but once destroyed the gibs looks nasty when they are in shadow. Now fixed.
Fix heavy scientists not moving after being dropped by the heli on some seeds (small oilrig only?), the AI zone was too small to encompass the drop points so they couldn't find them
Merge: from main
Been a year, lets see how borked everything is
Another attempt at fixing old AIs not catching up to player
Potential fix for oil rig scientists hitbox issues, seemed to happen mostly on stairs with arrows because of too strict anti hack padding
- Add an animation when clicking on any of the customisations options
- Ensure the players eyes blind
- Try and reduce the jittering when zoomed in on the models face
merge from world models 2026
car radio world model
jungle ar world model optimisation
ice ak world model optimisation
chainsaw world model optimisation
car radio now has a proper world model
LOD 0 cheaper than burlap sack
- Fix crocodile dying by themselves on some seeds, was caused by them by spawn more than 20m from rivers
- Crocs spawning will now be constrained to river, but if they can't find one they won't break
- Better logging when animals despawn because they can't find a valid move destination
Add new animations to the character creator
fix to high external wall and gate collision mesh
glass AK:
- Use a mip-filtered refraction texture with specular shimmer/firefly reduction for better looking blurry refraction
- Some shader simplification, remove unncessary alpha blending and emission map
- Remove unnecessary "depth prime" viewmodel pass
- Fix inconsistencies with viewmodel renderer shader passes between BRP and RRP
9x improvement on the triangle culling for heightfield bounds by making it native
- Added a dust effect in the background
- Make sure orbital camera works (slow it down)
- Invert controls
Various small fixes and cleanup:
- Root the native log callback delegate in a static field (GC could collect it and crash the next DLL log)
- RebuildTilesInBounds no longer skips the default navmesh when independent navmeshes overlap the bounds (stale tiles at island/monument seams)
- IsNavMeshBuilt answers from the agent's bound navmesh with a lazy rebind instead of a fresh resolve that could disagree with every query
- Restore rustnav.debugpath / debugraycast / debugsample, ported to the NavVector3 API with proper independent navmesh space transforms and a not-built guard
- Delete dead code: GeometryUtils, NavmeshHelpers, TileExtractor (CreateBoxMesh moved into BackgroundTileBuilder), unused RecastWrapper P/Invokes pointing at removed exports, disabled MAX_BUILD_QUEUE throttle, GetOrigin, IsSprintingOnClient
- Skip MeshColliders with no sharedMesh during tile collection, bounds-check FailTile/AddTile coords
- TryOpenDoors reports whether a door actually opened (TryOpenDoorFor void -> bool)
- Null-guard RustNavigation.Instance on scene teardown, clear the stale Instance in OnDestroy
Limit nav drawing network use with kb instead of per tile, show grid again in editor, move label for tile coords to tile height
merge from render_pipeline_testing
fix brp error spam on low water quality
Terrain footprint for both variants of rock_formation_medium_e
Merge from setflag_remove
Fix SetFlagLocal compile error
Terrain footprint for 3 variants of rock_formation_medium_d
Terrain footprint for 3 variants of rock_formation_medium_c
Terrain footprint for 3 variants of rock_formation_medium_b