2,041 Commits over 518 Days - 0.16cph!
Merge: from networkcache_stalegroup
- Bugfix for vanishing child entities (l-ike drybox on rhib)
Tests: spawned rhib, teleported far then back after pause, paused again - all parts stayed in place
Bugfix: fix missing child entities (like drybox on rhib) by invalidating network cache on netgroup change
Previously if parent moved it would update the network group of the hierarchy, but only parent would have it's cache invalidated. This meant that it was possible for child to be with a netgroup outside of network range, while parent is in network range.
Tests: on Craggy, took rhib and drove it from E4 to a row above E0, teleported back to E4, waited for boat to stream out, teleported to boat and waited a bit - it stayed in place (previously drybox would disappear)
Merge: from randomize_junkpile_checkempty
- minor optim to load balance JunkPile::CheckEmpty
Tests: looted one on craggy, saw it disappear
Update: JunkPile.CheckEmpty now have a 5 second randomness
Tests: looted a junkpile on craggy, flew away, waited and got back - it was gone
Merge: from procpop_debug
- Bugfix: fix DensitySpawnPopulation prefab pool being starved out, resulting in failed spawn attempts
- Optim: DensitySpawnPopulation early exits if it reached prefab population target isntead of continuing to try to spawn
- New: spawn.report now contains info about failed iterations and how many entities it recently spawned
- New: spawn.dump_map <pop> [count] which simulates spawns and generates pngs indicating general spawn area and attempted spawns. Pngs in <server_ident>/debug.
Tests: 4.5k procgen in editor - server started with full junkpile pop, simulated spawn gave better numbers
Update: dump_map exports to identity/debug/ folder
- client buildfixes
Tests: built all modes in editor, ran dump_map on craggy
Optim: DensitySpawnPopulation - stop trying to spawn prefabs when used up available prefabs
This eliminates a lot of wastefull attempts
Tests: while at full population, ran dump_map with 1000 items to fill - reported 0 attempts
Bugfix: DensitySpawnPopulation - avoid weighted prefab pool starvation
Bug from 2022 - we never checked if prefab instantiation ever failed, as it has it's own internal checks
Tests: ran spawn.report - saw that junkpiles population was full after boot. deleted junkpiles pop then immediately simulated spawning - saw green pixels, got the count
Update: spawn.dump_map - also report how many spawned and how many attempts were taken
Looking at the texture it's hard to believe it has 800 green pixels, but apparantly it does.
Tests: used dump_map right after delete_populations
Update: differentiate SpawnPosOverride and Density errors
Noticed a bug that can cause random prefab picking starvation (we don't return prefabs if instantiating a prefab fails), will fix in a separate CL to confirm via debug maps
Tests: ran dump_map junkpiles 1000 on 4.5k procgen
Update: refactor SpawnPopulationBase to work with ISpawnHandler
- got rid of SimulateSubFill, consolidated logic
- changed dump_map default simulation count to 100 (to avoid iteration explosion)
- added more fail reasons
This both reduces code duplication and makes sure we run exactly the same SubFill logic when simulating to generate debug maps
Tests: ran it on 4.5k procgen with dump_map junkpiles 1000 - found why they don't spawn
Bugfix: fix spawn ticks counting non-max pop as a fail, instead of requested spawn count
Tests: none, trivial change
Update: add ability to dump pngs of simulated spawning of a population
Tests: used locally
Update: spawn.report now also reports failed tick and how much were spawned recently on average when failing
Can use this as a further estimate which population is costing us when trying to spawn full pop
Tests: used in editor
Update: spawn.report now outputs max attempts it can do for next tick
Helps quickly spot what's the worst contributor to spawn overhead
Tests: used in editor on Craggy
▆▅▇▍▇: █▌▋▄ ▋▊▌▊▆_▉▋▍█▊▆
- ▌▆▉▉▊▍▍▅▊▊▋▋▄ ▊█▆▊▉▉ - ▅▉▉▋▍▅ ▊▋▊ ▉▍▉ █▆ ▆▌▄▊▋▇ ▇▉▊▅▇▍▌▌▄ ▋▇ ▅█▌▉▊▆█▉█▍▅▆▊▊▅▆█▋▌█▉▌▅▅
▉▌██▄: ▆▌▋▌, ▆▌▄▊▋▊▉ ▉▅▇▇▆▇
▋▌▊▋▌▊: █▆▍ ▇▌▄▄▋▌ ▅▉▌ ▊▌ ▊▍▇▆▉▆ ▄▉▇▌▇ █▊▊▅▆▋▌▇ ▉▌ ▆▅▌▊ ▋▇▊█ ▌ █▄▉▄
▊▋▉█▅: ▉▉▌▌, ▄▍▇█▇▉▊ ▇▋█▄▄▇
Merge: from triggerparentdelayedexit_optim
- Optim: sped up noclip check via OOB broadphase + reduced tick count + added BaseEntity caching
Tests: hopped around the boat
Merge: from opt_triggerparent_timeslice
- Optim: reduced component accesses and added support for triggerparent.ontick timeslicing
Tests: jumped around the boat
▅▍▌▉▊: ▋▋▄▅▇ ▍▅▄█▌▆▆▊ ▆▌ █▋▇▇▌▇██▅▄▇▇▇.▊▆▆▆▋▍ ▋▍▌ ▊▋▆▌▍▅ ▌▋▌ ▍▆█▉
- █▊▉▋▆▇▇▌▄▄▊▌▇▆▊▍█▊▉▌▉▄▉▄ ▍█ ▇▉█ ▆█▄▌ ▄▌▊ ▋▄▋▇▊▄▉▋▉▄ ▉▍, ▆▋▇▇▊▉▄▇▄█ ▋▌▍ ▋▇▌▊▊▄▇▇▍▆█▌▅▆▉▉▌▉▍▌█▇▋▌.▄▇▆▄█_▉▇▇▍_█▍▊▊▄▍▄▆(▉▆▉▍██▇ █▌▆▌) ▋▄▉ ▇▊▍▉_▆▋▆▌_▇▌▄▍▋▇▌(▌▋▉▍▉▌▅ ▅.▍)
▊▌▍▉▊: ▇█▊▌▌▉ ▄ ▋▉▋▆ ▄▊▌▊ ▌█▋ ▄▊▄█▇ ▋█▊▆ █▍ ▌▇▋▊▆, ▄██▄▌▋▋▄▅▋ ▋▉▆▆▉▅ ▆▅ ▍▍▊ ▍▄▌█▆▇ - ▊▋▋ ██▇█▌▆▇▇▌▆ ▌▍ ▆▉▄ ▌█▄▌, ▌▊▅ ▌▋▉▄▇▊▊ ▊█▄ ▇█ ▇▆▅▋▇ ▇▌▌▇▋▄▋▊█▋ (▉▌▆-▋▍▄▆▊▊▌▋ ▌▊▋▆▋). ▌▉▋▆▌▋▊▊ ▉ ▍▌▌▅▊▌ ▇▍▌▄▋.
Update: reorder clipping entities check to fast-exit on corpses
Tests: none, trivial change
Clean: remove duplicate IsDestroyed check
It's already checked as part of ToBaseEntity and our caching Entity
Tests: none, trivial change
Optim: TriggerParent - cache ToBaseEntity calls
Best case they cost us a hash-lookup + alive checks, worst case - hierarchy traversal. We can make do with alive checks only.
Tests: built a boat and rode it, put it in edit and reconstructed a foundation
Update: don't requiry parent exclusion trigger
Tests: none, trivial change
Merge: from invis_phantom
- Bugfix: old ServerOcclusion logic could spawn a phantom player on the client for invis players
Tests: on a fresh server tried to come into range of invis player - phantom no longer spawns. Validated UsePlayerUpdateJobs 0, 1, 2
▍▄▊▇▇█: ▇▊▊'▆ ▅█▌█ ▆▌▆▉▅ ▅▅▌▆▇ ▌▆ ▉▊▆█▍▄▌▉▇
▊▊▋▋▌'▄ ▄ ▉▋▉▄▊▍ ▍▌▆▄▊ ▇▆▄▌(▇▉▅▍▊▇▆▆▄.▊▆▄▉▅▉▌▇▅▄▇█ ▋▋▉▉▊'█ ▅▌██▇▆ ▌▇▅▊▍▇▋▇▉███▌█▊), ▋▆▇ ▅▅▋▇ ▉▌▉▇▄▍ ▄▇▉▅ ▍▋▊▌ ▇▅▇ ▌▇▄ ▍▆▇ ▅▊ ▆▋█▉ ▅▆▅▉▉▋▇▄.
▉▆▌▆▅: ▍▇█▄▌▌ ▇▅▍▇ ▌▋▇▆▉█▊▋ ▅▊▋ █▌ ▋▆▄ ▄▄▄ ▌▉█ ▋▋▇▍, ▊▊█▌ ▄█▆▍▇▌▅ █▋▊▌█▊▊▇██ - ▊▌▋▌▆▄▅▌▇▍ ▊▍▉▋▄ ▇▇▉ ▇▆▍█▇▍▉ ▆█▍▄▌▅ █▍▉▍▋▊▄▋-█▄▅▍▌▉▉▆ ▍▋ ▅▇▄▄
Bugfix: ServerOcclusion - don't send out initial snapshot if other player is invisible/spectating
UsePlayerUpdateJobs 0 & 1 only issue. Fallout from my invis rewrite
Tests: on playground, went invis and flew away from spawn. p2 connected then flew to p1 - no more phantom. Repeated 3x. Tested UsePlayerUpdateJobs 0, 1, 2
Merge: from spectate_3p_fix
- Bugfix for spectating yourself causing a client crash
Tests: tried to spectate via F1 menu - no longer possible
Clean: fix formatting for PlayerInfo
Tests: none, trivial change
Update: Block Spectate button in F1 Server menu when selected player is local player
- updated engineui.serveradmin.playerinfo.prefab to link up the button
Tests: Opened Server tab, selected self in list - button was not interactible
Bugfix: Spectating - prevent server accepting spectating yourself
Tests: Used F1 Server tab to spectate myself - no crash
Merge: from spectate_3p_fix
- Bugfix: fixes 3rd person spectate camera not following spectated player
Tests: spectated target in 3rd person while original body was in a box - camera orbitted target as expected
Bugfix: Spectating - when in 3rd person mode, run overshoot checks relative to target entity, rather than current
Used to work previously because current entity was part of parent - but since recent changes that's not the case
Tests: 2p session on craggy - put spectator into the white box the started spectating. when switching to 3rd person, camera no longer stuck in box and is orbiting around target player
Merge: from jobs_noclip_mask_fix
- Bugfix for UsePlayerUpdateJobs > 0 NoClip checks incorrectly using vehicle layer mask
- Updated unit test to check for above case
Tests: ran unit test, tried to push against modular vehicles on craggy
Bugfix: AreNoClipping - fix vehicle layer inclusion logic actually excluding the layer from the mask
- Also uncommented one test that I accidentally submitted as commented
Tests: ran unit tests - they now pass
Tests: TestNoClipConsistency - add vehicle detail colliders to catch inconsistency
- also don't reinvent the wheel with permutation combinations, just use [Values] instead as before
Tests: unit test fails (expected, will fix next)
Tests: Amend TestNoClipConsistency to generate players permutations with non-zero vehiclePauseTime alongside forceCastTime
This should trigger a slightly different code path for noclip checks. Still need to generate relevant physics colliders to validate this path.
Tests: ran TestNoClipConsistency
Merge: from jobs_coarsedist_crashfix
- Bugfix: fixes crash when players connect to a fresh server with UsePlayerUpdateJobs > 0
Tests: local C+S with UsePlayerUpdateJobs 2 enabled from the start - no more exceptions by height and shoredist jobs
Bugfix: UsePlayerUpdateJobs - fix GatherWavesIndicesJobIndirect returning invalid count of deepsea players
- Also fixed invalid index usage for acessing positions
Tests: local C+S with UsePlayerUpdateJobs 2 enabled from the start - no more exceptions by height and shoredist jobs
Merge: from main
- Bugfix: Removes client-side network group setting when updating parents - fixes phantom entities on cargoship and other global network entities
Tests: flew around craggy, was able to pick up items, chop trees, kill animals. spawned cargoship and dropped items on it, spawned dressed player & killed him, then deleted them using console cmd - they got cleaned up as expected
Update: BaseEntity.UpdateParenting no longer tries to update network group
- When client receives an entity snapshot, allow it to update the network group if it's out of sync
We already get network group change messages - there's no need to try to "guess" on the client and potentially desync.
Tests: flew around craggy, was able to pick up items, chop trees, kill animals. spawned cargoship and dropped items on it, spawned dressed player & killed him, then deleted them using console cmd - they got cleaned up as expected
Bugfix: Run same network-group-inheritance checks on client when recieving snapshots
This resovles a scenario where dropped items/players on a cargoship/crane/etc have local net group, but client resolves global net group.
Tests: Spawned cargo ship, spawned NPC, player - killed both. dropped items. flew away, destroyed them via console, flew back - they were gone
Bugfix: handle spawn groups on non-baseentity gameobjects
Tests: procgen 2.5k in editor
Merge: from navmeshsurface_optim
- Optim: Ghostships now use a static, detached navmesh, saving us on navmesh re-integration every physics step
- New scientists adapted to work with detached navmesh
- In C+S editor, we now automatically exclude client-scene entities from dynamic navmesh gen
Tests: spawned all ghost ships, observed scientists patrolling, dogfighting, sprinting
Clean: remove obsolete TODOs
Tests: none, trivial change
Clean: remove test code that offset the baked navmesh
Prepping to merge back
Tests: spawned all variations of ghostship, engaged scientists - didn't spot any weirdness