From 74dd726c2cd7477e42640b437053452720fc2f9c Mon Sep 17 00:00:00 2001 From: Arnaud Jamin Date: Tue, 4 Feb 2025 21:52:53 -0500 Subject: [PATCH] CogEngine: Make the Cheat Execution implementable in blueprint - Deprecate CogAbilityWindow_Cheats as it is now replaced with CogEngineWindow_Cheats - Add CogAbilityCheat_Execution_ActivateAbility for cheats that rely on an ability - CogSample: Add new cheats --- .../Cheats/BP_Cheat_TeleportToAim.uasset | Bin 0 -> 97791 bytes .../Cheats/BP_Cheat_TeleportToPlayer.uasset | Bin 0 -> 44732 bytes .../Debug/Cheats/GA_Cheat_Teleport.uasset | Bin 0 -> 63324 bytes Content/Core/Debug/DA_Debug_Engine.uasset | Bin 11235 -> 12143 bytes Plugins/Cog/Config/DefaultCog.ini | 2 + .../CogEngine/Private/CogEngineDataAsset.cpp | 4 +- .../CogEngine/Private/CogEngineReplicator.cpp | 6 +- .../Private/CogEngineWindow_Cheats.cpp | 78 ++-- .../CogEngine/Public/CogEngineDataAsset.h | 14 +- .../CogEngine/Public/CogEngineReplicator.h | 2 +- .../CogEngine/Public/CogEngineWindow_Cheats.h | 5 +- ...AbilityCheat_Execution_ActivateAbility.cpp | 115 ++++++ .../CogAbilityCheat_Execution_ApplyEffect.cpp | 4 +- .../Private/CogAbilityConfig_Alignment.cpp | 29 +- .../Private/CogAbilityWindow_Cheats.cpp | 339 +----------------- ...ogAbilityCheat_Execution_ActivateAbility.h | 27 ++ .../CogAbilityCheat_Execution_ApplyEffect.h | 4 +- .../Public/CogAbilityConfig_Alignment.h | 4 +- .../CogAbility/Public/CogAbilityDataAsset.h | 6 + .../Public/CogAbilityWindow_Cheats.h | 24 -- 20 files changed, 237 insertions(+), 426 deletions(-) create mode 100644 Content/Core/Debug/Cheats/BP_Cheat_TeleportToAim.uasset create mode 100644 Content/Core/Debug/Cheats/BP_Cheat_TeleportToPlayer.uasset create mode 100644 Content/Core/Debug/Cheats/GA_Cheat_Teleport.uasset create mode 100644 Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ActivateAbility.cpp create mode 100644 Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ActivateAbility.h diff --git a/Content/Core/Debug/Cheats/BP_Cheat_TeleportToAim.uasset b/Content/Core/Debug/Cheats/BP_Cheat_TeleportToAim.uasset new file mode 100644 index 0000000000000000000000000000000000000000..0dd551d5d609e8b352bdc2cb1ebc005ccb6f4577 GIT binary patch literal 97791 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 literal 0 HcmV?d00001 diff --git a/Content/Core/Debug/Cheats/BP_Cheat_TeleportToPlayer.uasset b/Content/Core/Debug/Cheats/BP_Cheat_TeleportToPlayer.uasset new file mode 100644 index 0000000000000000000000000000000000000000..0b31f7305195c7d7e1f6158855b3acad166a77c3 GIT binary patch literal 44732 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 literal 0 HcmV?d00001 diff --git a/Content/Core/Debug/Cheats/GA_Cheat_Teleport.uasset b/Content/Core/Debug/Cheats/GA_Cheat_Teleport.uasset new file mode 100644 index 0000000000000000000000000000000000000000..d0ba82a89f5fb4e5471c51bf5e47370411701ec4 GIT binary patch literal 63324 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

