#pragma once

#include "CoreMinimal.h"
#include "BaseHusk.h"
#include "AnimationMontageDescriptor.h"
#include "UObject/NoExportTypes.h"
#include "K41BodyHusk.generated.h"

class UK41BodyHuskMovementComponent;
class UCapsuleComponent;
class UMontagePlayer;
class UFloatValueStrategy;

UCLASS(Blueprintable)
class THEK41_API AK41BodyHusk : public ABaseHusk
{
	GENERATED_BODY()

protected:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	UK41BodyHuskMovementComponent* _bodyHuskMovementComponent;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	UCapsuleComponent* _capsuleComponent;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	UMontagePlayer* _montagePlayer;

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _timeBeforeDetachingHusk;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UFloatValueStrategy* _spawnMushroomTimerDuration;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FAnimationMontageDescriptor _moriMontage;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _timeAllowedToBePushedByPalletAfterDetachingFromKiller;

protected:
	UFUNCTION(BlueprintCallable)
	void DeactivateHusk();

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnHuskDetachedFromKiller();

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnHuskActivated(const FVector& velocity);

public:
	AK41BodyHusk();
};

FORCEINLINE uint32 GetTypeHash(const AK41BodyHusk) { return 0; }
