1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| void UEngine::HandleNetworkFailure(UWorld *World, UNetDriver *NetDriver, ENetworkFailure::Type FailureType, const FString& ErrorString) { UE_LOG(LogNet, Log, TEXT("NetworkFailure: %s, Error: '%s'"), ENetworkFailure::ToString(FailureType), *ErrorString);
if (!NetDriver) { return; }
FName NetDriverName = NetDriver->NetDriverName; if (NetDriverName == NAME_GameNetDriver || NetDriverName == NAME_PendingNetDriver) { if (World) { if (!FindNamedNetDriver(World, NetDriverName)) { return; } }
HandleNetworkFailure_NotifyGameInstance(World, NetDriver, FailureType);
ENetMode FailureNetMode = NetDriver->GetNetMode(); bool bShouldTravel = true;
switch (FailureType) { case ENetworkFailure::FailureReceived: break; case ENetworkFailure::PendingConnectionFailure: break; case ENetworkFailure::ConnectionLost: bShouldTravel = (FailureNetMode == NM_Client); break; case ENetworkFailure::ConnectionTimeout: bShouldTravel = (FailureNetMode == NM_Client); break; case ENetworkFailure::NetGuidMismatch: case ENetworkFailure::NetChecksumMismatch: bShouldTravel = (FailureNetMode == NM_Client); break; case ENetworkFailure::NetDriverAlreadyExists: case ENetworkFailure::NetDriverCreateFailure: case ENetworkFailure::OutdatedClient: case ENetworkFailure::OutdatedServer: default: break; }
if (bShouldTravel) { CallHandleDisconnectForFailure(World, NetDriver); } } }
void UEngine::HandleNetworkFailure_NotifyGameInstance(UWorld *World, UNetDriver *NetDriver, ENetworkFailure::Type FailureType) { bool bIsServer = true;
if (NetDriver != nullptr) { bIsServer = NetDriver->GetNetMode() != NM_Client; }
if (World != nullptr && World->GetGameInstance() != nullptr) { World->GetGameInstance()->HandleNetworkError(FailureType, bIsServer); } else { for (auto& Context : WorldList) { if (Context.PendingNetGame != nullptr && Context.PendingNetGame->NetDriver == NetDriver && Context.OwningGameInstance != nullptr) { Context.OwningGameInstance->HandleNetworkError(FailureType, bIsServer); } } } }
|