Acheron
09/01/2025, 4:06 PMJurjen
09/02/2025, 5:55 AMAcheron
09/02/2025, 7:29 AMPlayerModel as MetaDictionary<QuestId,QuestModel>.
* When the player session starts, they are calculated on PlayerActor and added by a QuestAddAction : SynchronizedServerAction
* When players progresses through the quest, QuestProgressAction : PlayerAction is enqued, incrementing progress inside QuestModel and making the quest collectable
* After player collects this quest, QuestCollectAction is called by Client. This actions removes quest from MetaDictionary<QuestId, QuestModel> and calls ServerListener.QuestCollected().
* From here on ServerListener.QuestCollected calculates new quests to adds them with QuestAddAction completing the cycle.Acheron
09/02/2025, 7:38 AMProgressAction enqued on Client (finishes with success both at staging and checkpoint rerun) BUT on the Server completes as expected on stagedModel but fails on checkpointModel. The reason is inside ProgressAction I check an enum field and see if the quest is already completed; if so return error code. And somehow on the checkpointModel the quest is already completed breaking the timeline :/Jurjen
09/02/2025, 7:45 AMPlayer:
DebugConfig:
ClientConsistencyChecks: true
ServerConsistencyChecks: true
ChecksumGranularity: PerOperationJurjen
09/02/2025, 7:45 AMAcheron
09/02/2025, 7:50 AMAcheron
09/02/2025, 7:52 AMJurjen
09/02/2025, 8:00 AMAcheron
09/02/2025, 8:02 AMAcheron
09/02/2025, 8:04 AMSharedCode is set internally so I assume mutating the model outside actions is not the case. I'll explore the second option and try to find a solution. Btw this may sound lame but i am going add this option to Options.base.yaml right? wanted to be sureJurjen
09/02/2025, 8:05 AMOptions.base.yaml or Options.local.yaml both work, the latter is likely better if you're going to keep the setting around, but if you're going to remove it, then either worksAcheron
09/02/2025, 9:04 AMAcheron
09/02/2025, 9:22 AMJurjen
09/02/2025, 12:04 PMAcheron
09/02/2025, 12:24 PMAntti // Metaplay
09/03/2025, 8:20 AMAcheron
09/03/2025, 6:45 PMDebugLog to see if the action is being executed on a correct model or not and while the client side prints 2 successes (guessing one for stage and one for check point), the server side runs the same action twice as well but with 1 success and 1 fail (first one being stage and second one on checkpoint). Additionally, when I drop a breakpoint to this 'fault state check' inside the action, I can catch it on server and the stack points to the checkpoint rerun (ModelJournal.Follower.CommitOperationRange). From what I understand from your explanation the _timeline.IsCheckpointingEnabled should be false or not have to checkpoint logic to begin with, alas, neither is the case 😄
Meanwhile I've made a simple flow of Actions being taken from both the server side and the client side which you can find here: https://drive.google.com/file/d/1r2PidDms2wuY_0Zb0ky_aygauuB4PXRT/view?usp=sharingAntti // Metaplay
09/03/2025, 7:54 PMAntti // Metaplay
09/03/2025, 8:21 PMAntti // Metaplay
09/03/2025, 8:43 PMAcheron
09/04/2025, 5:10 PMAntti // Metaplay
09/05/2025, 7:49 AMAntti // Metaplay
09/09/2025, 2:51 PMServerConsistencyChecks to accidentally alter the behavior of the checkpoint model re-run and this will be fixed in the next SDK update. This explains why enabling the checks hides the issue, but the original issue turned out to be sneaky sharing of state between the actual and the checkpoint model.