diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.cpp index b258cb28..e56cd24d 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.cpp @@ -63,6 +63,14 @@ void AEnemyCharacter::EquipWeapon_Implementation() { } +void AEnemyCharacter::DeEquipWeapon_Implementation() +{ +} + +void AEnemyCharacter::SetFiring_Implementation(bool IsFiring) +{ +} + void AEnemyCharacter::HuntPlayer(FVector PlayerLastKnownLocation) { if (!IsValid(this)) return; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.h b/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.h index c0fccd40..0ffdeb80 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/AI/EnemyCharacter.h @@ -16,6 +16,8 @@ class ENDLESSVENDETTA_API AEnemyCharacter : public AAICharacter public: // Sets default values for this character's properties AEnemyCharacter(); + UPROPERTY(BlueprintReadWrite) + bool WeaponRaised = false; protected: // Called when the game starts or when spawned @@ -29,9 +31,16 @@ public: void SubscribeToGroupAIEvents(class AAIControlHub* ControlHub); void SetLocalAlertLevel(int NewAlertLevel) const; + //Animation Blueprint Triggers UFUNCTION(BlueprintNativeEvent) void EquipWeapon(); virtual void EquipWeapon_Implementation(); + UFUNCTION(BlueprintNativeEvent) + void DeEquipWeapon(); + virtual void DeEquipWeapon_Implementation(); + UFUNCTION(BlueprintNativeEvent) + void SetFiring(bool IsFiring); + virtual void SetFiring_Implementation(bool IsFiring); private: FDelegateHandle AlertLevelDelegateHandle; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.cpp new file mode 100644 index 00000000..d890b9ca --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.cpp @@ -0,0 +1,24 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "BTService_StopAttack.h" + +#include "EndlessVendetta/AI/AI_EnemyController.h" +#include "EndlessVendetta/AI/EnemyCharacter.h" + +UBTService_StopAttack::UBTService_StopAttack() +{ + NodeName = "Stop Attack"; +} + +void UBTService_StopAttack::OnBecomeRelevant(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + Super::OnBecomeRelevant(OwnerComp, NodeMemory); + if (const AAI_EnemyController* const EnemyController = Cast(OwnerComp.GetAIOwner())) + { + if (AEnemyCharacter* const EnemyCharacter = Cast(EnemyController->GetPawn())) + { + EnemyCharacter->SetFiring(false); + } + } +} diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.h b/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.h new file mode 100644 index 00000000..4c00aec2 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Services/BTService_StopAttack.h @@ -0,0 +1,20 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/Services/BTService_BlackboardBase.h" +#include "BTService_StopAttack.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API UBTService_StopAttack : public UBTService_BlackboardBase +{ + GENERATED_BODY() + +public: + UBTService_StopAttack(); + virtual void OnBecomeRelevant(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; +}; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_AttackPlayer.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_AttackPlayer.cpp index d7371066..779adfb6 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_AttackPlayer.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_AttackPlayer.cpp @@ -5,6 +5,7 @@ #include "EndlessVendetta/AI/AI_EnemyController.h" #include "BehaviorTree/BlackboardComponent.h" +#include "EndlessVendetta/AI/EnemyCharacter.h" UBTTask_AttackPlayer::UBTTask_AttackPlayer(FObjectInitializer const& ObjectInitializer) { @@ -21,8 +22,13 @@ EBTNodeResult::Type UBTTask_AttackPlayer::ExecuteTask(UBehaviorTreeComponent& Ow FVector const PlayerLocation = Blackboard->GetValueAsVector("TargetLocation"); DrawDebugLine(GetWorld(), Origin, PlayerLocation, FColor::Green, false, 1.f, 0, 1.f); - FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); - return EBTNodeResult::Succeeded; + if (AEnemyCharacter* const EnemyCharacter = Cast(AIController->GetPawn())) + { + EnemyCharacter->SetFiring(true); + + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } } } return EBTNodeResult::Failed; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.cpp new file mode 100644 index 00000000..a1da277f --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.cpp @@ -0,0 +1,32 @@ +// Fill out your copyright notice in the Description page of PrBTTask_LowerWeapon.h" + +#include "BTTask_LowerWeapon.h" +#include "EndlessVendetta/AI/AI_EnemyController.h" +#include "EndlessVendetta/AI/EnemyCharacter.h" + +UBTTask_LowerWeapon::UBTTask_LowerWeapon() +{ + NodeName = "Lower Weapon"; +} + +EBTNodeResult::Type UBTTask_LowerWeapon::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + if (const AAI_EnemyController* const AIEnemyController = Cast(OwnerComp.GetAIOwner())) + { + if (AEnemyCharacter* const EnemyCharacter = Cast(AIEnemyController->GetPawn())) + { + if (!EnemyCharacter->WeaponRaised) + { + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + EnemyCharacter->DeEquipWeapon(); + EnemyCharacter->WeaponRaised = false; + + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + } + + return EBTNodeResult::Failed; +} diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.h b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.h new file mode 100644 index 00000000..103692e7 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_LowerWeapon.h @@ -0,0 +1,21 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" +#include "BTTask_LowerWeapon.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API UBTTask_LowerWeapon : public UBTTask_BlackboardBase +{ + GENERATED_BODY() + +public: + UBTTask_LowerWeapon(); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; + +}; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.cpp new file mode 100644 index 00000000..39bf4684 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.cpp @@ -0,0 +1,34 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "BTTask_RaiseWeapon.h" +#include "EndlessVendetta/AI/AI_EnemyController.h" +#include "EndlessVendetta/AI/EnemyCharacter.h" + +UBTTask_RaiseWeapon::UBTTask_RaiseWeapon() +{ + NodeName = "Raise Weapon"; +} + +EBTNodeResult::Type UBTTask_RaiseWeapon::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + if (const AAI_EnemyController* const AIEnemyController = Cast(OwnerComp.GetAIOwner())) + { + if (AEnemyCharacter* const EnemyCharacter = Cast(AIEnemyController->GetPawn())) + { + if (EnemyCharacter->WeaponRaised) + { + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + + EnemyCharacter->EquipWeapon(); + EnemyCharacter->WeaponRaised = true; + + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + } + + return EBTNodeResult::Failed; +} diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.h b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.h new file mode 100644 index 00000000..4171f066 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_RaiseWeapon.h @@ -0,0 +1,20 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" +#include "BTTask_RaiseWeapon.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API UBTTask_RaiseWeapon : public UBTTask_BlackboardBase +{ + GENERATED_BODY() + +public: + UBTTask_RaiseWeapon(); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; +}; diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.cpp new file mode 100644 index 00000000..29cc1c3e --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.cpp @@ -0,0 +1,26 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "BTTask_StopAttack.h" +#include "EndlessVendetta/AI/AI_EnemyController.h" +#include "EndlessVendetta/AI/EnemyCharacter.h" + +UBTTask_StopAttack::UBTTask_StopAttack() +{ + NodeName = "Stop Attack"; +} + +EBTNodeResult::Type UBTTask_StopAttack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) +{ + if (const AAI_EnemyController* const AIEnemyController = Cast(OwnerComp.GetAIOwner())) + { + if (AEnemyCharacter* const EnemyCharacter = Cast(AIEnemyController->GetPawn())) + { + EnemyCharacter->SetFiring(false); + + FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded); + return EBTNodeResult::Succeeded; + } + } + return EBTNodeResult::Failed; +} diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.h b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.h new file mode 100644 index 00000000..96d68378 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/AI/Tasks/BTTask_StopAttack.h @@ -0,0 +1,20 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "BehaviorTree/Tasks/BTTask_BlackboardBase.h" +#include "BTTask_StopAttack.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API UBTTask_StopAttack : public UBTTask_BlackboardBase +{ + GENERATED_BODY() + +public: + UBTTask_StopAttack(); + virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; +};