ProjectM/Source/ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h

170 lines
6.3 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "ProjectT/Data/Gen/GenerateEnumSkillTypes.h"
#include "ProjectT/Data/Npc/NpcDataModel.h"
#include "ProjectT/System/Core/Characters/NPC/CoreNpc.h"
#include "ProjectT/System/Core/Interfaces/AISettings.h"
#include "ProjectT/System/Core/Interfaces/DebugHitCollision.h"
#include "SPNpcAgent.generated.h"
enum class ENpcNormalAnimState : uint8;
enum class ENpcAgentAnimType : uint8;
UCLASS()
class PROJECTT_API ASPNpcAgent : public ACoreNpc, public IAISettings, public IDebugHitCollision
{
GENERATED_BODY()
public:
ASPNpcAgent();
virtual void PostInitializeComponents() override;
virtual void Tick(float DeltaTime) override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
virtual bool GetUseSight_Implementation() override;
virtual bool GetUseHearing_Implementation() override;
virtual FSightInfo GetSightInfo_Implementation() override;
virtual UBlackboardData* GetBlackboardData_Implementation() override;
virtual UBehaviorTree* GetBehaviorTree_Implementation() override;
virtual void DetectTargetBySight_Implementation(AActor* InTarget, FAIStimulus InStimulus) override;
virtual void ForgetTarget_Implementation(AActor* InTarget) override;
virtual FTransform GetViewTransform_Implementation() override;
virtual void ApplyDamageEvent_Implementation(AActor* InOccurActor, const FVector& InOriginLocation, const float InDamage, const TArray<FEffect>& InSkillEffects) override;
virtual void ApplyRecoveryEvent_Implementation(const TArray<FEffect>& InReleaseEffects) override;
virtual void StartDisableNpc() override;
virtual void CompleteDisableNpc() override;
virtual void ChangeNpcState(const ENpcState InState) override;
virtual void ActivateCharacter(const bool InbEnable) override;
virtual void SetDetectTargetFromNoise(AActor* InTarget) override;
virtual void SetDetectLocationFromNoise(const FVector& InTargetLocation) override;
virtual void SetVisionMode(EVisionMode InVisionMode) override;
virtual void ChangeDoubtState(const EDoubtState InDoubtState) override;
UFUNCTION(BlueprintPure)
class USPNpcAgentAnimInstance* GetAgentAnimInstance() const;
UFUNCTION(BlueprintCallable)
void ChangeSpeed(const ENpcSpeedType InSpeed, const bool InbStopImmediately = false);
UFUNCTION()
void FinishCheckInChaseRange();
FORCEINLINE bool CanRotateWhileAttack() const { return bRotateWhileAttack; }
class ACoreSkill* GetCurrentSkill() const;
class AAIPerceptionController* GetAIPerceptionController() const;
bool IsFinishSkillCoolDown() const;
bool IsTargetInAttackRange(const AActor* InTarget) const;
void GetSkillClass(TSubclassOf<AActor>& OutSkillClass) const;
void PlayActionMontage(FName InSectionName, FOnMontageBlendingOutStarted InEndedFunction = nullptr);
void StopSkillActionMontage();
void TryAttack();
bool ShouldContinueAttack() const;
void DetermineNextStateAfterAbnormal();
void SetCurrentUsingSkill(class ACoreSkill* InSkill);
void FinishCurrentSkill();
void SetSkillCoolTime(const float InCoolTime);
protected:
virtual void BeginPlay() override;
virtual void InitializeStatus(const FEnemyNpc InNpcStatus) override;
virtual void InitializeProperty() override;
virtual void Respawn() override;
virtual void ExecuteClickedEvent(UPrimitiveComponent* InTouchedComponent, FKey InButtonPressed) override;
virtual void ExecuteBeginCursorOverEvent(UPrimitiveComponent* InTouchedComponent) override;
virtual void ExecuteEndCursorOverEvent(UPrimitiveComponent* InTouchedComponent) override;
virtual void ResetStateAfterGameEnd() override;
virtual void SetUnDetectTarget(const bool InbUnDetect) override;
void InitializeMaterials();
void StatusSlow(float InSlowValue, bool InbRecovery = false);
void StatusFast(float InFastValue, bool InbRecovery = false);
#if WITH_EDITOR
virtual void ApplyCharacterData(const FTableRowBase* RowData) override;
#endif
UFUNCTION()
void ContinueAttack();
UFUNCTION()
void TryFinishAttack();
UFUNCTION()
void FinishAttack();
void RelocateOnNavMesh();
void CheckTargetInChaseRange();
void UpdateSkillCooldown(const float InDeltaSeconds);
void JumpBack(const FVector& InTargetLocation);
void CheckFallingFromJumpBack();
void StartCheckInChaseRange();
void SetSkillClass();
void ClearSkillCoolTime();
void StartAttack();
void UpdateDissolve(const float InDeltaSeconds);
void UpdateVisionLineLength();
void NotifyVisionDetection(const bool InbDetect);
public:
virtual void ShowVisual_Implementation() override;
virtual void HideVisual_Implementation() override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AISetting")
FCrowdSettingsInfo CrowdSettingsInfo;
uint8 bAttack : 1;
protected:
ENpcSpeedType CurrentSpeed;
ESkillTypes SkillType;
FString ActionMontageSectionName;
FName ChaseRangeProfileName;
FName DissolveParameterName;
float SkillCoolTime;
float DissolveElapsedTime;
float DissolveDuration;
uint8 bRotateWhileAttack : 1;
uint8 bSkillCooldownActive : 1;
uint8 bDissolving : 1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
TObjectPtr<class UWidgetComponent> HpBarWidgetComponent;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component")
TObjectPtr<class UWidgetComponent> DetectIndicatorWidget;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component")
TObjectPtr<class UObstacleFilterComponent> SphereChaseRangeComponent;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Component")
TObjectPtr<class UNiagaraComponent> DissolveFXComponent;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
TObjectPtr<class UStaticMeshComponent> VisionLineMeshComponent;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill")
TSubclassOf<class ACoreSkill> NpcSkillClass;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Skill")
TObjectPtr<class ACoreSkill> CurrentUsingSkill;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Animation")
TObjectPtr<class USPNpcAgentAnimInstance> AgentAnimInstance;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Animation")
TObjectPtr<class UAnimMontage> NpcActionMontage;
UPROPERTY()
FTimerHandle CheckChaseRangeTimerHandle;
UPROPERTY()
FTimerHandle JumpBackTimerHandle;
UPROPERTY()
TArray<TObjectPtr<UMeshComponent>> AllMeshComponents;
};