/** * Function to host a game! * * @Param UserID User that started the request * @Param SessionName Name of the Session * @Param bIsLAN Is this is LAN Game? * @Param bIsPresence "Is the Session to create a presence Session" * @Param MaxNumPlayers Number of Maximum allowed players on this "Session" (Server) */ bool URadeGameInstance::HostSession(TSharedPtr<const FUniqueNetId> UserId, FName SessionName, FString MapName, bool bIsLAN, bool bIsPresence, int32 MaxNumPlayers) { // Get the Online Subsystem to work with IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { // Get the Session Interface, so we can call the "CreateSession" function on it IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid() && UserId.IsValid()) { /* Fill in all the Session Settings that we want to use. There are more with SessionSettings.Set(...); For example the Map or the GameMode/Type. */ SessionSettings = MakeShareable(new FOnlineSessionSettings()); SessionSettings->bIsLANMatch = bIsLAN; SessionSettings->bUsesPresence = bIsPresence; SessionSettings->NumPublicConnections = MaxNumPlayers; SessionSettings->NumPrivateConnections = 0; SessionSettings->bAllowInvites = true; SessionSettings->bAllowJoinInProgress = true; SessionSettings->bShouldAdvertise = true; SessionSettings->bAllowJoinViaPresence = true; SessionSettings->bAllowJoinViaPresenceFriendsOnly = false; SessionSettings->Set(SETTING_MAPNAME, MapName, EOnlineDataAdvertisementType::ViaOnlineService); // Set the delegate to the Handle of the SessionInterface OnCreateSessionCompleteDelegateHandle = Sessions->AddOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegate); //printr(SessionName.ToString()); // Our delegate should get called when this is complete (doesn't need to be successful!) return Sessions->CreateSession(*UserId, SessionName, *SessionSettings); } } else { //GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, TEXT("No OnlineSubsytem found!")); } return false; }
bool AMahjongGameSession_Japanese::HostSession(TSharedPtr<const FUniqueNetId> UserId, FName SessionName, const FString& GameType, const FString& MapName, bool bIsLAN, bool bIsPresence, int32 MaxNumPlayers) { IOnlineSubsystem* const OnlineSubsystem = IOnlineSubsystem::Get(); if (OnlineSubsystem) { CurrentSessionParams.SessionName = SessionName; CurrentSessionParams.bIsLAN = bIsLAN; CurrentSessionParams.bIsPresence = bIsPresence; CurrentSessionParams.UserId = UserId; MaxPlayers = MaxNumPlayers; IOnlineSessionPtr Sessions = OnlineSubsystem->GetSessionInterface(); if (Sessions.IsValid() && CurrentSessionParams.UserId.IsValid()) { HostSettings = MakeShareable(new FMahjongOnlineSessionSettings(bIsLAN, bIsPresence, MaxPlayers)); HostSettings->Set(SETTING_GAMEMODE, GameType, EOnlineDataAdvertisementType::ViaOnlineService); HostSettings->Set(SETTING_MAPNAME, MapName, EOnlineDataAdvertisementType::ViaOnlineService); HostSettings->Set(SETTING_MATCHING_HOPPER, FString("JapaneseMahjong"), EOnlineDataAdvertisementType::DontAdvertise); HostSettings->Set(SETTING_MATCHING_TIMEOUT, 120.0f, EOnlineDataAdvertisementType::ViaOnlineService); HostSettings->Set(SETTING_SESSION_TEMPLATE_NAME, FString("GameSession"), EOnlineDataAdvertisementType::DontAdvertise); HostSettings->Set(SEARCH_KEYWORDS, MahjongWords::CustomMatchKeyword, EOnlineDataAdvertisementType::ViaOnlineService); OnCreateSessionCompleteDelegateHandle = Sessions->AddOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegate); return Sessions->CreateSession(*CurrentSessionParams.UserId, CurrentSessionParams.SessionName, *HostSettings); } } #if !UE_BUILD_SHIPPING else { // Hack workflow in development OnCreatePresenceSessionComplete().Broadcast(GameSessionName, true); return true; } #endif return false; }
bool UUModGameInstance::StartNewGame(bool single, bool local, int32 max, FString map, FString hostName) { ULocalPlayer* const Player = GetFirstGamePlayer(); Player->PlayerController->ClientTravel("LoadScreen", ETravelType::TRAVEL_Absolute); TSharedPtr<const FUniqueNetId> UserId = Player->GetPreferredUniqueNetId(); IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); IOnlineSessionPtr Sessions = NULL; if (OnlineSub == NULL) { return false; } Sessions = OnlineSub->GetSessionInterface(); if (!Sessions.IsValid() || !UserId.IsValid()) { return false; } if (!CurSessionName.IsEmpty()){ DestroyCurSession(Sessions); return false; } TSharedPtr<class FOnlineSessionSettings> SessionSettings = MakeShareable(new FOnlineSessionSettings()); if (single) { SessionSettings->bIsLANMatch = true; IsLAN = true; } else { SessionSettings->bIsLANMatch = local; IsLAN = local; } SessionSettings->bUsesPresence = true; if (single) { SessionSettings->NumPublicConnections = 1; } else { SessionSettings->NumPublicConnections = max; } SessionSettings->NumPrivateConnections = 0; SessionSettings->bAllowInvites = true; SessionSettings->bAllowJoinInProgress = true; SessionSettings->bShouldAdvertise = true; SessionSettings->bAllowJoinViaPresence = true; SessionSettings->bAllowJoinViaPresenceFriendsOnly = false; SessionSettings->Set(SETTING_MAPNAME, map, EOnlineDataAdvertisementType::ViaOnlineService); SessionSettings->Set(SETTING_GAMEMODE, AUModGameMode::StaticClass()->GetPathName(), EOnlineDataAdvertisementType::ViaOnlineService); if (single) { hostName = TEXT("UMod_SinglePlayer"); } OnCreateSessionCompleteDelegateHandle = Sessions->AddOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegate); CurSessionMapName = map; FName name = FName(*hostName); CurSessionName = hostName; return Sessions->CreateSession(*UserId, name, *SessionSettings); }