t(Jw;JQK11TB4)(7 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 delta 2136 zcmai#duUr#9LLX1)0p?#q%|&&dz&dmg{< z=bUrTz2~0Gqd#tay{mCHC`1&Btz~Mk#j{BWQBX)IwN8z9jrQ?+AHVA0F?pO#Q;QG8 z4ij)F%R}5q6-vC6+o-FYEkCNHl)x&g4^9+I`H9koLSgL5Qc)D|zOog2E#pBRZ1dQT z;xon4*p2YaKOdD5Zdg(h^hELUVe4>1`EmOzmR4Rnr?tz4xJ1)+p*!NQi!4&4+c5Go zMQ%5Y{6vu+jyP84L9a`zX%$>r-Aq3awT`Lg6{@ipl6|6arSzoW=~h9g~s z*Ihr-x8(0N^k2ZJf&V=D`wac(aL~a24f*>G{qtBd@PAGI^@jel81~e!e~$bc*^gb` zCglufTmh~%entIvuJq4hpNISH$^g!KQ>05$ldHHsEOn>UeNsL*e!O0_k!Cnt4_)EA^4ka}9G>SND>&yQ@xU0ur?J}vnht+e{G1syGM2W37Z4$2wI zoMwaA9tvV0=f;9RZiraOR*PIWM_f8288V&4twT1OBOV>{oH^pvA^Xh{{z23}{%Lch zNr(Jxjx^|ySlD#OtUBa=bEHv+>@-JgI^-R5+YP~xxo8h>n*b}S<&({3pKaQD?}_b)nhaM>;R?DSXb+xRxZv2*}k zomNbS>=+3>kGarV+jhFEW`bpB*sVDEH(jY5tyDBTp~mrQB!dsM3=XOpj8eUe%1JGw zTtl~-#yqvoXw7&wvKm{+)k*o|$b+y@`LLQ%{>7X&U~#yhwS|0q!US*h|M#39(VT{f zwny-OI*-YO13gg{J((f&wYTiaI`C;!!>P7BK40U&`dB-{>2Z7+i@_0Jwm;UcVoygN z7uwgrDN6^6@i<1J9CyN!h~S*8r|>2*_GA)TBF{s=mDKQFVhGo>_t-jkm#mnM1@KTR jjU!23Km@<1RJ@cLN2x=_Q?Wd*bfl3>4wWY}m#zN+gKF0S diff --git a/Plugins/Cog/Config/DefaultCog.ini b/Plugins/Cog/Config/DefaultCog.ini index 4c29e40..6030448 100644 --- a/Plugins/Cog/Config/DefaultCog.ini +++ b/Plugins/Cog/Config/DefaultCog.ini @@ -1,2 +1,4 @@ [CoreRedirects] +StructRedirects=(OldName="/Script/CogDebug.CogLogCategory",NewName="/Script/CogCommon.CogLogCategory") ++PropertyRedirects=(OldName="/Script/CogEngine.CogEngineCheatCategory.PersistentEffects",NewName="/Script/CogEngine.CogEngineCheatCategory.PersistentCheats") ++PropertyRedirects=(OldName="/Script/CogEngine.CogEngineCheatCategory.InstantEffects",NewName="/Script/CogEngine.CogEngineCheatCategory.InstantCheats") diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineDataAsset.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineDataAsset.cpp index d5e3ecf..eb47385 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineDataAsset.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineDataAsset.cpp @@ -1,12 +1,12 @@ #include "CogEngineDataAsset.h" //-------------------------------------------------------------------------------------------------------------------------- -void UCogEngineCheat_Execution::Execute_Implementation(const AActor* Instigator, const TArray& Targets) const +void UCogEngineCheat_Execution::Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const { } //-------------------------------------------------------------------------------------------------------------------------- -ECogEngineCheat_ActiveState UCogEngineCheat_Execution::IsActiveOnTargets_Implementation(const TArray& Targets) const +ECogEngineCheat_ActiveState UCogEngineCheat_Execution::IsActiveOnTargets_Implementation(const UObject* WorldContextObject, const TArray& Targets) const { return ECogEngineCheat_ActiveState::Inactive; } diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp index 404ff8f..9004fe4 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineReplicator.cpp @@ -230,16 +230,16 @@ void ACogEngineReplicator::Server_ApplyCheat_Implementation(const AActor* CheatI return; } - Cheat.Execution->Execute(CheatInstigator, Targets); + Cheat.Execution->Execute(GetWorld(), CheatInstigator, Targets); } //-------------------------------------------------------------------------------------------------------------------------- -ECogEngineCheat_ActiveState ACogEngineReplicator::IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat) +ECogEngineCheat_ActiveState ACogEngineReplicator::IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat) const { if (Cheat.Execution == nullptr) { return ECogEngineCheat_ActiveState::Inactive; } - return Cheat.Execution->IsActiveOnTargets(Targets); + return Cheat.Execution->IsActiveOnTargets(GetWorld(), Targets); } diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp index 17af666..6ef7b2f 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_Cheats.cpp @@ -43,18 +43,25 @@ void FCogEngineWindow_Cheats::Initialize() { if (InArgs.Num() > 0) { - if (const FCogEngineCheat* cheat = FindCheatByName(InArgs[0], false)) - { - const bool ApplyToEnemies = InArgs.Contains("-Enemies"); - const bool ApplyToAllies = InArgs.Contains("-Allies"); - const bool ApplyToControlled = InArgs.Contains("-Controlled"); - - RequestCheat(GetLocalPlayerPawn(), GetSelection(), *cheat, ApplyToEnemies, ApplyToAllies, ApplyToControlled); - } - else + const FCogEngineCheat* Cheat = FindCheatByName(InArgs[0], false); + if (Cheat == nullptr) { UE_LOG(LogCogImGui, Warning, TEXT("Cog.Cheat %s | Cheat not found"), *InArgs[0]); + return; } + + ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*InWorld); + if (Replicator == nullptr) + { + UE_LOG(LogCogImGui, Warning, TEXT("Cog.Cheat %s | Repliactor not found"), *InArgs[0]); + return; + } + + const bool ApplyToEnemies = InArgs.Contains("-Enemies"); + const bool ApplyToAllies = InArgs.Contains("-Allies"); + const bool ApplyToControlled = InArgs.Contains("-Controlled"); + + RequestCheat(*Replicator, GetLocalPlayerPawn(), GetSelection(), *Cheat, ApplyToEnemies, ApplyToAllies, ApplyToControlled); } })); @@ -64,12 +71,12 @@ void FCogEngineWindow_Cheats::Initialize() for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) { - for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats) { UpdateCheatColor(Cheat); } - for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.InstantCheats) { UpdateCheatColor(Cheat); } @@ -179,6 +186,12 @@ void FCogEngineWindow_Cheats::RenderContent() return; } + ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*GetWorld()); + if (Replicator == nullptr) + { + ImGui::TextDisabled("No Replicator"); + } + if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("Options")) @@ -276,9 +289,9 @@ void FCogEngineWindow_Cheats::RenderContent() } int Index = 0; - for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats) { - AddCheat(Index, ControlledActor, SelectedActor, Cheat, true); + AddCheat(*Replicator, Index, ControlledActor, SelectedActor, Cheat, true); Index++; } @@ -290,10 +303,10 @@ void FCogEngineWindow_Cheats::RenderContent() //---------------------------------------------------------------------------- if (SelectedActor == ControlledActor) { - for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats) { TArray Targets = { SelectedActor }; - if (ACogEngineReplicator::IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active) + if (Replicator->IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active) { Config->AppliedCheats.AddUnique(Cheat.Name); } @@ -307,9 +320,9 @@ void FCogEngineWindow_Cheats::RenderContent() ImGui::TableNextColumn(); Index = 0; - for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.InstantCheats) { - AddCheat(Index, ControlledActor, SelectedActor, Cheat, false); + AddCheat(*Replicator, Index, ControlledActor, SelectedActor, Cheat, false); Index++; } @@ -327,7 +340,7 @@ void FCogEngineWindow_Cheats::RenderContent() } //-------------------------------------------------------------------------------------------------------------------------- -bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool IsPersistent) +bool FCogEngineWindow_Cheats::AddCheat(ACogEngineReplicator& Replicator, const int32 Index, AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool IsPersistent) { const auto CheatName = StringCast(*Cheat.Name); @@ -346,10 +359,10 @@ bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActo if (IsPersistent) { TArray Targets = { SelectedActor }; - bool isEnabled = ACogEngineReplicator::IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active; + bool isEnabled = Replicator.IsCheatActiveOnTargets(Targets, Cheat) == ECogEngineCheat_ActiveState::Active; if (ImGui::Checkbox(CheatName.Get(), &isEnabled)) { - RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); + RequestCheat(Replicator, ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); bIsPressed = true; } } @@ -357,7 +370,7 @@ bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActo { if (ImGui::Button(CheatName.Get(), ImVec2(-1, 0))) { - RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); + RequestCheat(Replicator, ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); bIsPressed = true; } } @@ -365,10 +378,10 @@ bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActo if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown || IsAltDown || IsControlDown ? 0.5f : 1.0f), "On Selection"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown ? 1.0f : 0.5f), "On Enemies [SHIFT]"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsAltDown ? 1.0f : 0.5f), "On Allies [ALT]"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsControlDown ? 1.0f : 0.5f), "On Controlled [CTRL]"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown || IsAltDown || IsControlDown ? 0.5f : 1.0f), "Selection"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown ? 1.0f : 0.5f), "Enemies [SHIFT]"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsAltDown ? 1.0f : 0.5f), "Allies [ALT]"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsControlDown ? 1.0f : 0.5f), "Controlled [CTRL]"); ImGui::EndTooltip(); } @@ -380,7 +393,7 @@ bool FCogEngineWindow_Cheats::AddCheat(const int32 Index, AActor* ControlledActo } //-------------------------------------------------------------------------------------------------------------------------- -void FCogEngineWindow_Cheats::RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled) +void FCogEngineWindow_Cheats::RequestCheat(ACogEngineReplicator& Replicator, AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled) { TArray Actors; @@ -416,14 +429,7 @@ void FCogEngineWindow_Cheats::RequestCheat(AActor* ControlledActor, AActor* Sele Actors.Add(SelectedActor); } - if (ACogEngineReplicator* Replicator = ACogEngineReplicator::GetLocalReplicator(*GetWorld())) - { - Replicator->Server_ApplyCheat(ControlledActor, Actors, Cheat); - } - else - { - UE_LOG(LogCogImGui, Warning, TEXT("FCogAbilityWindow_Cheats::RequestCheat | Replicator not found")); - } + Replicator.Server_ApplyCheat(ControlledActor, Actors, Cheat); } //-------------------------------------------------------------------------------------------------------------------------- @@ -431,7 +437,7 @@ const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& C { for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) { - for (const FCogEngineCheat& Cheat : CheatCategory.PersistentEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats) { if (Cheat.Name == CheatName) { @@ -444,7 +450,7 @@ const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& C continue; } - for (const FCogEngineCheat& Cheat : CheatCategory.InstantEffects) + for (const FCogEngineCheat& Cheat : CheatCategory.InstantCheats) { if (Cheat.Name == CheatName) { diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h index c395a0a..14b46fb 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineDataAsset.h @@ -16,7 +16,7 @@ enum class ECogEngineCheat_ActiveState : uint8 }; //-------------------------------------------------------------------------------------------------------------------------- -UCLASS(BlueprintType, Abstract, Const, DefaultToInstanced, EditInlineNew, CollapseCategories) +UCLASS(BlueprintType, Blueprintable, Abstract, Const, DefaultToInstanced, EditInlineNew, CollapseCategories, Meta = (ShowWorldContextPin)) class COGENGINE_API UCogEngineCheat_Execution : public UObject { @@ -24,11 +24,11 @@ class COGENGINE_API UCogEngineCheat_Execution public: - UFUNCTION(BlueprintNativeEvent) - void Execute(const AActor* Instigator, const TArray& Targets) const; + UFUNCTION(BlueprintNativeEvent, meta = (DevelopmentOnly, WorldContext = "WorldContextObject")) + void Execute(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const; - UFUNCTION(BlueprintNativeEvent) - ECogEngineCheat_ActiveState IsActiveOnTargets(const TArray& Targets) const; + UFUNCTION(BlueprintNativeEvent, meta = (DevelopmentOnly, WorldContext = "WorldContextObject")) + ECogEngineCheat_ActiveState IsActiveOnTargets(const UObject* WorldContextObject, const TArray& Targets) const; virtual bool GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const; }; @@ -61,10 +61,10 @@ struct COGENGINE_API FCogEngineCheatCategory FString Name; UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) - TArray PersistentEffects; + TArray PersistentCheats; UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) - TArray InstantEffects; + TArray InstantCheats; }; //-------------------------------------------------------------------------------------------------------------------------- diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h index be13be5..67a4e55 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineReplicator.h @@ -54,7 +54,7 @@ public: UFUNCTION(Reliable, Server) void Server_ApplyCheat(const AActor* CheatInstigator, const TArray& TargetActors, const FCogEngineCheat& Cheat) const; - static ECogEngineCheat_ActiveState IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat); + ECogEngineCheat_ActiveState IsCheatActiveOnTargets(const TArray& Targets, const FCogEngineCheat& Cheat) const; protected: diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h index 0ebc474..7e640b3 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_Cheats.h @@ -5,6 +5,7 @@ #include "CogWindow.h" #include "CogEngineWindow_Cheats.generated.h" +class ACogEngineReplicator; class AActor; class UCogEngineConfig_Cheats; class UCogEngineDataAsset; @@ -29,9 +30,9 @@ protected: virtual void TryReapplyCheats(); - virtual bool AddCheat(const int32 Index, AActor* ControlledActor, AActor* TargetActor, const FCogEngineCheat& CheatEffect, bool IsPersistent); + virtual bool AddCheat(ACogEngineReplicator& Replicator, const int32 Index, AActor* ControlledActor, AActor* TargetActor, const FCogEngineCheat& CheatEffect, bool IsPersistent); - virtual void RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled); + virtual void RequestCheat(ACogEngineReplicator& Replicator, AActor* ControlledActor, AActor* SelectedActor, const FCogEngineCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled); virtual const FCogEngineCheat* FindCheatByName(const FString& CheatName, const bool OnlyPersistentCheats); diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ActivateAbility.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ActivateAbility.cpp new file mode 100644 index 0000000..3cf28c9 --- /dev/null +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ActivateAbility.cpp @@ -0,0 +1,115 @@ +#include "CogAbilityCheat_Execution_ActivateAbility.h" + +#include "CogAbilityDataAsset.h" + +#include "AbilitySystemComponent.h" +#include "AbilitySystemGlobals.h" +#include "CogAbilityConfig_Alignment.h" +#include "CogCommon.h" +#include "CogImguiHelper.h" +#include "CogWindow.h" + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogAbilityCheat_Execution_ActivateAbility::Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const +{ + if (Ability == nullptr) + { return; } + + for (AActor* Target : Targets) + { + UAbilitySystemComponent* AbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Target, true); + if (AbilitySystem == nullptr) + { + COG_LOG_FUNC(LogCogImGui, ELogVerbosity::Warning, TEXT("Target:%s | Invalid Target AbilitySystem"), *GetNameSafe(Target)); + continue; + } + + FGameplayAbilitySpecHandle Handle; + const FGameplayAbilitySpec* Spec = AbilitySystem->FindAbilitySpecFromClass(Ability); + if (Spec != nullptr) + { + if (Spec->IsActive()) + { + AbilitySystem->CancelAbilityHandle(Spec->Handle); + if (RemoveAbilityOnEnd) + { + AbilitySystem->ClearAbility(Handle); + } + return; + } + + Handle = Spec->Handle; + } + else + { + Handle = AbilitySystem->GiveAbility(FGameplayAbilitySpec(Ability, 1, INDEX_NONE, Target)); + Spec = AbilitySystem->FindAbilitySpecFromHandle(Handle, EConsiderPending::All); + } + + AbilitySystem->TryActivateAbility(Handle); + + if (Spec->IsActive() == false) + { + if (RemoveAbilityOnEnd) + { + AbilitySystem->ClearAbility(Handle); + } + } + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +ECogEngineCheat_ActiveState UCogAbilityCheat_Execution_ActivateAbility::IsActiveOnTargets_Implementation(const UObject* WorldContextObject, const TArray& Targets) const +{ + if (Ability == nullptr) + { + return ECogEngineCheat_ActiveState::Inactive; + } + + int32 NumActiveAbilities = 0; + for (const AActor* Target : Targets) + { + const UAbilitySystemComponent* AbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Target, true); + if (AbilitySystem == nullptr) + { continue; } + + const FGameplayAbilitySpec* Spec = AbilitySystem->FindAbilitySpecFromClass(Ability); + if (Spec == nullptr) + { continue; } + + if (Spec->IsActive()) + { + NumActiveAbilities++; + } + } + + if (NumActiveAbilities == 0) + { + return ECogEngineCheat_ActiveState::Inactive; + } + + if (NumActiveAbilities == Targets.Num()) + { + return ECogEngineCheat_ActiveState::Active; + } + + return ECogEngineCheat_ActiveState::Partial; +} + + +//-------------------------------------------------------------------------------------------------------------------------- +bool UCogAbilityCheat_Execution_ActivateAbility::GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const +{ + if (Ability == nullptr) + { return false; } + + const UGameplayAbility* GameplayAbility = Ability->GetDefaultObject(); + if (GameplayAbility == nullptr) + { return false; } + + const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig(); + const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset(); + + OutColor = Config->GetAbilityColor(Asset, *GameplayAbility); + return true; +} diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp index 1636fee..4e09f52 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityCheat_Execution_ApplyEffect.cpp @@ -9,7 +9,7 @@ #include "CogWindow.h" //-------------------------------------------------------------------------------------------------------------------------- -void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const AActor* Instigator, const TArray& Targets) const +void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const { UAbilitySystemComponent* DefaultInstigatorAbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Instigator, true); @@ -56,7 +56,7 @@ void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const AActor } //-------------------------------------------------------------------------------------------------------------------------- -ECogEngineCheat_ActiveState UCogAbilityCheat_Execution_ApplyEffect::IsActiveOnTargets_Implementation(const TArray& Targets) const +ECogEngineCheat_ActiveState UCogAbilityCheat_Execution_ApplyEffect::IsActiveOnTargets_Implementation(const UObject* WorldContextObject, const TArray& Targets) const { if (Effect == nullptr) { diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityConfig_Alignment.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityConfig_Alignment.cpp index 286722e..dfd74d4 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityConfig_Alignment.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityConfig_Alignment.cpp @@ -23,25 +23,34 @@ FVector4f UCogAbilityConfig_Alignment::GetAttributeColor(const UAbilitySystemCom return NeutralColor; } +//-------------------------------------------------------------------------------------------------------------------------- +FVector4f UCogAbilityConfig_Alignment::GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability) const +{ + if (Asset == nullptr) + { return NeutralColor; } + + const FGameplayTagContainer& Tags = Ability.GetAssetTags(); + if (Tags.HasTag(Asset->NegativeAbilityTag)) + { return NegativeColor; } + + if (Tags.HasTag(Asset->PositiveAbilityTag)) + { return PositiveColor; } + + return NeutralColor; +} + //-------------------------------------------------------------------------------------------------------------------------- FVector4f UCogAbilityConfig_Alignment::GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect) const { if (Asset == nullptr) - { - return NeutralColor; - } + { return NeutralColor; } const FGameplayTagContainer& Tags = Effect.GetAssetTags(); - if (Tags.HasTag(Asset->NegativeEffectTag)) - { - return NegativeColor; - } + { return NegativeColor; } if (Tags.HasTag(Asset->PositiveEffectTag)) - { - return PositiveColor; - } + { return PositiveColor; } return NeutralColor; } diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Cheats.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Cheats.cpp index 99915c6..6c0d82e 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Cheats.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Cheats.cpp @@ -1,114 +1,11 @@ #include "CogAbilityWindow_Cheats.h" -#include "CogAbilityConfig_Alignment.h" -#include "CogAbilityDataAsset.h" -#include "CogAbilityReplicator.h" -#include "CogCommonAllegianceActorInterface.h" -#include "CogImguiHelper.h" -#include "CogWindowConsoleCommandManager.h" -#include "CogWindowWidgets.h" -#include "EngineUtils.h" -#include "GameFramework/Character.h" #include "imgui.h" -#include "imgui_internal.h" - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogAbilityWindow_Cheats::Initialize() -{ - Super::Initialize(); - - bHasMenu = true; - - Asset = GetAsset(); - Config = GetConfig(); - AlignmentConfig = GetConfig(); -} //-------------------------------------------------------------------------------------------------------------------------- void FCogAbilityWindow_Cheats::RenderHelp() { - ImGui::Text( - "This window can be used to apply cheats to the selected actor (by default). " - "The cheats can be configured in the '%s' data asset. " - "When clicking a cheat button, press:\n" - " [CTRL] to apply the cheat to controlled actor\n" - " [ALT] to apply the cheat to the allies of the selected actor\n" - " [SHIFT] to apply the cheat to the enemies of the selected actor\n" - , TCHAR_TO_ANSI(*GetNameSafe(Asset.Get())) - ); -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogAbilityWindow_Cheats::GameTick(float DeltaTime) -{ - Super::GameTick(DeltaTime); - - TryReapplyCheats(); -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogAbilityWindow_Cheats::TryReapplyCheats() -{ - if (Config == nullptr) - { - return; - } - - if (bHasReappliedCheats) - { - return; - } - - if (Config->bReapplyCheatsBetweenPlays == false) - { - return; - } - - static int32 IsFirstLaunch = true; - if (IsFirstLaunch && Config->bReapplyCheatsBetweenLaunches == false) - { - return; - } - IsFirstLaunch = false; - - if (Asset == nullptr) - { - return; - } - - APawn* ControlledActor = GetLocalPlayerPawn(); - if (ControlledActor == nullptr) - { - return; - } - - ACogAbilityReplicator* Replicator = ACogAbilityReplicator::GetFirstReplicator(*GetWorld()); - if (Replicator == nullptr) - { - return; - } - - TArray Targets { ControlledActor }; - - for (int32 i = Config->AppliedCheats.Num() - 1; i >= 0; i--) - { - const FString& AppliedCheatName = Config->AppliedCheats[i]; - - if (const FCogAbilityCheat* Cheat = Asset->PersistentEffects.FindByPredicate( - [AppliedCheatName](const FCogAbilityCheat& Cheat) { return Cheat.Name == AppliedCheatName; })) - { - Replicator->Server_ApplyCheat(ControlledActor, Targets, *Cheat); - } - else - { - //----------------------------------------------------- - // This cheat doesn't exist anymore. We can remove it. - //----------------------------------------------------- - Config->AppliedCheats.RemoveAt(i); - } - } - - bHasReappliedCheats = true; + ImGui::TextDisabled("This window is deprecated. Please use the CogEngineWindow_Cheat instead as it provide more functionnalities."); } //-------------------------------------------------------------------------------------------------------------------------- @@ -116,235 +13,5 @@ void FCogAbilityWindow_Cheats::RenderContent() { Super::RenderContent(); - if (Config == nullptr) - { - ImGui::TextDisabled("Invalid Config"); - return; - } - - AActor* SelectedActor = GetSelection(); - if (SelectedActor == nullptr) - { - ImGui::TextDisabled("Invalid Selection"); - return; - } - - if (Asset == nullptr) - { - ImGui::TextDisabled("Invalid Asset"); - return; - } - - if (ImGui::BeginMenuBar()) - { - if (ImGui::BeginMenu("Options")) - { - ImGui::Checkbox("Reapply Cheats Between Plays", &Config->bReapplyCheatsBetweenPlays); - - if (Config->bReapplyCheatsBetweenPlays == false) - { - ImGui::BeginDisabled(); - } - ImGui::Checkbox("Reapply Cheats Between Launches", &Config->bReapplyCheatsBetweenLaunches); - - if (Config->bReapplyCheatsBetweenPlays == false) - { - ImGui::EndDisabled(); - } - - ImGui::Separator(); - ImGui::ColorEdit4("Positive Color", (float*)&AlignmentConfig->PositiveColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf); - ImGui::ColorEdit4("Negative Color", (float*)&AlignmentConfig->NegativeColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf); - ImGui::ColorEdit4("Neutral Color", (float*)&AlignmentConfig->NeutralColor, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_AlphaPreviewHalf); - - ImGui::Separator(); - if (ImGui::MenuItem("Reset")) - { - ResetConfig(); - } - - ImGui::EndMenu(); - } - - ImGui::EndMenuBar(); - } - - APawn* ControlledActor = GetLocalPlayerPawn(); - - if (ImGui::BeginTable("Cheats", 2, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_NoBordersInBodyUntilResize)) - { - ImGui::TableSetupColumn("Toggle", ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("Instant", ImGuiTableColumnFlags_WidthStretch); - - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - - int Index = 0; - for (const FCogAbilityCheat& CheatEffect : Asset->PersistentEffects) - { - ImGui::PushID(Index); - AddCheat(ControlledActor, SelectedActor, CheatEffect, true); - ImGui::PopID(); - Index++; - } - - //---------------------------------------------------------------------------- - // Update the config of applied cheat to reapply them on the next launch. - // We do not updated them only when the the user input is pressed because - // the state of the cheat is lagging when connected to a server. - // So we check if the array should be updated all the time. - //---------------------------------------------------------------------------- - if (SelectedActor == ControlledActor) - { - for (const FCogAbilityCheat& CheatEffect : Asset->PersistentEffects) - { - if (ACogAbilityReplicator::IsCheatActive(SelectedActor, CheatEffect)) - { - Config->AppliedCheats.AddUnique(CheatEffect.Name); - } - else - { - Config->AppliedCheats.Remove(CheatEffect.Name); - } - } - } - - ImGui::TableNextColumn(); - - for (const FCogAbilityCheat& CheatEffect : Asset->InstantEffects) - { - ImGui::PushID(Index); - AddCheat(ControlledActor, SelectedActor, CheatEffect, false); - ImGui::PopID(); - Index++; - } - - ImGui::EndTable(); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -bool FCogAbilityWindow_Cheats::AddCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogAbilityCheat& Cheat, bool IsPersistent) -{ - if (Cheat.Effect == nullptr) - { - return false; - } - - const UGameplayEffect* EffectCDO = Cheat.Effect->GetDefaultObject(); - - if (EffectCDO != nullptr) - { - FCogWindowWidgets::PushBackColor(FCogImguiHelper::ToImVec4(AlignmentConfig->GetEffectColor(Asset, *EffectCDO))); - } - - const bool IsShiftDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Shift) != 0; - const bool IsAltDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Alt) != 0; - const bool IsControlDown = (ImGui::GetCurrentContext()->IO.KeyMods & ImGuiMod_Ctrl) != 0; - - bool bIsPressed = false; - if (IsPersistent) - { - bool isEnabled = ACogAbilityReplicator::IsCheatActive(SelectedActor, Cheat); - if (ImGui::Checkbox(TCHAR_TO_ANSI(*Cheat.Name), &isEnabled)) - { - RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); - bIsPressed = true; - } - } - else - { - if (ImGui::Button(TCHAR_TO_ANSI(*Cheat.Name), ImVec2(-1, 0))) - { - RequestCheat(ControlledActor, SelectedActor, Cheat, IsShiftDown, IsAltDown, IsControlDown); - bIsPressed = true; - } - } - - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown || IsAltDown || IsControlDown ? 0.5f : 1.0f), "On Selection"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsShiftDown ? 1.0f : 0.5f), "On Enemies [SHIFT]"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsAltDown ? 1.0f : 0.5f), "On Allies [ALT]"); - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, IsControlDown ? 1.0f : 0.5f), "On Controlled [CTRL]"); - ImGui::EndTooltip(); - } - - if (EffectCDO != nullptr) - { - FCogWindowWidgets::PopBackColor(); - } - - return bIsPressed; -} - -//-------------------------------------------------------------------------------------------------------------------------- -void FCogAbilityWindow_Cheats::RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogAbilityCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled) -{ - TArray Actors; - - if (ApplyToControlled) - { - Actors.Add(ControlledActor); - } - - if (ApplyToEnemies || ApplyToAllies) - { - for (TActorIterator It(GetWorld(), ACharacter::StaticClass()); It; ++It) - { - if (AActor* OtherActor = *It) - { - ECogCommonAllegiance Allegiance = ECogCommonAllegiance::Enemy; - - if (ICogCommonAllegianceActorInterface* AllegianceInterface = Cast(OtherActor)) - { - Allegiance = AllegianceInterface->GetAllegianceWithOtherActor(ControlledActor); - } - - if ((ApplyToEnemies && (Allegiance == ECogCommonAllegiance::Enemy)) - || (ApplyToAllies && (Allegiance == ECogCommonAllegiance::Friendly))) - { - Actors.Add(OtherActor); - } - } - } - } - - if ((ApplyToControlled || ApplyToEnemies || ApplyToAllies) == false) - { - Actors.Add(SelectedActor); - } - - if (ACogAbilityReplicator* Replicator = ACogAbilityReplicator::GetFirstReplicator(*GetWorld())) - { - Replicator->Server_ApplyCheat(ControlledActor, Actors, Cheat); - } - else - { - UE_LOG(LogCogImGui, Warning, TEXT("FCogAbilityWindow_Cheats::RequestCheat | Replicator not found")); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -const FCogAbilityCheat* FCogAbilityWindow_Cheats::FindCheatByName(const FString& CheatName) -{ - for (const FCogAbilityCheat& cheat : Asset->PersistentEffects) - { - if (cheat.Name == CheatName) - { - return &cheat; - } - } - - for (const FCogAbilityCheat& cheat : Asset->InstantEffects) - { - if (cheat.Name == CheatName) - { - return &cheat; - } - } - - return nullptr; -} + RenderHelp(); +} \ No newline at end of file diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ActivateAbility.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ActivateAbility.h new file mode 100644 index 0000000..e454e73 --- /dev/null +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ActivateAbility.h @@ -0,0 +1,27 @@ +#pragma once + +#include "CoreMinimal.h" +#include "CogEngineDataAsset.h" +#include "GameplayEffect.h" +#include "CogAbilityCheat_Execution_ActivateAbility.generated.h" + +//-------------------------------------------------------------------------------------------------------------------------- +UCLASS(DisplayName = "Activate Ability") +class COGABILITY_API UCogAbilityCheat_Execution_ActivateAbility + : public UCogEngineCheat_Execution +{ + GENERATED_BODY() + +public: + virtual void Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const override; + + virtual ECogEngineCheat_ActiveState IsActiveOnTargets_Implementation(const UObject* WorldContextObject, const TArray& Targets) const override; + + virtual bool GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const override; + + UPROPERTY(EditAnywhere) + TSubclassOf Ability; + + UPROPERTY(EditAnywhere) + bool RemoveAbilityOnEnd = true; +}; diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h index fd388e9..44eb3d9 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityCheat_Execution_ApplyEffect.h @@ -13,9 +13,9 @@ class COGABILITY_API UCogAbilityCheat_Execution_ApplyEffect GENERATED_BODY() public: - void Execute_Implementation(const AActor* Instigator, const TArray& Targets) const override; + virtual void Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray& Targets) const override; - ECogEngineCheat_ActiveState IsActiveOnTargets_Implementation(const TArray& Targets) const override; + virtual ECogEngineCheat_ActiveState IsActiveOnTargets_Implementation(const UObject* WorldContextObject, const TArray& Targets) const override; virtual bool GetColor(const FCogWindow& InCallingWindow, FLinearColor& OutColor) const override; diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityConfig_Alignment.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityConfig_Alignment.h index 9b055da..8b9f573 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityConfig_Alignment.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityConfig_Alignment.h @@ -2,6 +2,7 @@ #include "CoreMinimal.h" #include "CogCommonConfig.h" +#include "Abilities/GameplayAbility.h" #include "CogAbilityConfig_Alignment.generated.h" class UAbilitySystemComponent; @@ -22,13 +23,14 @@ public: FVector4f GetAttributeColor(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) const; + FVector4f GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability) const; + FVector4f GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const; FVector4f GetEffectModifierColor(float ModifierValue, EGameplayModOp::Type ModifierOp, float BaseValue) const; FVector4f GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect) const; - UPROPERTY(Config) FVector4f PositiveColor = FVector4f(0.0f, 1.0f, 0.5f, 1.0f); diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityDataAsset.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityDataAsset.h index 56a96dc..525b08c 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityDataAsset.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityDataAsset.h @@ -151,6 +151,12 @@ public: UPROPERTY(Category = "Cheats", EditAnywhere) FGameplayTag PositiveEffectTag; + UPROPERTY(Category="Cheats", EditAnywhere) + FGameplayTag NegativeAbilityTag; + + UPROPERTY(Category = "Cheats", EditAnywhere) + FGameplayTag PositiveAbilityTag; + UPROPERTY(Category = "Cheats", EditAnywhere, meta = (TitleProperty = "Name")) TArray PersistentEffects; diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Cheats.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Cheats.h index 4404b7f..f204fc2 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Cheats.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Cheats.h @@ -16,35 +16,11 @@ class COGABILITY_API FCogAbilityWindow_Cheats : public FCogWindow { typedef FCogWindow Super; -public: - - virtual void Initialize() override; - protected: - virtual void GameTick(float DeltaTime) override; - virtual void RenderHelp() override; virtual void RenderContent() override; - - virtual void TryReapplyCheats(); - - APawn* GetCheatInstigator(); - - virtual bool AddCheat(AActor* ControlledActor, AActor* TargetActor, const FCogAbilityCheat& CheatEffect, bool IsPersistent); - - virtual void RequestCheat(AActor* ControlledActor, AActor* SelectedActor, const FCogAbilityCheat& Cheat, bool ApplyToEnemies, bool ApplyToAllies, bool ApplyToControlled); - - virtual const FCogAbilityCheat* FindCheatByName(const FString& CheatName); - - TObjectPtr Asset = nullptr; - - TObjectPtr Config = nullptr; - - TObjectPtr AlignmentConfig = nullptr; - - bool bHasReappliedCheats = false; }; //--------------------------------------------------------------------------------------------------------------------------