From e107458690daffbc8efcd165b1a879c45d98da87 Mon Sep 17 00:00:00 2001 From: Kingsmedia Date: Thu, 26 May 2022 14:03:51 +0200 Subject: [PATCH] 173 - Replicating Scatter --- Source/Blaster/Components/CombatComponent.cpp | 35 +++++++++++++++++-- Source/Blaster/Components/CombatComponent.h | 3 ++ Source/Blaster/Weapon/HitScanWeapon.cpp | 28 +++------------ Source/Blaster/Weapon/HitScanWeapon.h | 16 +-------- Source/Blaster/Weapon/Weapon.cpp | 29 +++++++++++++++ Source/Blaster/Weapon/Weapon.h | 26 ++++++++++++++ 6 files changed, 96 insertions(+), 41 deletions(-) diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index ffd88ae..599fe22 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -102,16 +102,47 @@ void UCombatComponent::Fire() if (CanFire()) { bCanFire = false; - ServerFire(HitTarget); - LocalFire(HitTarget); if (PrimaryWeapon) { CrosshairShootingFactor = .75f; + switch (PrimaryWeapon->FireType) + { + case EFireType::EFT_HitScan: + FireHitScanWeapon(); + break; + case EFireType::EFT_Projectile: + FireProjectileWeapon(); + break; + case EFireType::EFT_Shotgun: + FireShotgun(); + break; + } } StartFireTimer(); } } +void UCombatComponent::FireProjectileWeapon() +{ + LocalFire(HitTarget); + ServerFire(HitTarget); +} + +void UCombatComponent::FireHitScanWeapon() +{ + if (PrimaryWeapon) + { + HitTarget = PrimaryWeapon->bUseScatter ? PrimaryWeapon->TraceEndWithScatter(HitTarget) : HitTarget; + LocalFire(HitTarget); + ServerFire(HitTarget); + } +} + +void UCombatComponent::FireShotgun() +{ + +} + void UCombatComponent::StartFireTimer() { if (PrimaryWeapon == nullptr || Character == nullptr) return; diff --git a/Source/Blaster/Components/CombatComponent.h b/Source/Blaster/Components/CombatComponent.h index c06db29..8d64ddd 100644 --- a/Source/Blaster/Components/CombatComponent.h +++ b/Source/Blaster/Components/CombatComponent.h @@ -60,6 +60,9 @@ protected: void OnRep_SecondaryWeapon(); void Fire(); + void FireProjectileWeapon(); + void FireHitScanWeapon(); + void FireShotgun(); UFUNCTION(Server, Reliable) void ServerFire(const FVector_NetQuantize& TraceHitTarget); diff --git a/Source/Blaster/Weapon/HitScanWeapon.cpp b/Source/Blaster/Weapon/HitScanWeapon.cpp index c7a6c40..7d483ed 100644 --- a/Source/Blaster/Weapon/HitScanWeapon.cpp +++ b/Source/Blaster/Weapon/HitScanWeapon.cpp @@ -6,7 +6,6 @@ #include "Blaster/Character/BlasterCharacter.h" #include "Engine/SkeletalMeshSocket.h" #include "Kismet/GameplayStatics.h" -#include "Kismet/KismetMathLibrary.h" #include "Particles/ParticleSystemComponent.h" void AHitScanWeapon::Fire(const FVector& HitTarget) @@ -78,7 +77,7 @@ void AHitScanWeapon::WeaponTraceHit(const FVector& TraceStart, const FVector& Hi UWorld* World = GetWorld(); if (World) { - FVector End = bUseScatter ? TraceEndWithScatter(TraceStart, HitTarget) : TraceStart + (HitTarget - TraceStart) * 1.25f; + FVector End = TraceStart + (HitTarget - TraceStart) * 1.25f; World->LineTraceSingleByChannel( OutHit, TraceStart, @@ -90,6 +89,9 @@ void AHitScanWeapon::WeaponTraceHit(const FVector& TraceStart, const FVector& Hi { BeamEnd = OutHit.ImpactPoint; } + + DrawDebugSphere(GetWorld(), BeamEnd, 16.f, 12, FColor::Orange, true); + if (BeamParticles) { UParticleSystemComponent* Beam = UGameplayStatics::SpawnEmitterAtLocation( @@ -106,25 +108,3 @@ void AHitScanWeapon::WeaponTraceHit(const FVector& TraceStart, const FVector& Hi } } } - -FVector AHitScanWeapon::TraceEndWithScatter(const FVector& TraceStart, const FVector& HitTarget) -{ - FVector ToTargetNormalized = (HitTarget - TraceStart).GetSafeNormal(); - FVector SphereCenter = TraceStart + ToTargetNormalized * DistanceToSphere; - FVector RandVec = UKismetMathLibrary::RandomUnitVector() * FMath::FRandRange(0.f, SphereRadius); - FVector EndLoc = SphereCenter + RandVec; - FVector ToEndLoc = EndLoc - TraceStart; - - /* - DrawDebugSphere(GetWorld(), SphereCenter, SphereRadius, 12, FColor::Red, true); - DrawDebugSphere(GetWorld(), ToEndLoc, 4.f, 12, FColor::Blue, true); - DrawDebugLine( - GetWorld(), - TraceStart, - FVector(TraceStart + ToEndLoc * TRACE_LENGTH / ToEndLoc.Size()), - FColor::Cyan, - true - ); - */ - return FVector(TraceStart + ToEndLoc * TRACE_LENGTH / ToEndLoc.Size()); -} diff --git a/Source/Blaster/Weapon/HitScanWeapon.h b/Source/Blaster/Weapon/HitScanWeapon.h index bb2889c..8a65489 100644 --- a/Source/Blaster/Weapon/HitScanWeapon.h +++ b/Source/Blaster/Weapon/HitScanWeapon.h @@ -15,12 +15,9 @@ class BLASTER_API AHitScanWeapon : public AWeapon GENERATED_BODY() public: - virtual void Fire(const FVector& HitTarget) override; - + protected: - - FVector TraceEndWithScatter(const FVector& TraceStart, const FVector& HitTarget); void WeaponTraceHit(const FVector& TraceStart, const FVector& HitTarget, FHitResult& OutHit); UPROPERTY(EditAnywhere) @@ -43,15 +40,4 @@ private: UPROPERTY(EditAnywhere) USoundCue* FireSound; - // Trace end with scatter - - UPROPERTY(EditAnywhere, Category = "Weapon Scatter") - float DistanceToSphere = 800.f; - - UPROPERTY(EditAnywhere, Category = "Weapon Scatter") - float SphereRadius = 75.f; - - UPROPERTY(EditAnywhere, Category = "Weapon Scatter") - bool bUseScatter = false; - }; \ No newline at end of file diff --git a/Source/Blaster/Weapon/Weapon.cpp b/Source/Blaster/Weapon/Weapon.cpp index 9212f05..1e39f7d 100644 --- a/Source/Blaster/Weapon/Weapon.cpp +++ b/Source/Blaster/Weapon/Weapon.cpp @@ -10,6 +10,7 @@ #include "Components/SphereComponent.h" #include "Components/WidgetComponent.h" #include "Engine/SkeletalMeshSocket.h" +#include "Kismet/KismetMathLibrary.h" #include "Net/UnrealNetwork.h" AWeapon::AWeapon() @@ -292,3 +293,31 @@ void AWeapon::AddAmmo(int32 Amount) Ammo = FMath::Clamp(Ammo - Amount, 0, MagCapacity); SetHUDAmmo(); } + +FVector AWeapon::TraceEndWithScatter(const FVector& HitTarget) +{ + const USkeletalMeshSocket* MuzzleFlashSocket = GetWeaponMesh()->GetSocketByName("MuzzleFlash"); + if (MuzzleFlashSocket == nullptr) return FVector(); + + FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh()); + FVector TraceStart = SocketTransform.GetLocation(); + + FVector ToTargetNormalized = (HitTarget - TraceStart).GetSafeNormal(); + FVector SphereCenter = TraceStart + ToTargetNormalized * DistanceToSphere; + FVector RandVec = UKismetMathLibrary::RandomUnitVector() * FMath::FRandRange(0.f, SphereRadius); + FVector EndLoc = SphereCenter + RandVec; + FVector ToEndLoc = EndLoc - TraceStart; + + /* + DrawDebugSphere(GetWorld(), SphereCenter, SphereRadius, 12, FColor::Red, true); + DrawDebugSphere(GetWorld(), ToEndLoc, 4.f, 12, FColor::Blue, true); + DrawDebugLine( + GetWorld(), + TraceStart, + FVector(TraceStart + ToEndLoc * TRACE_LENGTH / ToEndLoc.Size()), + FColor::Cyan, + true + ); + */ + return FVector(TraceStart + ToEndLoc * TRACE_LENGTH / ToEndLoc.Size()); +} diff --git a/Source/Blaster/Weapon/Weapon.h b/Source/Blaster/Weapon/Weapon.h index a0c1322..0a22f45 100644 --- a/Source/Blaster/Weapon/Weapon.h +++ b/Source/Blaster/Weapon/Weapon.h @@ -18,6 +18,16 @@ enum class EWeaponState : uint8 EWS_MAX UMETA(DisplayName = "DefaultMAX") }; +UENUM(BlueprintType) +enum class EFireType: uint8 +{ + EFT_HitScan UMETA(DisplayName = "HitScan Weapon"), + EFT_Projectile UMETA(DisplayName = "Projectile Weapon"), + EFT_Shotgun UMETA(DisplayName = "Shotgun Weapon"), + + EFT_Max UMETA(DisplayName = "DefaultMax") +}; + UCLASS() class BLASTER_API AWeapon : public AActor { @@ -32,6 +42,7 @@ public: virtual void Fire(const FVector& HitTarget); void Dropped(); void AddAmmo(int32 Amount); + FVector TraceEndWithScatter(const FVector& HitTarget); // Textures for the weapon crosshairs @@ -72,6 +83,13 @@ public: void EnableCustomDepth(bool bEnabled); bool bDestroyWeapon = false; + + UPROPERTY(EditAnywhere) + EFireType FireType; + + UPROPERTY(EditAnywhere, Category = "Weapon Scatter") + bool bUseScatter = false; + protected: virtual void BeginPlay() override; @@ -139,6 +157,14 @@ private: UPROPERTY(EditAnywhere) EWeaponType WeaponType; + + // Trace end with scatter + + UPROPERTY(EditAnywhere, Category = "Weapon Scatter") + float DistanceToSphere = 800.f; + + UPROPERTY(EditAnywhere, Category = "Weapon Scatter") + float SphereRadius = 75.f; public: void SetWeaponState(EWeaponState State);