Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Config/DefaultEngine.ini
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
bInitServerOnClient=true

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
198 changes: 96 additions & 102 deletions Plugins/MultiplayerSessions/Source/MultiplayerSessions/Private/Menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,134 +9,125 @@

void UMenu::MenuSetup(int32 NumberOfPublicConnections, FString TypeOfMatch, FString LobbyPath)
{
PathToLobby = FString::Printf(TEXT("%s?listen"), *LobbyPath);
NumPublicConnections = NumberOfPublicConnections;
MatchType = TypeOfMatch;
PathToLobby = FString::Printf(TEXT("%s?listen"), *LobbyPath);

AddToViewport();
SetVisibility(ESlateVisibility::Visible);
bIsFocusable = true;

UWorld* World = GetWorld();
if (World)
{
APlayerController* PlayerController = World->GetFirstPlayerController();
if (PlayerController)
{
FInputModeUIOnly InputModeData;
InputModeData.SetWidgetToFocus(TakeWidget());
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(true);
}
}
const auto World = GetWorld();
if (!World)
return;

UGameInstance* GameInstance = GetGameInstance();
if (GameInstance)
{
MultiplayerSessionsSubsystem = GameInstance->GetSubsystem<UMultiplayerSessionsSubsystem>();
}
const auto PlayerController = World->GetFirstPlayerController();
if (!PlayerController)
return;

if (MultiplayerSessionsSubsystem)
{
MultiplayerSessionsSubsystem->MultiplayerOnCreateSessionComplete.AddDynamic(this, &ThisClass::OnCreateSession);
MultiplayerSessionsSubsystem->MultiplayerOnFindSessionsComplete.AddUObject(this, &ThisClass::OnFindSessions);
MultiplayerSessionsSubsystem->MultiplayerOnJoinSessionComplete.AddUObject(this, &ThisClass::OnJoinSession);
MultiplayerSessionsSubsystem->MultiplayerOnDestroySessionComplete.AddDynamic(this, &ThisClass::OnDestroySession);
MultiplayerSessionsSubsystem->MultiplayerOnStartSessionComplete.AddDynamic(this, &ThisClass::OnStartSession);
}
FInputModeUIOnly InputModeData;
InputModeData.SetWidgetToFocus(TakeWidget());
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(true);

const auto GameInstance = GetGameInstance();
if (!GameInstance)
return;

MultiplayerSessionsSubsystem = GameInstance->GetSubsystem<UMultiplayerSessionsSubsystem>();
if (!MultiplayerSessionsSubsystem)
return;

MultiplayerSessionsSubsystem->MultiplayerOnCreateSessionComplete.AddDynamic(this, &ThisClass::OnCreateSession);
MultiplayerSessionsSubsystem->MultiplayerOnFindSessionsComplete.AddUObject(this, &ThisClass::OnFindSessions);
MultiplayerSessionsSubsystem->MultiplayerOnJoinSessionComplete.AddUObject(this, &ThisClass::OnJoinSession);
MultiplayerSessionsSubsystem->MultiplayerOnDestroySessionComplete.AddDynamic(this, &ThisClass::OnDestroySession);
MultiplayerSessionsSubsystem->MultiplayerOnStartSessionComplete.AddDynamic(this, &ThisClass::OnStartSession);
}

bool UMenu::Initialize()
{
if (!Super::Initialize())
{
return false;
}

if (HostButton)
{
HostButton->OnClicked.AddDynamic(this, &ThisClass::HostButtonClicked);
}
if (JoinButton)
{
JoinButton->OnClicked.AddDynamic(this, &ThisClass::JoinButtonClicked);
}
if (!HostButton || !JoinButton)
return false;

HostButton->OnClicked.AddDynamic(this, &ThisClass::HostButtonClicked);
JoinButton->OnClicked.AddDynamic(this, &ThisClass::JoinButtonClicked);

return true;
}

void UMenu::OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld)
void UMenu::NativeDestruct()
{
MenuTearDown();
Super::OnLevelRemovedFromWorld(InLevel, InWorld);
Super::NativeDestruct();
}

