Modifying `FUpdateLevelVisibilityLevelInfo::NetSerialize` as follows (ripping off `UE::GameplayTags::GameplayTagDynamicSerialization::NetSerialize`) seems to help:
`bool FUpdateLevelVisibilityLevelInfo::NetSerialize(FArchive& Ar, UPackageMap* PackageMap, bool& bOutSuccess)
{
bool bArePackageAndFileTheSame = !!((PlayerControllerCVars::LevelVisibilityDontSerializeFileName) || (FileName == PackageName) || (FileName == NAME_None));
bool bLocalIsVisible = !!bIsVisible;
bool bLocalTryMakeVisible = !!bTryMakeVisible;
Ar.SerializeBits(&bArePackageAndFileTheSame, 1);
Ar.SerializeBits(&bLocalIsVisible, 1);
Ar.SerializeBits(&bLocalTryMakeVisible, 1);
// @CHANGE BEGIN
#if UE_WITH_IRIS
if (Ar.IsLoading())
{
const UE::Net::FNetTokenResolveContext* netTokenResolveContext = PackageMap ? PackageMap->GetNetTokenResolveContext() : nullptr;
UE::Net::FNameTokenStore* nameTokenStore = netTokenResolveContext ? netTokenResolveContext->NetTokenStore->GetDataStoreUE::Net::FNameTokenStore() : nullptr;
if (ensure(nameTokenStore))
{
UE::Net::FNetToken nameToken = nameTokenStore->ReadNetToken(Ar);
if (!Ar.IsError())
{
PackageName = nameTokenStore->ResolveToken(nameToken, netTokenResolveContext->RemoteNetTokenStoreState);
}
}
}
else
{
UE::Net::FNetTokenExportContext* netTokenExportContext = UE::Net::FNetTokenExportContext::GetNetTokenExportContext(Ar);
UE::Net::FNetTokenStore* netTokenStore = netTokenExportContext ? netTokenExportContext->GetNetTokenStore() : nullptr;
UE::Net::FNameTokenStore* nameTokenStore = netTokenStore ? netTokenStore->GetDataStoreUE::Net::FNameTokenStore() : nullptr;
if (ensure(nameTokenStore))
{
UE::Net::FNetToken netToken = nameTokenStore->GetOrCreateToken(PackageName);
nameTokenStore->WriteNetToken(Ar, netToken);
netTokenExportContext->AddNetTokenPendingExport(netToken);
}
}
#else // UE_WITH_IRIS
// @CHANGE END
Ar << PackageName;
// @CHANGE BEGIN
#endif // UE_WITH_IRIS
// @CHANGE END
if (!bArePackageAndFileTheSame)
{
Ar << FileName;
}
else if (Ar.IsLoading())
{
FileName = PackageName;
}
VisibilityRequestId.NetSerialize(Ar, PackageMap, bOutSuccess);
bIsVisible = bLocalIsVisible;
bTryMakeVisible = bLocalTryMakeVisible;
bOutSuccess = !Ar.IsError();
return true;
}To make the server\-to\-client save bandwidth too, it may also be worth changing \
APlayerController::ClientAckUpdateLevelVisibility` to use the `FUpdateLevelVisibilityLevelInfo` as a parameter (otherwise it will just serialise the PackageName parameter as a string).
There may well be some pitfall that I’ve wondered into though or I may be missing something fundamental that invalidates this change.