using UnrealSharp.Engine; using UnrealSharp.Attributes; using UnrealSharp.BusyRabbit; using UnrealSharp.GameplayAbilities; using UnrealSharp; using UnrealSharp.CoreUObject; namespace UI.Level.Controllers; [UMultiDelegate] public delegate void OnUIAttributeChange(FName AttributeName, float NewValue, float OldValue); [UClass] public class UBusyRoleStateController : UPW_UIController { [UProperty()] public TMulticastDelegate OnAttributeChangeDelegate { get; set; } protected override void OnUIControllerInitialized() { if (UGameplayStatics.GetPlayerController(0) is ALevelPlayerController PC) { ABusyPlayerRole Role = PC.ControlledRole; if (AbilitySystemLibrary.GetAbilitySystemComponent(Role) is UBusyAbilitySystemComponent ASC) { RegisterAttributeListener(ASC, "Health"); RegisterAttributeListener(ASC, "Hunger"); } } } public float GetControlledAttribute(FName AttributeName) { if (UGameplayStatics.GetPlayerController(0) is ALevelPlayerController PC) { ABusyPlayerRole Role = PC.ControlledRole; if (AbilitySystemLibrary.GetAbilitySystemComponent(Role) is UBusyAbilitySystemComponent ASC) { FGameplayAttribute Attribute = UBusyAscLibrary.GetAttribute(Role.Attributes, AttributeName); return ASC.GetGameplayAttributeValue(Attribute, out bool IsFound); } } return 0; } public float GetRoleAttribute(ABusyPawnBase Pawn, FName Attribute) { return 0; } protected void RegisterAttributeListener(UBusyAbilitySystemComponent ASC, FName AttributeName) { TDelegate Delegate = new TDelegate(); Delegate.BindUFunction(this, "OnAttributeChange"); ASC.BindEventToAttributeChange(typeof(UBusyPlayerRoleAttributeSet), AttributeName, Delegate); } [UFunction()] protected void OnAttributeChange(FName AttributeName, float NewValue, float OldValue) { OnAttributeChangeDelegate.Invoke(AttributeName, NewValue, OldValue); } protected override void OnUIControllerDestroy() { base.OnUIControllerDestroy(); } }