// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraLocalPlayer.h" #include "Settings/LyraSettingsLocal.h" #include "Settings/LyraSettingsShared.h" #include "Input/LyraInputConfig.h" #include "InputMappingContext.h" #include "AudioMixerBlueprintLibrary.h" #include "GameFramework/PlayerController.h" ULyraLocalPlayer::ULyraLocalPlayer() { } void ULyraLocalPlayer::PostInitProperties() { Super::PostInitProperties(); if (ULyraSettingsLocal* LocalSettings = GetLocalSettings()) { LocalSettings->OnAudioOutputDeviceChanged.AddUObject(this, &ULyraLocalPlayer::OnAudioOutputDeviceChanged); } } void ULyraLocalPlayer::SwitchController(class APlayerController* PC) { Super::SwitchController(PC); OnPlayerControllerChanged(PlayerController); } bool ULyraLocalPlayer::SpawnPlayActor(const FString& URL, FString& OutError, UWorld* InWorld) { const bool bResult = Super::SpawnPlayActor(URL, OutError, InWorld); OnPlayerControllerChanged(PlayerController); return bResult; } void ULyraLocalPlayer::InitOnlineSession() { OnPlayerControllerChanged(PlayerController); Super::InitOnlineSession(); } void ULyraLocalPlayer::OnPlayerControllerChanged(APlayerController* NewController) { // Stop listening for changes from the old controller FGenericTeamId OldTeamID = FGenericTeamId::NoTeam; if (ILyraTeamAgentInterface* ControllerAsTeamProvider = Cast(LastBoundPC.Get())) { OldTeamID = ControllerAsTeamProvider->GetGenericTeamId(); ControllerAsTeamProvider->GetTeamChangedDelegateChecked().RemoveAll(this); } // Grab the current team ID and listen for future changes FGenericTeamId NewTeamID = FGenericTeamId::NoTeam; if (ILyraTeamAgentInterface* ControllerAsTeamProvider = Cast(NewController)) { NewTeamID = ControllerAsTeamProvider->GetGenericTeamId(); ControllerAsTeamProvider->GetTeamChangedDelegateChecked().AddDynamic(this, &ThisClass::OnControllerChangedTeam); LastBoundPC = NewController; } ConditionalBroadcastTeamChanged(this, OldTeamID, NewTeamID); } void ULyraLocalPlayer::SetGenericTeamId(const FGenericTeamId& NewTeamID) { // Do nothing, we merely observe the team of our associated player controller } FGenericTeamId ULyraLocalPlayer::GetGenericTeamId() const { if (ILyraTeamAgentInterface* ControllerAsTeamProvider = Cast(PlayerController)) { return ControllerAsTeamProvider->GetGenericTeamId(); } else { return FGenericTeamId::NoTeam; } } FOnLyraTeamIndexChangedDelegate* ULyraLocalPlayer::GetOnTeamIndexChangedDelegate() { return &OnTeamChangedDelegate; } ULyraSettingsLocal* ULyraLocalPlayer::GetLocalSettings() const { return ULyraSettingsLocal::Get(); } ULyraSettingsShared* ULyraLocalPlayer::GetSharedSettings() const { if (!SharedSettings) { SharedSettings = ULyraSettingsShared::LoadOrCreateSettings(this); } return SharedSettings; } void ULyraLocalPlayer::OnAudioOutputDeviceChanged(const FString& InAudioOutputDeviceId) { FOnCompletedDeviceSwap DevicesSwappedCallback; DevicesSwappedCallback.BindUFunction(this, FName("OnCompletedAudioDeviceSwap")); UAudioMixerBlueprintLibrary::SwapAudioOutputDevice(GetWorld(), InAudioOutputDeviceId, DevicesSwappedCallback); } void ULyraLocalPlayer::OnCompletedAudioDeviceSwap(const FSwapAudioOutputResult& SwapResult) { if (SwapResult.Result == ESwapAudioOutputDeviceResultState::Failure) { } } void ULyraLocalPlayer::OnControllerChangedTeam(UObject* TeamAgent, int32 OldTeam, int32 NewTeam) { ConditionalBroadcastTeamChanged(this, IntegerToGenericTeamId(OldTeam), IntegerToGenericTeamId(NewTeam)); }