#pragma once

#include "CoreMinimal.h"
#include "KillerAbilityComponent.h"
#include "Templates/SubclassOf.h"
#include "EAttackSubstate.h"
#include "K37WolfAbility.generated.h"

class UK37WolfBiteAttack;
class UK37ChargeChainedPounceAttackInteraction;
class UK37AdjustChainedPounceAttackInteraction;
class UK37SurvivorScentTrailParticleSpawner;
class UK37WolfBiteAttackData;
class ASurvivor;

UCLASS(Blueprintable, EditInlineNew, meta=(BlueprintSpawnableComponent))
class THEK37_API UK37WolfAbility : public UKillerAbilityComponent
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UK37WolfBiteAttack> _wolfBiteAttackClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UK37ChargeChainedPounceAttackInteraction> _chainedPounceAttackInteractionClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UK37AdjustChainedPounceAttackInteraction> _adjustPounceAttackInteractionClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UK37SurvivorScentTrailParticleSpawner> _survivorScentTrailParticleSpawnerClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TArray<UK37WolfBiteAttackData*> _chainedWolfBitesData;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, Instanced, meta=(AllowPrivateAccess=true))
	UK37ChargeChainedPounceAttackInteraction* _chainedPounceAttackInteraction;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, Instanced, meta=(AllowPrivateAccess=true))
	UK37AdjustChainedPounceAttackInteraction* _adjustPounceAttackInteraction;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing=OnRep_WolfBiteAttack, Instanced, meta=(AllowPrivateAccess=true))
	UK37WolfBiteAttack* _wolfBiteAttack;

	UPROPERTY(EditAnywhere, Replicated)
	TArray<TWeakObjectPtr<ASurvivor>> _trackedSurvivors;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Replicated, meta=(AllowPrivateAccess=true))
	int32 _completedConsecutiveChainedBitesCount;

private:
	UFUNCTION(BlueprintCallable)
	void OnRep_WolfBiteAttack();

	UFUNCTION(BlueprintCallable)
	void OnAttackSubstateChanged(EAttackSubstate substate);

public:
	virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

public:
	UK37WolfAbility();
};

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