Make hearing and damaged perception events
This commit is contained in:
		
							parent
							
								
									7313dccdff
								
							
						
					
					
						commit
						a1832e352e
					
				@ -160,7 +160,6 @@ void AEnemyAIController::OnPerceptionUpdated(const TArray<AActor*>& actors)
 | 
				
			|||||||
			else if (stimulus.Type == HearingID)
 | 
								else if (stimulus.Type == HearingID)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				SensedHearing(actor, stimulus);
 | 
									SensedHearing(actor, stimulus);
 | 
				
			||||||
				stimulus.StimulusLocation;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if (stimulus.Type == DamageID)
 | 
								else if (stimulus.Type == DamageID)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "EnemyCharacter.h"
 | 
					#include "EnemyCharacter.h"
 | 
				
			||||||
#include "EnemyAIController.h"
 | 
					#include "EnemyAIController.h"
 | 
				
			||||||
 | 
					#include "EnemyHealthComponent.h"
 | 
				
			||||||
#include "InteractableComponent.h"
 | 
					#include "InteractableComponent.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define COLLISION_WEAPON	ECC_GameTraceChannel1
 | 
					#define COLLISION_WEAPON	ECC_GameTraceChannel1
 | 
				
			||||||
@ -10,6 +11,10 @@ AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) :
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	RandomWeaponParameters = CreateDefaultSubobject<URandomWeaponParameters>(TEXT("Random Weapon Parameters"));
 | 
						RandomWeaponParameters = CreateDefaultSubobject<URandomWeaponParameters>(TEXT("Random Weapon Parameters"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto healthComponent = CreateDefaultSubobject<UEnemyHealthComponent>(TEXT("Health Component"));
 | 
				
			||||||
 | 
						SetHealthComponent(healthComponent);
 | 
				
			||||||
 | 
						GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged");
 | 
				
			||||||
 | 
						GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath");
 | 
				
			||||||
	GetHealthComponent()->SetMaxHealth(100.0f);
 | 
						GetHealthComponent()->SetMaxHealth(100.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->Tags.Add(FName("Enemy"));
 | 
						this->Tags.Add(FName("Enemy"));
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										36
									
								
								Source/Nakatomi/EnemyHealthComponent.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Source/Nakatomi/EnemyHealthComponent.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					// Fill out your copyright notice in the Description page of Project Settings.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "EnemyHealthComponent.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "EnemyAIController.h"
 | 
				
			||||||
 | 
					#include "EnemyCharacter.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void UEnemyHealthComponent::BeginPlay()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Super::BeginPlay();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void UEnemyHealthComponent::TakeDamage(AActor* damagedActor, float damage, const UDamageType* damageType,
 | 
				
			||||||
 | 
						AController* instigatedBy, AActor* damageCauser)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (damagedActor == nullptr || IsDead || !CanDamage)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CurrentHealth -= damage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						AEnemyCharacter* enemyCharacter = Cast<AEnemyCharacter>(damagedActor);
 | 
				
			||||||
 | 
						UAISense_Damage::ReportDamageEvent(GetWorld(), damagedActor, damageCauser, 1,
 | 
				
			||||||
 | 
						                                   damageCauser->GetTransform().GetLocation(),
 | 
				
			||||||
 | 
						                                   damageCauser->GetTransform().GetLocation());
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						OnDamaged.ExecuteIfBound({damagedActor, damage, damageType, instigatedBy, damageCauser});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (CurrentHealth <= 0.0f)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							IsDead = true;
 | 
				
			||||||
 | 
							OnDeath.ExecuteIfBound({damagedActor, damage, damageType, instigatedBy, damageCauser});
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								Source/Nakatomi/EnemyHealthComponent.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Source/Nakatomi/EnemyHealthComponent.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					// Fill out your copyright notice in the Description page of Project Settings.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "CoreMinimal.h"
 | 
				
			||||||
 | 
					#include "HealthComponent.h"
 | 
				
			||||||
 | 
					#include "EnemyHealthComponent.generated.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					UCLASS()
 | 
				
			||||||
 | 
					class NAKATOMI_API UEnemyHealthComponent : public UHealthComponent
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						GENERATED_BODY()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						virtual void BeginPlay() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						virtual void TakeDamage(AActor* damagedActor, float damage, const UDamageType* damageType, AController* instigatedBy, AActor* damageCauser) override;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -39,7 +39,7 @@ public:
 | 
				
			|||||||
	FOnDamageDelegate OnDamaged;
 | 
						FOnDamageDelegate OnDamaged;
 | 
				
			||||||
	FOnDeathDelegate OnDeath;
 | 
						FOnDeathDelegate OnDeath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					protected:
 | 
				
			||||||
	UPROPERTY(EditDefaultsOnly)
 | 
						UPROPERTY(EditDefaultsOnly)
 | 
				
			||||||
	float MaxHealth = 100.f;
 | 
						float MaxHealth = 100.f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,7 +55,7 @@ public:
 | 
				
			|||||||
	UHealthComponent();
 | 
						UHealthComponent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UFUNCTION()
 | 
						UFUNCTION()
 | 
				
			||||||
	void TakeDamage(AActor* damagedActor, float damage, const UDamageType* damageType, AController* instigatedBy,
 | 
						virtual void TakeDamage(AActor* damagedActor, float damage, const UDamageType* damageType, AController* instigatedBy,
 | 
				
			||||||
	                AActor* damageCauser);
 | 
						                AActor* damageCauser);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UFUNCTION()
 | 
						UFUNCTION()
 | 
				
			||||||
 | 
				
			|||||||
@ -14,9 +14,12 @@ ANakatomiCharacter::ANakatomiCharacter(const FObjectInitializer& ObjectInitializ
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	NakatomiCMC = Cast<UNakatomiCMC>(GetCharacterMovement());
 | 
						NakatomiCMC = Cast<UNakatomiCMC>(GetCharacterMovement());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	HealthComponent = CreateDefaultSubobject<UHealthComponent>(TEXT("Health Component"));
 | 
						// if (!HealthComponent)
 | 
				
			||||||
	HealthComponent->OnDamaged.BindUFunction(this, "OnDamaged");
 | 
						// {
 | 
				
			||||||
	HealthComponent->OnDeath.BindUFunction(this, "OnDeath");
 | 
						// 	HealthComponent = CreateDefaultSubobject<UHealthComponent>(TEXT("Health Component"));
 | 
				
			||||||
 | 
						// 	HealthComponent->OnDamaged.BindUFunction(this, "OnDamaged");
 | 
				
			||||||
 | 
						// 	HealthComponent->OnDeath.BindUFunction(this, "OnDeath");
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Called when the game starts or when spawned
 | 
					// Called when the game starts or when spawned
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,10 @@ APlayerCharacter::APlayerCharacter(const FObjectInitializer& ObjectInitializer)
 | 
				
			|||||||
	//bUseControllerRotationYaw = true;
 | 
						//bUseControllerRotationYaw = true;
 | 
				
			||||||
	//bUseControllerRotationRoll = false;
 | 
						//bUseControllerRotationRoll = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SetHealthComponent(CreateDefaultSubobject<UHealthComponent>(TEXT("Health Component")));
 | 
				
			||||||
 | 
						GetHealthComponent()->OnDamaged.BindUFunction(this, "OnDamaged");
 | 
				
			||||||
 | 
						GetHealthComponent()->OnDeath.BindUFunction(this, "OnDeath");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Setup the camera boom
 | 
						// Setup the camera boom
 | 
				
			||||||
	CameraSpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraSpringArmComponent"));
 | 
						CameraSpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraSpringArmComponent"));
 | 
				
			||||||
	CameraSpringArmComponent->SetupAttachment(RootComponent);
 | 
						CameraSpringArmComponent->SetupAttachment(RootComponent);
 | 
				
			||||||
@ -398,6 +402,7 @@ void APlayerCharacter::ProcessHits(TArray<FHitResult> hits)
 | 
				
			|||||||
			{
 | 
								{
 | 
				
			||||||
				healthComponent->TakeDamage(Hit.GetActor(), CurrentWeapon->GetWeaponProperties()->WeaponDamage, nullptr,
 | 
									healthComponent->TakeDamage(Hit.GetActor(), CurrentWeapon->GetWeaponProperties()->WeaponDamage, nullptr,
 | 
				
			||||||
				                            GetController(), this);
 | 
									                            GetController(), this);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
				if (!healthComponent->GetIsDead())
 | 
									if (!healthComponent->GetIsDead())
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					OnEnemyHit.ExecuteIfBound();
 | 
										OnEnemyHit.ExecuteIfBound();
 | 
				
			||||||
@ -437,6 +442,8 @@ void APlayerCharacter::ProcessHits(TArray<FHitResult> hits)
 | 
				
			|||||||
				                                         true);
 | 
									                                         true);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							MakeNoise(1, this, Hit.Location);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -639,6 +646,8 @@ void APlayerCharacter::OnFire()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	CurrentWeapon->PlayFireSoundAtLocation(this->GetTransform().GetLocation());
 | 
						CurrentWeapon->PlayFireSoundAtLocation(this->GetTransform().GetLocation());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MakeNoise(1,this, this->GetTransform().GetLocation());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PlayOnFireAnimations();
 | 
						PlayOnFireAnimations();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CurrentWeapon->SetCurrentWeaponStatus(Cooldown);
 | 
						CurrentWeapon->SetCurrentWeaponStatus(Cooldown);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user