void UMenu::OnCreateSession(bool bWasSuccessful)
{
if (bWasSuccessful)
{
UWorld* World = GetWorld();
if (World)
{
World->ServerTravel(PathToLobby);
}
}
else
if (!GEngine)
return;

if (!bWasSuccessful)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(
-1,
15.f,
FColor::Red,
FString(TEXT("Failed to create session!"))
);
}
GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, FString(TEXT("Failed to create session")));
HostButton->SetIsEnabled(true);
return;
}

if (const auto World = GetWorld())
World->ServerTravel(PathToLobby);
}

void UMenu::OnFindSessions(const TArray<FOnlineSessionSearchResult>& SessionResults, bool bWasSuccessful)
{
if (MultiplayerSessionsSubsystem == nullptr)
{
return;
}

for (auto Result : SessionResults)
{
if (!Result.IsValid())
continue;

FString SettingsValue;
Result.Session.SessionSettings.Get(FName("MatchType"), SettingsValue);
if (SettingsValue == MatchType)
{
MultiplayerSessionsSubsystem->JoinSession(Result);
return;
}
if (SettingsValue != MatchType)
continue;

MultiplayerSessionsSubsystem->JoinSession(Result);
return;
}
if (!bWasSuccessful || SessionResults.Num() == 0)
{

if (!bWasSuccessful || SessionResults.Num() <= 0)
JoinButton->SetIsEnabled(true);
}
}

void UMenu::OnJoinSession(EOnJoinSessionCompleteResult::Type Result)
{
IOnlineSubsystem* Subsystem = IOnlineSubsystem::Get();
if (Subsystem)
{
IOnlineSessionPtr SessionInterface = Subsystem->GetSessionInterface();
if (SessionInterface.IsValid())
{
FString Address;
SessionInterface->GetResolvedConnectString(NAME_GameSession, Address);

APlayerController* PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
if (PlayerController)
{
PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
}
}
}
const auto Subsystem = IOnlineSubsystem::Get();
if (!Subsystem)
return;

const auto SessionInterface = Subsystem->GetSessionInterface();
if (!SessionInterface.IsValid())
return;

FString Address;
SessionInterface->GetResolvedConnectString(NAME_GameSession, Address);

const auto PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
if (!PlayerController)
return;

PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);

if (Result == EOnJoinSessionCompleteResult::Success)
return;

JoinButton->SetIsEnabled(true);
}

void UMenu::OnDestroySession(bool bWasSuccessful)
Expand All @@ -150,33 +141,36 @@ void UMenu::OnStartSession(bool bWasSuccessful)
void UMenu::HostButtonClicked()
{
HostButton->SetIsEnabled(false);
if (MultiplayerSessionsSubsystem)
{
MultiplayerSessionsSubsystem->CreateSession(NumPublicConnections, MatchType);
}

if (!MultiplayerSessionsSubsystem)
return;

MultiplayerSessionsSubsystem->CreateSession(NumPublicConnections, MatchType);
}

void UMenu::JoinButtonClicked()
{
JoinButton->SetIsEnabled(false);
if (MultiplayerSessionsSubsystem)
{
MultiplayerSessionsSubsystem->FindSessions(10000);
}

if (!MultiplayerSessionsSubsystem)
return;

MultiplayerSessionsSubsystem->FindSessions(10000);
}

void UMenu::MenuTearDown()
{
RemoveFromParent();
UWorld* World = GetWorld();
if (World)
{
APlayerController* PlayerController = World->GetFirstPlayerController();
if (PlayerController)
{
FInputModeGameOnly InputModeData;
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(false);
}
}

const auto World = GetWorld();
if (!World)
return;

const auto PlayerController = World->GetFirstPlayerController();
if (!PlayerController)
return;

const FInputModeGameOnly InputModeData;
PlayerController->SetInputMode(InputModeData);
PlayerController->SetShowMouseCursor(false);
}
Loading