Very strange error C2678 caused by trying to remove an attribute from my system

Log File:

Build started 12/29/2022 8:30:44 PM.
Logging verbosity is set to: Normal.Project "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.sln" on node 1 (Build target(s)).
ValidateSolutionConfiguration:
  Building solution configuration "Development Editor|Win64".
ValidateProjects:
  The project "UE5" is not selected for building in solution configuration "Development Editor|Win64".
Project "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.sln" (1) is building "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj" (2) on node 1 (default targets).
Build:
  C:\UE_5.1\Engine\Build\BatchFiles\Build.bat CONN_MN_SoREditor Win64 Development -Project="C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.uproject" -WaitMutex -FromMsBuild
  Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" CONN_MN_SoREditor Win64 Development -Project="C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.uproject" -WaitMutex -FromMsBuild
  Log file: C:\Users\impho\AppData\Local\UnrealBuildTool\Log.txt
  Invalidating makefile for CONN_MN_SoREditor (ConnAttributeFramework.Build.cs modified)
  Parsing headers for CONN_MN_SoREditor
    Running Internal UnrealHeaderTool "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.uproject" "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\Build\Win64\CONN_MN_SoREditor\Development\CONN_MN_SoREditor.uhtmanifest" -WarningsAsErrors -installed
  Total of 0 written
  Reflection code generated for CONN_MN_SoREditor in 1.8358687 seconds
  Building CONN_MN_SoREditor...
  Using Visual Studio 2022 14.34.31935 toolchain (C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933) and Windows 10.0.20348.0 SDK (C:\Program Files (x86)\Windows Kits\10).
  Determining max actions to execute in parallel (8 physical cores, 8 logical cores)
    Executing up to 8 processes, one per physical core
    Requested 1.5 GB free memory per action, 2.3 GB available: limiting max parallel actions to 1
  Building 4 actions with 1 process...
  [1/4] Link UnrealEditor-ConnAttributeFramework.lib cancelled
  [2/4] WriteMetadata CONN_MN_SoREditor.target cancelled
  [3/4] Link UnrealEditor-ConnAttributeFramework.dll cancelled
  [4/4] Compile Module.ConnAttributeFramework.cpp
