Files
WizardingHub/Source/WizardingCentral/Characters/LumiCharacter.h
T
2024-09-10 08:20:07 -04:00

188 lines
6.2 KiB
C++

// Copyright Team Lumi. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "LumiStance.h"
#include "GameFramework/Character.h"
#include "Logging/LogMacros.h"
#include "LumiCharacter.generated.h"
class USpringArmComponent;
class UCameraComponent;
class UInputMappingContext;
class UInputAction;
struct FInputActionValue;
DECLARE_LOG_CATEGORY_EXTERN(LogLumiCharacter, Log, All);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FJumpDelegate);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FStanceChangedDelegate,
ELumiStance, OldStance,
ELumiStance, NewStance);
static const FString PlayerStanceEnumPath = TEXT("/Game/Player/E_PlayerStance");
UCLASS()
class WIZARDINGCENTRAL_API ALumiCharacter : public ACharacter
{
GENERATED_BODY()
// Private UPROPERTIE'S --------------------------------------------------------------------------------------------
/** Camera boom positioning the camera behind the character */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
USpringArmComponent* CameraBoom;
/** Follow camera */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
UCameraComponent* FollowCamera;
/** MappingContext */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputMappingContext* DefaultMappingContext;
/** Grab Input Action */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* GrabAction;
/** Jump Input Action */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* JumpAction;
/** Move Input Action */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* MoveAction;
/** Look Input Action */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* LookAction;
/** The default boom offset */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
FVector DefaultBoomOffset = FVector(0.0f, 60.0f, 30.0f);
/** The boom offset when aiming */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Camera, meta = (AllowPrivateAccess = "true"))
FVector AimBoomOffset = FVector(200.0f, 65.0f, 45.0f);
/** The current stance of the character */
UPROPERTY(BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
ELumiStance CurrentStance = ELumiStance::Default;
/** The stamina of the character */
UPROPERTY(BlueprintReadWrite, Category = "Stamina", meta = (AllowPrivateAccess = "true"))
double Stamina = 10.0;
UPROPERTY(BlueprintReadWrite, Category = "Stamina", meta = (AllowPrivateAccess = "true"))
double MaxStamina = 10.0;
protected:
// UFUNCTION's -----------------------------------------------------------------------------------------------------
/**
* Set the stance of the character
*
* @param NewStance The new stance to set
* @return The stance before the new stance was set
*/
UFUNCTION(BlueprintCallable, Category = "Stance")
ELumiStance SetCurrentStance(ELumiStance NewStance);
/**
* Event called when the character switches to the default stance
*/
UFUNCTION(BlueprintNativeEvent, Category = "Stance")
void OnDefaultStance();
/**
* Event called when the character switches to the magic stance
*/
UFUNCTION(BlueprintNativeEvent, Category = "Stance")
void OnMagicStance();
/**
* Check if the character has jumped the maximum number of times
*
* @return True if the character cannot jump anymore, false otherwise
*/
UFUNCTION(BlueprintPure, Category = "LumiCharacter")
bool IsLastJump();
public:
// Public Virtual Functions ----------------------------------------------------------------------------------------
// Called every frame
// virtual void Tick(float DeltaTime) override;
/**
* Called to bind functionality to input
* @param PlayerInputComponent The input component to bind to
*/
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected:
// Protected Virtual Functions -------------------------------------------------------------------------------------
/**
* Called when the game starts or when spawned
*/
virtual void BeginPlay() override;
public:
// Public Functions ------------------------------------------------------------------------------------------------
/**
* Sets default values for this character's properties
*/
ALumiCharacter();
/**
* Getter for @property CurrentStance
*
* @return The current stance of the character
*/
ELumiStance GetCurrentStance() const;
private:
// Private Functions -----------------------------------------------------------------------------------------------
// Grab
/**
* Callback for when the grab action is triggered
* @param Value The value of the input action
*/
void OnGrabActionTriggered(const FInputActionValue& Value);
// Jump
/**
* Callback for when the jump action is started
* @param Value The value of the input action
*/
void OnJumpActionStarted(const FInputActionValue& Value);
/**
* Callback for when the jump action is ongoing
* @param Value The value of the input action
*/
void OnJumpActionOngoing(const FInputActionValue& Value);
/**
* Callback for when the jump action is completed
* @param Value The value of the input action
*/
void OnJumpActionCompleted(const FInputActionValue& Value);
// Move
/**
* Callback for when the move action is triggered
* @param Value The value of the input action
*/
void OnMoveActionTriggered(const FInputActionValue& Value);
// Look
/**
* Callback for when the look action is triggered
* @param Value The value of the input action
*/
void OnLookActionTriggered(const FInputActionValue& Value);
public:
// Delegates -------------------------------------------------------------------------------------------------------
UPROPERTY(BlueprintAssignable, Category = "Input")
FJumpDelegate OnJumpStarted;
UPROPERTY(BlueprintAssignable, Category = "Stance")
FStanceChangedDelegate OnStanceChanged;
};