|
@@ -0,0 +1,159 @@
|
|
|
|
|
+#include "MyGameInstance.h"
|
|
|
|
|
+#include "OnlineSubsystem.h"
|
|
|
|
|
+#include "Kismet/GameplayStatics.h"
|
|
|
|
|
+#include "Engine/Engine.h"
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::Init()
|
|
|
|
|
+{
|
|
|
|
|
+ Super::Init();
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get();
|
|
|
|
|
+ if (OnlineSub)
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ SessionInterface = OnlineSub->GetSessionInterface();
|
|
|
|
|
+
|
|
|
|
|
+ if (SessionInterface.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ SessionInterface->OnCreateSessionCompleteDelegates.AddUObject(this, &UMyGameInstance::OnCreateSessionComplete);
|
|
|
|
|
+ SessionInterface->OnFindSessionsCompleteDelegates.AddUObject(this, &UMyGameInstance::OnFindSessionsComplete);
|
|
|
|
|
+ SessionInterface->OnJoinSessionCompleteDelegates.AddUObject(this, &UMyGameInstance::OnJoinSessionComplete);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("SessionInterface ist ungültig."));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("OnlineSubsystem konnte nicht geladen werden."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::HostSession()
|
|
|
|
|
+{
|
|
|
|
|
+ if (!SessionInterface.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("SessionInterface ungültig, kann keine Session hosten."));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ FOnlineSessionSettings SessionSettings;
|
|
|
|
|
+ SessionSettings.bIsLANMatch = false;
|
|
|
|
|
+ SessionSettings.NumPublicConnections = 4;
|
|
|
|
|
+ SessionSettings.bShouldAdvertise = true;
|
|
|
|
|
+ SessionSettings.bUsesPresence = true;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ const ULocalPlayer* LocalPlayer = GetFirstGamePlayer();
|
|
|
|
|
+ if (LocalPlayer)
|
|
|
|
|
+ {
|
|
|
|
|
+ SessionInterface->CreateSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, SessionSettings);
|
|
|
|
|
+ UE_LOG(LogTemp, Log, TEXT("Versuche, Session zu erstellen..."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::OnCreateSessionComplete(FName SessionName, bool bWasSuccessful)
|
|
|
|
|
+{
|
|
|
|
|
+ if (bWasSuccessful)
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Log, TEXT("Session erfolgreich erstellt: %s"), *SessionName.ToString());
|
|
|
|
|
+ UGameplayStatics::OpenLevel(GetWorld(), "YourMapName", true, "listen");
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("Session-Erstellung fehlgeschlagen."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::FindSessions()
|
|
|
|
|
+{
|
|
|
|
|
+ if (!SessionInterface.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("SessionInterface ungültig, kann keine Sessions suchen."));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ SearchSettings = MakeShareable(new FOnlineSessionSearch());
|
|
|
|
|
+ SearchSettings->bIsLanQuery = false;
|
|
|
|
|
+ SearchSettings->MaxSearchResults = 20;
|
|
|
|
|
+
|
|
|
|
|
+ const ULocalPlayer* LocalPlayer = GetFirstGamePlayer();
|
|
|
|
|
+ if (LocalPlayer)
|
|
|
|
|
+ {
|
|
|
|
|
+ SessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), SearchSettings.ToSharedRef());
|
|
|
|
|
+ UE_LOG(LogTemp, Log, TEXT("Suche nach Sessions gestartet..."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::OnFindSessionsComplete(bool bWasSuccessful)
|
|
|
|
|
+{
|
|
|
|
|
+ if (bWasSuccessful && SearchSettings.IsValid() && SearchSettings->SearchResults.Num() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Log, TEXT("Sessions gefunden: %d"), SearchSettings->SearchResults.Num());
|
|
|
|
|
+ JoinSessionByIndex(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("Keine Sessions gefunden oder Suche fehlgeschlagen."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::JoinSessionByIndex(int32 SessionIndex)
|
|
|
|
|
+{
|
|
|
|
|
+ if (!SessionInterface.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!SearchSettings.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!SearchSettings->SearchResults.IsValidIndex(SessionIndex))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ SessionInterface->JoinSession(
|
|
|
|
|
+ 0,
|
|
|
|
|
+ NAME_GameSession,
|
|
|
|
|
+ SearchSettings->SearchResults[SessionIndex]
|
|
|
|
|
+ );
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void UMyGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
|
|
|
|
|
+{
|
|
|
|
|
+ IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get();
|
|
|
|
|
+ if (!OnlineSub)
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("OnlineSubsystem nicht gefunden bei JoinSession."));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();
|
|
|
|
|
+ if (!Sessions.IsValid())
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("SessionInterface ungültig bei JoinSession."));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FString ConnectString;
|
|
|
|
|
+ if (Sessions->GetResolvedConnectString(SessionName, ConnectString))
|
|
|
|
|
+ {
|
|
|
|
|
+ APlayerController* PlayerController = GetFirstLocalPlayerController();
|
|
|
|
|
+ if (PlayerController)
|
|
|
|
|
+ {
|
|
|
|
|
+ PlayerController->ClientTravel(ConnectString, ETravelType::TRAVEL_Absolute);
|
|
|
|
|
+ UE_LOG(LogTemp, Log, TEXT("Client reist zu: %s"), *ConnectString);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UE_LOG(LogTemp, Warning, TEXT("Verbindungstring konnte nicht aufgelöst werden."));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|