diff --git a/Content/Blueprints/Game/BP_AuraGM.uasset b/Content/Blueprints/Game/BP_AuraGM.uasset index 9e02123..6fa6291 100644 --- a/Content/Blueprints/Game/BP_AuraGM.uasset +++ b/Content/Blueprints/Game/BP_AuraGM.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40148c89967cabfd4ec8554ebd605fdf76bbe9bc2230f5b157f8055cc55eb918 -size 19806 +oid sha256:1e73577c8a29e54c4f08cf2d5b6577c1e1bb68a392d905a3a9161051e00bbb82 +size 20000 diff --git a/Content/Blueprints/UI/HUD/BP_AuraHUD.uasset b/Content/Blueprints/UI/HUD/BP_AuraHUD.uasset new file mode 100644 index 0000000..68ddfe4 --- /dev/null +++ b/Content/Blueprints/UI/HUD/BP_AuraHUD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43844941eb2d4434a1578133cbde02ea7d6f1c369abb07d48af94b521358d8b7 +size 22616 diff --git a/Source/Aura/Private/Character/AuraCharacter.cpp b/Source/Aura/Private/Character/AuraCharacter.cpp index 407b737..d317413 100644 --- a/Source/Aura/Private/Character/AuraCharacter.cpp +++ b/Source/Aura/Private/Character/AuraCharacter.cpp @@ -7,7 +7,9 @@ #include "Camera/CameraComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "GameFramework/SpringArmComponent.h" +#include "Player/AuraPlayerController.h" #include "Player/AuraPlayerState.h" +#include "UI/HUD/AuraHUD.h" AAuraCharacter::AAuraCharacter() { @@ -36,6 +38,8 @@ void AAuraCharacter::PossessedBy(AController* NewController) // Init ability actor info for the Server InitAbilityActorInfo(); + + InitHUD(); } void AAuraCharacter::OnRep_PlayerState() @@ -44,6 +48,8 @@ void AAuraCharacter::OnRep_PlayerState() // Init ability actor info for the Client InitAbilityActorInfo(); + + InitHUD(); } void AAuraCharacter::InitAbilityActorInfo() @@ -55,3 +61,13 @@ void AAuraCharacter::InitAbilityActorInfo() AttributeSet = AuraPlayerState->GetAttributeSet(); } +void AAuraCharacter::InitHUD() const +{ + const auto AuraPlayerState = GetPlayerState(); + check(AuraPlayerState); + + if(const auto AuraPlayerController = Cast(GetController())) + if(const auto HUD = Cast(AuraPlayerController->GetHUD())) + HUD->InitOverlay(AuraPlayerController, AuraPlayerState, AbilitySystemComponent, AttributeSet); +} + diff --git a/Source/Aura/Private/Player/AuraPlayerController.cpp b/Source/Aura/Private/Player/AuraPlayerController.cpp index aca1817..ec6e17b 100644 --- a/Source/Aura/Private/Player/AuraPlayerController.cpp +++ b/Source/Aura/Private/Player/AuraPlayerController.cpp @@ -23,9 +23,8 @@ void AAuraPlayerController::BeginPlay() Super::BeginPlay(); check(AuraContext); - UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer()); - check(Subsystem); - Subsystem->AddMappingContext(AuraContext, 0); + if(UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + Subsystem->AddMappingContext(AuraContext, 0); bShowMouseCursor = true; DefaultMouseCursor = EMouseCursor::Default; diff --git a/Source/Aura/Private/UI/HUD/AuraHUD.cpp b/Source/Aura/Private/UI/HUD/AuraHUD.cpp new file mode 100644 index 0000000..e56b792 --- /dev/null +++ b/Source/Aura/Private/UI/HUD/AuraHUD.cpp @@ -0,0 +1,35 @@ +// Assets provided by DruidMechanics. Copyright Jonathan Rampersad 2024 + + +#include "UI/HUD/AuraHUD.h" + +#include "UI/Widget/AuraUserWidget.h" +#include "Blueprint/UserWidget.h" +#include "UI/WidgetController/OverlayWidgetController.h" + +UOverlayWidgetController* AAuraHUD::GetOverlayWidgetController(const FWidgetControllerParams& WCParams) +{ + if (OverlayWidgetController != nullptr) return OverlayWidgetController; + + OverlayWidgetController = NewObject(this, OverlayWidgetControllerClass); + OverlayWidgetController->SetWidgetControllerParams(WCParams); + + return OverlayWidgetController; +} + +void AAuraHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS) +{ + checkf(OverlayWidgetClass, TEXT("Overlay Widget Class uninitialized, please fill out BP_AuraHUD")) + checkf(OverlayWidgetControllerClass, TEXT("Overlay Widget Controller Class uninitialized, please fill out BP_AuraHUD")) + + UUserWidget* Widget = CreateWidget(GetWorld(), OverlayWidgetClass); + OverlayWidget = Cast(Widget); + + const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS); + const auto WidgetController = GetOverlayWidgetController(WidgetControllerParams); + + OverlayWidget->SetWidgetController(WidgetController); + + Widget->AddToViewport(); +} + diff --git a/Source/Aura/Private/UI/WidgetController/AuraWidgetController.cpp b/Source/Aura/Private/UI/WidgetController/AuraWidgetController.cpp index a977c2d..649138c 100644 --- a/Source/Aura/Private/UI/WidgetController/AuraWidgetController.cpp +++ b/Source/Aura/Private/UI/WidgetController/AuraWidgetController.cpp @@ -3,3 +3,10 @@ #include "UI/WidgetController/AuraWidgetController.h" +void UAuraWidgetController::SetWidgetControllerParams(const FWidgetControllerParams& Params) +{ + PlayerController = Params.PlayerController; + PlayerState = Params.PlayerState; + AbilitySystemComponent = Params.AbilitySystemComponent; + AttributeSet = Params.AttributeSet; +} diff --git a/Source/Aura/Private/UI/WidgetController/OverlayWidgetController.cpp b/Source/Aura/Private/UI/WidgetController/OverlayWidgetController.cpp new file mode 100644 index 0000000..a72aeda --- /dev/null +++ b/Source/Aura/Private/UI/WidgetController/OverlayWidgetController.cpp @@ -0,0 +1,5 @@ +// Assets provided by DruidMechanics. Copyright Jonathan Rampersad 2024 + + +#include "UI/WidgetController/OverlayWidgetController.h" + diff --git a/Source/Aura/Public/Character/AuraCharacter.h b/Source/Aura/Public/Character/AuraCharacter.h index 47a21d1..77a5201 100644 --- a/Source/Aura/Public/Character/AuraCharacter.h +++ b/Source/Aura/Public/Character/AuraCharacter.h @@ -31,4 +31,6 @@ public: private: void InitAbilityActorInfo(); + + void InitHUD() const; }; diff --git a/Source/Aura/Public/UI/HUD/AuraHUD.h b/Source/Aura/Public/UI/HUD/AuraHUD.h new file mode 100644 index 0000000..c1a63eb --- /dev/null +++ b/Source/Aura/Public/UI/HUD/AuraHUD.h @@ -0,0 +1,39 @@ +// Assets provided by DruidMechanics. Copyright Jonathan Rampersad 2024 + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/HUD.h" +#include "AuraHUD.generated.h" + +class UAttributeSet; +class UAbilitySystemComponent; +struct FWidgetControllerParams; +class UOverlayWidgetController; +class UAuraUserWidget; +/** + * + */ +UCLASS() +class AURA_API AAuraHUD : public AHUD +{ + GENERATED_BODY() + +public: + UPROPERTY() + TObjectPtr OverlayWidget; + + UOverlayWidgetController* GetOverlayWidgetController(const FWidgetControllerParams& WCParams); + + void InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS); + +private: + UPROPERTY(EditAnywhere) + TSubclassOf OverlayWidgetClass; + + UPROPERTY() + TObjectPtr OverlayWidgetController; + + UPROPERTY(EditAnywhere) + TSubclassOf OverlayWidgetControllerClass; +}; diff --git a/Source/Aura/Public/UI/WidgetController/AuraWidgetController.h b/Source/Aura/Public/UI/WidgetController/AuraWidgetController.h index 62e6771..e4a1c13 100644 --- a/Source/Aura/Public/UI/WidgetController/AuraWidgetController.h +++ b/Source/Aura/Public/UI/WidgetController/AuraWidgetController.h @@ -3,11 +3,36 @@ #pragma once #include "CoreMinimal.h" +#include "AbilitySystemComponent.h" #include "UObject/NoExportTypes.h" #include "AuraWidgetController.generated.h" class UAttributeSet; class UAbilitySystemComponent; + +USTRUCT(BlueprintType) +struct FWidgetControllerParams +{ + GENERATED_BODY() + + FWidgetControllerParams() {} + FWidgetControllerParams(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS) + : PlayerController(PC), PlayerState(PS), AbilitySystemComponent(ASC), AttributeSet(AS) + {} + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TObjectPtr PlayerController = nullptr; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TObjectPtr PlayerState = nullptr; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TObjectPtr AbilitySystemComponent = nullptr; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TObjectPtr AttributeSet = nullptr; +}; + /** * */ @@ -16,6 +41,10 @@ class AURA_API UAuraWidgetController : public UObject { GENERATED_BODY() +public: + UFUNCTION(BlueprintCallable) + void SetWidgetControllerParams(const FWidgetControllerParams& Params); + protected: UPROPERTY(BlueprintReadOnly, Category="WidgetController") TObjectPtr PlayerController; diff --git a/Source/Aura/Public/UI/WidgetController/OverlayWidgetController.h b/Source/Aura/Public/UI/WidgetController/OverlayWidgetController.h new file mode 100644 index 0000000..46a34ce --- /dev/null +++ b/Source/Aura/Public/UI/WidgetController/OverlayWidgetController.h @@ -0,0 +1,17 @@ +// Assets provided by DruidMechanics. Copyright Jonathan Rampersad 2024 + +#pragma once + +#include "CoreMinimal.h" +#include "UI/WidgetController/AuraWidgetController.h" +#include "OverlayWidgetController.generated.h" + +/** + * + */ +UCLASS() +class AURA_API UOverlayWidgetController : public UAuraWidgetController +{ + GENERATED_BODY() + +};