Implemented Ring Module Class Functionality

This commit is contained in:
Rafal Swierczek 2023-10-08 19:35:08 +01:00
parent 9d36fa7846
commit 2a9e30108d
7 changed files with 175 additions and 10 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2bc44125551b89f13cdffde72a42c09685d26b6bbaa3ce8d28858ab14d83c0dc
oid sha256:77cadba64fcbb3018eab09695343339696bd1a1fbcfb39ee13aca7d57c7b4bab
size 108254

View File

@ -43,7 +43,6 @@ void AOverloadModule::CheckForPotentialHackTarget()
if (HackedEnemies.Contains(OutHit.GetActor()->GetUniqueID()))
{
UE_LOG(LogTemp, Warning, TEXT("Enemy has already been hacked!"));
PotentialHackTarget = nullptr;
DisplayAlreadyHacked();
return;
@ -77,8 +76,7 @@ void AOverloadModule::ExplodeClosestAliveEnemy()
{
FTransform EmptyTransform;
USphereComponent* SphereCollision = Cast<USphereComponent>(AddComponentByClass(USphereComponent::StaticClass(), false, EmptyTransform, false));
SphereCollision->SetHiddenInGame(false);
SphereCollision->SetSphereRadius(AreaOfEffectInMeters * 100, true);
TArray<AActor*> OverlappingActors;

View File

@ -0,0 +1,99 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "RingModule.h"
#include "Components/SphereComponent.h"
#include "GameFramework/Character.h"
void ARingModule::BeginPlay()
{
Super::BeginPlay();
this->SetActorTickInterval(0.2);
PlayerChar = GetWorld()->GetFirstPlayerController()->GetCharacter();
PlayerCam = Cast<UCameraComponent>(PlayerChar->GetComponentByClass(UCameraComponent::StaticClass()));
}
void ARingModule::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
if (GadgetCantBeUsed()) return;
CheckForPotentialHackTarget();
}
void ARingModule::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);
FCollisionQueryParams QueryParams = FCollisionQueryParams::DefaultQueryParam;
QueryParams.AddIgnoredActor(PlayerChar);
if (!GetWorld()->LineTraceSingleByChannel(OutHit, LT_Start, LT_End, ECC_Camera, QueryParams) || !(OutHit.GetActor()->ActorHasTag(FName("Enemy")) && OutHit.GetActor()->ActorHasTag(FName("Dead"))))
{
PotentialHackTarget = nullptr;
DisplayNeedADeadEnemy();
return;
}
if (HackedEnemies.Contains(OutHit.GetActor()->GetUniqueID()))
{
PotentialHackTarget = nullptr;
DisplayAlreadyHacked();
return;
}
//DrawDebugLine(GetWorld(), LT_Start, OutHit.ImpactPoint, FColor::Green, false, 0.2, 0, 1);
PotentialHackTarget = OutHit.GetActor();
DisplayFoundPotentialTarget();
}
void ARingModule::Activate()
{
if (GadgetCantBeUsed() || !IsValid(PotentialHackTarget)) return;
Super::Activate();
HackedEnemies.Add(PotentialHackTarget->GetUniqueID());
PlayHackingAnim(GadgetMaxUptime);
}
void ARingModule::FinishedUsing()
{
SpawnRingingPhoneForAllNearbyEnemies() ? DisplayHackingSuccess() : DisplayHackingFailure();
Super::FinishedUsing();
PlayRechargingAnim(CooldownTime);
}
bool ARingModule::SpawnRingingPhoneForAllNearbyEnemies()
{
FTransform EmptyTransform;
USphereComponent* SphereCollision = Cast<USphereComponent>(AddComponentByClass(USphereComponent::StaticClass(), false, EmptyTransform, false));
SphereCollision->SetSphereRadius(AreaOfEffectInMeters * 100, true);
TArray<AActor*> OverlappingActors;
TArray<AActor*> EnemiesInRadius;
SphereCollision->GetOverlappingActors(OverlappingActors, ACharacter::StaticClass());
for (AActor* OverlappingActor : OverlappingActors)
{
if (OverlappingActor->ActorHasTag(FName("Enemy")) && !OverlappingActor->ActorHasTag(FName("Dead"))) EnemiesInRadius.Add(OverlappingActor);
}
if (EnemiesInRadius.IsEmpty())
{
SphereCollision->DestroyComponent();
return false;
}
for (AActor* Enemy : EnemiesInRadius)
{
//Dont Forget to spawn in phone ringing
UE_LOG(LogTemp, Warning, TEXT("%s's phone is ringing!!!"), *Enemy->GetName());
}
return true;
}

View File

@ -0,0 +1,68 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "EndlessVendetta/GadgetSystem/ReconGadget.h"
#include "Camera/CameraComponent.h"
#include "RingModule.generated.h"
/**
*
*/
UCLASS()
class ENDLESSVENDETTA_API ARingModule : public AReconGadget
{
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();
// Returns false if there are no nearby enemies
bool SpawnRingingPhoneForAllNearbyEnemies();
protected:
UPROPERTY(EditDefaultsOnly, Category = "Overload Module")
float AreaOfEffectInMeters = 20;
UPROPERTY(EditDefaultsOnly, Category = "Overload Module")
float DeadBodyCheckDistance = 250;
// --------------- 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 PlayHackingAnim(float Loadingtime);
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
void DisplayHackingFailure();
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
void DisplayHackingSuccess();
UFUNCTION(BlueprintImplementableEvent, Category = "Overload Module")
void PlayRechargingAnim(float RechargingTime);
};