mirror of
https://github.com/Ed94/Cog.git
synced 2026-06-13 08:02:23 -07:00
CogAbility: Apply tweaks at start and when an new actor is spawned
The data asset is now loaded directly by the windows.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,6 +4,7 @@
|
||||
#include "CogDebugSettings.h"
|
||||
#include "CogEngineDataAsset.h"
|
||||
#include "CogImGuiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "Components/BoxComponent.h"
|
||||
#include "Components/CapsuleComponent.h"
|
||||
#include "Components/PrimitiveComponent.h"
|
||||
@@ -26,6 +27,8 @@ void UCogEngineWindow_Collisions::RenderHelp()
|
||||
UCogEngineWindow_Collisions::UCogEngineWindow_Collisions()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
SetAsset(FCogWindowHelper::GetFirstAssetByClass<UCogEngineDataAsset>());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -3,8 +3,16 @@
|
||||
#include "CogEngineDataAsset.h"
|
||||
#include "CogEngineReplicator.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
UCogEngineWindow_Spawns::UCogEngineWindow_Spawns()
|
||||
{
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogEngineDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void UCogEngineWindow_Spawns::RenderHelp()
|
||||
{
|
||||
|
||||
@@ -15,11 +15,7 @@ public:
|
||||
|
||||
UCogEngineWindow_Collisions();
|
||||
|
||||
const UCogEngineDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogEngineDataAsset* Value);
|
||||
|
||||
private:
|
||||
protected:
|
||||
|
||||
virtual void ResetConfig() override;
|
||||
|
||||
@@ -27,6 +23,8 @@ private:
|
||||
|
||||
virtual void RenderContent() override;
|
||||
|
||||
virtual void SetAsset(const UCogEngineDataAsset* Value);
|
||||
|
||||
struct FChannel
|
||||
{
|
||||
bool IsValid = false;
|
||||
|
||||
@@ -15,9 +15,7 @@ class COGENGINE_API UCogEngineWindow_Spawns : public UCogWindow
|
||||
|
||||
public:
|
||||
|
||||
const UCogEngineDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogEngineDataAsset* Value) { Asset = Value; }
|
||||
UCogEngineWindow_Spawns();
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -42,7 +42,10 @@ private:
|
||||
void Initialize();
|
||||
|
||||
FCogImguiTextureManager TextureManager;
|
||||
|
||||
ImFontAtlas DefaultFontAtlas;
|
||||
|
||||
bool bEnabledInput = true;
|
||||
|
||||
bool bIsInitialized = false;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "AssetRegistry/AssetRegistryModule.h"
|
||||
#include "AssetRegistry/IAssetRegistry.h"
|
||||
|
||||
class COGWINDOW_API FCogWindowHelper
|
||||
{
|
||||
public:
|
||||
|
||||
template<typename T>
|
||||
static T* GetFirstAssetByClass()
|
||||
{
|
||||
IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
|
||||
|
||||
TArray<FAssetData> Assets;
|
||||
AssetRegistry.GetAssetsByClass(T::StaticClass()->GetClassPathName(), Assets, true);
|
||||
if (Assets.Num() == 0)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
UObject* Asset = Assets[0].GetAsset();
|
||||
T* CastedAsset = Cast<T>(Asset);
|
||||
return CastedAsset;
|
||||
}
|
||||
};
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "AbilitySystemComponent.h"
|
||||
#include "AbilitySystemGlobals.h"
|
||||
#include "CogAbilityDataAsset.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "Components/SceneComponent.h"
|
||||
#include "EngineUtils.h"
|
||||
#include "GameplayEffect.h"
|
||||
@@ -52,6 +54,8 @@ ACogAbilityReplicator::ACogAbilityReplicator(const FObjectInitializer& ObjectIni
|
||||
bReplicates = true;
|
||||
bOnlyRelevantToOwner = true;
|
||||
|
||||
AbilityAsset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
|
||||
#endif // !UE_BUILD_SHIPPING
|
||||
}
|
||||
|
||||
@@ -74,6 +78,18 @@ void ACogAbilityReplicator::BeginPlay()
|
||||
Super::BeginPlay();
|
||||
|
||||
OwnerPlayerController = Cast<APlayerController>(GetOwner());
|
||||
|
||||
OnAnyActorSpawnedHandle = GetWorld()->AddOnActorSpawnedHandler(FOnActorSpawned::FDelegate::CreateUObject(this, &ACogAbilityReplicator::OnAnyActorSpawned));
|
||||
|
||||
ApplyAllTweaksOnAllActors();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
||||
{
|
||||
GetWorld()->RemoveOnActorSpawnedHandler(OnAnyActorSpawnedHandle);
|
||||
|
||||
Super::EndPlay(EndPlayReason);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -216,59 +232,76 @@ void ACogAbilityReplicator::Server_ResetAllTweaks_Implementation()
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::SetTweakValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
void ACogAbilityReplicator::OnAnyActorSpawned(AActor* Actor)
|
||||
{
|
||||
Server_SetTweakValue(TweaksAsset, TweakIndex, TweakCategoryIndex, Value);
|
||||
if (AbilityAsset->ActorRootClass != nullptr && Actor->GetClass()->IsChildOf(AbilityAsset->ActorRootClass) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int32 TweakCategoryIndex = FindTweakCategoryFromActor(Actor);
|
||||
if (TweakCategoryIndex == INDEX_NONE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ApplyAllTweaksOnActor(TweakCategoryIndex, Actor);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::Server_SetTweakValue_Implementation(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
void ACogAbilityReplicator::SetTweakValue(int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
{
|
||||
if (TweaksAsset == nullptr)
|
||||
Server_SetTweakValue(TweakIndex, TweakCategoryIndex, Value);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::Server_SetTweakValue_Implementation(int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
{
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (TweaksAsset->Tweaks.IsValidIndex(TweakIndex) == false)
|
||||
if (AbilityAsset->Tweaks.IsValidIndex(TweakIndex) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (TweaksAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
if (AbilityAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SetTweakCurrentValue(TweaksAsset, TweakIndex, TweakCategoryIndex, Value);
|
||||
SetTweakCurrentValue(TweakIndex, TweakCategoryIndex, Value);
|
||||
|
||||
const FCogAbilityTweak& Tweak = TweaksAsset->Tweaks[TweakIndex];
|
||||
const FCogAbilityTweak& Tweak = AbilityAsset->Tweaks[TweakIndex];
|
||||
|
||||
TArray<AActor*> Actors;
|
||||
GetActorsFromTweakCategory(TweaksAsset, TweakCategoryIndex, Actors);
|
||||
FindActorsFromTweakCategory(TweakCategoryIndex, Actors);
|
||||
for (AActor* Actor : Actors)
|
||||
{
|
||||
ApplyTweakOnActor(Actor, Tweak, Value, TweaksAsset->SetByCallerMagnitudeTag);
|
||||
ApplyTweakOnActor(Actor, Tweak, Value, AbilityAsset->SetByCallerMagnitudeTag);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::ApplyAllTweaksOnActor(const UCogAbilityDataAsset* TweaksAsset, int32 TweakCategoryIndex, AActor* Actor)
|
||||
void ACogAbilityReplicator::ApplyAllTweaksOnActor(int32 TweakCategoryIndex, AActor* Actor)
|
||||
{
|
||||
if (TweaksAsset == nullptr)
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (TweaksAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
if (AbilityAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int32 TweakIndex = 0;
|
||||
for (const FCogAbilityTweak& Tweak : TweaksAsset->Tweaks)
|
||||
for (const FCogAbilityTweak& Tweak : AbilityAsset->Tweaks)
|
||||
{
|
||||
const float Value = GetTweakCurrentValue(TweaksAsset, TweakIndex, TweakCategoryIndex);
|
||||
ApplyTweakOnActor(Actor, Tweak, Value, TweaksAsset->SetByCallerMagnitudeTag);
|
||||
const float Value = GetTweakCurrentValue(TweakIndex, TweakCategoryIndex);
|
||||
ApplyTweakOnActor(Actor, Tweak, Value, AbilityAsset->SetByCallerMagnitudeTag);
|
||||
TweakIndex++;
|
||||
}
|
||||
}
|
||||
@@ -297,9 +330,9 @@ void ACogAbilityReplicator::ApplyTweakOnActor(AActor* Actor, const FCogAbilityTw
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
float ACogAbilityReplicator::GetTweakCurrentValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex)
|
||||
float ACogAbilityReplicator::GetTweakCurrentValue(int32 TweakIndex, int32 TweakCategoryIndex)
|
||||
{
|
||||
float* Value = GetTweakCurrentValuePtr(TweaksAsset, TweakIndex, TweakCategoryIndex);
|
||||
float* Value = GetTweakCurrentValuePtr(TweakIndex, TweakCategoryIndex);
|
||||
if (Value == nullptr)
|
||||
{
|
||||
return 0.0f;
|
||||
@@ -309,11 +342,16 @@ float ACogAbilityReplicator::GetTweakCurrentValue(const UCogAbilityDataAsset* Tw
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
float* ACogAbilityReplicator::GetTweakCurrentValuePtr(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex)
|
||||
float* ACogAbilityReplicator::GetTweakCurrentValuePtr(int32 TweakIndex, int32 TweakCategoryIndex)
|
||||
{
|
||||
TweakCurrentValues.SetNum(TweaksAsset->Tweaks.Num() * TweaksAsset->TweaksCategories.Num());
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const int32 Index = TweakIndex + (TweakCategoryIndex * TweaksAsset->Tweaks.Num());
|
||||
TweakCurrentValues.SetNum(AbilityAsset->Tweaks.Num() * AbilityAsset->TweaksCategories.Num());
|
||||
|
||||
const int32 Index = TweakIndex + (TweakCategoryIndex * AbilityAsset->Tweaks.Num());
|
||||
|
||||
if (TweakCurrentValues.IsValidIndex(Index) == false)
|
||||
{
|
||||
@@ -324,16 +362,16 @@ float* ACogAbilityReplicator::GetTweakCurrentValuePtr(const UCogAbilityDataAsset
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::SetTweakCurrentValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
void ACogAbilityReplicator::SetTweakCurrentValue(int32 TweakIndex, int32 TweakCategoryIndex, float Value)
|
||||
{
|
||||
if (TweaksAsset == nullptr)
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TweakCurrentValues.SetNum(TweaksAsset->Tweaks.Num() * TweaksAsset->TweaksCategories.Num());
|
||||
TweakCurrentValues.SetNum(AbilityAsset->Tweaks.Num() * AbilityAsset->TweaksCategories.Num());
|
||||
|
||||
const int32 Index = TweakIndex + (TweakCategoryIndex * TweaksAsset->Tweaks.Num());
|
||||
const int32 Index = TweakIndex + (TweakCategoryIndex * AbilityAsset->Tweaks.Num());
|
||||
if (TweakCurrentValues.IsValidIndex(TweakIndex) == false)
|
||||
{
|
||||
return;
|
||||
@@ -344,20 +382,20 @@ void ACogAbilityReplicator::SetTweakCurrentValue(const UCogAbilityDataAsset* Twe
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::SetTweakProfile(const UCogAbilityDataAsset* TweaksAsset, int32 ProfileIndex)
|
||||
void ACogAbilityReplicator::SetTweakProfile(int32 ProfileIndex)
|
||||
{
|
||||
Server_SetTweakProfile(TweaksAsset, ProfileIndex);
|
||||
Server_SetTweakProfile(ProfileIndex);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::Server_SetTweakProfile_Implementation(const UCogAbilityDataAsset* TweaksAsset, int32 ProfileIndex)
|
||||
void ACogAbilityReplicator::Server_SetTweakProfile_Implementation(int32 ProfileIndex)
|
||||
{
|
||||
if (TweaksAsset == nullptr)
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (TweaksAsset->TweakProfiles.IsValidIndex(ProfileIndex) == false)
|
||||
if (AbilityAsset->TweakProfiles.IsValidIndex(ProfileIndex) == false)
|
||||
{
|
||||
ProfileIndex = INDEX_NONE;
|
||||
}
|
||||
@@ -367,48 +405,59 @@ void ACogAbilityReplicator::Server_SetTweakProfile_Implementation(const UCogAbil
|
||||
|
||||
ResetAllTweaks();
|
||||
|
||||
if (TweaksAsset->TweakProfiles.IsValidIndex(TweakProfileIndex))
|
||||
if (AbilityAsset->TweakProfiles.IsValidIndex(TweakProfileIndex))
|
||||
{
|
||||
const FCogAbilityTweakProfile& TweakProfile = TweaksAsset->TweakProfiles[TweakProfileIndex];
|
||||
const FCogAbilityTweakProfile& TweakProfile = AbilityAsset->TweakProfiles[TweakProfileIndex];
|
||||
|
||||
for (const FCogAbilityTweakProfileValue& ProfileTweak : TweakProfile.Tweaks)
|
||||
{
|
||||
const int32 TweakIndex = TweaksAsset->Tweaks.IndexOfByPredicate([ProfileTweak](const FCogAbilityTweak& Tweak) { return ProfileTweak.Effect == Tweak.Effect; });
|
||||
const int32 TweakCategoryIndex = TweaksAsset->TweaksCategories.IndexOfByPredicate([ProfileTweak](const FCogAbilityTweakCategory& TweakCategory) { return ProfileTweak.CategoryId == TweakCategory.Id; });
|
||||
const int32 TweakIndex = AbilityAsset->Tweaks.IndexOfByPredicate([ProfileTweak](const FCogAbilityTweak& Tweak) { return ProfileTweak.Effect == Tweak.Effect; });
|
||||
const int32 TweakCategoryIndex = AbilityAsset->TweaksCategories.IndexOfByPredicate([ProfileTweak](const FCogAbilityTweakCategory& TweakCategory) { return ProfileTweak.CategoryId == TweakCategory.Id; });
|
||||
|
||||
if (TweakIndex != INDEX_NONE && TweakCategoryIndex != INDEX_NONE)
|
||||
{
|
||||
SetTweakCurrentValue(TweaksAsset, TweakIndex, TweakCategoryIndex, ProfileTweak.Value);
|
||||
SetTweakCurrentValue(TweakIndex, TweakCategoryIndex, ProfileTweak.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int32 TweakCategoryIndex = 0; TweakCategoryIndex < TweaksAsset->TweaksCategories.Num(); ++TweakCategoryIndex)
|
||||
ApplyAllTweaksOnAllActors();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::ApplyAllTweaksOnAllActors()
|
||||
{
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int32 TweakCategoryIndex = 0; TweakCategoryIndex < AbilityAsset->TweaksCategories.Num(); ++TweakCategoryIndex)
|
||||
{
|
||||
TArray<AActor*> Actors;
|
||||
GetActorsFromTweakCategory(TweaksAsset, TweakCategoryIndex, Actors);
|
||||
FindActorsFromTweakCategory(TweakCategoryIndex, Actors);
|
||||
|
||||
for (AActor* Actor : Actors)
|
||||
{
|
||||
ApplyAllTweaksOnActor(TweaksAsset, TweakCategoryIndex, Actor);
|
||||
ApplyAllTweaksOnActor(TweakCategoryIndex, Actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogAbilityReplicator::GetActorsFromTweakCategory(const UCogAbilityDataAsset* TweaksAsset, int32 TweakCategoryIndex, TArray<AActor*>& Actors)
|
||||
void ACogAbilityReplicator::FindActorsFromTweakCategory(int32 TweakCategoryIndex, TArray<AActor*>& Actors)
|
||||
{
|
||||
if (TweaksAsset == nullptr)
|
||||
if (AbilityAsset == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (TweaksAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
if (AbilityAsset->TweaksCategories.IsValidIndex(TweakCategoryIndex) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const FCogAbilityTweakCategory& TweakCategory = TweaksAsset->TweaksCategories[TweakCategoryIndex];
|
||||
const FCogAbilityTweakCategory& TweakCategory = AbilityAsset->TweaksCategories[TweakCategoryIndex];
|
||||
|
||||
for (TActorIterator<AActor> It(GetWorld(), TweakCategory.ActorClass); It; ++It)
|
||||
{
|
||||
@@ -423,4 +472,49 @@ void ACogAbilityReplicator::GetActorsFromTweakCategory(const UCogAbilityDataAsse
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
int32 ACogAbilityReplicator::FindTweakCategoryFromActor(AActor* Actor)
|
||||
{
|
||||
UAbilitySystemComponent* AbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Actor, true);
|
||||
if (AbilitySystem == nullptr)
|
||||
{
|
||||
return INDEX_NONE;
|
||||
}
|
||||
|
||||
for (int32 i = 0; i < AbilityAsset->TweaksCategories.Num(); ++i)
|
||||
{
|
||||
const FCogAbilityTweakCategory& TweakCategory = AbilityAsset->TweaksCategories[i];
|
||||
|
||||
if (IsActorMatchingTweakCategory(Actor, AbilitySystem, TweakCategory))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return INDEX_NONE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
bool ACogAbilityReplicator::IsActorMatchingTweakCategory(const AActor* Actor, const UAbilitySystemComponent* ActorAbilitySystem, const FCogAbilityTweakCategory& TweakCategory)
|
||||
{
|
||||
if (Actor->GetClass()->IsChildOf(TweakCategory.ActorClass) == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const bool bHasRequiredTags = ActorAbilitySystem->HasAllMatchingGameplayTags(TweakCategory.RequiredTags);
|
||||
if (bHasRequiredTags == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const bool bHasIgnoredTags = ActorAbilitySystem->HasAnyMatchingGameplayTags(TweakCategory.IgnoredTags);
|
||||
if (bHasIgnoredTags)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "CogAbilityHelper.h"
|
||||
#include "CogAbilityReplicator.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "imgui.h"
|
||||
#include "imgui_internal.h"
|
||||
@@ -25,6 +26,8 @@ void UCogAbilityWindow_Abilities::RenderHelp()
|
||||
UCogAbilityWindow_Abilities::UCogAbilityWindow_Abilities()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "CogAbilityDataAsset.h"
|
||||
#include "CogAbilityHelper.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "AttributeSet.h"
|
||||
#include "EngineUtils.h"
|
||||
@@ -26,6 +27,8 @@ void UCogAbilityWindow_Attributes::RenderHelp()
|
||||
UCogAbilityWindow_Attributes::UCogAbilityWindow_Attributes()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "CogCommonAllegianceActorInterface.h"
|
||||
#include "CogDebugDraw.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "EngineUtils.h"
|
||||
#include "GameFramework/Character.h"
|
||||
@@ -30,6 +31,8 @@ void UCogAbilityWindow_Cheats::RenderHelp()
|
||||
UCogAbilityWindow_Cheats::UCogAbilityWindow_Cheats()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
SetAsset(FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "CogAbilityDataAsset.h"
|
||||
#include "CogAbilityHelper.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "EngineUtils.h"
|
||||
#include "GameFramework/Character.h"
|
||||
@@ -23,6 +24,8 @@ void UCogAbilityWindow_Effects::RenderHelp()
|
||||
UCogAbilityWindow_Effects::UCogAbilityWindow_Effects()
|
||||
{
|
||||
bHasMenu = false;
|
||||
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -4,9 +4,16 @@
|
||||
#include "AbilitySystemGlobals.h"
|
||||
#include "CogAbilityDataAsset.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "imgui_internal.h"
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
UCogAbilityWindow_Pools::UCogAbilityWindow_Pools()
|
||||
{
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void UCogAbilityWindow_Pools::RenderHelp()
|
||||
{
|
||||
|
||||
@@ -4,12 +4,15 @@
|
||||
#include "CogAbilityDataAsset.h"
|
||||
#include "CogAbilityReplicator.h"
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
UCogAbilityWindow_Tweaks::UCogAbilityWindow_Tweaks()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -62,7 +65,7 @@ void UCogAbilityWindow_Tweaks::RenderContent()
|
||||
bool IsSelected = CurrentTweakProfileIndex == INDEX_NONE;
|
||||
if (ImGui::Selectable("None", IsSelected))
|
||||
{
|
||||
Replicator->SetTweakProfile(Asset.Get(), INDEX_NONE);
|
||||
Replicator->SetTweakProfile(INDEX_NONE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +76,7 @@ void UCogAbilityWindow_Tweaks::RenderContent()
|
||||
|
||||
if (ImGui::Selectable(TCHAR_TO_ANSI(*TweakProfile.Name.ToString()), IsSelected))
|
||||
{
|
||||
Replicator->SetTweakProfile(Asset.Get(), TweakProfileIndex);
|
||||
Replicator->SetTweakProfile(TweakProfileIndex);
|
||||
}
|
||||
}
|
||||
ImGui::EndCombo();
|
||||
@@ -128,7 +131,7 @@ void UCogAbilityWindow_Tweaks::DrawTweak(ACogAbilityReplicator* Replicator, int3
|
||||
return;
|
||||
}
|
||||
|
||||
float* Value = Replicator->GetTweakCurrentValuePtr(Asset.Get(), TweakIndex, TweakCategoryIndex);
|
||||
float* Value = Replicator->GetTweakCurrentValuePtr(TweakIndex, TweakCategoryIndex);
|
||||
if (Value == nullptr)
|
||||
{
|
||||
return;
|
||||
@@ -156,6 +159,6 @@ void UCogAbilityWindow_Tweaks::DrawTweak(ACogAbilityReplicator* Replicator, int3
|
||||
|
||||
if (bUpdateValue)
|
||||
{
|
||||
Replicator->SetTweakValue(Asset.Get(), TweakIndex, TweakCategoryIndex, *Value);
|
||||
Replicator->SetTweakValue(TweakIndex, TweakCategoryIndex, *Value);
|
||||
}
|
||||
}
|
||||
@@ -192,6 +192,9 @@ public:
|
||||
UPROPERTY(Category = "Tweaks", EditAnywhere)
|
||||
FGameplayTag SetByCallerMagnitudeTag;
|
||||
|
||||
UPROPERTY(Category = "Tweaks", EditAnywhere)
|
||||
TSubclassOf<AActor> ActorRootClass;
|
||||
|
||||
UPROPERTY(Category = "Tweaks", EditAnywhere, meta = (TitleProperty = "Name"))
|
||||
TArray<FCogAbilityTweak> Tweaks;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ class UAbilitySystemComponent;
|
||||
class UCogAbilityDataAsset;
|
||||
struct FCogAbilityCheat;
|
||||
struct FCogAbilityTweak;
|
||||
struct FCogAbilityTweakCategory;
|
||||
struct FGameplayTag;
|
||||
|
||||
UCLASS(NotBlueprintable, NotBlueprintType, notplaceable, noteditinlinenew, hidedropdown, Transient, Config = Cog)
|
||||
@@ -26,6 +27,8 @@ public:
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||
|
||||
APlayerController* GetPlayerController() const { return OwnerPlayerController.Get(); }
|
||||
|
||||
void ApplyCheat(AActor* CheatInstigator, const TArray<AActor*>& Targets, const FCogAbilityCheat& Cheat);
|
||||
@@ -38,18 +41,21 @@ public:
|
||||
|
||||
void ResetAllTweaks();
|
||||
|
||||
void SetTweakValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 CategoryIndex, float Value);
|
||||
void SetTweakValue(int32 TweakIndex, int32 CategoryIndex, float Value);
|
||||
|
||||
void SetTweakProfile(const UCogAbilityDataAsset* TweaksAsset, int32 ProfileIndex);
|
||||
void SetTweakProfile(int32 ProfileIndex);
|
||||
|
||||
int32 GetTweakProfileIndex() const { return TweakProfileIndex; }
|
||||
|
||||
float GetTweakCurrentValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 CategoryIndex);
|
||||
float GetTweakCurrentValue(int32 TweakIndex, int32 CategoryIndex);
|
||||
|
||||
float* GetTweakCurrentValuePtr(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 CategoryIndex);
|
||||
float* GetTweakCurrentValuePtr(int32 TweakIndex, int32 CategoryIndex);
|
||||
|
||||
private:
|
||||
|
||||
UFUNCTION()
|
||||
void OnAnyActorSpawned(AActor* Actor);
|
||||
|
||||
UFUNCTION(Reliable, Server)
|
||||
void Server_ApplyCheat(const AActor* CheatInstigator, const TArray<AActor*>& TargetActors, const FCogAbilityCheat& Cheat) const;
|
||||
|
||||
@@ -63,17 +69,24 @@ private:
|
||||
void Server_ResetAllTweaks();
|
||||
|
||||
UFUNCTION(Reliable, Server)
|
||||
void Server_SetTweakValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 TweakCategoryIndex, float Value);
|
||||
void Server_SetTweakValue(int32 TweakIndex, int32 TweakCategoryIndex, float Value);
|
||||
|
||||
UFUNCTION(Reliable, Server)
|
||||
void Server_SetTweakProfile(const UCogAbilityDataAsset* TweaksAsset, int32 ProfileIndex);
|
||||
void Server_SetTweakProfile(int32 ProfileIndex);
|
||||
|
||||
void SetTweakCurrentValue(int32 TweakIndex, int32 CategoryIndex, float Value);
|
||||
|
||||
void ApplyAllTweaksOnAllActors();
|
||||
|
||||
void SetTweakCurrentValue(const UCogAbilityDataAsset* TweaksAsset, int32 TweakIndex, int32 CategoryIndex, float Value);
|
||||
void ApplyTweakOnActor(AActor* Actor, const FCogAbilityTweak& Tweak, float Value, const FGameplayTag& SetByCallerMagnitudeTag);
|
||||
void ApplyAllTweaksOnActor(const UCogAbilityDataAsset* TweaksAsset, int32 TweakCategoryIndex, AActor* Actor);
|
||||
void GetActorsFromTweakCategory(const UCogAbilityDataAsset* TweaksAsset, int32 CategoryIndex, TArray<AActor*>& Actors);
|
||||
|
||||
TObjectPtr<APlayerController> OwnerPlayerController;
|
||||
void ApplyAllTweaksOnActor(int32 TweakCategoryIndex, AActor* Actor);
|
||||
|
||||
void FindActorsFromTweakCategory(int32 CategoryIndex, TArray<AActor*>& Actors);
|
||||
|
||||
int32 FindTweakCategoryFromActor(AActor* Actor);
|
||||
|
||||
static bool IsActorMatchingTweakCategory(const AActor* Actor, const UAbilitySystemComponent* ActorAbilitySystem, const FCogAbilityTweakCategory& TweakCategory);
|
||||
|
||||
UPROPERTY(Replicated)
|
||||
int32 TweakProfileIndex = INDEX_NONE;
|
||||
@@ -83,4 +96,11 @@ private:
|
||||
|
||||
UPROPERTY(Config)
|
||||
TArray<FString> AppliedCheatsOnLocalPawn;
|
||||
|
||||
TObjectPtr<APlayerController> OwnerPlayerController;
|
||||
|
||||
FDelegateHandle OnAnyActorSpawnedHandle;
|
||||
|
||||
UPROPERTY()
|
||||
TObjectPtr<const UCogAbilityDataAsset> AbilityAsset = nullptr;
|
||||
};
|
||||
|
||||
@@ -19,10 +19,6 @@ public:
|
||||
|
||||
UCogAbilityWindow_Abilities();
|
||||
|
||||
const UCogAbilityDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogAbilityDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void RenderHelp() override;
|
||||
|
||||
@@ -19,10 +19,6 @@ public:
|
||||
|
||||
UCogAbilityWindow_Attributes();
|
||||
|
||||
const UCogAbilityDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogAbilityDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void ResetConfig() override;
|
||||
|
||||
@@ -24,10 +24,6 @@ public:
|
||||
|
||||
UCogAbilityWindow_Effects();
|
||||
|
||||
const UCogAbilityDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogAbilityDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void RenderHelp() override;
|
||||
|
||||
@@ -16,9 +16,7 @@ class COGABILITY_API UCogAbilityWindow_Pools : public UCogWindow
|
||||
|
||||
public:
|
||||
|
||||
const UCogAbilityDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogAbilityDataAsset* Value) { Asset = Value; }
|
||||
UCogAbilityWindow_Pools();
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -16,10 +16,6 @@ public:
|
||||
|
||||
UCogAbilityWindow_Tweaks();
|
||||
|
||||
const UCogAbilityDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogAbilityDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void RenderHelp() override;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "CogInputWindow_Actions.h"
|
||||
|
||||
#include "CogInputDataAsset.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "Engine/LocalPlayer.h"
|
||||
#include "EnhancedInputSubsystems.h"
|
||||
@@ -23,6 +24,8 @@ void UCogInputWindow_Actions::RenderHelp()
|
||||
UCogInputWindow_Actions::UCogInputWindow_Actions()
|
||||
{
|
||||
bHasMenu = true;
|
||||
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogInputDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "CogImguiHelper.h"
|
||||
#include "CogInputDataAsset.h"
|
||||
#include "CogWindowHelper.h"
|
||||
#include "CogWindowWidgets.h"
|
||||
#include "Engine/LocalPlayer.h"
|
||||
#include "EnhancedInputSubsystems.h"
|
||||
@@ -11,6 +12,7 @@
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
UCogInputWindow_Gamepad::UCogInputWindow_Gamepad()
|
||||
{
|
||||
Asset = FCogWindowHelper::GetFirstAssetByClass<UCogInputDataAsset>();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -17,10 +17,6 @@ public:
|
||||
|
||||
UCogInputWindow_Actions();
|
||||
|
||||
const UCogInputDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogInputDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
void RenderHelp();
|
||||
|
||||
@@ -18,10 +18,6 @@ public:
|
||||
|
||||
UCogInputWindow_Gamepad();
|
||||
|
||||
const UCogInputDataAsset* GetAsset() const { return Asset.Get(); }
|
||||
|
||||
void SetAsset(const UCogInputDataAsset* Value) { Asset = Value; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual void ResetConfig() override;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#include "CogSampleGameState.h"
|
||||
|
||||
#include "AssetRegistry/AssetRegistryModule.h"
|
||||
#include "AssetRegistry/IAssetRegistry.h"
|
||||
#include "CogSampleAbilitySystemComponent.h"
|
||||
#include "CogSampleFunctionLibrary_Tag.h"
|
||||
#include "GameFramework/Character.h"
|
||||
@@ -52,25 +50,6 @@
|
||||
|
||||
#endif //ENABLE_COG
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
template<typename T>
|
||||
T* GetFirstAssetByClass()
|
||||
{
|
||||
IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
|
||||
|
||||
TArray<FAssetData> Assets;
|
||||
AssetRegistry.GetAssetsByClass(T::StaticClass()->GetClassPathName(), Assets, true);
|
||||
if (Assets.Num() == 0)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
UObject* Asset = Assets[0].GetAsset();
|
||||
T* CastedAsset = Cast<T>(Asset);
|
||||
return CastedAsset;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
ACogSampleGameState::ACogSampleGameState(const FObjectInitializer & ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
@@ -139,10 +118,7 @@ void ACogSampleGameState::InitializeCog()
|
||||
//---------------------------------------
|
||||
// Engine
|
||||
//---------------------------------------
|
||||
const UCogEngineDataAsset* EngineAsset = GetFirstAssetByClass<UCogEngineDataAsset>();
|
||||
|
||||
UCogEngineWindow_Collisions* CollisionsWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Collisions>("Engine.Collision");
|
||||
CollisionsWindow->SetAsset(EngineAsset);
|
||||
CogWindowManager->CreateWindow<UCogEngineWindow_Collisions>("Engine.Collision");
|
||||
|
||||
CogWindowManager->CreateWindow<UCogEngineWindow_CommandBindings>("Engine.Command Bindings");
|
||||
|
||||
@@ -177,8 +153,7 @@ void ACogSampleGameState::InitializeCog()
|
||||
|
||||
CogWindowManager->CreateWindow<UCogEngineWindow_Skeleton>("Engine.Skeleton");
|
||||
|
||||
UCogEngineWindow_Spawns* SpawnWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Spawns>("Engine.Spawns");
|
||||
SpawnWindow->SetAsset(EngineAsset);
|
||||
CogWindowManager->CreateWindow<UCogEngineWindow_Spawns>("Engine.Spawns");
|
||||
|
||||
UCogEngineWindow_Stats* StatsWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Stats>("Engine.Stats");
|
||||
|
||||
@@ -187,44 +162,33 @@ void ACogSampleGameState::InitializeCog()
|
||||
//---------------------------------------
|
||||
// Abilities
|
||||
//---------------------------------------
|
||||
const UCogAbilityDataAsset* AbilityAsset = GetFirstAssetByClass<UCogAbilityDataAsset>();
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Abilities>("Gameplay.Abilities");
|
||||
|
||||
UCogAbilityWindow_Abilities* AbilitiesWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Abilities>("Gameplay.Abilities");
|
||||
AbilitiesWindow->SetAsset(AbilityAsset);
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Attributes>("Gameplay.Attributes");
|
||||
|
||||
UCogAbilityWindow_Attributes* AttributesWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Attributes>("Gameplay.Attributes");
|
||||
AttributesWindow->SetAsset(AbilityAsset);
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Cheats>("Gameplay.Cheats");
|
||||
|
||||
UCogAbilityWindow_Cheats* CheatsWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Cheats>("Gameplay.Cheats");
|
||||
CheatsWindow->SetAsset(AbilityAsset);
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Effects>("Gameplay.Effects");
|
||||
|
||||
UCogAbilityWindow_Effects* EffectsWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Effects>("Gameplay.Effects");
|
||||
EffectsWindow->SetAsset(AbilityAsset);
|
||||
|
||||
UCogAbilityWindow_Pools* PoolsWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Pools>("Gameplay.Pools");
|
||||
PoolsWindow->SetAsset(AbilityAsset);
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Pools>("Gameplay.Pools");
|
||||
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Tags>("Gameplay.Tags");
|
||||
|
||||
UCogAbilityWindow_Tweaks* TweaksWindow = CogWindowManager->CreateWindow<UCogAbilityWindow_Tweaks>("Gameplay.Tweaks");
|
||||
TweaksWindow->SetAsset(AbilityAsset);
|
||||
CogWindowManager->CreateWindow<UCogAbilityWindow_Tweaks>("Gameplay.Tweaks");
|
||||
|
||||
//---------------------------------------
|
||||
// AI
|
||||
//---------------------------------------
|
||||
CogWindowManager->CreateWindow<UCogAIWindow_BehaviorTree>("AI.Behavior Tree");
|
||||
|
||||
CogWindowManager->CreateWindow<UCogAIWindow_Blackboard>("AI.Blackboard");
|
||||
|
||||
//---------------------------------------
|
||||
// Input
|
||||
//---------------------------------------
|
||||
const UCogInputDataAsset* InputAsset = GetFirstAssetByClass<UCogInputDataAsset>();
|
||||
CogWindowManager->CreateWindow<UCogInputWindow_Actions>("Input.Actions");
|
||||
|
||||
UCogInputWindow_Actions* ActionsWindow = CogWindowManager->CreateWindow<UCogInputWindow_Actions>("Input.Actions");
|
||||
ActionsWindow->SetAsset(InputAsset);
|
||||
|
||||
UCogInputWindow_Gamepad* GamepadWindow = CogWindowManager->CreateWindow<UCogInputWindow_Gamepad>("Input.Gamepad");
|
||||
GamepadWindow->SetAsset(InputAsset);
|
||||
CogWindowManager->CreateWindow<UCogInputWindow_Gamepad>("Input.Gamepad");
|
||||
|
||||
//---------------------------------------
|
||||
// Main Menu Widget
|
||||
|
||||
Reference in New Issue
Block a user