2022-05-23 18:41:30 +00:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
#include "GameFeatureAction_SplitscreenConfig.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
|
2022-05-23 18:41:30 +00:00
|
|
|
#include "Engine/Engine.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "Engine/GameInstance.h"
|
|
|
|
#include "Engine/GameViewportClient.h"
|
|
|
|
#include "GameFeaturesSubsystem.h"
|
|
|
|
#include "Templates/Casts.h"
|
|
|
|
#include "UObject/ObjectPtr.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "LyraGameFeatures"
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// UGameFeatureAction_SplitscreenConfig
|
|
|
|
|
|
|
|
TMap<FObjectKey, int32> UGameFeatureAction_SplitscreenConfig::GlobalDisableVotes;
|
|
|
|
|
|
|
|
void UGameFeatureAction_SplitscreenConfig::OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context)
|
|
|
|
{
|
|
|
|
Super::OnGameFeatureDeactivating(Context);
|
|
|
|
|
|
|
|
for (int32 i = LocalDisableVotes.Num() - 1; i >= 0; i-- )
|
|
|
|
{
|
|
|
|
FObjectKey ViewportKey = LocalDisableVotes[i];
|
|
|
|
UGameViewportClient* GVP = Cast<UGameViewportClient>(ViewportKey.ResolveObjectPtr());
|
|
|
|
const FWorldContext* WorldContext = GEngine->GetWorldContextFromGameViewport(GVP);
|
|
|
|
if (GVP && WorldContext)
|
|
|
|
{
|
|
|
|
if (!Context.ShouldApplyToWorldContext(*WorldContext))
|
|
|
|
{
|
|
|
|
// Wrong context so ignore it, dead objects count as part of this context
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int32& VoteCount = GlobalDisableVotes[ViewportKey];
|
|
|
|
if (VoteCount <= 1)
|
|
|
|
{
|
|
|
|
GlobalDisableVotes.Remove(ViewportKey);
|
|
|
|
|
|
|
|
if (GVP && WorldContext)
|
|
|
|
{
|
|
|
|
GVP->SetForceDisableSplitscreen(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
--VoteCount;
|
|
|
|
}
|
|
|
|
LocalDisableVotes.RemoveAt(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UGameFeatureAction_SplitscreenConfig::AddToWorld(const FWorldContext& WorldContext, const FGameFeatureStateChangeContext& ChangeContext)
|
|
|
|
{
|
|
|
|
if (bDisableSplitscreen)
|
|
|
|
{
|
|
|
|
if (UGameInstance* GameInstance = WorldContext.OwningGameInstance)
|
|
|
|
{
|
|
|
|
if (UGameViewportClient* VC = GameInstance->GetGameViewportClient())
|
|
|
|
{
|
|
|
|
FObjectKey ViewportKey(VC);
|
|
|
|
|
|
|
|
LocalDisableVotes.Add(ViewportKey);
|
|
|
|
|
|
|
|
int32& VoteCount = GlobalDisableVotes.FindOrAdd(ViewportKey);
|
|
|
|
VoteCount++;
|
|
|
|
if (VoteCount == 1)
|
|
|
|
{
|
|
|
|
VC->SetForceDisableSplitscreen(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef LOCTEXT_NAMESPACE
|