1,956 Commits over 488 Days - 0.17cph!
Merge: from spectate_related_cmd_fixes
- sleeping-/usersinrange commands now run from spectated player's position, if spectating
Tests: used commands when spectating
Update: when running sleeping-/usersinrange, prefer to query from spectating target position
Tests: used the commands while spectating
Merge: from spectate_command_fix
- Bugfix for spectate doing nothing when spectating far-away player
- Bugfix for error on respawn after spectate if previously didn't have a spectate target
Tests: used spectate out of network range 10 times in a row, used keybind to spectate twice in a row - no issues
Bugfix: Spectating - when no valid spectator found when starting to spectate, ensure we still set the right SubStrategy
- If no spectate targets were found, chat message now contains the used filter
Could easily happen for people using keybinds, as keybind sends "spectate True"
Tests: using keybind, spectated other player twice in a row - no more errors
Bugfix: Spectating - ensure Spectating flag always gets sent to the owner
Fallout from the queue skipping optimization
Tests: Went outside of network range, waited for subscription to unsub and and started spectating on a 2p server. Did it 10 times - no failures
Update: Adopt Scientist2FSM to be aware of ghostship navmesh
Need to double check aiming logic (sometiems they aim at the sky), and investigate how initial on-navmesh spawning is done. Also need to convert variant FSMs
Tests: spawned ship navmesh offset and with a rotation. Ran around into different areas of the ship and rooms - they pursued
Update: serverocclusiondebug - clarify what invalid grid means
Now explicitly saying that server occlusion treats path with one or more invalid grid positions as unblocked
Tests: none, trivial change
Bugfix: server occlusion - skip occlusion for players outside of the occlusion grid
Tests: checked occlusion between y:90 and y:110 - previously would stutter(OcclusionV1) or would occlude(OcclusionV2). Tested hiding behind a hill - still works
Update: introduce BaseEntity.ServerNavMeshPos property and use it instead of the methods
Incomplete work(need to expose transform matrices), will return after bugfixing
Tests: none
Update: LimitedTurnNavAgent sets npc's position via helper functions
- ScientistNPC2 overrides it to optionally map on to the detached navmesh if it's on a ghost ship
- LimitedTurnNavAgent uses navmesh positions to calculate steering to waypoint in FaceTarget mode (think it was the original intent anyway)
There's a bunch more code that needs to be converted just to be safe with strong waves
Tests: spawned ghost ship away from craggy, enabled AI, and ran around to different areas - scientist caught up, were able to shoot me
Update: GhostShip spawns navmesh instead of NavMeshSurface
- Disabled NavMeshSurface on GhostSHip prefab (will need to do it for the rest later)
This stops NavMeshSurface constrantly running add-remove navmesh every server frame. Need to figure out how to tie it to NPCs
Tests: visualzied navmesh in editor via gizmos, checked profiler to not see any more NavMeshSurface::UpdateActive calls
Merge: from baseplayer_serverupdateparallel
- Optim for OcclusionV2 - remove extra hash lookup in a busy loop
Tests: with UsePlayerUpdateJobs 2 - toggled invis in close proximity and far away, suicided away from spawn and flew back, teleported around
Optim: OcclusionV2 - skip resetting lastPlayerVisibility every frame
Turns out didn't need to make the other half of changes
Tests: used invis close and far away
Update: UseOcclusionV2 - simplify toggling invis
- when enabling invis, notify occlusion tracking that we destroyed entity on subscriber's end
- when disabling invis, skip sending snapshots - occlusion will handle it
Halfway to remove the constant hashSet.Remove calls in GatherPairs loop
Tests: UsePlayerUpdateJobs 2, toggled invis in front of player. went invis, flew outside network range, flew back, disabled invis - spawned correctly.
Merge: from baseplayer_serverupdateparallel
- Bugfix for UsePlayerUpdateJobs 2 not replicating players for spectators
- Bugfix for leaking players in occlusion groups
Tests: spectated players from far away. Inspected server state after killing a sleeper
Bugfix: ServerOcclusion - clean up players from all of their occlusion groups on server destroy
Turns out we were leaving a lot of "zombie" players once sleepers were killed. This would slow down server occlusion eventually.
Tests: on Craggy, killed a sleeper, moved to a different network group, and checked in debugger if the occlusion group only contains my player
Bugfix: UseOcclusionV2 - handle spectating players
Since we no longer do bidirectional checks when iterating occlusion groups, we ended up missing out on spectators and wouldn't allow replication to them.
Tests: on craggy with UsePlayerUpdateJobs 2, flew far away to get outside of network range then started spectating - could see target moving.
Merge: from spectate_dontfloodsnapshots
- Bugfix for occlusion not destroying all players in UsePlayerUpdateJobs 2 mode
Tests: 2p on craggy - used hill as obstruction, checked entity lists on both clients in editor
Bugfix: UsePlayerTasks - calculate end of batch correctly in SendEntityDestroyMessages_AsyncState
This was causing server occlusion to skip sending some of destroy commands (from last batch), leaving a phantom player
Tests: on Craggy went on behind hill, then checked editor entity list - confirmed that replicated players got removed on both ends
Merge: from spectate_dontfloodsnapshots
- Fixes spectate not working in UsePlayerUpdateJobs 2 case
Tests: tried to spectate occluded player
Bugfix: Ensure initial player snapshot gets sent to spectator in UsePlayerUpdateJobs 2 case
Tests: on craggy with UsePlayerUpdateJobs 2, took 2nd player behind a hill to occlude, then tried to spectate them - confirmed that the first snapshot got sent.
Clean: post-submit feedback
- rename entity_prefabId field to entity_prefab_id
- rename AddShortEntity to AddShortEntityField
More consistent with other examples
Tests: compiles in editor
Merge: from analytics_entity_createdestroy
- minor code clean
Tests: editor compiles
Merge: from analytics_entity_createdestroy
- we now collect entity spawn and destroy events once the server has started up (part of `gameplay_analytics` servervar)
Tests: observed logs of analytics in CLIENT+SERVER editor
Clean: fix formatting in Analytics.Azure.cs
Most of file was offset with 2 tabs. Sorry to anyone who has conflicting changes in same file (hopefully no-one)
Tests: editor compiles
Update: Analytics - track all entity spawn/destroy events after server initializes
- change the format of these events to only send vital data
- HackableLockedCrate no longer has it's own EntityCreated event
Tests: logged analytics on Craggy - saw events being appended after server initialized
Merge: from server_occlusion_poppin
- Reduce player poppin by making occlusion grid generation more conservative
- Bumped occlusion version, will cause regeneration on next server boot
Tests: visualized in editor, ran previously failed queries
Update: ServerOcclusion - only block occlusion cell if it's fully under terrain
- bumped occlusion file version
Previously we considered it was blocked if one of sample points was in terrain. This allows more occlusion queries to pass, which should reduce poppin.
Tests: visualized new grid, ran previously failing query - they now pass
Merge: from hide_getinternalarrayunsafe
- Replaces dangerous API with a safer, updates existing use cases
Tests: unit tests
Update: replace invalid usage of GetInternalArrayUnsafe
Tests: none, trivial change
Update: Hide List.GetInternalArrayUnsafe
- introduce ListAsReadOnlySpanOf to help deal with casting up (since we don't have ReadOnlySpan<T>.CastUp<U>)
- added simple unit tests
Tests: ran unit tests
Merge: from analytics_v2_expose_telem
- Fixes CLient crash when running analytics.tablestats or uploaderstats
Tests: built standalone and ran the commands - no crash
▊▉▆█▋▌: ▇█▍▊ ▌▋▉▋▍▅▆▍▇▊▌▊▌▇▇▊▋▌▉▋▇▋ ▊█ ▅▉▍██▉▋▉▄
█▌▉▅▊▍▍▆▆▌▋ ▋▄▊▌▅ ▄▄█▌▅▇▄ ▅▅▊▇▆▌, ▉▋▌▆▉ ██▋▉▅ ▍▊█▄▍ ▌▊▄▌▄ ▆▇ █▆ ▊▌▅▌█▍ ▄▉▋█▋▅▌ █▉▆█ █▉▍ ▉▅▋▆▅▆█▉█▅ ▉▅▇▉ ▊▊▆▊▆▉▄▇▍.
▄▆▌▄▆: ▉▊▊▌▌ █▋█▅▌▋▆▉▉▄ ▉▍▊▋▆▌, ▌▍▌ ▅▍▌▆▆▊▍▇▆.▅▍▌█▊▇▌▌▅▉ - █▍ ▄▄▉▆ ▇▅▊▄▋█▋
Merge: from spectate_dontfloodsnapshots
- reduce potential delay when starting to spectate a far-away player
Tests: flew around 2k procgen map, got to the other side of it then spectated player on the opposite end.
Update: spectator's snapshot queue is cleared when switching between far-away targets
This should speed up switching around on a server. Doesn't help if the network write queue is backed up
Tests: on a 2k procgen map and fast noclip, flew around the island to load up the snapshot queue, then spectated on a player that's on the other side of the island. Observed player moving.
Undo:
135590 - ISubscriberStrategy.GatherSubscriptions outputs whether it has fully or partially gathered subscriptions
After implementing throttling realized there's a better way(invalidate grid sbuscriptions for spectator) - thottling solves only half of problem
Tests: editor compiles
Update: ISubscriberStrategy.GatherSubscriptions outputs whether it has fully or partially gathered subscriptions
- all existing implementations report "full" gathers
This feeds into whether we'll stop running UpdateSubscriptions or not. Will use this to throttle-and-prioritize cell streaming to spectators
Tests: editor compiles
Merge: from networkpositiontick_reduce
- Optim: buoys, containers, water-junkpiles and vines no longer always replicate their position. Reduces number of NetworkPositionTick invokes from 2309 down to 522 on 4.5k map
Tests: interacted with each prefab type, observed up close and from afar
Update: codegen
Tests: editor compiles
Bugfix: profile.CountSyncMoveEntities - check if invoke handlers are not instantiated
- Also add a total count
Tests: used it while swinging from vines
Optim: VineSwingMountable no longer syncs positions by default
Should save another 0.7ms
Tests: Swung across multiple vines in playground_vineswinging, descended on one to ground
Optim: crate_underwater_* - only sync positions once freed
Should save us 0.7ms on 4.5k server
Tests: untied basic and advanced crates on Craggy and observed them raise up
Bugfix: disable Drop To Ground on spawnpoints for junkpile_water_* barrel spawns
Some were incorrectly placed leading to barrel spawning on the ocean floor.
Tests: spawned on craggy, inspected a bunch of junkpile_water_*, none had underwater barrels