141,161 Commits over 4,505 Days - 1.31cph!
Make sure we only send entiites when a door opens immediately based on a convar, so we can do normal slower snapshot queue when doors are opened and we send entiites and let the "closer than 30m send everything" prevent pop-in
Merge from new_navmesh_fixes
Merge from cactus_impact_effects
Merge from FoundationMeleeLOS_fix
Merge from high_external_wallgate_COL
Merge from MarketTerminal_Names
Merge from AugustLowCraftBuffs
Merge from heavy_helmet_audio
Add audioMuffleAmount to ItemModWearable, allows us to muffle game audio based on specific clothing
Muffled game audio when wearing heavy plate helmet
Declare hair shader stencil block
Merge from render_pipeline_testing
Capped fuel pump crude storage amount at dome to 1000 (per pump)
S2P dome
Merge from deepsea_terrain_everywhere
Merge from deepsea_terrain_everywhere
Added deepsea.terrain_everywhere replicated convar, enables the deep sea terrain splats everywhere when enabled
added new cactus decals by repurposing the wood decals looks much better
https://files.facepunch.com/pilgrim/2026/August/23_22-55-SomeCicada.mp4
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