Merge branch 'Gadgets/VisionLink' into MergingVisionLink

# Conflicts:
#	EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetClasses/Recon/VisionLink/VisionLink.cpp
This commit is contained in:
Rafal Swierczek 2023-10-03 21:34:02 +01:00
commit 4a714ba3d7
23 changed files with 106 additions and 36 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -3,6 +3,12 @@
#include "VisionLink.h" #include "VisionLink.h"
#include "CollisionDebugDrawingPublic.h"
#include "Kismet/KismetMathLibrary.h"
#include "Camera/CameraComponent.h"
#include "VisionLinkEnemyLOSTest.h"
#include "GameFramework/Character.h"
void AVisionLink::BeginPlay() void AVisionLink::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();
@ -38,15 +44,44 @@ void AVisionLink::SendOutPingPulse()
UpdatePulsesRemaining(NumOfPingPulsesLeftInThisCycle); UpdatePulsesRemaining(NumOfPingPulsesLeftInThisCycle);
if (NumOfPingPulsesLeftInThisCycle < 0) return; if (NumOfPingPulsesLeftInThisCycle < 0) return;
//FActorSpawnParameters SpawnParams;
//SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
//FVector SpawnLoc = (GetActorLocation() - EquippedOffset) + EnemyLOSTestActor.GetDefaultObject()->SpawnOffset;
//AActor* LOSTestActor = GetWorld()->SpawnActor<AActor>(EnemyLOSTestActor, SpawnLoc, GetActorRotation(), SpawnParams);
//TArray<FString> EmptyFStringArray;
//Cast<AVisionLinkEnemyLOSTest>(LOSTestActor)->TestLOS(EmptyFStringArray, GetOwner());
UE_LOG(LogTemp, Warning, TEXT("Ping Pulse!"));
GetWorld()->GetTimerManager().SetTimer(PulseHandle, this, &AVisionLink::SendOutPingPulse, TimeInbetweenPingPulses, false); GetWorld()->GetTimerManager().SetTimer(PulseHandle, this, &AVisionLink::SendOutPingPulse, TimeInbetweenPingPulses, false);
PlayPingPulseAnim(TimeInbetweenPingPulses); PlayPingPulseAnim(TimeInbetweenPingPulses);
UCameraComponent* PlayerCamComp = Cast<UCameraComponent>(GetWorld()->GetFirstPlayerController()->GetCharacter()->GetComponentByClass(UCameraComponent::StaticClass()));
TArray<AActor*> ActorsToIgnore;
ActorsToIgnore.Add(GetWorld()->GetFirstPlayerController()->GetCharacter());
TestLOS(PlayerCamComp->GetComponentTransform(), ActorsToIgnore);
} }
void AVisionLink::TestLOS(FTransform StartingPos, TArray<AActor*> &ActorsToIgnore)
{
float H_DegreeIncrement = (float)H_FOV / (float)LT_Horizontal_Density;
float V_DegreeIncrement = (float)V_FOV / (float)LT_Vertical_Density;
float H_StartingRot = StartingPos.GetRotation().Rotator().Yaw - ((float)H_FOV / 2.0);
float V_StartingRot = StartingPos.GetRotation().Rotator().Pitch - ((float)V_FOV / 2.0);
for (int H_Increment = 1; H_Increment <= LT_Horizontal_Density; H_Increment++)
{
for (int V_Increment = 1; V_Increment <= LT_Vertical_Density; V_Increment++)
{
FHitResult outHit;
FCollisionQueryParams QueryParams = FCollisionQueryParams::DefaultQueryParam;
QueryParams.bTraceComplex = true;
QueryParams.AddIgnoredActors(ActorsToIgnore);
FRotator LT_Rot = FRotator(V_StartingRot + (V_Increment * V_DegreeIncrement), H_StartingRot + (H_Increment * H_DegreeIncrement), StartingPos.GetRotation().Rotator().Roll);
FVector LT_EndPoint = StartingPos.GetLocation() + UKismetMathLibrary::GetForwardVector(LT_Rot) * LT_Distance;
if (!GetWorld()->LineTraceSingleByChannel(outHit, StartingPos.GetLocation(), LT_EndPoint, ECC_Camera, QueryParams)) continue;
AActor* HitActor = outHit.GetActor();
if (!HitActor->ActorHasTag(FName("Enemy"))) continue;
//DrawDebugLine(GetWorld(), outHit.TraceStart, outHit.ImpactPoint, FColor::Blue, false, 3, 0, 3);
ActorsToIgnore.Add(HitActor);
SpawnPing(HitActor->GetTransform());
TestLOS(HitActor->GetTransform(), ActorsToIgnore);
}
}
}

View File

