Angi 6 روز پیش
والد
کامیت
f2c0bf7b7e

+ 6 - 0
DuckDuckKazoo/Config/DefaultEngine.ini

@@ -106,3 +106,9 @@ ConnectionType=USBOnly
 bUseManualIPAddress=False
 ManualIPAddress=
 
+[OnlineSubsystem]
+DefaultPlatformService=Steam
+
+[OnlineSubsystemSteam]
+SteamDevAppId=480
+bEnabled=true

+ 2 - 2
DuckDuckKazoo/Content/DuckDuckKazoo/Blueprints/UI/WBP_MainMenu.uasset

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:3f4f0aa3db548a35be2494fe7a34911f32bd2da47aa468e510a347cf7bcdff92
-size 53251
+oid sha256:e944de0fa1e0601e041a18953827b6146aa7aa1aeede95c0dfc0ec5642310d53
+size 88193

+ 3 - 0
DuckDuckKazoo/Content/DuckDuckKazoo/Blueprints/UI/WBP_MainMenu1.uasset

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3453460228696bea15d80c0dc5a522757336533fae53dbb26fa6c3c3cebbaf5
+size 81024

+ 3 - 0
DuckDuckKazoo/Content/DuckDuckKazoo/MainMenu.umap

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:784456c5664d8728e8c664fb73223ca7850c081cf29517f6b030c909baa49f29
+size 6539

+ 4 - 0
DuckDuckKazoo/DuckDuckKazoo.uproject

@@ -30,6 +30,10 @@
 		{
 			"Name": "GameplayStateTree",
 			"Enabled": true
+		},
+		{
+			"Name": "OnlineSubsystemSteam",
+			"Enabled": true
 		}
 	]
 }

+ 6 - 11
DuckDuckKazoo/Source/DuckDuckKazoo/DuckDuckKazoo.Build.cs

@@ -18,8 +18,11 @@ public class DuckDuckKazoo : ModuleRules
 			"StateTreeModule",
 			"GameplayStateTreeModule",
 			"UMG",
-			"Slate"
-		});
+			"Slate",
+            "OnlineSubsystem",
+            "OnlineSubsystemUtils",
+            "OnlineSubsystemSteam"
+        });
 
 		PrivateDependencyModuleNames.AddRange(new string[] { });
 
@@ -32,13 +35,5 @@ public class DuckDuckKazoo : ModuleRules
 			"DuckDuckKazoo/Variant_Shooter/UI",
 			"DuckDuckKazoo/Variant_Shooter/Weapons"
 		});
-
-		// Uncomment if you are using Slate UI
-		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
-
-		// Uncomment if you are using online features
-		// PrivateDependencyModuleNames.Add("OnlineSubsystem");
-
-		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
-	}
+    }
 }

+ 159 - 0
DuckDuckKazoo/Source/DuckDuckKazoo/MyGameInstance.cpp

@@ -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."));
+    }
+}

+ 36 - 0
DuckDuckKazoo/Source/DuckDuckKazoo/MyGameInstance.h

@@ -0,0 +1,36 @@
+#pragma once
+
+#include "CoreMinimal.h"
+#include "Engine/GameInstance.h"
+#include "Interfaces/OnlineSessionInterface.h"
+#include "OnlineSessionSettings.h"
+#include "MyGameInstance.generated.h"
+
+UCLASS()
+class DUCKDUCKKAZOO_API UMyGameInstance : public UGameInstance
+{
+    GENERATED_BODY()
+
+public:
+    virtual void Init() override;
+
+    UFUNCTION(BlueprintCallable)
+    void HostSession();
+
+    UFUNCTION(BlueprintCallable)
+    void FindSessions();
+
+    UFUNCTION(BlueprintCallable)
+    void JoinSessionByIndex(int32 SessionIndex);
+
+protected:
+    void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);
+    void OnFindSessionsComplete(bool bWasSuccessful);
+    void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);
+
+    void TravelToSession(const FString& ConnectString);
+
+private:
+    TSharedPtr<FOnlineSessionSearch> SearchSettings;
+    IOnlineSessionPtr SessionInterface;
+};