int32 UPartyBeaconState::GetTeamForCurrentPlayer(const FUniqueNetId& PlayerId) const { int32 TeamNum = INDEX_NONE; if (PlayerId.IsValid()) { for (int32 ResIdx = 0; ResIdx < Reservations.Num(); ResIdx++) { const FPartyReservation& Reservation = Reservations[ResIdx]; for (int32 PlayerIdx = 0; PlayerIdx < Reservation.PartyMembers.Num(); PlayerIdx++) { // find the player id in the existing list of reservations if (*Reservation.PartyMembers[PlayerIdx].UniqueId == PlayerId) { TeamNum = Reservation.TeamNum; break; } } } UE_LOG(LogBeacon, Display, TEXT("Assigning player %s to team %d"), *PlayerId.ToString(), TeamNum); } else { UE_LOG(LogBeacon, Display, TEXT("Invalid player when attempting to find team assignment")); } return TeamNum; }
virtual void FireEvent_FriendRemoved(const FUniqueNetId& LocalUserId, const IFriendItem& Friend, const FString& RemoveReason) const override { static const FString EventName = TEXT("Social.FriendRemoved"); if (AnalyticsProvider.IsValid()) { if (LocalUserId.IsValid()) { TArray<FAnalyticsEventAttribute> Attributes; Attributes.Add(FAnalyticsEventAttribute(TEXT("User"), LocalUserId.ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("Friend"), Friend.GetUniqueID()->ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("RemoveReason"), RemoveReason)); AddPresenceAttributes(LocalUserId, Attributes); AnalyticsProvider->RecordEvent(EventName, Attributes); } } }
virtual void FireEvent_RecordToggleChat(const FUniqueNetId& LocalUserId, const FString& Channel, bool bEnabled) const override { static const FString EventName = TEXT("Social.Chat.Toggle"); if (AnalyticsProvider.IsValid()) { if (LocalUserId.IsValid()) { TArray<FAnalyticsEventAttribute> Attributes; Attributes.Add(FAnalyticsEventAttribute(TEXT("User"), LocalUserId.ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("Channel"), Channel)); Attributes.Add(FAnalyticsEventAttribute(TEXT("bEnabled"), bEnabled)); AddPresenceAttributes(LocalUserId, Attributes); AnalyticsProvider->RecordEvent(EventName, Attributes); } } }
virtual void FireEvent_SendGameInvite(const FUniqueNetId& LocalUserId, const FUniqueNetId& ToUser) const override { static const FString EventName = TEXT("Social.GameInvite.Send"); if (AnalyticsProvider.IsValid()) { if (LocalUserId.IsValid()) { TArray<FAnalyticsEventAttribute> Attributes; Attributes.Add(FAnalyticsEventAttribute(TEXT("User"), LocalUserId.ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("Friend"), ToUser.ToString())); AddPresenceAttributes(LocalUserId, Attributes); AnalyticsProvider->RecordEvent(EventName, Attributes); } } }
void FTestFriendsInterface::OnQueryRecentPlayersComplete(const FUniqueNetId& UserId, const FString& Namespace, bool bWasSuccessful, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("QueryRecentPlayers() for player (%s) was success=%d error=%s"), *UserId.ToDebugString(), bWasSuccessful, *ErrorStr); if (bWasSuccessful) { TArray< TSharedRef<FOnlineRecentPlayer> > Players; // Grab the friends data so we can print it out if (OnlineSub->GetFriendsInterface()->GetRecentPlayers(UserId, Namespace, Players)) { UE_LOG(LogOnline, Log, TEXT("GetRecentPlayers returned %d players"), Players.Num()); // Log each friend's data out for (auto RecentPlayer : Players) { UE_LOG(LogOnline, Log, TEXT("\t%s has unique id (%s)"), *RecentPlayer->GetDisplayName(), *RecentPlayer->GetUserId()->ToDebugString()); UE_LOG(LogOnline, Log, TEXT("\t LastSeen (%s)"), *RecentPlayer->GetLastSeen().ToString()); } } } // done with this part of the test bQueryRecentPlayers = false; // kick off next test StartNextTest(); }
bool FOnlineAchievementsNull::ResetAchievements(const FUniqueNetId& PlayerId) { if (!ReadAchievementsFromConfig()) { // we don't have achievements UE_LOG_ONLINE(Warning, TEXT("No achievements have been configured")); return false; } FUniqueNetIdString NullId(PlayerId); TArray<FOnlineAchievement> * PlayerAch = PlayerAchievements.Find(NullId); if (NULL == PlayerAch) { // achievements haven't been read for a player UE_LOG_ONLINE(Warning, TEXT("Could not find achievements for player %s"), *PlayerId.ToString()); return false; } // treat each achievement as unlocked const int32 AchNum = PlayerAch->Num(); for (int32 AchIdx = 0; AchIdx < AchNum; ++AchIdx) { (*PlayerAch)[ AchIdx ].Progress = 0.0; } return true; };
bool FOnlineVoiceImpl::UnmuteRemoteTalker(uint8 LocalUserNum, const FUniqueNetId& PlayerId, bool bIsSystemWide) { uint32 Return = E_FAIL; if (LocalUserNum >= 0 && LocalUserNum < MAX_LOCAL_PLAYERS) { // Skip this if the session isn't active if (SessionInt && SessionInt->GetNumSessions() > 0 && // Or if voice is disabled VoiceEngine != NULL) { // Find the specified talker FRemoteTalker* Talker = FindRemoteTalker(PlayerId); if (Talker != NULL) { // Remove them from the mute list MuteList.RemoveSingleSwap((const FUniqueNetIdString&)PlayerId); UE_LOG(LogVoice, Log, TEXT("Unmuting remote talker (%s)"), *PlayerId.ToDebugString()); } else { UE_LOG(LogVoice, Warning, TEXT("Unknown remote talker (%s) specified to UnmuteRemoteTalker()"), *PlayerId.ToDebugString()); } } } else { UE_LOG(LogVoice, Warning, TEXT("Invalid user specified in UnmuteRemoteTalker(%d)"), LocalUserNum); } return Return == S_OK; }
/** Resets a player's notification handlers */ void FOnlineNotificationHandler::ResetPlayerNotificationBindings(const FUniqueNetId& PlayerId) { NotificationTypeBindingsMap* FoundPlayerBindings = PlayerBindingMap.Find(PlayerId.ToString()); if (FoundPlayerBindings) { FoundPlayerBindings->Reset(); } }
void ATitleFileSubsystemTestActor::LoginCallback(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error) { UE_LOG(LogTemp, Log, TEXT("%s"), (_identity->GetLoginStatus(0) == ELoginStatus::LoggedIn) ? TEXT("true") : TEXT("false")); TArray<TSharedRef<const FUniqueNetId>> ids; ids.Add(UserId.AsShared()); _titleFile->EnumerateFiles(); }
FString FOnlineIdentityFacebook::GetPlayerNickname(const FUniqueNetId& UserId) const { const TSharedRef<FUserOnlineAccountFacebook>* FoundUserAccount = UserAccounts.Find(UserId.ToString()); if (FoundUserAccount != NULL) { const TSharedRef<FUserOnlineAccountFacebook>& UserAccount = *FoundUserAccount; return UserAccount->RealName; } return TEXT(""); }
virtual void FireEvent_AddFriend(const FUniqueNetId& LocalUserId, const FString& FriendName, const FUniqueNetId& FriendId, EFindFriendResult::Type Result, bool bRecentPlayer) const override { static const FString EventName = TEXT("Social.AddFriend"); if (AnalyticsProvider.IsValid()) { if (LocalUserId.IsValid()) { TArray<FAnalyticsEventAttribute> Attributes; Attributes.Add(FAnalyticsEventAttribute(TEXT("User"), LocalUserId.ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("Friend"), FriendId.ToString())); Attributes.Add(FAnalyticsEventAttribute(TEXT("FriendName"), FriendName)); Attributes.Add(FAnalyticsEventAttribute(TEXT("Result"), EFindFriendResult::ToString(Result))); Attributes.Add(FAnalyticsEventAttribute(TEXT("bRecentPlayer"), bRecentPlayer)); AddPresenceAttributes(LocalUserId, Attributes); AnalyticsProvider->RecordEvent(EventName, Attributes); } } }
TSharedPtr<FUserOnlineAccount> FOnlineIdentityAmazon::GetUserAccount(const FUniqueNetId& UserId) const { TSharedPtr<FUserOnlineAccount> Result; const TSharedRef<FUserOnlineAccountAmazon>* FoundUserAccount = UserAccounts.Find(UserId.ToString()); if (FoundUserAccount != NULL) { Result = *FoundUserAccount; } return Result; }
bool FOnlineVoiceImpl::RegisterRemoteTalker(const FUniqueNetId& UniqueId) { uint32 Return = E_FAIL; if (OnlineSubsystem) { // Skip this if the session isn't active if (SessionInt && SessionInt->GetNumSessions() > 0 && // Or when voice is disabled VoiceEngine != NULL) { // See if this talker has already been registered or not FRemoteTalker* Talker = FindRemoteTalker(UniqueId); if (Talker == NULL) { // Add a new talker to our list int32 AddIndex = RemoteTalkers.AddZeroed(); Talker = &RemoteTalkers[AddIndex]; // Copy the UniqueId const FUniqueNetIdString& UniqueIdStr = (const FUniqueNetIdString&)UniqueId; Talker->TalkerId = MakeShareable(new FUniqueNetIdString(UniqueIdStr)); // Register the remote talker locally Return = VoiceEngine->RegisterRemoteTalker(UniqueId); UE_LOG(LogVoice, Log, TEXT("RegisterRemoteTalker(%s) returned 0x%08X"), *UniqueId.ToDebugString(), Return); } else { UE_LOG(LogVoice, Warning, TEXT("Remote talker %s is being re-registered"), *UniqueId.ToDebugString()); Return = S_OK; } // @todo ONLINE Mute List update // Now start processing the remote voices Return = VoiceEngine->StartRemoteVoiceProcessing(UniqueId); UE_LOG(LogVoice, Log, TEXT("StartRemoteVoiceProcessing(%s) returned 0x%08X"), *UniqueId.ToDebugString(), Return); } } return Return == S_OK; }
bool FOnlineVoiceSteam::RegisterRemoteTalker(const FUniqueNetId& UniqueId) { uint32 Return = E_FAIL; if (SteamSubsystem) { // Skip this if the session isn't active if (SessionInt && SessionInt->GetNumSessions() > 0 && // Or when voice is disabled VoiceEngine.IsValid()) { // See if this talker has already been registered or not FRemoteTalker* Talker = FindRemoteTalker(UniqueId); if (Talker == NULL) { // Add a new talker to our list int32 AddIndex = RemoteTalkers.AddZeroed(); Talker = &RemoteTalkers[AddIndex]; // Copy the UniqueId const FUniqueNetIdSteam& UniqueIdSteam = (const FUniqueNetIdSteam&)UniqueId; Talker->TalkerId = MakeShareable(new FUniqueNetIdSteam(UniqueIdSteam)); // Register the remote talker locally Return = VoiceEngine->RegisterRemoteTalker(UniqueId); UE_LOG(LogVoice, Log, TEXT("RegisterRemoteTalker(%s) returned 0x%08X"), *UniqueId.ToDebugString(), Return); } else { UE_LOG(LogVoice, Verbose, TEXT("Remote talker %s is being re-registered"), *UniqueId.ToDebugString()); Return = S_OK; } // Update muting all of the local talkers with this remote talker ProcessMuteChangeNotification(); // Now start processing the remote voices Return = VoiceEngine->StartRemoteVoiceProcessing(UniqueId); UE_LOG(LogVoice, Log, TEXT("StartRemoteVoiceProcessing(%s) returned 0x%08X"), *UniqueId.ToDebugString(), Return); } } return Return == S_OK; }
FDelegateHandle FOnlineNotificationHandler::AddPlayerNotificationBinding_Handle(const FUniqueNetId& PlayerId, FString NotificationType, const FOnlineNotificationBinding& NewBinding) { if (!NewBinding.NotificationDelegate.IsBound()) { UE_LOG(LogOnline, Error, TEXT("Adding empty notification binding for type %s"), *NotificationType); return FDelegateHandle(); } NotificationTypeBindingsMap& FoundPlayerBindings = PlayerBindingMap.FindOrAdd(PlayerId.ToString()); TArray<FOnlineNotificationBinding>& FoundPlayerTypeBindings = FoundPlayerBindings.FindOrAdd(NotificationType); FoundPlayerTypeBindings.Add(NewBinding); return FoundPlayerTypeBindings.Last().NotificationDelegate.GetHandle(); }
void AMessageSubsystemTestActor::LoginCallback(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error) { UE_LOG(LogTemp, Log, TEXT("%s"), (_identity->GetLoginStatus(0) == ELoginStatus::LoggedIn) ? TEXT("true") : TEXT("false")); TArray<TSharedRef<const FUniqueNetId>> ids; ids.Add(UserId.AsShared()); FOnlineMessagePayload payload = FOnlineMessagePayload(); FVariantData data = FVariantData(); data.SetValue(true); payload.SetAttribute("test", data); _message->SendMessage(0, ids, TEXT("testMessage"), payload); }
void FTestFriendsInterface::OnDeleteFriendComplete(int32 LocalPlayer, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("DeleteFriend() for player (%d) to friend (%s) was success=%d. %s"), LocalPlayer, *FriendId.ToDebugString(), bWasSuccessful, *ErrorStr); // done with this part of the test if no more friends to delete FriendsToDelete.RemoveAt(0); if (bWasSuccessful && FriendsToDelete.Num() == 0) { bDeleteFriends = false; bReadFriendsList = true; } // kick off next test StartNextTest(); }
int32 APartyBeaconHost::GetTeamForCurrentPlayer(const FUniqueNetId& PlayerId) const { int32 TeamNum = INDEX_NONE; if (PlayerId.IsValid()) { if (State) { TeamNum = State->GetTeamForCurrentPlayer(PlayerId); } } else { UE_LOG(LogBeacon, Display, TEXT("Invalid player when attempting to find team assignment")); } return TeamNum; }
bool FOnlineVoiceSteam::UnregisterRemoteTalker(const FUniqueNetId& UniqueId) { uint32 Return = E_FAIL; if (SteamSubsystem) { // Skip this if the session isn't active if (SessionInt && SessionInt->GetNumSessions() > 0 && // Or when voice is disabled VoiceEngine.IsValid()) { // Make sure the talker is valid if (FindRemoteTalker(UniqueId) != NULL) { // Find them in the talkers array and remove them for (int32 Index = 0; Index < RemoteTalkers.Num(); Index++) { const FRemoteTalker& Talker = RemoteTalkers[Index]; // Is this the remote talker? if (*Talker.TalkerId == UniqueId) { // Going to remove the talker, so if they were talking recently make sure to indicate they've stopped if (OnPlayerTalkingStateChangedDelegates.IsBound() && (Talker.bIsTalking || Talker.bWasTalking)) { OnPlayerTalkingStateChangedDelegates.Broadcast(Talker.TalkerId.ToSharedRef(), false); } RemoteTalkers.RemoveAtSwap(Index); break; } } // Remove them from voice engine Return = VoiceEngine->UnregisterRemoteTalker(UniqueId); UE_LOG(LogVoice, Log, TEXT("UnregisterRemoteTalker(%s) returned 0x%08X"), *UniqueId.ToDebugString(), Return); } else { UE_LOG(LogVoice, Verbose, TEXT("Unknown remote talker (%s) specified to UnregisterRemoteTalker()"), *UniqueId.ToDebugString()); } } } return Return == S_OK; }
void FTestEntitlementsInterface::OnQueryEntitlementsComplete(bool bWasSuccessful, const FUniqueNetId& InUserId, const FString& Namespace, const FString& Error) { UE_LOG(LogOnline, Log, TEXT("enumerated entitlements. UserId=%s Result=%s Error=[%s]"), *InUserId.ToDebugString(), bWasSuccessful ? TEXT("true") : TEXT("false"), *Error); // Now check em out TArray<TSharedRef<FOnlineEntitlement>> Entitlements; EntitlementsOSS->GetAllEntitlements(InUserId, FString(), Entitlements); for (auto It = Entitlements.CreateConstIterator(); It; ++It) { const TSharedRef<FOnlineEntitlement> Entry = *It; UE_LOG(LogOnline, Log, TEXT(" entitlement id=%s name=%s"), *Entry->Id, *Entry->Name); } // kick off next test bQueryEntitlements = false; StartNextTest(); }
void FTestIdentityInterface::OnLoginComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error) { if (bWasSuccessful) { UE_LOG(LogOnline, Log, TEXT("Successful authenticated user. UserId=[%s] "), *UserId.ToDebugString()); // update user info for newly registered user UserInfo = OnlineIdentity->GetUserAccount(UserId); } else { UE_LOG(LogOnline, Warning, TEXT("Failed to authenticate new user. Error=[%s]"), *Error); } // Mark test as done bRunLoginTest = false; // kick off next test StartNextTest(); }
/** Remove the player notification handler for a type */ void FOnlineNotificationHandler::RemovePlayerNotificationBinding(const FUniqueNetId& PlayerId, FString NotificationType, FDelegateHandle RemoveHandle) { int32 BindingsRemoved = 0; NotificationTypeBindingsMap* FoundPlayerBindings = PlayerBindingMap.Find(PlayerId.ToString()); if (FoundPlayerBindings) { TArray<FOnlineNotificationBinding>* FoundPlayerTypeBindings = FoundPlayerBindings->Find(NotificationType); if (FoundPlayerTypeBindings) { BindingsRemoved = FoundPlayerTypeBindings->RemoveAll([=](const FOnlineNotificationBinding& Binding) { return Binding.NotificationDelegate.GetHandle() == RemoveHandle; }); } } if (BindingsRemoved == 0) { UE_LOG_ONLINE(Error, TEXT("Attempted to remove binding that could not be found for player %s type %s"), *PlayerId.ToDebugString(), *NotificationType); } }
bool FOnlineVoiceSteam::MuteRemoteTalker(uint8 LocalUserNum, const FUniqueNetId& PlayerId, bool bIsSystemWide) { uint32 Return = E_FAIL; if (LocalUserNum >= 0 && LocalUserNum < MAX_LOCAL_PLAYERS) { if (bIsSystemWide) { SystemMuteList.AddUnique((const FUniqueNetIdSteam&)PlayerId); ProcessMuteChangeNotification(); } else { // Skip this if the session isn't active if (SessionInt && SessionInt->GetNumSessions() > 0 && // Or if voice is disabled VoiceEngine.IsValid()) { // Find the specified talker FRemoteTalker* Talker = FindRemoteTalker(PlayerId); if (Talker != NULL) { MuteList.AddUnique((const FUniqueNetIdSteam&)PlayerId); Return = S_OK; UE_LOG(LogVoice, Log, TEXT("Muting remote talker (%s)"), *PlayerId.ToDebugString()); } else { UE_LOG(LogVoice, Verbose, TEXT("Unknown remote talker (%s) specified to MuteRemoteTalker()"), *PlayerId.ToDebugString()); } } } } else { UE_LOG(LogVoice, Warning, TEXT("Invalid user specified in MuteRemoteTalker(%d)"), LocalUserNum); } return Return == S_OK; }
/** Add a notification binding for a type */ void FOnlineNotificationHandler::AddPlayerNotificationBinding(const FUniqueNetId& PlayerId, FString NotificationType, const FOnlineNotificationBinding& NewBinding) { if (!NewBinding.NotificationDelegate.IsBound()) { UE_LOG(LogOnline, Error, TEXT("Adding empty notification binding for type %s"), *NotificationType); return; } NotificationTypeBindingsMap& FoundPlayerBindings = PlayerBindingMap.FindOrAdd(PlayerId.ToString()); TArray<FOnlineNotificationBinding>& FoundPlayerTypeBindings = FoundPlayerBindings.FindOrAdd(NotificationType); for (int32 i = 0; i < FoundPlayerTypeBindings.Num(); i++) { if (FoundPlayerTypeBindings[i].NotificationDelegate.DEPRECATED_Compare(NewBinding.NotificationDelegate)) { UE_LOG(LogOnline, Error, TEXT("Adding identical notification binding for type %s"), *NotificationType); return; } } FoundPlayerTypeBindings.Add(NewBinding); }
bool FOnlineSharedCloudSteam::WriteSharedFile(const FUniqueNetId& UserId, const FString& FileName, TArray<uint8>& FileContents) { SteamSubsystem->QueueAsyncTask(new FOnlineAsyncTaskSteamWriteSharedFile(SteamSubsystem, FUniqueNetIdSteam(*(uint64*)UserId.GetBytes()), FileName, FileContents)); return true; }
uint32 FVoiceEngineSteam::SubmitRemoteVoiceData(const FUniqueNetId& RemoteTalkerId, uint8* Data, uint32* Size) { UE_LOG(LogVoiceDecode, VeryVerbose, TEXT("SubmitRemoteVoiceData(%s) Size: %d received!"), *RemoteTalkerId.ToDebugString(), *Size); const FUniqueNetIdSteam& SteamId = (const FUniqueNetIdSteam&)RemoteTalkerId; FRemoteTalkerDataSteam* QueuedData = RemoteTalkerBuffers.Find(SteamId); if (QueuedData == NULL) { RemoteTalkerBuffers.Add(SteamId, FRemoteTalkerDataSteam()); QueuedData = RemoteTalkerBuffers.Find(SteamId); } check(QueuedData); // new voice packet. QueuedData->LastSeen = FPlatformTime::Seconds(); uint32 BytesWritten = 0; DecompressedVoiceBuffer.Empty(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE); DecompressedVoiceBuffer.AddUninitialized(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE); const EVoiceResult VoiceResult = SteamUserPtr->DecompressVoice(Data, *Size, DecompressedVoiceBuffer.GetData(), DecompressedVoiceBuffer.Num(), &BytesWritten, SteamUserPtr->GetVoiceOptimalSampleRate()); if (VoiceResult != k_EVoiceResultOK) { UE_LOG(LogVoiceDecode, Warning, TEXT("SubmitRemoteVoiceData: DecompressVoice failure: VoiceResult: %s"), *SteamVoiceResult(VoiceResult)); *Size = 0; return E_FAIL; } // If there is no data, return if (BytesWritten <= 0) { *Size = 0; return S_OK; } // Generate a streaming wave audio component for voice playback if (QueuedData->AudioComponent == NULL || QueuedData->AudioComponent->IsPendingKill()) { if (SerializeHelper == NULL) { SerializeHelper = new FVoiceSerializeHelper(this); } QueuedData->AudioComponent = CreateVoiceAudioComponent(SteamUserPtr->GetVoiceOptimalSampleRate()); if (QueuedData->AudioComponent) { QueuedData->AudioComponent->OnAudioFinishedNative.AddRaw(this, &FVoiceEngineSteam::OnAudioFinished); QueuedData->AudioComponent->Play(); } } if (QueuedData->AudioComponent != NULL) { USoundWaveProcedural* SoundStreaming = CastChecked<USoundWaveProcedural>(QueuedData->AudioComponent->Sound); if (SoundStreaming->GetAvailableAudioByteCount() == 0) { UE_LOG(LogVoiceDecode, Log, TEXT("VOIP audio component was starved!")); } SoundStreaming->QueueAudio(DecompressedVoiceBuffer.GetData(), BytesWritten); } return S_OK; }
void UAmethystGameInstance::HandleControllerPairingChanged(int GameUserIndex, const FUniqueNetId& PreviousUser, const FUniqueNetId& NewUser) { if (CurrentState == AmethystGameInstanceState::WelcomeScreen) { // Don't care about pairing changes at welcome screen return; } #if Amethyst_CONSOLE_UI && PLATFORM_XBOXONE if (IgnorePairingChangeForControllerId != -1 && GameUserIndex == IgnorePairingChangeForControllerId) { // We were told to ignores IgnorePairingChangeForControllerId = -1; // Reset now so there there is no chance this remains in a bad state return; } if (PreviousUser.IsValid() && !NewUser.IsValid()) { // Treat this as a disconnect or signout, which is handled somewhere else return; } if (!PreviousUser.IsValid() && NewUser.IsValid()) { // Treat this as a signin ULocalPlayer * ControlledLocalPlayer = FindLocalPlayerFromControllerId(GameUserIndex); if (ControlledLocalPlayer != NULL && !ControlledLocalPlayer->GetCachedUniqueNetId().IsValid()) { // If a player that previously selected "continue without saving" signs into this controller, move them back to welcome screen HandleSignInChangeMessaging(); } return; } // Find the local player currently being controlled by this controller ULocalPlayer * ControlledLocalPlayer = FindLocalPlayerFromControllerId(GameUserIndex); // See if the newly assigned profile is in our local player list ULocalPlayer * NewLocalPlayer = FindLocalPlayerFromUniqueNetId(NewUser); // If the local player being controlled is not the target of the pairing change, then give them a chance // to continue controlling the old player with this controller if (ControlledLocalPlayer != nullptr && ControlledLocalPlayer != NewLocalPlayer) { UAmethystGameViewportClient * AmethystViewport = Cast<UAmethystGameViewportClient>(GetGameViewportClient()); if (AmethystViewport != nullptr) { AmethystViewport->ShowDialog( nullptr, EAmethystDialogType::Generic, NSLOCTEXT("ProfileMessages", "PairingChanged", "Your controller has been paired to another profile, would you like to switch to this new profile now? Selecting YES will sign out of the previous profile."), NSLOCTEXT("DialogButtons", "YES", "A - YES"), NSLOCTEXT("DialogButtons", "NO", "B - NO"), FOnClicked::CreateUObject(this, &UAmethystGameInstance::OnPairingUseNewProfile), FOnClicked::CreateUObject(this, &UAmethystGameInstance::OnPairingUsePreviousProfile) ); } } #endif }
FString FOnlineIdentityNull::GetPlayerNickname(const FUniqueNetId& UserId) const { return UserId.ToString(); }
uint32 FVoiceEngineImpl::SubmitRemoteVoiceData(const FUniqueNetId& RemoteTalkerId, uint8* Data, uint32* Size) { UE_LOG(LogVoiceDecode, VeryVerbose, TEXT("SubmitRemoteVoiceData(%s) Size: %d received!"), *RemoteTalkerId.ToDebugString(), *Size); const FUniqueNetIdString& TalkerId = (const FUniqueNetIdString&)RemoteTalkerId; FRemoteTalkerDataImpl& QueuedData = RemoteTalkerBuffers.FindOrAdd(TalkerId); // new voice packet. QueuedData.LastSeen = FPlatformTime::Seconds(); uint32 BytesWritten = MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE; DecompressedVoiceBuffer.Empty(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE); DecompressedVoiceBuffer.AddUninitialized(MAX_UNCOMPRESSED_VOICE_BUFFER_SIZE); QueuedData.VoiceDecoder->Decode(Data, *Size, DecompressedVoiceBuffer.GetData(), BytesWritten); // If there is no data, return if (BytesWritten <= 0) { *Size = 0; return S_OK; } bool bAudioComponentCreated = false; // Generate a streaming wave audio component for voice playback if (QueuedData.AudioComponent == nullptr || QueuedData.AudioComponent->IsPendingKill()) { if (SerializeHelper == nullptr) { SerializeHelper = new FVoiceSerializeHelper(this); } QueuedData.AudioComponent = CreateVoiceAudioComponent(VOICE_SAMPLE_RATE); if (QueuedData.AudioComponent) { QueuedData.AudioComponent->OnAudioFinishedNative.AddRaw(this, &FVoiceEngineImpl::OnAudioFinished); } } if (QueuedData.AudioComponent != nullptr) { if (!QueuedData.AudioComponent->IsActive()) { QueuedData.AudioComponent->Play(); } USoundWaveStreaming* SoundStreaming = CastChecked<USoundWaveStreaming>(QueuedData.AudioComponent->Sound); if (0) { if (!bAudioComponentCreated && SoundStreaming->GetAvailableAudioByteCount() == 0) { UE_LOG(LogVoiceDecode, Log, TEXT("VOIP audio component was starved!")); } } SoundStreaming->QueueAudio(DecompressedVoiceBuffer.GetData(), BytesWritten); } return S_OK; }
void FOnlineAchievementsSteam::WriteAchievements(const FUniqueNetId& PlayerId, FOnlineAchievementsWriteRef& WriteObject, const FOnAchievementsWrittenDelegate& Delegate) { if (!bHaveConfiguredAchievements) { // we don't have achievements UE_LOG_ONLINE(Warning, TEXT("Steam achievements have not been configured in .ini")); WriteObject->WriteState = EOnlineAsyncTaskState::Failed; Delegate.ExecuteIfBound(PlayerId, false); return; } FUniqueNetIdSteam SteamId(PlayerId); // check if this is our player (cannot report for someone else) if (SteamUser() == NULL || SteamUser()->GetSteamID() != SteamId) { // we don't have achievements UE_LOG_ONLINE(Warning, TEXT("Cannot report Steam achievements for non-local player %s"), *PlayerId.ToString()); WriteObject->WriteState = EOnlineAsyncTaskState::Failed; Delegate.ExecuteIfBound(PlayerId, false); return; } const TArray<FOnlineAchievement> * PlayerAch = PlayerAchievements.Find(SteamId); if (NULL == PlayerAch) { // achievements haven't been read for a player UE_LOG_ONLINE(Warning, TEXT("Steam achievements have not been read for player %s"), *PlayerId.ToString()); WriteObject->WriteState = EOnlineAsyncTaskState::Failed; Delegate.ExecuteIfBound(PlayerId, false); return; } const int32 AchNum = PlayerAch->Num(); for (FStatPropertyArray::TConstIterator It(WriteObject->Properties); It; ++It) { const FString AchievementId = It.Key().ToString(); UE_LOG_ONLINE(Verbose, TEXT("WriteObject AchievementId: '%s'"), *AchievementId); for (int32 AchIdx = 0; AchIdx < AchNum; ++AchIdx) { if ((*PlayerAch)[ AchIdx ].Id == AchievementId) { // do not unlock it now, but after a successful write #if !UE_BUILD_SHIPPING float Value = 0.0f; It.Value().GetValue(Value); if (Value <= 0.0f) { UE_LOG_ONLINE(Verbose, TEXT("Resetting achievement '%s'"), *AchievementId); SteamUserStats()->ClearAchievement(TCHAR_TO_UTF8(*AchievementId)); } else { #endif // !UE_BUILD_SHIPPING UE_LOG_ONLINE(Verbose, TEXT("Setting achievement '%s'"), *AchievementId); SteamUserStats()->SetAchievement(TCHAR_TO_UTF8(*AchievementId)); #if !UE_BUILD_SHIPPING } #endif // !UE_BUILD_SHIPPING break; } } } StatsInt->WriteAchievementsInternal(SteamId, WriteObject, Delegate); };