3,043 Commits over 730 Days - 0.17cph!
Update: avoid transform call in TravellingVendor.Save when it's following a spline
Tests: none
Update: move Privelege caching from DisplayingBoxStorage.Save to OnPrivelegeUpdated
We can't have it in Save as it is self-modifying and can call Vis.Entities - lets see how this holds
Tests: none
Update: force TimeZone caching in WipeTimer.ServerInit
While smashing TestMTSave(WipeTimer) I saw it NRE while resolving timezone. Couldn't repro again, but this should make it safe
Tests: none, trivial change
Update: get rid of WipeTimer rounding to second, just pass DateTime from external source
Old version would always have a sporadic fails when serialization test would run across second boundary, this way we can control it in tests
Tests: a bunch of times for hacked version of TestMTSave(WipeTimer) that has 1k serialization tasks
Update(tests): add various missing TestServer setup and unit testing bypass for entity logic
Tests: ran all TestMTSave, no sporadic failures, except WipeTimer - guess my prev fix didn't work >.>
Update: made MarketTerminal.Save MT friendly
- get rid of TimeUntil aliases from Entity.proto
- ran protobuf gen
Doesn't need protocol update, as the underlying type/serialization doesn't change
Tests: TestMTSave - all 636 tests pass, though gotta work on cleanup consistency
Update: WipeTimer now returns time rounded to a second
No change for gameplay, but makes serialization tests consistent
Tests: 20 runs of TestMTSave(WipeTimer), all pass
Update(tests): TestMTSave - move protobuf serialization to worker threads to catch more invalid API usages
Revealed 2 failures
Tests: ran all TestMTSave - MarketTerminal (TimeUnitl) and WipeTimer(missmatching stream) failed
Bugfix: avoid Time call in ChickenCoop.Save to make it MT friendly
- added chicken as part of test setup to trigger this path
Tests: TestMTSave pass
Update: BasePlayer - don't mutate own model state on save
We modify the copy as we send it, and the original value should be modified on every tick, so should be safe
Tests: none, trivial change
Update: make ItemBlueprint.FindBlueprint MT friendly
GetComponent is not thread safe, so caching item->blueprint pairs at init time
Tests: setup TC, made sure it has right upkeep calculated
Bugfix: BuildingPrivlidge(sic) - add GetOrUpdateProtectedMinutes that's MT safe and does a bit of a cheeky
If we end up sending this entity to many players in 1 frame, it will update the cached protected minutes only for 1 player, and the rest are in limbo if they got old or new value. This gives us same perf as original lazy-eval solution.
Tests: TestMTSave - got 0 fails!
Update(tests): patch MapMarkerMissionProvider
Tests: TestMTSave passes (down to 2)
Update: TestServer now initializes PaintballColorLookup.instance
Tests: TestMTSave - 5 -> 3 fails
Bugfix: make TravelingVendor.Save MT friendly
- get rid of wheel flags processing, they were updated on server and sent over, but not used
- cache linear velocity every fixed step (we're missing on interpolation, but we only send the snapshot every fixed update anyway)
- use manually interpolated steeringAngle instead of querying the wheel collider
Tests: TestMTSave(down to 5 remaining), ran TravelingVendorTest scene and looked at the vendor as it drove around
Bugfix: move tin can updates out of Save, as it's not MT safe
Tests: TestMTSave and placed it on the ground, walked over and opened inventory
Update(tests): TestServer now also initialized TrainWagonLootData and Translate classes
Tests: TestMTSave - 13 -> 7 fails
Bugfix: batch of bugfixes to Save being not MT safe
- removed more Time dependency
- replaced Transform access with TransformHandle bypass
Tests: TestMTSave - 20 -> 13 fails
Bugfix: move Signage.EnsureInitialized from Save to ServerInit, as it's not MT safe
Tests: TestMTSave - 25 -> 20 fails
Bugfix(tests): batch of patches for unit test spawned entities to avoid NREs in Save
Tests: TestMTSave - 28 -> 25 fails
Bugfix: move CarvablePumpkin.EnsureInitialized out of Save, since it's not thread safe
Tests: TestMTSave(CarvablePumpkin) and spawned and carved one on playground
Bugfix: batch of Transform replacements with TransformHandle in save code when using Jobs 4
Tests: TestMTSave - 32 -> 29 fails
Bugfix: batch of replacement for Time usage with ThreadSafeTime
Only 1 skipped out for now, BuildingPriviledge - that one does lazy-eval, which is problematic
Tests: TestMTSave - 42 -> 32
Bugfix: BasePlayer - avoid Time.time when evaluating mortarCooldown
There's one more issue to resolve, but it doesn't affect unit tests, will resolve later
Tests: TestMTSave - 59 -> 42 fails
Bugfix: vehicle related Time api fixes
- TimeSince and TimeUntil now have a member method allowing to calculate from passed time (to avoid Time.time invoke)
- TrainCar uses GetNetworkTime(ThreadSafeTime) overload
Tests: ran TestMTSave, 74 -> 59 fails
Tests: TestMTSave
Bugfix: don't use cached fuel fraction, just calculate it when saving
Avoids TimeUntil sample, which isn't safe in MT
Tests: TestMTSave(AttachHelicopter) pass
Update(tests): another small batch of patches and skips that I missed
Tests: TestMTSave 81 -> 75 failures
Bugfix: BaseNPC - fallback to original GetNtworkRotation implementation for server side entity
It knows how to fetch local rotation in MT-safe way
Tests: TestMTSave - 94 -> 81 failures
Update(tests, editor): last batch of patches and bypasses to spawn entities
- Renamed Prefabs editor script into PrefabTools, as it was conflicting with PRefabs.Misc.GhostShip
I can finally get to fixing save issues for MT
Tests: relevant TestMTSave pass
Update(tests): batch of various patches and prefab spawn skips
Got about 10 patches to apply before starting to fix saving for MT
Tests: relevant TestMTSave pass
Update(tests): skip marker spawning in tests for DeliveryDrone
Tests: TestMTSave(DeliveryDrone) pass
Update(tests): patch GraveyardFence
Tests: TestMTSave(GraveyardFence) pass
Update(tests): patch StringFirecracker
Tests: TestMTSave(StringFirecracker) pass
Update(tests): patch CookingWorkbench
Tests: TestMTSave(CookingWorkbench) fails on Save now (realtimeSinceStartup)
Update(tests): patch WaterInflatable
Tests: TestMTSave(WaterInflatable) pass
Update(tests): TestServer now creates TreeManager
Tests: TestMTSave(TreeEntity) pass
Update(tests): patch ThrownBoomerang
Tests: TestMTSave(ThrownBoomerang) pass
Update(tests): patch SingleUseMissionStorageContainer
- also have TestServer explicitly create InvokeHandlerFixedTime to avoid DontDestroy call
Tests: TestMTSave(SingleUseMSC) pass
Update(tests): patch SantaSleigh
Tests: TestMTSave(SantaSleigh) pass
Update(tests): patch MobilePhone
Tests: TestMTSave(MobilePhone) pass
Update(tests): patch DisplayingBoxStorage
Tests: TestMTSave(DisplayingBoxStorage) pass
Update(tests): patch ConstructableEntity
Tests: TestMTSave(ContainerCorpse) pass
Update(tests): patch BallistaGun
Tests: TestMTSave(BallistaGun) pass
Update(tests): patch WildlifeHazard
Tests: TestMTSave(WildlifeHazard) pass
Bugfix(editor): rename TreeManager.Reset into ResetTrees
Unity was derping trying to call instance Reset when it was marked as static
Tests: TestMTSave(TreeManager) pass
Update(tests): ensure patched BaseCombatEnt have non-0 starting health
Allows for Stocking to survive during initial damage tick on spawn
Tests: TestMTSave(Stocking) pass
Update(tests): redirect relationship db location to temp path in tests
Tests: TestMTSave(RelationshipManager) pass
Update(tests): skip generation and map marker of ProceduralDynamicDungeon in tests
Tests: TestMTSave(ProceduralDynamicDungeon) pass
Update(tests): patch PatrolHelicopter
- also bypass map marker spawn in unit tests
Tests: TestMTSave(PatrolHelicopter) - fails on transform access in save
Update(tests): bypass mapMarkerPrefab spawning in unit tests
Tests: TestMTSave(MLRSRocket) pass