I’ve been digging through source with 4.6.1. Your main issue here is that you are calling a reliable multicast on tick event. Multicasts are designed for non gameplay important events and should remain unreliable. When made reliable, call to client is “forced”. If reliable multicast rpc is called before client is done logging in, because it is “forced”, it thinks it is a broken or new instance of a previous connection.
Engine\Source\Runtime\Engine\Private\NetConnection.cpp
// on server, if we receive bunch data for a channel that doesn't exist while we're still logging in,
// it's either a broken client or a new instance of a previous connection,
// so reject it
else if ( PlayerController == NULL && Driver->ClientConnections.Contains( this ) )
{
UE_LOG( LogNetTraffic, Error, TEXT( "UNetConnection::ReceivedPacket: Received non-control bunch during login process" ) );
Close();
return;
}
I came up with a fix but requires editing engine source.
change \Engine\Source\Runtime\Online\OnlineSubsystemUtils\Private\IpNetDriver.cpp at line 320 from
if (IsRelevant)
{
if (Connection->GetUChildConnection() != NULL)
{
Connection = ((UChildConnection*)Connection)->Parent;
}
InternalProcessRemoteFunction( Actor, SubObject, Connection, Function, Parameters, OutParms, Stack, bIsServer );
}
to
if (IsRelevant && (Function->FunctionFlags & FUNC_NetReliable) ? Connection->OwningActor != NULL : true)
{
if (Connection->GetUChildConnection() != NULL)
{
Connection = ((UChildConnection*)Connection)->Parent;
}
InternalProcessRemoteFunction( Actor, SubObject, Connection, Function, Parameters, OutParms, Stack, bIsServer );
}
Now, if multicast is unreliable, it behave as before. But if it is reliable, it won’t be called on client until Connections owning actor is not null. In this case, I believe that owning actor needs to be a player controller or else connection will still be closed.
Another option that doesn’t involve changing source code is to not use reliable multicasts until after all clients have connected to host. If that is not an option, use reliable multicasts sparingly and it should be a very rare occasion that connection is dropped when client tries to join.