// Project Lab - NHTV Igad #include "UnrealProject.h" #include "EnemyAIController.h" #include "EnemyBase.h" #include "NetworkCharacter.h" #include "Navigation/CrowdFollowingComponent.h" #include "BehaviorTree/BehaviorTree.h" #include "BehaviorTree/BlackboardComponent.h" #include "BehaviorTree/BehaviorTreeComponent.h" #include "BehaviorTree/BlackBoard/BlackboardKeyAllTypes.h" #include "DrawDebugHelpers.h" AEnemyAIController::AEnemyAIController(const FObjectInitializer& PCIP) //: Super(PCIP.SetDefaultSubobjectClass(TEXT("PathFollowingComponent"))) { blackBoardComp = CreateDefaultSubobject(FName("BlackBoardComp")); behaviorTreeComp = CreateDefaultSubobject(FName("BehaviorTreeComp")); climbSpeed = 1.0f; } void AEnemyAIController::Tick(float deltaTime) { Super::Tick(deltaTime); } void AEnemyAIController::Possess(APawn* pawn) { Super::Possess(pawn); AEnemyBase* enemy = Cast(pawn); if (enemy &&enemy->treeBehavior) { if (!enemy->treeBehavior->BlackboardAsset) { RERROR("There is no blackboard asset in the behavior tree"); return; } blackBoardComp->InitializeBlackboard(*(enemy->treeBehavior->BlackboardAsset)); behaviorTreeComp->StartTree(*enemy->treeBehavior); } } bool AEnemyAIController::VerticleMoveTo(FVector destination, FVector direction,float acceptRadius) { FVector location =GetPawn()->GetActorLocation(); FVector dest = destination; dest -= location; dest *= direction; FVector newDest= dest; float height = newDest.Size(); if (height < acceptRadius&&destination.Z GetCharacterMovement()->GravityScale = 1; return true; } GetPawn()->SetActorLocation(FVector(location.X+(direction.X*10), location.Y+(direction.Y*10) , (location.Z)+(direction.Z*10))); GetCharacter()->GetCharacterMovement()->GravityScale = 0; return false; } bool AEnemyAIController::JumpFence(FVector destination) { TArray result; UNavigationSystem* navsys = UNavigationSystem::GetCurrent(GetWorld()); if (!navsys) { RERROR("There is no navigation system in the current level, please check if there is one or contact a developer!"); return false; } ANPCBase* character = Cast(GetPawn()); FVector direction; FNavLocation navLocation; character->SetActorEnableCollision(false); DrawDebugLine(GetWorld(), GetPawn()->GetActorLocation(), GetPawn()->GetActorLocation() + GetActorUpVector()*-10000.0f, FColor(255, 0, 0),false, -1, 0, 12.333); FCollisionQueryParams collisionParams; collisionParams.AddIgnoredActor(this->GetPawn()); GetWorld()->LineTraceMultiByChannel(result, GetPawn()->GetActorLocation(), GetPawn()->GetActorLocation() + GetActorUpVector()*-10000.0f, ECollisionChannel::ECC_WorldStatic, collisionParams); for (int i = 0; i < result.Num(); i++) { if(result[i].ImpactPoint!=GetPawn()->GetActorLocation()) { if (!navsys->ProjectPointToNavigation(GetPawn()->GetActorLocation(), navLocation)) { continue; } GetCharacter()->GetCharacterMovement()->GravityScale = 1; SetBool(false,FName("ClimbKey")); navsys->SimpleMoveToLocation(this,destination); character->PlayNormalAnimation(); character->SetActorEnableCollision(true); return true; } } character->PlayFencAnimation(); direction = destination - GetPawn()->GetActorLocation(); direction.Normalize(); GetPawn()->SetActorLocation(GetPawn()->GetActorLocation()+(direction * 10)); return false; } void AEnemyAIController::BeginInactiveState() { Super::BeginInactiveState(); } void AEnemyAIController::SetVector(FVector vector, FName name) { if (blackBoardComp) { blackBoardComp->SetValueAsVector(name, (vector)); } } void AEnemyAIController::SetBool(bool boolean, FName name) { if (blackBoardComp) { blackBoardComp->SetValueAsBool(name, (boolean)); } } void AEnemyAIController::SetTarget(ANetworkCharacter* player) { if (blackBoardComp) { blackBoardComp->SetValueAsObject((FName("Target")), (player)); } } ANetworkCharacter* AEnemyAIController::GetTarget() { if (blackBoardComp) { return Cast(blackBoardComp->GetValue(FName("Target"))); } return nullptr; } FVector AEnemyAIController::GetLocationTarget() { if (blackBoardComp) { return FVector(blackBoardComp->GetValue(FName("TargetLocation"))); } return FVector(); } FVector AEnemyAIController::GetHomeLocation() { if (blackBoardComp) { return FVector(blackBoardComp->GetValue(FName("HomeLocation"))); } return FVector(); } FVector AEnemyAIController::GetSelfLocation() { if (blackBoardComp) { return FVector(blackBoardComp->GetValue(FName("SelfLocation"))); } return FVector(); } bool AEnemyAIController::GetClimbKey() { if (blackBoardComp) { return blackBoardComp->GetValue((FName("ClimbKey"))); } else return false; }