C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): error C2678: binary '==': no operator found which takes a left-hand operand of type 'FConnAttributeFloat' (or there is no acceptable conversion) [C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj]
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\Animation\AnimNotifyQueue.h(77): note: could be 'bool operator ==(const FAnimNotifyEventReference &,const FAnimNotifyEvent &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\SkinnedAssetCommon.h(267): note: or       'bool operator ==(const UMaterialInterface &,const FSkeletalMaterial &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\SkinnedAssetCommon.h(266): note: or       'bool operator ==(const FSkeletalMaterial &,const UMaterialInterface &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\SkinnedAssetCommon.h(265): note: or       'bool operator ==(const FSkeletalMaterial &,const FSkeletalMaterial &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\StaticMesh.h(520): note: or       'bool operator ==(const UMaterialInterface &,const FStaticMaterial &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\StaticMesh.h(519): note: or       'bool operator ==(const FStaticMaterial &,const UMaterialInterface &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\StaticMesh.h(518): note: or       'bool operator ==(const FStaticMaterial &,const FStaticMaterial &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Engine\StaticMesh.h(386): note: or       'bool operator ==(const FMeshSectionInfo &,const FMeshSectionInfo &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\StaticParameterSet.h(551): note: or       'bool operator ==(const FStaticParameterSetRuntimeData &,const FStaticParameterSet &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\StaticParameterSet.h(550): note: or       'bool operator ==(const FStaticParameterSet &,const FStaticParameterSetRuntimeData &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Materials\MaterialLayersFunctions.h(387): note: or       'bool operator ==(const FMaterialLayersFunctionsRuntimeData &,const FMaterialLayersFunctions &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\Materials\MaterialLayersFunctions.h(386): note: or       'bool operator ==(const FMaterialLayersFunctions &,const FMaterialLayersFunctionsRuntimeData &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\MaterialTypes.h(353): note: or       'bool operator ==(const FMaterialParameterValue &,const FMaterialParameterValue &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\MaterialTypes.h(164): note: or       'bool operator ==(const FMemoryImageMaterialParameterInfo &,const FMaterialParameterInfo &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\MaterialTypes.h(154): note: or       'bool operator ==(const FMaterialParameterInfo &,const FMemoryImageMaterialParameterInfo &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\MaterialTypes.h(144): note: or       'bool operator ==(const FMemoryImageMaterialParameterInfo &,const FMemoryImageMaterialParameterInfo &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\MaterialTypes.h(134): note: or       'bool operator ==(const FMaterialParameterInfo &,const FMaterialParameterInfo &)'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\VirtualTexturing.h(488): note: or       'bool operator ==(const FVirtualTextureLocalTile &,const FVirtualTextureLocalTile &)'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\VirtualTexturing.h(100): note: or       'bool operator ==(const FAllocatedVTDescription &,const FAllocatedVTDescription &)'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\VirtualTexturing.h(46): note: or       'bool operator ==(const FVirtualTextureProducerHandle &,const FVirtualTextureProducerHandle &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Classes\EdGraph\EdGraphPin.h(83): note: or       'bool operator ==(const FEdGraphTerminalType &,const FEdGraphTerminalType &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(504): note: or       'bool operator ==(const FAssetDataTagMap &,const FAssetDataTagMapSharedView &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(423): note: or       'bool operator ==(const FAssetDataTagMapSharedView &,const FAssetDataTagMapSharedView &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(422): note: or       'bool operator ==(const FAssetDataTagMapSharedView &,const FAssetDataTagMap &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(279): note: or       'bool operator ==(const FString &,FAssetTagValueRef)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(277): note: or       'bool operator ==(FAssetTagValueRef,const FString &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(273): note: or       'bool operator ==(FStringView,FAssetTagValueRef)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(271): note: or       'bool operator ==(FAssetTagValueRef,FStringView)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\AssetRegistry\AssetDataTagMap.h(59): note: or       'bool operator ==(const FAssetRegistryExportPath &,const FAssetRegistryExportPath &)'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\ShaderCore.h(721): note: or       'bool operator ==(const FShaderCodeVendorExtension &,const FShaderCodeVendorExtension &)'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\ShaderCore.h(247): note: or       'bool operator ==(const FParameterAllocation &,const FParameterAllocation &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHIResources.h(1033): note: or       'bool operator ==(const FRHIUniformBufferLayout &,const FRHIUniformBufferLayout &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHIResources.h(934): note: or       'bool operator ==(const FRHIUniformBufferLayoutInitializer &,const FRHIUniformBufferLayoutInitializer &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHIResources.h(775): note: or       'bool operator ==(const FRHIUniformBufferResource &,const FRHIUniformBufferResource &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHI.h(1596): note: or       'bool operator ==(const FBlendStateInitializerRHI &,const FBlendStateInitializerRHI &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHI.h(1593): note: or       'bool operator ==(const FBlendStateInitializerRHI::FRenderTarget &,const FBlendStateInitializerRHI::FRenderTarget &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHI.h(1498): note: or       'bool operator ==(const FDepthStencilStateInitializerRHI &,const FDepthStencilStateInitializerRHI &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHI.h(1425): note: or       'bool operator ==(const FRasterizerStateInitializerRHI &,const FRasterizerStateInitializerRHI &)'
  C:\UE_5.1\Engine\Source\Runtime\RHI\Public\RHI.h(1378): note: or       'bool operator ==(const FSamplerStateInitializerRHI &,const FSamplerStateInitializerRHI &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\IO\IoHash.h(145): note: or       'bool operator ==(const FIoHash &,const FIoHash &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Hash\Blake3.h(147): note: or       'bool operator ==(const FBlake3Hash &,const FBlake3Hash &)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectHandle.h(400): note: or       'bool operator ==(FObjectHandle,FObjectHandle)'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectHandle.h(131): note: or       'bool operator ==(FPackedObjectRef,FPackedObjectRef)'
  C:\UE_5.1\Engine\Source\Runtime\Json\Public\Dom\JsonValue.h(112): note: or       'bool operator ==(const FJsonValue &,const FJsonValue &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Misc\Timecode.h(350): note: or       'bool operator ==(const FTimecode &,const FTimecode &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Misc\FrameRate.h(201): note: or       'bool operator ==(const FFrameRate &,const FFrameRate &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Misc\FrameTime.h(157): note: or       'bool operator ==(FFrameTime,FFrameTime)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Serialization\MemoryImage.h(180): note: or       'bool operator ==(const FMemoryImageNamePointer &,const FMemoryImageNamePointer &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Serialization\MemoryImage.h(160): note: or       'bool operator ==(const FMemoryImageVTablePointer &,const FMemoryImageVTablePointer &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1814): note: or       'bool operator ==(const FLazyName &,const FLazyName &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1539): note: or       'bool operator ==(FMemoryImageName,FName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1534): note: or       'bool operator ==(FScriptName,FName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1529): note: or       'bool operator ==(FMinimalName,FName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1497): note: or       'bool operator ==(FName,FMemoryImageName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1482): note: or       'bool operator ==(FMemoryImageName,FMemoryImageName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1492): note: or       'bool operator ==(FName,FScriptName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1477): note: or       'bool operator ==(FScriptName,FScriptName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1487): note: or       'bool operator ==(FName,FMinimalName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1472): note: or       'bool operator ==(FMinimalName,FMinimalName)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(114): note: or       'bool operator ==(EName,FNameEntryId)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Serialization\MemoryLayout.h(143): note: or       'bool operator ==(const FTypeLayoutDesc &,const FTypeLayoutDesc &)'
  C:\UE_5.1\Engine\Source\Runtime\Engine\Public\Net\Util\SequenceNumber.h(93): note: or       'bool operator ==(const TSequenceNumber<NumBits,SequenceType> &,const TSequenceNumber<NumBits,SequenceType> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSequenceNumber<NumBits,SequenceType> &,const TSequenceNumber<NumBits,SequenceType> &)': could not deduce template argument for 'const TSequenceNumber<NumBits,SequenceType> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\StrongObjectPtr.h(184): note: or       'bool operator ==(const TStrongObjectPtr<ObjectType,ReferencerNameProvider> &,const TStrongObjectPtr<RHSObjectType,RHSReferencerNameProvider> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TStrongObjectPtr<ObjectType,ReferencerNameProvider> &,const TStrongObjectPtr<RHSObjectType,RHSReferencerNameProvider> &)': could not deduce template argument for 'const TStrongObjectPtr<ObjectType,ReferencerNameProvider> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Memory\SharedBuffer.h(471): note: or       'unknown-type operator ==(const TypeA &,const TypeB &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: Failed to specialize function template 'unknown-type operator ==(const TypeA &,const TypeB &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: With the following template arguments:
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'TypeA=FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'TypeB=FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\RenderCore\Public\Shader.h(1140): note: or       'bool operator ==(const TShaderRefBase<ShaderType0,PointerTableType> &,const TShaderRefBase<ShaderType1,PointerTableType> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TShaderRefBase<ShaderType0,PointerTableType> &,const TShaderRefBase<ShaderType1,PointerTableType> &)': could not deduce template argument for 'const TShaderRefBase<ShaderType0,PointerTableType> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\LazyObjectPtr.h(360): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TLazyObjectPtr<T> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TLazyObjectPtr<T> &)': could not deduce template argument for 'const TLazyObjectPtr<T> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\LazyObjectPtr.h(355): note: or       'bool operator ==(const TLazyObjectPtr<T> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TLazyObjectPtr<T> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TLazyObjectPtr<T> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\LazyObjectPtr.h(348): note: or       'bool operator ==(const U *,const TLazyObjectPtr<T> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const U *,const TLazyObjectPtr<T> &)': could not deduce template argument for 'const U *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\LazyObjectPtr.h(343): note: or       'bool operator ==(const TLazyObjectPtr<T> &,const U *)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TLazyObjectPtr<T> &,const U *)': could not deduce template argument for 'const TLazyObjectPtr<T> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\LazyObjectPtr.h(331): note: or       'bool operator ==(const TLazyObjectPtr<T> &,const TLazyObjectPtr<U> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TLazyObjectPtr<T> &,const TLazyObjectPtr<U> &)': could not deduce template argument for 'const TLazyObjectPtr<T> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectPtr.h(588): note: or       'bool operator ==(U &&,const TObjectPtr<T> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(U &&,const TObjectPtr<T> &)': could not deduce template argument for 'const TObjectPtr<T> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectPtr.h(579): note: or       'bool operator ==(const TObjectPtr<T> &,U &&)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TObjectPtr<T> &,U &&)': could not deduce template argument for 'const TObjectPtr<T> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectPtr.h(456): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TObjectPtr<T> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TObjectPtr<T> &)': could not deduce template argument for 'const TObjectPtr<T> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\FieldPath.h(505): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TFieldPath<PropertyType> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TFieldPath<PropertyType> &)': could not deduce template argument for 'const TFieldPath<PropertyType> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\FieldPath.h(499): note: or       'bool operator ==(const TFieldPath<PropertyType> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TFieldPath<PropertyType> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TFieldPath<PropertyType> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\CoreUObject\Public\UObject\FieldPath.h(488): note: or       'bool operator ==(const LhsT *,const TFieldPath<RhsT> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const LhsT *,const TFieldPath<RhsT> &)': could not deduce template argument for 'const LhsT *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\RefCounting.h(354): note: or       'bool operator ==(ReferencedType *,const TRefCountPtr<ReferencedType> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(ReferencedType *,const TRefCountPtr<ReferencedType> &)': could not deduce template argument for 'ReferencedType *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\RefCounting.h(348): note: or       'bool operator ==(const TRefCountPtr<ReferencedType> &,ReferencedType *)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TRefCountPtr<ReferencedType> &,ReferencedType *)': could not deduce template argument for 'const TRefCountPtr<ReferencedType> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\RefCounting.h(342): note: or       'bool operator ==(const TRefCountPtr<ReferencedType> &,const TRefCountPtr<ReferencedType> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TRefCountPtr<ReferencedType> &,const TRefCountPtr<ReferencedType> &)': could not deduce template argument for 'const TRefCountPtr<ReferencedType> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\PimplPtr.h(305): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TPimplPtr<U,M> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TPimplPtr<U,M> &)': could not deduce template argument for 'const TPimplPtr<U,M> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\PimplPtr.h(304): note: or       'bool operator ==(const TPimplPtr<U,M> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TPimplPtr<U,M> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TPimplPtr<U,M> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\WeakObjectPtrTemplates.h(263): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TWeakObjectPtr<T,TWeakObjectPtrBase> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TWeakObjectPtr<T,TWeakObjectPtrBase> &)': could not deduce template argument for 'const TWeakObjectPtr<T,TWeakObjectPtrBase> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\WeakObjectPtrTemplates.h(257): note: or       'bool operator ==(const TWeakObjectPtr<T,TWeakObjectPtrBase> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakObjectPtr<T,TWeakObjectPtrBase> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TWeakObjectPtr<T,TWeakObjectPtrBase> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\WeakObjectPtrTemplates.h(250): note: or       'bool operator ==(const LhsT *,const TWeakObjectPtr<RhsT,OtherTWeakObjectPtrBase> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const LhsT *,const TWeakObjectPtr<RhsT,OtherTWeakObjectPtrBase> &)': could not deduce template argument for 'const LhsT *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\WeakObjectPtrTemplates.h(243): note: or       'bool operator ==(const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &,const RhsT *)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &,const RhsT *)': could not deduce template argument for 'const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\WeakObjectPtrTemplates.h(237): note: or       'bool operator ==(const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &,const TWeakObjectPtr<RhsT,OtherTWeakObjectPtrBase> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &,const TWeakObjectPtr<RhsT,OtherTWeakObjectPtrBase> &)': could not deduce template argument for 'const TWeakObjectPtr<LhsT,OtherTWeakObjectPtrBase> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1946): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TWeakPtr<ObjectType,InMode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TWeakPtr<ObjectType,InMode> &)': could not deduce template argument for 'const TWeakPtr<ObjectType,InMode> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1934): note: or       'bool operator ==(const TWeakPtr<ObjectType,InMode> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakPtr<ObjectType,InMode> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TWeakPtr<ObjectType,InMode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1922): note: or       'bool operator ==(const TSharedPtr<ObjectTypeA,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedPtr<ObjectTypeA,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TSharedPtr<ObjectTypeA,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1910): note: or       'bool operator ==(const TSharedRef<CastToType,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedRef<CastToType,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TSharedRef<CastToType,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1898): note: or       'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TWeakPtr<ObjectTypeA,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1886): note: or       'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TSharedRef<CastFromType,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TSharedRef<CastFromType,Mode> &)': could not deduce template argument for 'const TWeakPtr<ObjectTypeA,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1874): note: or       'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TWeakPtr<ObjectTypeA,Mode> &,const TWeakPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TWeakPtr<ObjectTypeA,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1850): note: or       'bool operator ==(const TSharedPtr<ObjectTypeB,Mode> &,const TSharedRef<CastToType,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedPtr<ObjectTypeB,Mode> &,const TSharedRef<CastToType,Mode> &)': could not deduce template argument for 'const TSharedPtr<ObjectTypeB,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1826): note: or       'bool operator ==(const TSharedRef<CastToType,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedRef<CastToType,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TSharedRef<CastToType,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1778): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TSharedPtr<ObjectType,InMode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TSharedPtr<ObjectType,InMode> &)': could not deduce template argument for 'const TSharedPtr<ObjectType,InMode> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1766): note: or       'bool operator ==(const TSharedPtr<ObjectType,InMode> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedPtr<ObjectType,InMode> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TSharedPtr<ObjectType,InMode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1754): note: or       'bool operator ==(const TSharedPtr<ObjectTypeA,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedPtr<ObjectTypeA,Mode> &,const TSharedPtr<ObjectTypeB,Mode> &)': could not deduce template argument for 'const TSharedPtr<ObjectTypeA,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h(1730): note: or       'bool operator ==(const TSharedRef<CastToType,Mode> &,const TSharedRef<CastFromType,Mode> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TSharedRef<CastToType,Mode> &,const TSharedRef<CastFromType,Mode> &)': could not deduce template argument for 'const TSharedRef<CastToType,Mode> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\UObject\NameTypes.h(1627): note: or       'bool operator ==(const CharType *,const FName &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const CharType *,const FName &)': could not deduce template argument for 'const CharType *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\StringView.h(743): note: or       'bool operator ==(const CharType *,TStringView<CharType>)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const CharType *,TStringView<CharType>)': could not deduce template argument for 'const CharType *' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\StringView.h(737): note: or       'bool operator ==(TStringView<CharType>,const CharType *)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TStringView<CharType>,const CharType *)': could not deduce template argument for 'TStringView<CharType>' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\StringView.h(702): note: or       'unknown-type operator ==(CharRangeType &&,TStringView<CharType>)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'unknown-type operator ==(CharRangeType &&,TStringView<CharType>)': could not deduce template argument for 'TStringView<CharType>' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\StringView.h(695): note: or       'unknown-type operator ==(TStringView<CharType>,CharRangeType &&)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'unknown-type operator ==(TStringView<CharType>,CharRangeType &&)': could not deduce template argument for 'TStringView<CharType>' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\StringView.h(675): note: or       'bool operator ==(TStringView<CharType>,TStringView<CharType>)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TStringView<CharType>,TStringView<CharType>)': could not deduce template argument for 'TStringView<CharType>' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\ArrayView.h(771): note: or       'bool operator ==(TArrayView<ElementType,int32>,RangeType &&)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TArrayView<ElementType,int32>,RangeType &&)': could not deduce template argument for 'TArrayView<ElementType,int32>' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\ArrayView.h(760): note: or       'bool operator ==(RangeType &&,TArrayView<ElementType,int32>)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(RangeType &&,TArrayView<ElementType,int32>)': could not deduce template argument for 'TArrayView<ElementType,int32>' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\ArrayView.h(745): note: or       'bool operator ==(TArrayView<InElementType,InSizeType>,TArrayView<OtherElementType,OtherSizeType>)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TArrayView<InElementType,InSizeType>,TArrayView<OtherElementType,OtherSizeType>)': could not deduce template argument for 'TArrayView<InElementType,InSizeType>' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\UniquePtr.h(706): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TUniquePtr<LhsT,TDefaultDelete<T>> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TUniquePtr<LhsT,TDefaultDelete<T>> &)': could not deduce template argument for 'const TUniquePtr<LhsT,TDefaultDelete<T>> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\UniquePtr.h(701): note: or       'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TUniquePtr<LhsT,TDefaultDelete<T>> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\UniquePtr.h(669): note: or       'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,const TUniquePtr<LhsT,TDefaultDelete<T>> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,const TUniquePtr<LhsT,TDefaultDelete<T>> &)': could not deduce template argument for 'const TUniquePtr<LhsT,TDefaultDelete<T>> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\UniquePtr.h(664): note: or       'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,const TUniquePtr<RhsT,TDefaultDelete<RhsT>> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TUniquePtr<LhsT,TDefaultDelete<T>> &,const TUniquePtr<RhsT,TDefaultDelete<RhsT>> &)': could not deduce template argument for 'const TUniquePtr<LhsT,TDefaultDelete<T>> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\Function.h(1038): note: or       'bool operator ==(const TFunction<T> &,TYPE_OF_NULLPTR)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(const TFunction<T> &,TYPE_OF_NULLPTR)': could not deduce template argument for 'const TFunction<T> &' from 'FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Templates\Function.h(1029): note: or       'bool operator ==(TYPE_OF_NULLPTR,const TFunction<T> &)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: 'bool operator ==(TYPE_OF_NULLPTR,const TFunction<T> &)': could not deduce template argument for 'const TFunction<T> &' from 'const FConnAttributeFloat'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): note: while trying to match the argument list '(FConnAttributeFloat, const FConnAttributeFloat)'
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2623): note: while compiling class template member function 'int TArray<FConnAttributeFloat,FDefaultAllocator>::Remove(const FConnAttributeFloat &)'
  C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Plugins\ConnFramework\Source\ConnToolkitCHISEL\ConnAttributeFramework\Private\ConnAttributeComponent.cpp(124): note: see reference to function template instantiation 'int TArray<FConnAttributeFloat,FDefaultAllocator>::Remove(const FConnAttributeFloat &)' being compiled
  C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Plugins\ConnFramework\Source\ConnToolkitCHISEL\ConnAttributeFramework\Public\ConnAttributeComponent.h(97): note: see reference to class template instantiation 'TArray<FConnAttributeFloat,FDefaultAllocator>' being compiled
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.MakeFile.Targets(44,5): error MSB3073: The command "C:\UE_5.1\Engine\Build\BatchFiles\Build.bat CONN_MN_SoREditor Win64 Development -Project="C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.uproject" -WaitMutex -FromMsBuild" exited with code 6. [C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj]
Done Building Project "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj" (default targets) -- FAILED.
Done Building Project "C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.sln" (Build target(s)) -- FAILED.

Build FAILED.

"C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.sln" (Build target) (1) ->
"C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj" (default target) (2) ->
(Build target) -> 
  C:\UE_5.1\Engine\Source\Runtime\Core\Public\Containers\Array.h(2627): error C2678: binary '==': no operator found which takes a left-hand operand of type 'FConnAttributeFloat' (or there is no acceptable conversion) [C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj]
  C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.MakeFile.Targets(44,5): error MSB3073: The command "C:\UE_5.1\Engine\Build\BatchFiles\Build.bat CONN_MN_SoREditor Win64 Development -Project="C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\CONN_MN_SoR.uproject" -WaitMutex -FromMsBuild" exited with code 6. [C:\Users\impho\OneDrive\Rapidfire\Games\CONNIPTION\Mainline\Shadows of Rage\Game\CONN_MN_SoR\Intermediate\ProjectFiles\CONN_MN_SoR.vcxproj]

    0 Warning(s)
    2 Error(s)

Time Elapsed 00:00:05.98

.h File (UConnAttributeComponent.h)

// Copyright [my full name]. All rights reserved.



#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"

#include "ConnAttributeComponent.generated.h"



class UConnAttributeComponent;

struct FConnAttributeBool;
struct FConnAttributeInt;
struct FConnAttributeFloat;
struct FGameplayTag;



DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttributeDelegateBoolUpdate, UConnAttributeComponent*, InstigatingComponent);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttributeDelegateIntUpdate, UConnAttributeComponent*, InstigatingComponent);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttributeDelegateFloatUpdate, UConnAttributeComponent*, InstigatingComponent);



/**
 * This is an Actor Component which manages actor attributes.
 *
 * Attributes are basically just properties, mainly for game events and systems.
 * These are values such as actor health, a state that the actor is in, and so on.
 *
 * All attributes in the CONNIPTION FRAMEWORK can be handled as:
 * A) Booleans (True/False value. It's basically a switch.)
 * B) Integers (Whole number. EXAMPLES: 1, 5, 10, etc.)
 * C) Floats (Rational number. EXAMPLES: 2.718, 3.14159, etc.)
 *
 * For global attributes (primarily for events), just add this component to the Game State.
 */
UCLASS( Blueprintable, ClassGroup=(ConniptionFramework), meta=(BlueprintSpawnableComponent, DisplayName = "Attribute Component") )
class CONNATTRIBUTEFRAMEWORK_API UConnAttributeComponent : public UActorComponent
{
	GENERATED_BODY()



public:



	/**
	 * Delegate for any time a boolean attribute is updated.
	 * Primarily used for UI and events.
	 * Unfortunately, replication notifies don't take parameters, so we can only pass in this component.
	 * Working around that to provide more parameters (e.g. tag, value) wasn't really worth the resulting bandwidth cost.
	 */
	UPROPERTY( Category = "Attribute System", BlueprintAssignable )
	FAttributeDelegateBoolUpdate OnBoolAttributesUpdated;

	/**
	 * Delegate for any time an integer attribute is updated.
	 * Primarily used for UI and events.
	 * Unfortunately, replication notifies don't take parameters, so we can only pass in this component.
	 * Working around that to provide more parameters (e.g. tag, value) wasn't really worth the resulting bandwidth cost.
	 */
	UPROPERTY( Category = "Attribute System", BlueprintAssignable )
	FAttributeDelegateIntUpdate OnIntAttributesUpdated;

	/**
	 * Delegate for any time a float attribute is updated.
	 * Primarily used for UI and events.
	 * Unfortunately, replication notifies don't take parameters, so we can only pass in this component.
	 * Working around that to provide more parameters (e.g. tag, value) wasn't really worth the resulting bandwidth cost.
	 */
	UPROPERTY( Category = "Attribute System", BlueprintAssignable )
	FAttributeDelegateFloatUpdate OnFloatAttributesUpdated;


	/**
	 * Boolean attribute board.
	 */
	UPROPERTY( Category = "Attribute System", EditDefaultsOnly, ReplicatedUsing = "OnRep_BooleanAttributes", SaveGame, BlueprintReadOnly )
	TArray<FConnAttributeBool> BooleanAttributes;

	/**
	 * Integer attribute board.
	 */
	UPROPERTY( Category = "Attribute System", EditDefaultsOnly,  ReplicatedUsing = "OnRep_IntegerAttributes", SaveGame, BlueprintReadOnly )
	TArray<FConnAttributeInt> IntegerAttributes;

	/**
	 * Float attribute board.
	 */
	UPROPERTY( Category = "Attribute System", EditDefaultsOnly,  ReplicatedUsing = "OnRep_FloatAttributes", SaveGame, BlueprintReadOnly )
	TArray<FConnAttributeFloat> FloatAttributes;



	/**
	 * Default update time for any auto-updating attributes. CANNOT be changed at runtime.
	 * Default value is 0.05f, or 20 times per second. This is a pretty safe value.
	 */
	UPROPERTY( Category = "Attribute System", EditDefaultsOnly, Replicated, BlueprintReadOnly, meta = (ForceUnits = "sec") )
	float DefaultAttributeTick = 0.05f;



	/**
	 * Sets default values for this component's properties.
	 */
	UConnAttributeComponent();



	/**
	 * Update a BOOLEAN attribute by its tag. This only runs on the server, but replicates value changes to clients.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param InNewValue New value.
	 * @param bInvertFromCurrent Flips current value, e.g. true becomes false. Ignores NewValue.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_UpdateBooleanAttribute(const FGameplayTag InSearchAttribute, const bool InNewValue = true, const bool bInvertFromCurrent = false);

	/**
	 * Update an INTEGER attribute by its tag. This only runs on the server, but replicates value changes to clients.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param InNewValue New value.
	 * @param bAddValues Adds new value to current value instead of setting it.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_UpdateIntegerAttribute(const FGameplayTag InSearchAttribute, const int32 InNewValue = 0, const bool bAddValues = false);

	/**
	 * Update a FLOAT attribute by its tag. This only runs on the server, but replicates value changes to clients.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param InNewValue New value.
	 * @param bAddValues Adds new value to current value instead of setting it.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_UpdateFloatAttribute(const FGameplayTag InSearchAttribute, const float InNewValue = 0.0f, const bool bAddValues = false);



	/**
	 * Add a BOOLEAN attribute to the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the new attribute.
	 * @param InValue Default value of the new attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_AddBooleanAttribute(const FGameplayTag InAttributeTag, const bool InValue);

	/**
	 * Add an INTEGER attribute to the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the new attribute.
	 * @param InValue Default value of the new attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_AddIntegerAttribute(const FGameplayTag InAttributeTag, const int32 InValue);

	/**
	 * Add a FLOAT attribute to the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the new attribute.
	 * @param InValue Default value of the new attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_AddFloatAttribute(const FGameplayTag InAttributeTag, const float InValue);



	/**
	 * Remove a BOOLEAN attribute from the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the target attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_RemoveBooleanAttribute(const FGameplayTag InAttributeTag);

	/**
	 * Remove an INTEGER attribute from the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the target attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_RemoveIntegerAttribute(const FGameplayTag InAttributeTag);

	/**
	 * Remove a FLOAT attribute from the attribute board. This only runs on the server, but replicates the updates to clients.
	 * @param InAttributeTag Tag of the target attribute.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintCallable, Server, Reliable )
	void Auth_RemoveFloatAttribute(const FGameplayTag InAttributeTag);



	/**
	 * Get a BOOLEAN attribute by its tag.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param OutFoundBool If found, returns value of the attribute.
	 * @return Whether or not the attribute was found.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintPure )
	bool GetBooleanAttribute(const FGameplayTag InSearchAttribute, bool& OutFoundBool);

	/**
	 * Get an INTEGER attribute by its tag.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param OutFoundInt If found, returns value of the attribute.
	 * @return Whether or not the attribute was found.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintPure )
	bool GetIntegerAttribute(const FGameplayTag InSearchAttribute, int32& OutFoundInt);

	/**
	 * Get a FLOAT attribute by its tag.
	 * @param InSearchAttribute Tag of the attribute.
	 * @param OutFoundFloat If found, returns value of the attribute.
	 * @return Whether or not the attribute was found.
	 */
	UFUNCTION( Category = "Attribute System", BlueprintPure )
	bool GetFloatAttribute(const FGameplayTag InSearchAttribute, float& OutFoundFloat);



	/**
	 * Replication notify for BOOLEAN Attributes.
	 */
	UFUNCTION()
	virtual void OnRep_BooleanAttributes();

	/**
	 * Replication notify for INTEGER Attributes.
	 */
	UFUNCTION()
	virtual void OnRep_IntegerAttributes();

	/**
	 * Replication notify for FLOAT Attributes.
	 */
	UFUNCTION()
	virtual void OnRep_FloatAttributes();



protected:



	/**
	 * Called when the game starts.
	 */
	virtual void BeginPlay() override;



	/**
	 * Called when an attribute board has been updated.
	 * This is used to transfer temporary additions to the main board.
	 */
	UFUNCTION( BlueprintNativeEvent )
	void OnBoolAttributeUpdateFinished(UConnAttributeComponent* InComponent);

	/**
	 * Called when an attribute board has been updated.
	 * This is used to transfer temporary additions to the main board.
	 */
	UFUNCTION( BlueprintNativeEvent )
	void OnIntAttributeUpdateFinished(UConnAttributeComponent* InComponent);

	/**
	 * Called when an attribute board has been updated.
	 * This is used to transfer temporary additions to the main board.
	 */
	UFUNCTION( BlueprintNativeEvent )
	void OnFloatAttributeUpdateFinished(UConnAttributeComponent* InComponent);



private:



	/**
	 * Server-only variable.
	 * If this is true, we are currently updating boolean attributes and cannot work with the attribute board directly.
	 * As such, we'll need to add our new attributes to the temporary board, then append that when we're done.
	 */
	UPROPERTY()
	bool bIsUpdatingBoolAttributes = false;

	/**
	 * Server-only variable.
	 * If this is true, we are currently updating integer attributes and cannot work with the attribute board directly.
	 * As such, we'll need to add our new attributes to the temporary board, then append that when we're done.
	 */
	UPROPERTY()
	bool bIsUpdatingIntAttributes = false;

	/**
	 * Server-only variable.
	 * If this is true, we are currently updating float attributes and cannot work with the attribute board directly.
	 * As such, we'll need to add our new attributes to the temporary board, then append that when we're done.
	 */
	UPROPERTY()
	bool bIsUpdatingFloatAttributes = false;



	/**
	 * Server-only.
	 * Storage for attributes awaiting addition.
	 */

	UPROPERTY()
	TArray<FConnAttributeBool> TempAddBooleanAttributes;

	UPROPERTY()
	TArray<FConnAttributeInt> TempAddIntegerAttributes;

	UPROPERTY()
	TArray<FConnAttributeFloat> TempAddFloatAttributes;



	/**
	 * Server-only.
	 * Storage for attributes awaiting deletion.
	 */

	UPROPERTY()
	TArray<FConnAttributeBool> TempDelBooleanAttributes;

	UPROPERTY()
	TArray<FConnAttributeInt> TempDelIntegerAttributes;

	UPROPERTY()
	TArray<FConnAttributeFloat> TempDelFloatAttributes;

};

/**
 * Savior plug-in support: Add a system for all events where after destroying an object, check the actor for a "Destroyed" bool and set it
 * (make note of that in the tooltip too (i.e. "If using Savior plugin this will auto-set any found "Destroy" tag")
 *
 * Further ideas:
 * modify attribute on actor (of class with tag, or by obj ref)
 * modify property on component (of class with tag)
 */

.cpp file (UConnAttributeComponent.cpp)

// Copyright [my full name]. All rights reserved.



#include "ConnAttributeComponent.h"

#include "ConnGameplayStatics.h"
#include "Attributes/ConnStructsAttributes.h"
#include "GameplayTagContainer.h"
#include "Net/UnrealNetwork.h"



UConnAttributeComponent::UConnAttributeComponent()
{
	// Disable ticks.
	PrimaryComponentTick.bCanEverTick = false;
	PrimaryComponentTick.bHighPriority = false;
	PrimaryComponentTick.bStartWithTickEnabled = false;
	PrimaryComponentTick.bTickEvenWhenPaused = false;
	PrimaryComponentTick.bAllowTickOnDedicatedServer = false;

	// Auto-enable component replication.
	SetIsReplicatedByDefault(true);

	// Component should auto-activate.
	bAutoActivate = true;
}



void UConnAttributeComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME( UConnAttributeComponent, BooleanAttributes );
	DOREPLIFETIME( UConnAttributeComponent, IntegerAttributes );
	DOREPLIFETIME( UConnAttributeComponent, FloatAttributes );
	DOREPLIFETIME_CONDITION( UConnAttributeComponent, DefaultAttributeTick, COND_InitialOnly);
}



void UConnAttributeComponent::BeginPlay()
{
	Super::BeginPlay();

	OnBoolAttributesUpdated.AddDynamic(this, &UConnAttributeComponent::OnBoolAttributeUpdateFinished);
	OnIntAttributesUpdated.AddDynamic(this, &UConnAttributeComponent::OnIntAttributeUpdateFinished);
	OnFloatAttributesUpdated.AddDynamic(this, &UConnAttributeComponent::OnFloatAttributeUpdateFinished);
}



void UConnAttributeComponent::OnBoolAttributeUpdateFinished_Implementation(UConnAttributeComponent* InComponent)
{
	// Direct operations on boards to prevent bugs because this situation isn't nearly as common as updating attributes.
	if(GetOwner()->HasAuthority())
	{
		if(!TempAddBooleanAttributes.IsEmpty())
		{
			BooleanAttributes.Append(TempAddBooleanAttributes);
			TempAddBooleanAttributes.Empty();
		}

		if(!TempDelBooleanAttributes.IsEmpty())
		{
			for(FConnAttributeBool LocDelAtt : TempDelBooleanAttributes)
			{
				if(BooleanAttributes.Contains(LocDelAtt))
				{
					BooleanAttributes.Remove(LocDelAtt);
				}
			}

			TempDelBooleanAttributes.Empty();
		}
	}
}

void UConnAttributeComponent::OnIntAttributeUpdateFinished_Implementation(UConnAttributeComponent* InComponent)
{
	// Direct operations on boards to prevent bugs because this situation isn't nearly as common as updating attributes.
	if(GetOwner()->HasAuthority())
	{
		if(!TempAddIntegerAttributes.IsEmpty())
		{
			IntegerAttributes.Append(TempAddIntegerAttributes);
			TempAddIntegerAttributes.Empty();
		}

		if(!TempDelIntegerAttributes.IsEmpty())
		{
			for(FConnAttributeInt LocDelAtt : TempDelIntegerAttributes)
			{
				if(IntegerAttributes.Contains(LocDelAtt))
				{
					IntegerAttributes.Remove(LocDelAtt);
				}
			}

			TempDelIntegerAttributes.Empty();
		}
	}
}

void UConnAttributeComponent::OnFloatAttributeUpdateFinished_Implementation(UConnAttributeComponent* InComponent)
{
	// Direct operations on boards to prevent bugs because this situation isn't nearly as common as updating attributes.
	if(GetOwner()->HasAuthority())
	{
		if(!TempAddFloatAttributes.IsEmpty())
		{
			FloatAttributes.Append(TempAddFloatAttributes);
			TempAddFloatAttributes.Empty();
		}

		if(!TempDelFloatAttributes.IsEmpty())
		{
			for(FConnAttributeFloat LocDelAtt : TempDelFloatAttributes)
			{
				if(FloatAttributes.Contains(LocDelAtt))
				{
					FloatAttributes.Remove(LocDelAtt);
				}
			}

			TempDelFloatAttributes.Empty();
		}
	}
}



void UConnAttributeComponent::Auth_UpdateBooleanAttribute_Implementation(const FGameplayTag InSearchAttribute, const bool InNewValue, const bool bInvertFromCurrent)
{
	if(GetOwner()->HasAuthority())
	{
		// Tell the system that we are updating these attributes, so that it doesn't try to add attributes to the board directly.
		bIsUpdatingBoolAttributes = true;

		// Create local attributes board so that we aren't operating on the attributes directly.
		// Important because editing it directly calls the global delegate to update attribute information, which would be wasteful.
		TArray<FConnAttributeBool> LocAttBoard = BooleanAttributes;

		if(const int32 LocFoundMatch = UConnGameplayStatics::FindMatchingAttributeTag(TArray<FConnAttribute>(LocAttBoard), InSearchAttribute); LocFoundMatch >= 0)
		{
			// Store old value in case game logic or UI needs it next.
			LocAttBoard[LocFoundMatch].AttributePreviousValue = LocAttBoard[LocFoundMatch].AttributeValue;

			// Decide on new value and set it.
			if(bInvertFromCurrent)
			{
				// Flips attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = !LocAttBoard[LocFoundMatch].AttributePreviousValue;
			}
			else
			{
				// Sets attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = InNewValue;
			}

			// Store updated values and call replication notify.
			BooleanAttributes = LocAttBoard;
			OnRep_BooleanAttributes();
		}

		// We are no longer updating these attributes!
		bIsUpdatingBoolAttributes = false;
	}
}



void UConnAttributeComponent::Auth_UpdateIntegerAttribute_Implementation(const FGameplayTag InSearchAttribute, const int32 InNewValue, const bool bAddValues)
{
	if(GetOwner()->HasAuthority())
	{
		// Tell the system that we are updating these attributes, so that it doesn't try to add attributes to the board directly.
		bIsUpdatingIntAttributes = true;

		// Create local attributes board so that we aren't operating on the attributes directly.
		// Important because editing it directly calls the global delegate to update attribute information, which would be wasteful.
		TArray<FConnAttributeInt> LocAttBoard = IntegerAttributes;

		if(const int32 LocFoundMatch = UConnGameplayStatics::FindMatchingAttributeTag(TArray<FConnAttribute>(LocAttBoard), InSearchAttribute); LocFoundMatch >= 0)
		{
			// Store old value in case game logic or UI needs it next.
			LocAttBoard[LocFoundMatch].AttributePreviousValue = LocAttBoard[LocFoundMatch].AttributeValue;

			// Decide on new value and set it.
			if(bAddValues)
			{
				// Adds value to attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = LocAttBoard[LocFoundMatch].AttributePreviousValue + InNewValue;
			}
			else
			{
				// Sets attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = InNewValue;
			}

			// Store updated values and call replication notify.
			IntegerAttributes = LocAttBoard;
			OnRep_IntegerAttributes();
		}

		// We are no longer updating these attributes!
		bIsUpdatingIntAttributes = false;
	}
}



void UConnAttributeComponent::Auth_UpdateFloatAttribute_Implementation(const FGameplayTag InSearchAttribute, const float InNewValue, const bool bAddValues)
{
	if(GetOwner()->HasAuthority())
	{
		// Tell the system that we are updating these attributes, so that it doesn't try to add attributes to the board directly.
		bIsUpdatingFloatAttributes = true;

		// Create local attributes board so that we aren't operating on the attributes directly.
		// Important because editing it directly calls the global delegate to update attribute information, which would be wasteful.
		TArray<FConnAttributeFloat> LocAttBoard = FloatAttributes;

		if(const int32 LocFoundMatch = UConnGameplayStatics::FindMatchingAttributeTag(TArray<FConnAttribute>(LocAttBoard), InSearchAttribute); LocFoundMatch >= 0)
		{
			// Store old value in case game logic or UI needs it next.
			LocAttBoard[LocFoundMatch].AttributePreviousValue = LocAttBoard[LocFoundMatch].AttributeValue;

			// Decide on new value and set it.
			if(bAddValues)
			{
				// Adds value to attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = LocAttBoard[LocFoundMatch].AttributePreviousValue + InNewValue;
			}
			else
			{
				// Sets attribute.
				LocAttBoard[LocFoundMatch].AttributeValue = InNewValue;
			}

			// Store updated values and call replication notify.
			FloatAttributes = LocAttBoard;
			OnRep_FloatAttributes();
		}

		// We are no longer updating these attributes!
		bIsUpdatingFloatAttributes = false;
	}
}



void UConnAttributeComponent::Auth_AddBooleanAttribute_Implementation(const FGameplayTag InAttributeTag, const bool InValue)
{
	const FConnAttributeBool NewAttribute = FConnAttributeBool(InAttributeTag, InValue);

	if(bIsUpdatingBoolAttributes)
	{
		TempAddBooleanAttributes.AddUnique(NewAttribute);
	}
	else
	{
		BooleanAttributes.AddUnique(NewAttribute);
	}
}

void UConnAttributeComponent::Auth_AddIntegerAttribute_Implementation(const FGameplayTag InAttributeTag, const int32 InValue)
{
	const FConnAttributeInt NewAttribute = FConnAttributeInt(InAttributeTag, InValue);

	if(bIsUpdatingIntAttributes)
	{
		TempAddIntegerAttributes.AddUnique(NewAttribute);
	}
	else
	{
		IntegerAttributes.AddUnique(NewAttribute);
	}
}

void UConnAttributeComponent::Auth_AddFloatAttribute_Implementation(const FGameplayTag InAttributeTag, const float InValue)
{
	const FConnAttributeFloat NewAttribute = FConnAttributeFloat(InAttributeTag, InValue);

	if(bIsUpdatingFloatAttributes)
	{
		TempAddFloatAttributes.AddUnique(NewAttribute);
	}
	else
	{
		FloatAttributes.AddUnique(NewAttribute);
	}
}



void UConnAttributeComponent::Auth_RemoveBooleanAttribute_Implementation(const FGameplayTag InAttributeTag)
{
	for(FConnAttributeBool LocTryAtt : BooleanAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InAttributeTag))
		{
			if(bIsUpdatingBoolAttributes)
			{
				TempDelBooleanAttributes.AddUnique(LocTryAtt);
			}
			else
			{
				if(BooleanAttributes.Contains(LocTryAtt))
				{
					BooleanAttributes.Remove(LocTryAtt);
				}
			}
			break;
		}
	}
}

void UConnAttributeComponent::Auth_RemoveIntegerAttribute_Implementation(const FGameplayTag InAttributeTag)
{
	for(FConnAttributeInt LocTryAtt : IntegerAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InAttributeTag))
		{
			if(bIsUpdatingIntAttributes)
			{
				TempDelIntegerAttributes.AddUnique(LocTryAtt);
			}
			else
			{
				if(IntegerAttributes.Contains(LocTryAtt))
				{
					IntegerAttributes.Remove(LocTryAtt);
				}
			}
			break;
		}
	}
}

void UConnAttributeComponent::Auth_RemoveFloatAttribute_Implementation(const FGameplayTag InAttributeTag)
{
	for(FConnAttributeFloat LocTryAtt : FloatAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InAttributeTag))
		{
			if(bIsUpdatingFloatAttributes)
			{
				TempDelFloatAttributes.AddUnique(LocTryAtt);
			}
			else
			{
				if(FloatAttributes.Contains(LocTryAtt))
				{
					FloatAttributes.Remove(LocTryAtt);
				}
			}
			break;
		}
	}
}



bool UConnAttributeComponent::GetBooleanAttribute(const FGameplayTag InSearchAttribute, bool& OutFoundBool)
{
	bool bSuccessful = false;

	for(FConnAttributeBool LocTryAtt : BooleanAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InSearchAttribute))
		{
			OutFoundBool = LocTryAtt.AttributeValue;
			bSuccessful = true;
			break;
		}
	}

	return bSuccessful;
}

bool UConnAttributeComponent::GetIntegerAttribute(const FGameplayTag InSearchAttribute, int32& OutFoundInt)
{
	bool bSuccessful = false;

	for(FConnAttributeInt LocTryAtt : IntegerAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InSearchAttribute))
		{
			OutFoundInt = LocTryAtt.AttributeValue;
			bSuccessful = true;
			break;
		}
	}

	return bSuccessful;
}

bool UConnAttributeComponent::GetFloatAttribute(const FGameplayTag InSearchAttribute, float& OutFoundFloat)
{
	bool bSuccessful = false;

	for(FConnAttributeFloat LocTryAtt : FloatAttributes)
	{
		if(LocTryAtt.AttributeTag.MatchesTagExact(InSearchAttribute))
		{
			OutFoundFloat = LocTryAtt.AttributeValue;
			bSuccessful = true;
			break;
		}
	}

	return bSuccessful;
}





void UConnAttributeComponent::OnRep_BooleanAttributes()
{
	// Call our delegate, which will update UI and game events/logic that it is bound to.
	OnBoolAttributesUpdated.Broadcast(this);
}

void UConnAttributeComponent::OnRep_IntegerAttributes()
{
	// Call our delegate, which will update UI and game events/logic that it is bound to.
	OnIntAttributesUpdated.Broadcast(this);
}

void UConnAttributeComponent::OnRep_FloatAttributes()
{
	// Call our delegate, which will update UI and game events/logic that it is bound to.
	OnFloatAttributesUpdated.Broadcast(this);
}

.h (ConnStructsAttributes.h)

// Copyright [my full name]. All rights reserved.

#pragma once

#include "CoreMinimal.h"

#include "GameplayTagContainer.h"
#include "ConnEnumsAttributes.h"

#include "ConnStructsAttributes.generated.h"





/**
 * Parent structure for all attributes.
 */
USTRUCT( BlueprintType )
struct FConnAttribute
{
	GENERATED_BODY()

	FConnAttribute()
	{
	};

	explicit FConnAttribute(const FGameplayTag InAttributeName)
	{
		AttributeTag = InAttributeName;
	};

	/**
	 * Gameplay tag for this attribute.
	 * @see Conniption Framework Documentation [https://rapidfire-computer-entertainment.gitbook.io/cfdocs/chisel-game-development-kit-gdk/gameplay-tags/naming-scheme]
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly )
	FGameplayTag AttributeTag;

};



/**
 * Structure containing miscellanious attribute settings, such as automatic update.
 */
USTRUCT( BlueprintType )
struct FConnAttributeWithBaseSettings : public FConnAttribute
{
	GENERATED_BODY()

	/**
	 * Update method of this attribute.
	 * Booleans are inverted when updated automatically.
	 * This option CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (DisplayAfter = "AttributeTag") )
	EConnAttributeUpdateMethod UpdateMethod = EConnAttributeUpdateMethod::Manual;

	/**
	 * Custom update interval of this value, if applicable.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "UpdateMethod != EConnAttributeUpdateMethod::Manual", DisplayAfter = "UpdateMethod") )
	float CustomUpdateInterval = 0.05f;

};



/**
 * Attribute settings structure which adds clamping to the list of available options.
 */
USTRUCT( BlueprintType )
struct FConnAttributeWithMiscSettings : public FConnAttributeWithBaseSettings
{
	GENERATED_BODY()

	/**
	 * This enables/disables having a maximum value which the attribute will be clamped to.
	 * This switch CANNOT be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (DisplayAfter = "UpdateQuantity") )
	bool bEnableMinimumValue = true;

	/**
	 * This enables/disables having a maximum value which the attribute will be clamped to.
	 * This switch CANNOT be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (DisplayAfter = "MinValue") )
	bool bEnableMaximumValue = false;

};



/**
 * Attribute settings specific to integers.
 */
USTRUCT( BlueprintType )
struct FConnAttributeWithMiscSettingsInt : public FConnAttributeWithMiscSettings
{
	GENERATED_BODY()

	/**
	 * If updating automatically, this specifies how much the value should be updated each time.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "UpdateMethod != EConnAttributeUpdateMethod::Manual", DisplayAfter = "CustomUpdateInterval") )
	int32 UpdateQuantity = 1;

	/**
	 * If enabled, this specifies the minimum value of this attribute.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "bEnableMinimumValue", DisplayAfter = "bEnableMinimumValue") )
	int32 MinValue = 0;

	/**
	 * If enabled, this specifies the maximum value of this attribute.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "bEnableMaximumValue", DisplayAfter = "bEnableMaximumValue") )
	int32 MaxValue = 100;

};



/**
 * Attribute settings specific to floats.
 */
USTRUCT( BlueprintType )
struct FConnAttributeWithMiscSettingsFloat : public FConnAttributeWithMiscSettings
{
	GENERATED_BODY()

