CogEngine: Fix crash when the CogEngine data asset is not present

Fix cheat colors always overriding the user color
This commit is contained in:
Arnaud Jamin
2025-02-06 10:21:31 -05:00
parent e56966482e
commit 27ad15488d
6 changed files with 51 additions and 24 deletions
@@ -16,13 +16,20 @@ void FCogEngineWindow_Cheats::RenderHelp()
{ {
ImGui::Text( ImGui::Text(
"This window can be used to apply cheats to the selected actor (by default). " "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" "When clicking a cheat button, press:\n"
" [CTRL] to apply the cheat to controlled actor\n" " [CTRL] to apply the cheat to controlled actor\n"
" [ALT] to apply the cheat to the allies of the selected 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" " [SHIFT] to apply the cheat to the enemies of the selected actor\n"
, TCHAR_TO_ANSI(*GetNameSafe(Asset.Get()))
); );
if (Asset == nullptr)
{
ImGui::Text("Create a DataAsset child of 'CogEngineDataAsset' to configure the cheats. ");
}
else
{
ImGui::Text("The cheats can be configured in the '%s' data asset. ", StringCast<ANSICHAR>(*GetNameSafe(Asset.Get())).Get());
}
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -436,6 +443,9 @@ void FCogEngineWindow_Cheats::RequestCheat(ACogEngineReplicator& Replicator, AAc
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& CheatName, const bool OnlyPersistentCheats) const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& CheatName, const bool OnlyPersistentCheats)
{ {
if (Asset == nullptr)
{ return nullptr; }
for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories) for (const FCogEngineCheatCategory& CheatCategory : Asset->CheatCategories)
{ {
for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats) for (const FCogEngineCheat& Cheat : CheatCategory.PersistentCheats)
@@ -447,9 +457,7 @@ const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& C
} }
if (OnlyPersistentCheats) if (OnlyPersistentCheats)
{ { continue; }
continue;
}
for (const FCogEngineCheat& Cheat : CheatCategory.InstantCheats) for (const FCogEngineCheat& Cheat : CheatCategory.InstantCheats)
{ {
@@ -458,8 +466,6 @@ const FCogEngineCheat* FCogEngineWindow_Cheats::FindCheatByName(const FString& C
return &Cheat; return &Cheat;
} }
} }
} }
return nullptr; return nullptr;
@@ -110,6 +110,5 @@ bool UCogAbilityCheat_Execution_ActivateAbility::GetColor(const FCogWindow& InCa
const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig<UCogAbilityConfig_Alignment>(); const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig<UCogAbilityConfig_Alignment>();
const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset<UCogAbilityDataAsset>(); const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset<UCogAbilityDataAsset>();
OutColor = Config->GetAbilityColor(Asset, *GameplayAbility); return Config->GetAbilityColor(Asset, *GameplayAbility, OutColor);
return true;
} }
@@ -7,6 +7,7 @@
#include "CogAbilityConfig_Alignment.h" #include "CogAbilityConfig_Alignment.h"
#include "CogImguiHelper.h" #include "CogImguiHelper.h"
#include "CogWindow.h" #include "CogWindow.h"
#include "MeshPaintVisualize.h"
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray<AActor*>& Targets) const void UCogAbilityCheat_Execution_ApplyEffect::Execute_Implementation(const UObject* WorldContextObject, const AActor* Instigator, const TArray<AActor*>& Targets) const
@@ -106,6 +107,5 @@ bool UCogAbilityCheat_Execution_ApplyEffect::GetColor(const FCogWindow& InCallin
const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig<UCogAbilityConfig_Alignment>(); const UCogAbilityConfig_Alignment* Config = InCallingWindow.GetConfig<UCogAbilityConfig_Alignment>();
const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset<UCogAbilityDataAsset>(); const UCogAbilityDataAsset* Asset = InCallingWindow.GetAsset<UCogAbilityDataAsset>();
OutColor = Config->GetEffectColor(Asset, *GameplayEffect); return Config->GetEffectColor(Asset, *GameplayEffect, OutColor);
return true;
} }
@@ -24,35 +24,55 @@ FVector4f UCogAbilityConfig_Alignment::GetAttributeColor(const UAbilitySystemCom
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
FVector4f UCogAbilityConfig_Alignment::GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability) const bool UCogAbilityConfig_Alignment::GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability, FLinearColor& OutColor) const
{ {
if (Asset == nullptr) if (Asset == nullptr)
{ return NeutralColor; } {
OutColor = NeutralColor;
return false;
}
const FGameplayTagContainer& Tags = Ability.GetAssetTags(); const FGameplayTagContainer& Tags = Ability.GetAssetTags();
if (Tags.HasTag(Asset->NegativeAbilityTag)) if (Tags.HasTag(Asset->NegativeAbilityTag))
{ return NegativeColor; } {
OutColor = NegativeColor;
return true;
}
if (Tags.HasTag(Asset->PositiveAbilityTag)) if (Tags.HasTag(Asset->PositiveAbilityTag))
{ return PositiveColor; } {
OutColor = PositiveColor;
return true;
}
return NeutralColor; OutColor = NeutralColor;
return true;
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
FVector4f UCogAbilityConfig_Alignment::GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect) const bool UCogAbilityConfig_Alignment::GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect, FLinearColor& OutColor) const
{ {
if (Asset == nullptr) if (Asset == nullptr)
{ return NeutralColor; } {
OutColor = NeutralColor;
return false;
}
const FGameplayTagContainer& Tags = Effect.GetAssetTags(); const FGameplayTagContainer& Tags = Effect.GetAssetTags();
if (Tags.HasTag(Asset->NegativeEffectTag)) if (Tags.HasTag(Asset->NegativeEffectTag))
{ return NegativeColor; } {
OutColor = NegativeColor;
return true;
}
if (Tags.HasTag(Asset->PositiveEffectTag)) if (Tags.HasTag(Asset->PositiveEffectTag))
{ return PositiveColor; } {
OutColor = PositiveColor;
return true;
}
return NeutralColor; OutColor = NeutralColor;
return true;
} }
//-------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------
@@ -192,7 +192,9 @@ void FCogAbilityWindow_Effects::RenderEffectRow(UAbilitySystemComponent& Ability
//------------------------ //------------------------
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::PushStyleColor(ImGuiCol_Text, FCogImguiHelper::ToImVec4(AlignmentConfig->GetEffectColor(Asset, Effect))); FLinearColor Color;
AlignmentConfig->GetEffectColor(Asset, Effect, Color);
ImGui::PushStyleColor(ImGuiCol_Text, FCogImguiHelper::ToImVec4(Color));
if (ImGui::Selectable(EffectName.Get(), Selected == Index, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap | ImGuiSelectableFlags_AllowDoubleClick)) if (ImGui::Selectable(EffectName.Get(), Selected == Index, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap | ImGuiSelectableFlags_AllowDoubleClick))
{ {
@@ -23,13 +23,13 @@ public:
FVector4f GetAttributeColor(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) const; FVector4f GetAttributeColor(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayAttribute& Attribute) const;
FVector4f GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability) const; bool GetAbilityColor(const UCogAbilityDataAsset* Asset, const UGameplayAbility& Ability, FLinearColor& OutColor) const;
FVector4f GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const; FVector4f GetEffectModifierColor(const FModifierSpec& ModSpec, const FGameplayModifierInfo& ModInfo, float BaseValue) const;
FVector4f GetEffectModifierColor(float ModifierValue, EGameplayModOp::Type ModifierOp, float BaseValue) const; FVector4f GetEffectModifierColor(float ModifierValue, EGameplayModOp::Type ModifierOp, float BaseValue) const;
FVector4f GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect) const; bool GetEffectColor(const UCogAbilityDataAsset* Asset, const UGameplayEffect& Effect, FLinearColor& OutColor) const;
UPROPERTY(Config) UPROPERTY(Config)
FVector4f PositiveColor = FVector4f(0.0f, 1.0f, 0.5f, 1.0f); FVector4f PositiveColor = FVector4f(0.0f, 1.0f, 0.5f, 1.0f);