diff --git a/Content/Core/Debug/Cheats/AM_Cheat.uasset b/Content/Core/Debug/Cheats/AM_Cheat.uasset new file mode 100644 index 0000000..fa13ce3 Binary files /dev/null and b/Content/Core/Debug/Cheats/AM_Cheat.uasset differ diff --git a/Content/Core/Debug/Cheats/GA_Cheat_Debug.uasset b/Content/Core/Debug/Cheats/GA_Cheat_Debug.uasset index 31552a4..1c99645 100644 Binary files a/Content/Core/Debug/Cheats/GA_Cheat_Debug.uasset and b/Content/Core/Debug/Cheats/GA_Cheat_Debug.uasset differ diff --git a/Content/Core/Debug/Cheats/GE_Cheat.uasset b/Content/Core/Debug/Cheats/GE_Cheat.uasset index b604b1e..fbb9e30 100644 Binary files a/Content/Core/Debug/Cheats/GE_Cheat.uasset and b/Content/Core/Debug/Cheats/GE_Cheat.uasset differ diff --git a/Content/Core/Debug/DA_Debug_Abilities.uasset b/Content/Core/Debug/DA_Debug_Abilities.uasset index b43d455..e21228f 100644 Binary files a/Content/Core/Debug/DA_Debug_Abilities.uasset and b/Content/Core/Debug/DA_Debug_Abilities.uasset differ diff --git a/Content/Core/Debug/Cheats/T_Effect_Cheat.uasset b/Content/Core/Textures/T_Cheat.uasset similarity index 53% rename from Content/Core/Debug/Cheats/T_Effect_Cheat.uasset rename to Content/Core/Textures/T_Cheat.uasset index 199608a..48ccb03 100644 Binary files a/Content/Core/Debug/Cheats/T_Effect_Cheat.uasset and b/Content/Core/Textures/T_Cheat.uasset differ diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityReplicator.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityReplicator.cpp index 85a83df..d2b2eef 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityReplicator.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityReplicator.cpp @@ -133,7 +133,7 @@ bool ACogAbilityReplicator::IsCheatActive(const AActor* EffectTarget, const FCog } //-------------------------------------------------------------------------------------------------------------------------- -void ACogAbilityReplicator::GiveAbility(AActor* Target, TSubclassOf AbilityClass) +void ACogAbilityReplicator::GiveAbility(AActor* Target, TSubclassOf AbilityClass) const { Server_GiveAbility(Target, AbilityClass); } @@ -148,12 +148,12 @@ void ACogAbilityReplicator::Server_GiveAbility_Implementation(AActor* TargetActo return; } - if (IsValid(AbilityClass) == false) + if (AbilitySystem->IsOwnerActorAuthoritative() == false) { return; } - if (AbilitySystem->IsOwnerActorAuthoritative() == false) + if (IsValid(AbilityClass) == false) { return; } @@ -162,6 +162,35 @@ void ACogAbilityReplicator::Server_GiveAbility_Implementation(AActor* TargetActo AbilitySystem->GiveAbility(Spec); } +//-------------------------------------------------------------------------------------------------------------------------- +void ACogAbilityReplicator::RemoveAbility(AActor* TargetActor, const FGameplayAbilitySpecHandle& Handle) const +{ + Server_RemoveAbility(TargetActor, Handle); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void ACogAbilityReplicator::Server_RemoveAbility_Implementation(AActor* TargetActor, const FGameplayAbilitySpecHandle& Handle) const +{ + UAbilitySystemComponent* AbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(TargetActor, true); + + if (AbilitySystem == nullptr) + { + return; + } + + if (AbilitySystem->IsOwnerActorAuthoritative() == false) + { + return; + } + + if (Handle.IsValid() == false) + { + return; + } + + AbilitySystem->SetRemoveAbilityOnEnd(Handle); +} + //-------------------------------------------------------------------------------------------------------------------------- void ACogAbilityReplicator::ResetAllTweaks() { diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Abilities.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Abilities.cpp index 3c9792b..f200bad 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Abilities.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Abilities.cpp @@ -68,7 +68,7 @@ void UCogAbilityWindow_Abilities::RenderOpenAbilities() bool Open = true; if (ImGui::Begin(TCHAR_TO_ANSI(*GetAbilityName(Ability)), &Open)) { - RenderAbilityInfo(*Spec); + RenderAbilityInfo(*AbilitySystemComponent, *Spec); ImGui::End(); } @@ -98,18 +98,6 @@ void UCogAbilityWindow_Abilities::RenderContent() RenderAbiltiesMenu(Selection); - //TArray& Abilities = AbilitySystemComponent->GetActivatableAbilities(); - //static int FocusedAbilityIndex = INDEX_NONE; - //if (FocusedAbilityIndex != INDEX_NONE && FocusedAbilityIndex < Abilities.Num()) - //{ - // RenderAbilityInfo(Abilities[FocusedAbilityIndex]); - // if (ImGui::Button("Close", ImVec2(-1, 0))) - // { - // FocusedAbilityIndex = INDEX_NONE; - // } - // ImGui::Spacing(); - //} - RenderAbilitiesTable(*AbilitySystemComponent); } @@ -215,7 +203,7 @@ void UCogAbilityWindow_Abilities::RenderAbilitiesTable(UAbilitySystemComponent& if (ImGui::IsItemHovered()) { FCogWindowWidgets::BeginTableTooltip(); - RenderAbilityInfo(Spec); + RenderAbilityInfo(AbilitySystemComponent, Spec); FCogWindowWidgets::EndTableTooltip(); } @@ -291,11 +279,10 @@ void UCogAbilityWindow_Abilities::RenderAbilityContextMenu(UAbilitySystemCompone ImGui::CloseCurrentPopup(); } - //if (ImGui::Button("Open Properties")) - //{ - // GetOwner()->GetPropertyGrid()->Open(BaseAbility); - // ImGui::CloseCurrentPopup(); - //} + if (ImGui::Button("Remove")) + { + AbilityHandleToRemove = Spec.Handle; + } ImGui::EndPopup(); } @@ -326,7 +313,7 @@ FString UCogAbilityWindow_Abilities::GetAbilityName(const UGameplayAbility* Abil } //-------------------------------------------------------------------------------------------------------------------------- -void UCogAbilityWindow_Abilities::RenderAbilityInfo(FGameplayAbilitySpec& Spec) +void UCogAbilityWindow_Abilities::RenderAbilityInfo(const UAbilitySystemComponent& AbilitySystemComponent, FGameplayAbilitySpec& Spec) { UGameplayAbility* Ability = Spec.GetPrimaryInstance(); if (Ability == nullptr) @@ -334,6 +321,11 @@ void UCogAbilityWindow_Abilities::RenderAbilityInfo(FGameplayAbilitySpec& Spec) Ability = Spec.Ability; } + if (Ability == nullptr) + { + return; + } + if (ImGui::BeginTable("Ability", 2, ImGuiTableFlags_Borders)) { const ImVec4 TextColor(1.0f, 1.0f, 1.0f, 0.5f); @@ -377,6 +369,15 @@ void UCogAbilityWindow_Abilities::RenderAbilityInfo(FGameplayAbilitySpec& Spec) ImGui::TableNextColumn(); ImGui::Text("%u", Spec.ActiveCount); + //------------------------ + // Cooldown + //------------------------ + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::TextColored(TextColor, "Cooldown"); + ImGui::TableNextColumn(); + RenderAbilityCooldown(AbilitySystemComponent, *Ability); + //------------------------ // Handle //------------------------ @@ -425,6 +426,20 @@ void UCogAbilityWindow_Abilities::GameTick(float DeltaTime) ProcessAbilityActivation(AbilityHandleToActivate); AbilityHandleToActivate = FGameplayAbilitySpecHandle(); } + + if (AbilityHandleToRemove.IsValid()) + { + if (AActor* Selection = GetSelection()) + { + FCogAbilityModule& Module = FCogAbilityModule::Get(); + if (ACogAbilityReplicator* Replicator = Module.GetLocalReplicator()) + { + Replicator->RemoveAbility(Selection, AbilityHandleToRemove); + } + } + + AbilityHandleToRemove = FGameplayAbilitySpecHandle(); + } } //-------------------------------------------------------------------------------------------------------------------------- diff --git a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp index 95c0921..9305d37 100644 --- a/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp +++ b/Plugins/CogAbility/Source/CogAbility/Private/CogAbilityWindow_Effects.cpp @@ -295,14 +295,10 @@ FString UCogAbilityWindow_Effects::GetEffectName(const UGameplayEffect& Effect) //-------------------------------------------------------------------------------------------------------------------------- void UCogAbilityWindow_Effects::RenderRemainingTime(const UAbilitySystemComponent& AbilitySystemComponent, const FActiveGameplayEffect& ActiveEffect) { - float StartTime = ActiveEffect.StartWorldTime; - float Duration = ActiveEffect.GetDuration(); + const float StartTime = ActiveEffect.StartWorldTime; + const float Duration = ActiveEffect.GetDuration(); - if (Duration <= 0) - { - ImGui::Text("NA"); - } - else + if (Duration >= 0) { UWorld* World = AbilitySystemComponent.GetWorld(); const float RemainingTime = StartTime + Duration - World->GetTimeSeconds(); diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityReplicator.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityReplicator.h index 3e44b5e..168b844 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityReplicator.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityReplicator.h @@ -28,7 +28,9 @@ public: static bool IsCheatActive(const AActor* EffectTarget, const FCogAbilityCheat& Cheat); - void GiveAbility(AActor* TargetActor, TSubclassOf AbilityClass); + void GiveAbility(AActor* TargetActor, TSubclassOf AbilityClass) const; + + void RemoveAbility(AActor* TargetActor, const FGameplayAbilitySpecHandle& Handle) const; void ResetAllTweaks(); @@ -50,6 +52,9 @@ private: UFUNCTION(Reliable, Server) void Server_GiveAbility(AActor* TargetActor, TSubclassOf AbilityClass) const; + UFUNCTION(Reliable, Server) + void Server_RemoveAbility(AActor* TargetActor, const FGameplayAbilitySpecHandle& Handle) const; + UFUNCTION(Reliable, Server) void Server_ResetAllTweaks(); diff --git a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Abilities.h b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Abilities.h index a1b3ce9..85984ba 100644 --- a/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Abilities.h +++ b/Plugins/CogAbility/Source/CogAbility/Public/CogAbilityWindow_Abilities.h @@ -41,7 +41,7 @@ protected: virtual void RenderOpenAbilities(); - virtual void RenderAbilityInfo(FGameplayAbilitySpec& Spec); + virtual void RenderAbilityInfo(const UAbilitySystemComponent& AbilitySystemComponent, FGameplayAbilitySpec& Spec); virtual void ProcessAbilityActivation(FGameplayAbilitySpecHandle Handle); @@ -57,5 +57,7 @@ private: FGameplayAbilitySpecHandle AbilityHandleToActivate; + FGameplayAbilitySpecHandle AbilityHandleToRemove; + TArray OpenedAbilities; }; diff --git a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_DebugSettings.cpp b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_DebugSettings.cpp index 7ff0386..3fea784 100644 --- a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_DebugSettings.cpp +++ b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_DebugSettings.cpp @@ -7,7 +7,7 @@ void UCogEngineWindow_DebugSettings::RenderHelp() { ImGui::Text( - "This window can be used to setup how the debug display is drawn. " + "This window can be used to tweak how the debug display is drawn. " "Check each item for more info. " ); } diff --git a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp index cd40262..f7b6506 100644 --- a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp +++ b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_OutputLog.cpp @@ -6,32 +6,6 @@ char ImGuiTextBuffer::EmptyString[1] = { 0 }; -//-------------------------------------------------------------------------------------------------------------------------- -// FCogLogOutputDevice -//-------------------------------------------------------------------------------------------------------------------------- -UCogLogOutputDevice::UCogLogOutputDevice() -{ - GLog->AddOutputDevice(this); -} - -//-------------------------------------------------------------------------------------------------------------------------- -UCogLogOutputDevice::~UCogLogOutputDevice() -{ - if (GLog != nullptr) - { - GLog->RemoveOutputDevice(this); - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -void UCogLogOutputDevice::Serialize(const TCHAR* Message, ELogVerbosity::Type Verbosity, const class FName& Category) -{ - if (OutputLog != nullptr) - { - OutputLog->AddLog(Message, Verbosity, Category); - } -} - //-------------------------------------------------------------------------------------------------------------------------- // FCogWindow_Log //-------------------------------------------------------------------------------------------------------------------------- @@ -302,3 +276,29 @@ void UCogEngineWindow_OutputLog::RenderContent() ImGui::EndChild(); } } + +//-------------------------------------------------------------------------------------------------------------------------- +// FCogLogOutputDevice +//-------------------------------------------------------------------------------------------------------------------------- +UCogLogOutputDevice::UCogLogOutputDevice() +{ + GLog->AddOutputDevice(this); +} + +//-------------------------------------------------------------------------------------------------------------------------- +UCogLogOutputDevice::~UCogLogOutputDevice() +{ + if (GLog != nullptr) + { + GLog->RemoveOutputDevice(this); + } +} + +//-------------------------------------------------------------------------------------------------------------------------- +void UCogLogOutputDevice::Serialize(const TCHAR* Message, ELogVerbosity::Type Verbosity, const class FName& Category) +{ + if (OutputLog != nullptr) + { + OutputLog->AddLog(Message, Verbosity, Category); + } +} \ No newline at end of file diff --git a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_Skeleton.cpp b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_Skeleton.cpp index 4962a7d..a956dd7 100644 --- a/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_Skeleton.cpp +++ b/Plugins/CogEngine/Source/CogEngine/Private/CogEngineWindow_Skeleton.cpp @@ -11,6 +11,17 @@ UCogEngineWindow_Skeleton::UCogEngineWindow_Skeleton() bHasMenu = true; } +//-------------------------------------------------------------------------------------------------------------------------- +void UCogEngineWindow_Skeleton::RenderHelp() +{ + ImGui::Text( + "This window display the bone hierarchy and the skeleton debug draw of the selected actor if it has a Skeletal Mesh. " + "Mouse over a bone to highlight it. " + "Right click a bone to access more debug display. " + "Use the [Ctrl] key to toggle the bone debug draw recursively. " + ); +} + //-------------------------------------------------------------------------------------------------------------------------- void UCogEngineWindow_Skeleton::OnSelectionChanged(AActor* OldSelection, AActor* NewSelection) { diff --git a/Plugins/CogEngine/Source/CogEngine/Public/CogEngineWindow_Skeleton.h b/Plugins/CogEngine/Source/CogEngine/Public/CogEngineWindow_Skeleton.h index a43d8f8..6f68065 100644 --- a/Plugins/CogEngine/Source/CogEngine/Public/CogEngineWindow_Skeleton.h +++ b/Plugins/CogEngine/Source/CogEngine/Public/CogEngineWindow_Skeleton.h @@ -31,11 +31,14 @@ class COGENGINE_API UCogEngineWindow_Skeleton : public UCogWindow public: UCogEngineWindow_Skeleton(); - virtual void RenderContent() override; - virtual void RenderTick(float DeltaTime) override; + virtual void RenderHelp() override; protected: + virtual void RenderContent() override; + + virtual void RenderTick(float DeltaTime) override; + virtual void OnSelectionChanged(AActor* OldSelection, AActor* NewSelection) override; private: