Below is everything you need to do to utilize external attribute sets and still get all of the features of this plugin. Unfortunately this DOES require some C++ work. This is 100% unavoidable due to the nature of properly utilizing GAS the way it was intended. I will have better instructions and a video for this in the future.

Quick Instructions

	/** 
	 * TO ENABLE PLUGIN FEATURES (Clamping, Events, Meta Attributes) for external attributes:
	 * 
	 * 1. In YourAttributeSet.h, add this include at the top:
	 *    #include "Attributes/WCGASAttributePoolHelper.h"
	 * 
	 * 2. In YourAttributeSet.h, declare these overrides if they haven't been alread:
	 *    virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
	 *    virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
	 * 
	 * 3. In YourAttributeSet.cpp, implement both functions if they haven't already then add the UWCGASAttributePoolHelper functions:
	 *    void UYourAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
	 *    {
	 *        Super::PreAttributeChange(Attribute, NewValue);
	 *        UWCGASAttributePoolHelper::HandlePreAttributeChange(this, Attribute, NewValue);
	 *    }
	 * 
	 *    void UYourAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
	 *    {
	 *        Super::PostGameplayEffectExecute(Data);
	 *        UWCGASAttributePoolHelper::HandlePostGameplayEffectExecute(this, Data);
	 *    }
	 * 
	 * 4. In YourModule.Build.cs, add "WonderscapeCreationsGASAlly" to PublicDependencyModuleNames.
	 * 
	 * 5. In YourPlugin.uplugin, add the dependency to the plugins section or you will get a warning
	 *    {
   *         "Name": "WonderscapeCreationsGASAlly",
   *         "Enabled": true
   *     }
	 *
	 * Check this box ONLY after implementing ALL of the above code.
	 */

Step by Step Instructions

First, you need to go to the CORRECT build.cs file. If you or someone in your team manages your C++ files and has created their own Attribute Sets then the one line of code needs to be added in either the projects build.cs file or the module build.cs file if their Attribute Set is part of a module. If you are using something like Narrative Pro or Ascent Combat Framework Ultimate then you would add it to their plugins build.cs. Below is AN EXAMPLE of what it would look like once added to your build.cs file

// Copyright Your Company. All Rights Reserved.

using UnrealBuildTool;

public class YourModule : ModuleRules
{
	public YourModule(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] 
		{ 
			"Core", 
			"CoreUObject", 
			"Engine", 
			"InputCore",
			"GameplayAbilities",
			"GameplayTags",
			"GameplayTasks",
			// ============================================================================
			// Add WonderscapeCreationsGASAlly to module dependencies
			// This allows access to UWCGASAttributePoolHelper and other plugin classes
			// ============================================================================
			"WonderscapeCreationsGASAlly"
		});

		PrivateDependencyModuleNames.AddRange(new string[] { });
	}
}

Next, open up the .uplugin file of the plugin to which you have added these public dependency modules and add it in there as well to the plugins section. By doing this it will ensure that my plugin is always turned on when your plugin is on.

"Plugins": [
    {
       "Name": "WonderscapeCreationsGASAlly",
       "Enabled": true
    }

Next, open up your Attribute Sets header file. You will know it is the header file because itll say YourAttributeSet.h. You will want to make sure it has the functions in the example below already made in the .h. If they are already in there then you do NOT need to readd them.

// Copyright Your Company. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"

// ============================================================================
// Include the WCGASAlly helper class
// This provides access to all plugin features (clamping, events, meta attributes)
// ============================================================================
#include "Attributes/WCGASAttributePoolHelper.h"

#include "ExampleExternalAttributeSet.generated.h"

/**
 * Example AttributeSet showing WCGASAlly plugin integration.
 * 
 * This AttributeSet demonstrates the MINIMUM code required to enable:
 * - Dynamic clamping (e.g., Health ≤ MaxHealth)
 * - Absolute max caps (e.g., CritChance ≤ 100%)
 * - Meta attribute validation and reset
 * - Zero event broadcasting (death/depletion)
 * - Threshold event broadcasting (low health warnings)
 * - Attribute value change broadcasting
 * - Event subsystem integration
 * 
 * NO ATTRIBUTES ARE DEFINED IN THIS EXAMPLE - it is purely a template.
 * Add your FGameplayAttributeData properties here as needed.
 */
UCLASS()
class YOURMODULE_API UExampleExternalAttributeSet : public UAttributeSet
{
	GENERATED_BODY()
	
public:
	//~ UAttributeSet Interface
	// ========================================================================

	// ============================================================================
	// Declare PreAttributeChange override
	// This function is called BEFORE an attribute value changes.
	// The helper handles plugin features like min/max clamping.
	// ============================================================================
	virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;

	// ============================================================================
	// Declare PostGameplayEffectExecute override
	// This function is called AFTER a gameplay effect modifies an attribute.
	// The helper handles meta attributes, absolute caps, and event broadcasting.
	// ============================================================================
	virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;

Lastly, go into your .cpp file and find or make the implementations of the functions confirmed or declared in the previous step.

// Copyright Your Company. All Rights Reserved.

#include "ExampleExternalAttributeSet.h"
#include "Net/UnrealNetwork.h"

// ============================================================================
// Implement PreAttributeChange
// ============================================================================
void UExampleExternalAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
	// Always call Super first to maintain parent class behavior
	Super::PreAttributeChange(Attribute, NewValue);
	
	// ============================================================================
	// CRITICAL: Call the WCGASAlly helper to enable plugin features
	// This single line provides:
	// - Dynamic clamping based on Attribute Definitions
	// - Minimum value enforcement (≥ 0 if configured)
	// - Attribute value change event broadcasting
	// ============================================================================
	UWCGASAttributePoolHelper::HandlePreAttributeChange(this, Attribute, NewValue);
}

// ============================================================================
// Implement PostGameplayEffectExecute
// ============================================================================
void UExampleExternalAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
	// Always call Super first to maintain parent class behavior
	Super::PostGameplayEffectExecute(Data);
	
	// ============================================================================
	// CRITICAL: Call the WCGASAlly helper to enable plugin features
	// This single line provides:
	// - Meta attribute validation and reset (meta attributes auto-reset to 0)
	// - Base value clamping (≥ 0, ≤ max if configured)
	// - Current value clamping (≥ 0, ≤ max if configured)
	// - Absolute max cap enforcement
	// - Zero event broadcasting (e.g., Health reaches 0)
	// - Threshold event broadcasting (e.g., Health below 25%)
	// ============================================================================
	UWCGASAttributePoolHelper::HandlePostGameplayEffectExecute(this, Data);
}