@ -23,6 +23,8 @@ class ENDLESSVENDETTA_API AVisionLink : public AReconGadget
void SendOutPingPulse(); void SendOutPingPulse();
void TestLOS(FTransform StartingPos, TArray<AActor*> &ActorsToIgnore);
virtual void BeginPlay() override; virtual void BeginPlay() override;
virtual void Activate() override; virtual void Activate() override;
@ -34,7 +36,19 @@ protected:
int NumberOfPingPulses = 1; int NumberOfPingPulses = 1;
UPROPERTY(EditDefaultsOnly, Category = "Vision Link") UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
TSubclassOf<AVisionLinkEnemyLOSTest> EnemyLOSTestActor; int LT_Horizontal_Density = 80;
UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
int LT_Vertical_Density = 25;
UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
float LT_Distance = 4000;
UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
float H_FOV = 75;
UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
float V_FOV = 25;
UPROPERTY(BlueprintReadOnly, Category = "Vision Link") UPROPERTY(BlueprintReadOnly, Category = "Vision Link")
float CooldownLength; float CooldownLength;
@ -56,4 +70,6 @@ protected:
UFUNCTION(BlueprintImplementableEvent, Category = "Vision Link") UFUNCTION(BlueprintImplementableEvent, Category = "Vision Link")
void VisionLinkRecharging(); void VisionLinkRecharging();
UFUNCTION(BlueprintImplementableEvent, Category = "Vision Link")
void SpawnPing(FTransform PingSpawnTransform);
}; };

View File

@ -28,7 +28,7 @@ void AVisionLinkEnemyLOSTest::Tick(float DeltaTime)
} }
void AVisionLinkEnemyLOSTest::TestLOS(TArray<FString> EnemiesInLink, AActor* LOSActor) void AVisionLinkEnemyLOSTest::TestLOS(TArray<uint32> EnemiesInLink, AActor* LOSActor)
{ {
// Get all overlapping Actors // Get all overlapping Actors
UBoxComponent* CollisionBox = Cast<UBoxComponent>(GetComponentByClass(UBoxComponent::StaticClass())); UBoxComponent* CollisionBox = Cast<UBoxComponent>(GetComponentByClass(UBoxComponent::StaticClass()));
@ -47,9 +47,12 @@ void AVisionLinkEnemyLOSTest::TestLOS(TArray<FString> EnemiesInLink, AActor* LOS
for (int i = 0; i < OverlappingEnemies.Num(); i++) for (int i = 0; i < OverlappingEnemies.Num(); i++)
{ {
UE_LOG(LogTemp, Warning, TEXT("Overlapping Enemy Name: %s"), *OverlappingEnemies[i]->GetName());
// Overlapping Enemies Array should only contain enemies which aren't already in the link // Overlapping Enemies Array should only contain enemies which aren't already in the link
if (!OverlappingEnemies[i]->ActorHasTag(FName("Enemy")) || EnemiesInLink.Contains(OverlappingEnemies[i]->GetName())) OverlappingEnemies.RemoveAt(i); if (!OverlappingEnemies[i]->ActorHasTag(FName("Enemy")) || EnemiesInLink.Contains(OverlappingEnemies[i]->GetUniqueID()))
{
UE_LOG(LogTemp, Warning, TEXT("enemy name: %s"), *OverlappingEnemies[i]->GetName());
OverlappingEnemies.RemoveAt(i);
}
} }
if (OverlappingEnemies.IsEmpty()) if (OverlappingEnemies.IsEmpty())
{ {
@ -61,6 +64,7 @@ void AVisionLinkEnemyLOSTest::TestLOS(TArray<FString> EnemiesInLink, AActor* LOS
{ {
FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(LOSActor->GetActorLocation(), Enemy->GetActorLocation()); FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(LOSActor->GetActorLocation(), Enemy->GetActorLocation());
UE_LOG(LogTemp, Warning, TEXT("Look at Rotation: %f"), LookAtRotation.Yaw); UE_LOG(LogTemp, Warning, TEXT("Look at Rotation: %f"), LookAtRotation.Yaw);
UE_LOG(LogTemp, Warning, TEXT("enemy name: %s"), *Enemy->GetName());
} }
Destroy(); Destroy();

View File

@ -18,7 +18,7 @@ protected:
public: public:
UPROPERTY(EditDefaultsOnly, Category = "Vision Link") UPROPERTY(EditDefaultsOnly, Category = "Vision Link")
FVector SpawnOffset = FVector(0, 0, 0 ); float SpawnOffset = 0;
// Sets default values for this actor's properties // Sets default values for this actor's properties
AVisionLinkEnemyLOSTest(); AVisionLinkEnemyLOSTest();
@ -26,5 +26,5 @@ public:
// Called every frame // Called every frame
virtual void Tick(float DeltaTime) override; virtual void Tick(float DeltaTime) override;
void TestLOS(TArray<FString> EnemiesInLink, AActor* LOS_Actor); void TestLOS(TArray<uint32> EnemiesInLink, AActor* LOS_Actor);
}; };