Hi,
I’ve spent the last few day investigating on a desync issue and I’m kinda of stuck.
I’m using Mover with the Network prediction backend and in some cases it seems to be stuck in an eternal struggle to rollback a desync. Which we can clearly see it from the Network Prediction Insight
[Image Removed]
I tried to isolate the issue, without much success, but it seemed to be related to either:
- A Client leaving a Movement Base(Sometime setting a new movement base and leaving again seem to resync properly)
- Switching a Mover Actor or Pawn to Autonomous Proxy from a Client. For Example when interacting with Mover GPE to move it or make it follow the client.
I’m unsure about how to fix the desync and/or fixing the rollback to avoid it being “stuck” and if there is a better way to have more info on what may be causing this desync/rollback.
Thanks !
Hi,
I haven’t been able to reproduce this myself, and I don’t see any reports of similar issues. To get a better idea of the problem, I have a couple of questions.
Is this occuring in PIE, standalone editor, and/or packaged instances? Are you using any network emulation when testing in the editor, and are you doing anything to lower the FPS of the editor or client instance?
Next, what Network Prediction settings are you using?
Also, could you clarify what you mean by having the client switch a mover actor to Autonomous Proxy? Are you having the client’s Player Controller possess the pawn, or is this being handled some other way?
Finally, have you been able to observe this problem in the test maps from the Mover Content Examples plugin?
Thanks,
Alex
Hi Alex,
Yeah I’m already in a very custom situation that is a bit hard to extract and replicate in a Mover Sample 
For now i’m testing in PIE 2 Players with Listen Server (but we are thinking about switching to Dedicated Server instead) without any network emulation or lower FPS.
I’m using the default settings recommended from Mover docs
[Image Removed]My use case is let’s say I have a Mount. It is a Pawn having it’s own Mover Component etc. Any of the players can use said Mount.
If a Client use it, I want it to be Autonomous Proxy on it’s side if another player use it it should be switched back to Simulated Proxy. Or at least from what I think I understood (still new to UE).
I’m not possessing the Mount but setting the Input Producer for the Mount Mover Component to use one from the Player.
I’m sorry if it’s a little too vague, I’m still trying to wrap my head around all this 
I’ll try to extract chunks of this and try to create a repro sample but we already have quite a setup so it may be difficult 
Sorry for double posting but I managed to isolate a repro. (Which has nothing to do with the switching Autonomous Proxy etc)
I found out that the collisions presets weren’t set properly on the skeletal mesh component of the mount so while exiting it (or just by jumping on it) will try to set it as a Movement Base and later cause the desync loop.
It’s also worth mentioning that while Mounted, the Player Mover Component use a Socket from the skeletal mesh as Movement Base, which can also cause the same issue when UnMounting.
On a fresh project on 5.6.1 using Mover Example Content I took an animated many, enabled the collision on the Skeletal Mesh and rotated the mesh to walk on it.
[Image Removed]
Then just by walking on it with the Player 2 and walking off, I was able to repro the same behavior that I had
[Image Removed]
But in this testing I also discovered that jumping on another Movement Base (I was using the L_BasedMovement Level) seemed to properly resync the Player 2.
Hi,
Thank you for the additional info, but following the steps outlined here, I’m unfortunately still unable to reproduce the issue locally.
Are there any other settings being changed as part of this repro, and if possible, could you provide a sample project?
I appreciate your patience as we work to resolve this.
Thanks,
Alex
Hmm that’s weird, I only created a new project on the Third Person template and added Mover and NPP Insight to it.
I attached a zip of the repro project I used, and a gif with the repro steps.
I hope it helps !
[Image Removed]
Hi,
Thank you for the repro project! I’m not sure what I was doing wrong in my own testing, but I can now observe the issue you’ve described here.
This does seem to be a bug with how based movement is handled when a skeletal mesh is the base, specifically when moving from a skeletal mesh to a movement base with “static” mobility. I’ve opened a new issue for this, UE-318970, which should be visible in the public tracker in a day or so.
Thanks,
Alex
Thanks, glad it could help.
However in the meantime do you have any recommendation or workaround about it ?
Even something that implies modifying the source code from Mover ?
Hi,
After a little more digging, I may have found the source of the issue.
In FMoverDefaultSyncState::NetSerialize, the MovementBaseBoneName isn’t reset on the receiving end when there isn’t a valid movement base. This leads to the MovementBaseBoneName on the client still being the name of the bone from the skeletal mesh, rather than “NAME_None.”
You can try adding this to FMoverDefaultSyncState::NetSerialize:
else if (Ar.IsLoading())
{
MovementBase = nullptr;
// Add the following line:
MovementBaseBoneName = NAME_None;
}
While this change did seem to fix the issue in my test project, please note that this has not been thoroughly tested. Let me know if you run into any issues with this change.
Thanks,
Alex
Hey,
I tried it yesterday, it seem to fix the issue and I haven’t seen any side effect (yet). Thanks !
I still have other desync issue but I believe those ones are on my part doing something wrong 
On that I have a follow up question: What is a good way to find what may cause a rollback ? Is the Network Prediction Insight my only goto ?
Hi,
Great, I’m glad that’s working for you so far!
Outside of Network Prediction Insights, you can also enable visual debugging of corrections with the “Mover.Debug.ShowCorrections” CVar (and the “Mover.LocalPlayer.ShowCorrections” CVar for the local player). There’s also the UMoverDebugComponent, and you can see how this is used in the mover content examples plugin.
There’s also the “np.PrintReconciles” CVar, which will log detailed info each time the Sync and Aux states are mismatched.
Thanks,
Alex
What visualizer is that above? Is that something custom you wrote or is that part of Unreal Insights or something?
Hi,
That is Network Prediction Insights, which uses Unreal Insights to trace and display debugging info for the Network Prediction Plugin. It is its own separate plugin that will need to be enabled for your project.
Also, in the future we recommend making a new question rather than replying to an existing thread, as these replies can sometimes be lost. If your question is in reference to an existing thread, please feel free to link to that thread on the new question.
Thanks,
Alex