diff --git a/Source/Nakatomi/GetDistanceToPlayerTask.cpp b/Source/Nakatomi/GetDistanceToPlayerTask.cpp new file mode 100644 index 0000000..de5ead0 --- /dev/null +++ b/Source/Nakatomi/GetDistanceToPlayerTask.cpp @@ -0,0 +1,39 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "GetDistanceToPlayerTask.h" +#include "EnemyAIController.h" +#include "DemolitionCharacter.h" + +UGetDistanceToPlayerTask::UGetDistanceToPlayerTask() +{ +} + +EBTNodeResult::Type UGetDistanceToPlayerTask::ExecuteTask(UBehaviorTreeComponent& owner, uint8* memory) +{ + auto enemyController = Cast(owner.GetAIOwner()); + auto enemyPawn = Cast(enemyController->GetPawn()); + + if (!enemyPawn || enemyPawn->GetHealthComponent()->GetIsDead()) + { + return EBTNodeResult::Failed; + } + + auto blackboardComponent = owner.GetBlackboardComponent(); + auto playerCharacter = Cast(blackboardComponent->GetValueAsObject(TargetActor.SelectedKeyName)); + auto distance = FVector::Distance(enemyPawn->GetActorLocation(), playerCharacter->GetActorLocation()); + + if (distance < DistanceThreshold) + { + enemyPawn->Explode(); + enemyPawn->GetHealthComponent()->TakeDamage(enemyPawn, enemyPawn->GetHealthComponent()->GetMaxHealth(), nullptr, nullptr, nullptr); + return EBTNodeResult::Succeeded; + } + + return EBTNodeResult::Failed; +} + +EBTNodeResult::Type UGetDistanceToPlayerTask::AbortTask(UBehaviorTreeComponent& owner, uint8* memory) +{ + return EBTNodeResult::Aborted; +} diff --git a/Source/Nakatomi/GetDistanceToPlayerTask.h b/Source/Nakatomi/GetDistanceToPlayerTask.h new file mode 100644 index 0000000..f7473b8 --- /dev/null +++ b/Source/Nakatomi/GetDistanceToPlayerTask.h @@ -0,0 +1,36 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/BTTaskNode.h" +#include "GetDistanceToPlayerTask.generated.h" + +/** + * + */ +UCLASS() +class NAKATOMI_API UGetDistanceToPlayerTask : public UBTTaskNode +{ + GENERATED_BODY() +private: + + UPROPERTY() + UBehaviorTreeComponent* behaviourTreeOwner = nullptr; + + UPROPERTY(EditAnywhere, Meta = (AllowPrivateAccess = "true")) + FBlackboardKeySelector TargetActor; + + UPROPERTY(EditAnywhere, Meta = (AllowPrivateAccess = "true")) + float DistanceThreshold = 5.0f; + +public: + + UGetDistanceToPlayerTask(); + + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& owner, uint8* memory) override; + + virtual EBTNodeResult::Type AbortTask(UBehaviorTreeComponent& owner, uint8* memory) override; + + +};