Implemented AOverloadModule and its Activation Functions
This commit is contained in:
parent
b93e78108e
commit
0f5c983e75
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:7d61bb4d0a3f7c25b8901699a8047059fb83a255d89990a5b366410f51d23792
|
||||||
|
size 23259
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:d2231f4d2a4b46f8a7daa258e14487b5ee0c0d6ed602fa256de0ef9cdd04f188
|
oid sha256:f27623f7de4cd3ffafc332f52d32f9d58031dad0ba48c3954472553188926618
|
||||||
size 106160
|
size 106253
|
||||||
|
BIN
EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/StarterContent/Architecture/Floor_400x400.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset
(Stored with Git LFS)
Binary file not shown.
@ -0,0 +1,122 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "OverloadModule.h"
|
||||||
|
|
||||||
|
#include "BehaviorTree/BTCompositeNode.h"
|
||||||
|
#include "Components/SphereComponent.h"
|
||||||
|
#include "GameFramework/Character.h"
|
||||||
|
|
||||||
|
void AOverloadModule::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
this->SetActorTickInterval(0.2);
|
||||||
|
PlayerChar = GetWorld()->GetFirstPlayerController()->GetCharacter();
|
||||||
|
PlayerCam = Cast<UCameraComponent>(PlayerChar->GetComponentByClass(UCameraComponent::StaticClass()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AOverloadModule::Tick(float DeltaSeconds)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaSeconds);
|
||||||
|
|
||||||
|
CheckForPotentialHackTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOverloadModule::CheckForPotentialHackTarget()
|
||||||
|
{
|
||||||
|
FHitResult OutHit;
|
||||||
|
FVector LT_Start = PlayerCam->GetComponentLocation();
|
||||||
|
FVector LT_End = PlayerCam->GetComponentLocation() + (PlayerCam->GetForwardVector() * DeadBodyCheckDistance);
|
||||||
|
|
||||||
|
DrawDebugLine(GetWorld(), LT_Start, LT_End, FColor::Red, false, 0.2, 0, 1);
|
||||||
|
|
||||||
|
if (!GetWorld()->LineTraceSingleByChannel(OutHit, LT_Start, LT_End, ECC_Camera) || !(OutHit.GetActor()->ActorHasTag(FName("Enemy")) && OutHit.GetActor()->ActorHasTag(FName("Dead"))))
|
||||||
|
{
|
||||||
|
PotentialHackTarget = nullptr;
|
||||||
|
DisplayNeedADeadEnemy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HackedEnemies.Contains(OutHit.GetActor()->GetUniqueID()))
|
||||||
|
{
|
||||||
|
PotentialHackTarget = nullptr;
|
||||||
|
DisplayAlreadyHacked();
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawDebugLine(GetWorld(), LT_Start, OutHit.ImpactPoint, FColor::Green, false, 0.2, 0, 1);
|
||||||
|
PotentialHackTarget = OutHit.GetActor();
|
||||||
|
DisplayFoundPotentialTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AOverloadModule::Activate()
|
||||||
|
{
|
||||||
|
if (GadgetCantBeUsed() || !IsValid(PotentialHackTarget)) return;
|
||||||
|
|
||||||
|
Super::Activate();
|
||||||
|
HackedEnemies.Add(PotentialHackTarget->GetUniqueID());
|
||||||
|
ExplodeClosestAliveEnemy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOverloadModule::FinishedUsing()
|
||||||
|
{
|
||||||
|
Super::FinishedUsing();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOverloadModule::ExplodeClosestAliveEnemy()
|
||||||
|
{
|
||||||
|
FActorSpawnParameters SpawnParams;
|
||||||
|
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
|
||||||
|
AActor* SphereCollisionActor = GetWorld()->SpawnActor<AActor>(USphereComponent::StaticClass(), PlayerChar->GetActorLocation(), PlayerChar->GetActorRotation(), SpawnParams);
|
||||||
|
USphereComponent* SphereCollision = Cast<USphereComponent>(SphereCollisionActor);
|
||||||
|
|
||||||
|
SphereCollision->SetHiddenInGame(false);
|
||||||
|
SphereCollision->SetSphereRadius(AreaOfEffectInMeters * 100, true);
|
||||||
|
|
||||||
|
TArray<AActor*> OverlappingActors;
|
||||||
|
TArray<AActor*> EnemiesInRadius;
|
||||||
|
|
||||||
|
// Find all living enemies within the radius
|
||||||
|
SphereCollision->GetOverlappingActors(OverlappingActors, ACharacter::StaticClass());
|
||||||
|
for (AActor* OverlappingActor : OverlappingActors)
|
||||||
|
{
|
||||||
|
if (OverlappingActor->ActorHasTag(FName("Enemy")) && !OverlappingActor->ActorHasTag(FName("Dead"))) EnemiesInRadius.Add(OverlappingActor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnemiesInRadius.IsEmpty())
|
||||||
|
{
|
||||||
|
DisplayFailedToFindTarget();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the closest Enemy in radius
|
||||||
|
AActor* ClosestEnemy = EnemiesInRadius[0];
|
||||||
|
float Dist = FVector::Distance(PlayerChar->GetActorLocation(), ClosestEnemy->GetActorLocation());
|
||||||
|
UE_LOG(LogTemp, Warning, TEXT("Distacne To first Considered Enemy = %f"), Dist);
|
||||||
|
if (EnemiesInRadius.Num() < 2)
|
||||||
|
{
|
||||||
|
SpawnExplosiveOnActor(ClosestEnemy, SpawnParams);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < EnemiesInRadius.Num(); i++)
|
||||||
|
{
|
||||||
|
float ConsideredDist = FVector::Distance(PlayerChar->GetActorLocation(), EnemiesInRadius[i]->GetActorLocation());
|
||||||
|
if (ConsideredDist <= Dist)
|
||||||
|
{
|
||||||
|
ClosestEnemy = EnemiesInRadius[i];
|
||||||
|
Dist = ConsideredDist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SpawnExplosiveOnActor(ClosestEnemy, SpawnParams);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOverloadModule::SpawnExplosiveOnActor(AActor* ActortoExplode, FActorSpawnParameters SpawnParams)
|
||||||
|
{
|
||||||
|
GetWorld()->SpawnActor<AActor>(Explosive, ActortoExplode->GetActorLocation(), ActortoExplode->GetActorRotation(), SpawnParams);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Camera/CameraComponent.h"
|
||||||
|
#include "EndlessVendetta/GadgetSystem/CombatGadget.h"
|
||||||
|
#include "EndlessVendetta/GadgetSystem/GadgetClasses/Combat/Explosive.h"
|
||||||
|
#include "OverloadModule.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class ENDLESSVENDETTA_API AOverloadModule : public ACombatGadget
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
ACharacter* PlayerChar;
|
||||||
|
|
||||||
|
UCameraComponent* PlayerCam;
|
||||||
|
|
||||||
|
AActor* PotentialHackTarget;
|
||||||
|
|
||||||
|
// An Array of previously hacked enemies, stops player from hacking the same Dead Enemy
|
||||||
|
TArray<uint32> HackedEnemies;
|
||||||
|
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
virtual void Tick(float DeltaSeconds) override;
|
||||||
|
|
||||||
|
virtual void Activate() override;
|
||||||
|
|
||||||
|
virtual void FinishedUsing() override;
|
||||||
|
|
||||||
|
void CheckForPotentialHackTarget();
|
||||||
|
|
||||||
|
void ExplodeClosestAliveEnemy();
|
||||||
|
|
||||||
|
void SpawnExplosiveOnActor(AActor* ActortoExplode, FActorSpawnParameters SpawnParams);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Overload Module")
|
||||||
|
float AreaOfEffectInMeters = 15;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Overload Module")
|
||||||
|
float DeadBodyCheckDistance = 300;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Overload Module")
|
||||||
|
TSubclassOf<AExplosive> Explosive;
|
||||||
|
|
||||||
|
// --------------- Display Functions ---------------
|
||||||
|
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
|
||||||
|
void DisplayAlreadyHacked();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
|
||||||
|
void DisplayNeedADeadEnemy();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
|
||||||
|
void DisplayFoundPotentialTarget();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
|
||||||
|
void DisplayFailedToFindTarget();
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user