// 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& InSkillEffects) override; virtual void ApplyRecoveryEvent_Implementation(const TArray& 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& 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 HpBarWidgetComponent; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component") TObjectPtr DetectIndicatorWidget; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component") TObjectPtr SphereChaseRangeComponent; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Component") TObjectPtr DissolveFXComponent; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component") TObjectPtr VisionLineMeshComponent; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") TSubclassOf NpcSkillClass; UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Skill") TObjectPtr CurrentUsingSkill; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Animation") TObjectPtr AgentAnimInstance; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Animation") TObjectPtr NpcActionMontage; UPROPERTY() FTimerHandle CheckChaseRangeTimerHandle; UPROPERTY() FTimerHandle JumpBackTimerHandle; UPROPERTY() TArray> AllMeshComponents; };