From 850ebb973e1c39cd6a28e6040b30beabbeb71ba5 Mon Sep 17 00:00:00 2001 From: baz Date: Fri, 2 Aug 2024 01:45:48 +0100 Subject: [PATCH] Make gun weapon fire to the corner of the screen rather than diagonally --- Source/vampires/Weapons/GunWeapon.cpp | 38 +++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/Source/vampires/Weapons/GunWeapon.cpp b/Source/vampires/Weapons/GunWeapon.cpp index 603ed22..7f168bb 100644 --- a/Source/vampires/Weapons/GunWeapon.cpp +++ b/Source/vampires/Weapons/GunWeapon.cpp @@ -3,6 +3,11 @@ #include "GunWeapon.h" +#include "Kismet/GameplayStatics.h" +#include "Kismet/KismetMathLibrary.h" +#include "vampires/PlayerCharacter.h" +#include "vampires/VampirePlayerController.h" + AGunWeapon::AGunWeapon() { } @@ -18,25 +23,48 @@ void AGunWeapon::FireWeaponAction_Implementation() if (IsValid(ProjectileTemplate)) { + FVector2d ViewportSize; + GEngine->GameViewport->GetViewportSize(ViewportSize); + + APlayerCharacter* PlayerCharacter = Cast(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0)); + AVampirePlayerController* PlayerController = Cast( + UGameplayStatics::GetPlayerController(PlayerCharacter, 0)); + + FVector TopLeft, TopLeftDir; + FVector TopRight, TopRightDir; + FVector BottomLeft, BottomLeftDir; + FVector BottomRight, BottomRightDir; + + PlayerController->DeprojectScreenPositionToWorld(0, 0, TopLeft, TopLeftDir); + PlayerController->DeprojectScreenPositionToWorld(ViewportSize.X, 0, TopRight, TopRightDir); + PlayerController->DeprojectScreenPositionToWorld(0, ViewportSize.Y, BottomLeft, BottomLeftDir); + PlayerController->DeprojectScreenPositionToWorld(ViewportSize.X, ViewportSize.Y, BottomRight, BottomRightDir); + + FVector actorLocation = GetActorLocation(); + TopLeft.Z = actorLocation.Z; + TopRight.Z = actorLocation.Z; + BottomLeft.Z = actorLocation.Z; + BottomRight.Z = actorLocation.Z; + FActorSpawnParameters actorSpawnParameters; actorSpawnParameters.Owner = this; actorSpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; actorSpawnParameters.TransformScaleMethod = ESpawnActorScaleMethod::MultiplyWithRoot; - + AProjectile* projectile = GetWorld()->SpawnActor(ProjectileTemplate, GetOwner()->GetTransform(), actorSpawnParameters); - projectile->TargetDirection = FVector(1.0f, 1.0f, 0.0f); + projectile->TargetDirection = UKismetMathLibrary::GetDirectionUnitVector(actorLocation, TopLeft); projectile = GetWorld()->SpawnActor(ProjectileTemplate, GetOwner()->GetTransform(), actorSpawnParameters); - projectile->TargetDirection = FVector(-1.0f, 1.0f, 0.0f); + projectile->TargetDirection = UKismetMathLibrary::GetDirectionUnitVector(actorLocation, TopRight); projectile = GetWorld()->SpawnActor(ProjectileTemplate, GetOwner()->GetTransform(), actorSpawnParameters); - projectile->TargetDirection = FVector(1.0f, -1.0f, 0.0f); + projectile->TargetDirection = UKismetMathLibrary::GetDirectionUnitVector(actorLocation, BottomLeft); projectile = GetWorld()->SpawnActor(ProjectileTemplate, GetOwner()->GetTransform(), actorSpawnParameters); - projectile->TargetDirection = FVector(-1.0f, -1.0f, 0.0f); + projectile->TargetDirection = UKismetMathLibrary::GetDirectionUnitVector(actorLocation, BottomRight); } } \ No newline at end of file