	/**
	 * If updating automatically, this specifies how much the value should be updated each time.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "UpdateMethod != EConnAttributeUpdateMethod::Manual", DisplayAfter = "CustomUpdateInterval") )
	float UpdateQuantity = 1.0f;

	/**
	 * If enabled, this specifies the minimum value of this attribute.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "bEnableMinimumValue", DisplayAfter = "bEnableMinimumValue") )
	float MinValue = 0.0f;

	/**
	 * If enabled, this specifies the maximum value of this attribute.
	 * This value CAN be changed at runtime.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, AdvancedDisplay, meta = (EditCondition = "bEnableMaximumValue", DisplayAfter = "bEnableMaximumValue") )
	float MaxValue = 1.0f; // default to show you could use this as a percentage

};





/**
 * Boolean attribute.
 * This is a structure for several reasons, but replication and flexibility are two of them.
 */
USTRUCT( BlueprintType )
struct FConnAttributeBool : public FConnAttributeWithBaseSettings
{
	GENERATED_BODY()

	FConnAttributeBool()
	{
	};

	FConnAttributeBool(const FGameplayTag InTag, const bool InValue)
	{
		AttributeTag = InTag;
		AttributeValue = InValue;
		AttributePreviousValue = InValue;
	};

	/**
	 * Value of this attribute. Changes based on save data and game events.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeTag") )
	bool AttributeValue = false;

	/**
	 * Old value of this attribute.
	 * Only set at runtime, but you can see that it exists from the editor panels.
	 */
	UPROPERTY( Category = "Attribute System", VisibleAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeValue") )
	bool AttributePreviousValue = false;

};

/**
 * Integer attribute.
 * This is a structure for several reasons, but replication and flexibility are two of them.
 */
USTRUCT( BlueprintType )
struct FConnAttributeInt : public FConnAttributeWithMiscSettingsInt
{
	GENERATED_BODY()

