Tearing off an actor managed by Network Prediction Plugin

Hi all,

I am having some issues with constant warning spam when trying to tear off a pawn using Mover 2.0 (UMoverComponent). In the network prediction plugin, I am using independent tick policy and forward predict because this gives the best results. Fixed with interpolation causes the remote proxy to basically mimic the autonomous proxy with a consistent but extremely noticeable latency, which is not good for a fast-paced multiplayer shooter. Forward predict with smoothing seems to find a nice middle ground between having smooth movement without constant “pop-in” corrections, but not running too far behind reality.

My use case is extremely simple: when a player dies, their pawn is torn off and stops replicating and syncing movement since the ragdoll is client-side. However, this causes permanent, endless spam in the logs:

LogNetworkPrediction: Warning: Independent Interpolation starved: -15

The actual number on the end is slightly different each time.

This warning is generated out of UNetworkPredictionWorldManager::BeginNewSimulationFrame_Internal so my guess is that the pawn’s mover component is still being managed by the network prediction plugin and since the pawn has been cut off from the server, it is being starved of frames to interpolate.

Can someone help me understand how I can cleanly tear off the pawn and prevent this spam? The actual functionality seems ok, but this spam suggests something is seriously wrong so I don’t want to just ignore it in case we get bugs elsewhere as a result.

Here is the point where I tear off the pawn:

void ABSPawnBase::FinishDying()
{
	// Called on server at the end of the death process
	TearOff();
}

void ABSPawnBase::TearOff()
{
	if (MoverComponent_Private)
	{
		MoverComponent_Private->UninitializeComponent();
		MoverComponent_Private->DestroyComponent();
	}

	Super::TearOff();

	if (FBSNetworkStatics::IsServerOnly(this))
	{
		SetLifeSpan(0.1f);
	}
	else
	{
		SetLifeSpan(5.0f);
	}
}

void ABSPawnBase::TornOff()
{
	if (MoverComponent_Private)
	{
		MoverComponent_Private->UninitializeComponent();
		MoverComponent_Private->DestroyComponent();
	}

	Super::TornOff();

	SetLifeSpan(5.0f);
}

As you can see, I’ve tried uninitializing the mover component which is supposed to unregister it from the backend liaison, and even destroying it. No good: permanent endless spam until I quit the game.