2,185 Commits over 549 Days - 0.17cph!
Tests: OcclusionGroupTests - TestNew_MoveOther (8)
Simulates other players going through observer's network range. Have a separate CL that makes this test pass, but not sure I like the final result - will try to rewrite it all through a different approach to be simpler.
Tests: ran unit tests, they fail without extra changes
Clean: dead code removal
Tests: none, trivial change
Bugfix: OcclusionGroup - handle sleeper edge cases
- when player disconnects, clean itself up from non-local occlusion groups
- when sleeper moves, unsubscribe from occlusion groups go out of range or don't have a local player
Tests: unit tests, all pass (yay)
Update: OcclusionGroupTests - clear global Occludees hashset on every test start
old logic leaks were polluting tests, making it more annoying to validate unit tests
Tests: ran unit tests
Bugfix: OcclusionGroups - new logic will cleanup non-local groups from itself if there's no connected player there
This fixes how 2 sleepers interact with each other, and lets us reduce the size of groups overall
Tests: ran unit tests, 4/226 fail
Tests: OcclusionGroupTests - add validation that all groups have been cleaned up at the end of the test
- some old logic based tests are failing this, so plugged it with a warning
Tests: ran all unit tests, 8/226 fails
Tests: OcclusionGroupTest - disable assertions for known issues with old logic tests
- Emitting "Skipping Assert for a known bug!" warnings for those instead
Old occlusion grouping logic does not support moving sleepers at all. Also, seems to be failing to clean-up global occlusion groups tracking properly.
Tests: ran all unit tests, 8/226 fail (only new logic that I've yet to fix)
Tests: OcclusionGroupTests - update expectations of all tests around newLogic and Asleep players
This is currently catching a bug, so will need to fix later, after I sort the oldLogic failures next
Tests: ran all unit tests, 22/226 failing
Bugfix: OcclusionGroupTests - hookup serverMgr to Network.Server
- clarified expectatios for TestVisibilityNear, will need to do more of it for sleepers
They were unlinked, sso player's weren't fully transitioning to the sleeper state (no subscriber, no connection), letting more tests pass than expected
Tests: ran unit tests, 23/226 fails, old logic started to fail as well
Tests: OcclusionGroupTests - Asleep players are now disconnected-asleep (no subscriber, no connection)
Tests: ran unit tests, this fails 11/226 cases, all on new logic side
Tests: OcclusionGroupTests - new TestVisibilityAfterMovingToOutside (32)
All simple cases covered, except for using actual sleepers. Next change will likely break a bunch of tests
Tests: ran unit tests
Tests: OcclusionGroupTests - add TestVisibilityAfterMovingToFarRange (32)
- added a couple TODOs
Tests: ran new unit tests, all's gud
Tests: OcclusionGroupTests - add move to near range visibility test (32)
Tests: ran new tests, all pass
Tests: OcclusionGroupTests - add test validating moving from outside net range to same cell (32 tests)
Need to add 2 more variations (move to near and far range), then can start moving to esoteric scenarios
Tests: ran new tests, all pass
Bugfix: OcclusionGroupTests - fixup invalid expectation of newlogic groups in TestVisibilityAfterMovementAway
We succesfully enforce newlogic's rule that networkable should always be in a local occlusion group
Tests: ran all unit tests, all green
Bugfix: OcclusionGroup - prevent unsubbing from own group
Can happen when player is dead/in limbo
Tests: ran unit tests, fixed TestUpdateSubs(newLogic, dead), but TestVisibilityAfterMovementAway(newLogic, dead, *) still fail, albeit for new reason
Tests: OcclusionGroupTests - add simple tests verifying group and sub updates
Need them to validate that new logic can unsub from group it's in (which is illegal)
Tests: ran new 24 tests, TestUpdateSubs(true, dead) failed as expected
Bugfix: OcclusionGroupTests - fix TestVisibilityAfterMovementAway(oldLogic, Dead) tests
Updating subs when in limbo unsubs you from limbo group (funky, but legal). Old logic ends up with empty groups (okay for it), but new logic ends up with an invalid occl group
Tests: ran unit tests, 4 failures left
Bugfix: OcclusionGroupTests - fix TestVisibilityAfterMovementAway(*, OutsideCell) tests
- Handle the fact that new occlusion group logic eagerly cleans up occlusion groups when moving out of range, even before subscription tick
- Fix invalid assertion for old logic when p2 moves, before subscription tick
Tests: ran tests, now 8 failing (all related to Dead players)
Tests: OcclusionGroupTests - add TestVisibilityAfterMovementAway tests (32)
Tests: ran new unit tests, 14 fail
Tests: OcclusionGroupTests - Visibility tests now update network groups and update subscriptions
This validates that subscription mechanism works on a basic level
Tests: all 42 unit tests pass
Bugfix: OcclusionGroupTests - use AreEquivalent instead of AreEqual when comparing occlusion groups
Old logic and new logic end up with differently ordered occlusion groups - but in real world we don't care about order
Tests: all 42 unit tests pass
Bugfix: Eagerly initialize occlusion groups when player spawns
When player's network group switches on spawn, it's treated as a bot, so doesn't create an occlusion group, but it might be awhile till next group switch, so player might have uninitialized occlusion group for a bit.
Tests: unit tests - 42/45 pass
Bugfix: OcclusionGroupTests - handle dead players in limbo
All TestVisibility* tests pass for old logic
Tests: ran unit tests
Bugfix: OcclusionGroupTests - use RespawnAt to be put in the right position for RespawnFromDead players
This makes 3 unit tests pass
Tests: ran unit tests
Bugfix: PlayerInventory - make GiveDefaultItems safe, report errors instead of NREing
- GameManager.InUnitTest is now available outside of UNITY_EDITOR as always-false const
Tests: more unit tests related to RespawnFromDead pass
Update: OcclusionGroupTests - introduce another player spawn state, RespawnFromDead
- setup default itemList for ItemManager when running unit tests, as it's assumed to always be there
Another assumption that I had proved wrong - when players are spawned, they can stay dead (for example, game mode can prohibit spawning for a time)
Tests: ran unit tests, more borkage
Bugfix: OcclusionGroupTests - setup valid world bounds for unit tests
- added netgroup visibility precondition testing, if that fails, then the test setup is wrong
Empty bounds were causing group layers to sometimes become TutorialIsland, which break visibility
Tests: ran unit tests, more pass
Bugfix: OcclusionGroupTests - correct expectations of visibility
Tests: ran unit tests, more pass, but still mostly borked
Tests: OcclusionGroupTests - add players that spawn as sleepers or dead
I assumed newly connected players always spawn as sleepers, but that's wrong - could explain an active NRE.
Tests: ran unit tests (most still borked)
Tests: add basic OcclusionGroup tests
- covers both old and new logic
Tests: ran unit tests, most fail, only trivial passes. Will resolve tomorrow.
Merge: from useplayertasks_removegroupocludee_nre
- Update: hide new server occlusion group logic behind -enable-new-server-occlusion-groups command line arg (disabled by default)
Tests: 2p on Craggy - moved, teleported, reconnected, checked server occlusion still works
Update: merge old OcclusionGroup code and put it behind DisableNewOcclusionGroups switch
- make DisableNewOcclusionGroups true by default, can be turned off with -enable-new-server-occlusion-groups command line arg
Tests: 2p on Craggy - moved, teleported, reconnected, checked server occlusion still works
Update: declare a boot time switch to disable new server occlusion groups
Need to bring back old logic for it, that'll be next.
Tests: none, trivial change
Merge: from useplayertasks_removegroupocludee_nre
- Bugfix: a series of bugfixes and extra error logs to ensure occlusion groups are valid and consistent
Tests: 2p on Craggy - ran around host, flew away and back, teleported away and back, tested sleepers, disconnects, and general occlusion
Clean: move OcclusionValidateGroups servervar to ServerOcclusion
- codegen
Tests: server compiles
Clean: GetOccludees => OcclusionGroup getter
Tests: server compiles
Clean: OcclusionGroups - define bespoke ServerOcclusion.Group
- updated code references
Tests: all modes compile in editor
Clean: OcclusionGroup - lower core of logic from BasePlayer to BaseNetworkable
- also move cached subscribers cleanup to BasePlayer.OnServerDestroy
- split off server occlusion logic into it's own BaseNetworkable potion
Tests: all platforms compile in editor
Bugfix: ServerOcclusion - clean up external references when BaseNetworkable is destoyed
Dobbie's free, this is the last bug I could theorycraft. There's a small window before occlusion would update and unsubscribe where a teleport then destroy could leave a dangling set of references, but this doesn't happen because of unnecessary SetParent being called when BaseEntity is destroyed on the server(but this should be fixed separately)
Tests: not testable
Update: OcclusionGroup - tracked down another false-positive error
- left a comment explaining why check was removed
Whena player reconnects and reclaims a sleeper with a player in proximity, the eventual network group subscription will try to append to the occlusion group that already contains the reconnected player.
Tests: reconnected with a player in vicinity
Bugfix: ServerOcclusion - clean up occlusion group refs when retiring groups
Fixes false-positive error logs
Tests: 2p, 2nd player disconnects while 1st player is in vicinity - afterwards first player walks out then back into to original network cell
Update: Update: OcclusionGroups - each members tracks which group refers to it
Needed for an upcomign bugfix in OnDestroy and helps detect issues
Tests: 2p on Craggy - tested players close, flying far away, teleporting, disconnect-reconnect - logged an extra problem to address
Clean: refactored out OcclusionOnDestroy, as it was getitng messy
- also added a null check to avoid pooling issues
Tests: none, trivial changes
Bugfix: OcclusionGroups - ensure sleepers are tracked when player transitions to a different occlusiongroup
This is an edge case when being in subscription range of a sleeper - sleeper's group would contain it and player, but player's group would have sleeper missing
Tests: moved around in the vicinity of sleeper, checked internal state
Bugfix: OcclusionGroups - fix NRE when moving out of group with a sleeper
- replaced with a IsVisibleFromFar check
- also reworked teleportation logic via IsVisibleFromFar, as that's more correct
- also IsVisibleFrom range check was wrong, so fixed that
Previous code relied on subscriber to check if move-out-of-bounds occurred, but sleepers don't have a subscriber, so it NREed
Tests: moved away from a cell with a sleeper, checked internal state
Update: NetworkVisibilityGrid gains IsVisibleFromNear/Far(Group from, Group to)
- expose via provider interface
Needed for occlusion groups case of moving sleepers (as I can't rely on subscriber check)
Tests: testted as part of followup bugfix