	FConnAttributeInt()
	{
	};

	FConnAttributeInt(const FGameplayTag InTag, const int32 InValue)
	{
		AttributeTag = InTag;
		AttributeValue = InValue;
		AttributePreviousValue = InValue;
	};

	/**
	 * Value of this attribute. Changes based on save data and game events.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeTag") )
	int32 AttributeValue = 0;

	/**
	 * Old value of this attribute.
	 * Only set at runtime, but you can see that it exists from the editor panels.
	 */
	UPROPERTY( Category = "Attribute System", VisibleAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeValue") )
	int32 AttributePreviousValue = 0;

};

/**
 * Float attribute.
 * This is a structure for several reasons, but replication and flexibility are two of them.
 */
USTRUCT( BlueprintType )
struct FConnAttributeFloat : public FConnAttributeWithMiscSettingsFloat
{
	GENERATED_BODY()

	FConnAttributeFloat()
	{
	};

	FConnAttributeFloat(const FGameplayTag InTag, const float InValue)
	{
		AttributeTag = InTag;
		AttributeValue = InValue;
		AttributePreviousValue = InValue;
	};

	/**
	 * Value of this attribute. Changes based on save data and game events.
	 */
	UPROPERTY( Category = "Attribute System", EditAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeTag") )
	float AttributeValue = 0.0f;

	/**
	 * Old value of this attribute.
	 * Only set at runtime, but you can see that it exists from the editor panels.
	 */
	UPROPERTY( Category = "Attribute System", VisibleAnywhere, BlueprintReadOnly, meta = (DisplayAfter = "AttributeValue") )
	float AttributePreviousValue = 0.0f;

};

If you can be bothered to look through the entire code files, you can see them up there.

Basically, the compiler is complaining that one of my operands is const when I try to remove an FConnAttributeFloat (structure containing a float attribute) from the component’s attribute board. I have no idea what could be causing this because it was literally compiling not even five minutes ago.

Helpful pointers:

  • The structure and component are in two separate modules. The module containing the Attribute Component, ConnAttributeFramework.Build.cs, does include the module containing the Attribute Structures, ConnDataTypes.Build.cs - I split these because ConnDataTypes also contains a general static function library that goes together with the data structures, but the library and structures don’t give a rat’s behind about what’s going on anywhere else in the framework.
  • This system is part a reworked version of a framework I’ve been working on for a few months now, probably longer. It jumps through a lot of hoops to help developers make games with minimal programming/scripting… like popular frameworks such as Horror Engine on the marketplace, just written in C++ and far more abstract… mainly because I have a low budget so once I get to full game development I want the most amount of time to focus on assets over coding new game systems, while also being reusable in the future.

If anyone can help, it would be very much appreciated. Thank you all.

I just found another little helpful point.

This did compile not even five minutes ago, but in those five minutes the Remove functions were added, and after that it stopped working.

So, when I commented those out, now the FConnAttributeInt structure is giving me issues. Hmm…

New ground covered!

So after removing the delegate bindings and the remove functions, it still has this problem. If I use Add() in my Adding functions instead of AddUnique() though, it compiles…

Solution found!

Turns out, unfortunately I get to do the extra like 3 lines per structure of adding an operator== overload. Easy little fix I should’ve done way earlier. Thanks for anyone that looked at this and bothered to try fixing it!

(Something that I suppose if I just read the error message well enough I may have been able to use the last of my two braincells to figure out.)

1 Like