142 - Projectile Grenades
This commit is contained in:
parent
d2c9cce7a3
commit
8f3a46b63d
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -137,7 +137,7 @@ void ABlasterCharacter::MulticastEliminated_Implementation()
|
|||
GetActorLocation()
|
||||
);
|
||||
}
|
||||
if (IsLocallyControlled() && GetEquippedWeapon()->GetWeaponType() == EWeaponType::EWT_SniperRifle && IsAiming())
|
||||
if (IsLocallyControlled() && GetEquippedWeapon() && GetEquippedWeapon()->GetWeaponType() == EWeaponType::EWT_SniperRifle && IsAiming())
|
||||
{
|
||||
ShowSniperScopeWidget(false);
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "Projectile.h"
|
||||
|
||||
#include "NiagaraFunctionLibrary.h"
|
||||
#include "Blaster/Blaster.h"
|
||||
#include "Components/BoxComponent.h"
|
||||
#include "Kismet/GameplayStatics.h"
|
||||
|
@ -50,6 +51,27 @@ void AProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimi
|
|||
Destroy();
|
||||
}
|
||||
|
||||
|
||||
void AProjectile::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
}
|
||||
|
||||
void AProjectile::StartDestroyTimer()
|
||||
{
|
||||
GetWorldTimerManager().SetTimer(
|
||||
DestroyTimer,
|
||||
this,
|
||||
&AProjectile::DestroyTimerFinished,
|
||||
DestroyTime
|
||||
);
|
||||
}
|
||||
|
||||
void AProjectile::DestroyTimerFinished()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void AProjectile::Destroyed()
|
||||
{
|
||||
Super::Destroyed();
|
||||
|
@ -65,7 +87,43 @@ void AProjectile::Destroyed()
|
|||
}
|
||||
}
|
||||
|
||||
void AProjectile::Tick(float DeltaTime)
|
||||
void AProjectile::SpawnTrailSystem()
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
if (TrailSystem)
|
||||
{
|
||||
TrailSystemComponent = UNiagaraFunctionLibrary::SpawnSystemAttached(
|
||||
TrailSystem,
|
||||
GetRootComponent(),
|
||||
FName(),
|
||||
GetActorLocation(),
|
||||
GetActorRotation(),
|
||||
EAttachLocation::KeepWorldPosition,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void AProjectile::ExplodeDamage()
|
||||
{
|
||||
APawn* FiringPawn = GetInstigator();
|
||||
if (FiringPawn && HasAuthority())
|
||||
{
|
||||
AController* FiringController = FiringPawn->GetController();
|
||||
if (FiringController)
|
||||
{
|
||||
UGameplayStatics::ApplyRadialDamageWithFalloff(
|
||||
this,
|
||||
Damage,
|
||||
10.f,
|
||||
GetActorLocation(),
|
||||
DamageInnerRadius,
|
||||
DamageOuterRadius,
|
||||
1.f,
|
||||
UDamageType::StaticClass(),
|
||||
TArray<AActor*>(),
|
||||
this,
|
||||
FiringController
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,10 @@ public:
|
|||
|
||||
protected:
|
||||
virtual void BeginPlay() override;
|
||||
void StartDestroyTimer();
|
||||
void DestroyTimerFinished();
|
||||
void SpawnTrailSystem();
|
||||
void ExplodeDamage();
|
||||
|
||||
UFUNCTION()
|
||||
virtual void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
|
||||
|
@ -37,6 +41,21 @@ protected:
|
|||
|
||||
UPROPERTY(VisibleAnywhere)
|
||||
class UProjectileMovementComponent* ProjectileMovementComponent;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
class UNiagaraSystem* TrailSystem;
|
||||
|
||||
UPROPERTY()
|
||||
class UNiagaraComponent* TrailSystemComponent;
|
||||
|
||||
UPROPERTY(VisibleAnywhere)
|
||||
UStaticMeshComponent* ProjectileMesh;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float DamageInnerRadius = 200.f;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float DamageOuterRadius = 500.f;
|
||||
|
||||
private:
|
||||
|
||||
|
@ -45,4 +64,9 @@ private:
|
|||
|
||||
UPROPERTY()
|
||||
class UParticleSystemComponent* TracerComponent;
|
||||
|
||||
FTimerHandle DestroyTimer;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float DestroyTime = 3.f;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "ProjectileGrenade.h"
|
||||
|
||||
#include "Blaster/Character/BlasterCharacter.h"
|
||||
#include "GameFramework/ProjectileMovementComponent.h"
|
||||
#include "Kismet/GameplayStatics.h"
|
||||
#include "Sound/SoundCue.h"
|
||||
|
||||
AProjectileGrenade::AProjectileGrenade()
|
||||
{
|
||||
ProjectileMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Grenade Mesh"));
|
||||
ProjectileMesh->SetupAttachment(RootComponent);
|
||||
ProjectileMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
|
||||
ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
|
||||
ProjectileMovementComponent->bRotationFollowsVelocity = true;
|
||||
ProjectileMovementComponent->SetIsReplicated(true);
|
||||
ProjectileMovementComponent->bShouldBounce = true;
|
||||
}
|
||||
|
||||
void AProjectileGrenade::BeginPlay()
|
||||
{
|
||||
AActor::BeginPlay();
|
||||
|
||||
SpawnTrailSystem();
|
||||
StartDestroyTimer();
|
||||
ProjectileMovementComponent->OnProjectileBounce.AddDynamic(this, &AProjectileGrenade::OnBounce);
|
||||
}
|
||||
|
||||
void AProjectileGrenade::OnBounce(const FHitResult& ImpactResult, const FVector& ImpactVelocity)
|
||||
{
|
||||
if (ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ImpactResult.GetActor()))
|
||||
{
|
||||
const APawn* FiringPawn = GetInstigator();
|
||||
if (FiringPawn && HasAuthority())
|
||||
{
|
||||
AController* InstigatorController = FiringPawn->GetController();
|
||||
if (InstigatorController)
|
||||
{
|
||||
UGameplayStatics::ApplyDamage(
|
||||
BlasterCharacter,
|
||||
Damage / 4,
|
||||
InstigatorController,
|
||||
this,
|
||||
UDamageType::StaticClass()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (BounceSound)
|
||||
{
|
||||
UGameplayStatics::PlaySoundAtLocation(
|
||||
this,
|
||||
BounceSound,
|
||||
GetActorLocation()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void AProjectileGrenade::Destroyed()
|
||||
{
|
||||
ExplodeDamage();
|
||||
Super::Destroyed();
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Projectile.h"
|
||||
#include "ProjectileGrenade.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class BLASTER_API AProjectileGrenade : public AProjectile
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
|
||||
AProjectileGrenade();
|
||||
virtual void Destroyed() override;
|
||||
|
||||
protected:
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
UFUNCTION()
|
||||
void OnBounce(const FHitResult& ImpactResult, const FVector& ImpactVelocity);
|
||||
|
||||
private:
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
USoundCue* BounceSound;
|
||||
};
|
|
@ -4,7 +4,6 @@
|
|||
#include "ProjectileRocket.h"
|
||||
|
||||
#include "Kismet/GameplayStatics.h"
|
||||
#include "NiagaraFunctionLibrary.h"
|
||||
#include "NiagaraComponent.h"
|
||||
#include "RocketMovementComponent.h"
|
||||
#include "Components/AudioComponent.h"
|
||||
|
@ -13,9 +12,9 @@
|
|||
|
||||
AProjectileRocket::AProjectileRocket()
|
||||
{
|
||||
RocketMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Rocket Mesh"));
|
||||
RocketMesh->SetupAttachment(RootComponent);
|
||||
RocketMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
ProjectileMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Rocket Mesh"));
|
||||
ProjectileMesh->SetupAttachment(RootComponent);
|
||||
ProjectileMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
|
||||
RocketMovementComponent = CreateDefaultSubobject<URocketMovementComponent>("RocketMovementComponent");
|
||||
RocketMovementComponent->bRotationFollowsVelocity = true;
|
||||
|
@ -35,18 +34,8 @@ void AProjectileRocket::BeginPlay()
|
|||
CollisionBox->OnComponentHit.AddDynamic(this, &AProjectileRocket::OnHit);
|
||||
}
|
||||
|
||||
if (TrailSystem)
|
||||
{
|
||||
TrailSystemComponent = UNiagaraFunctionLibrary::SpawnSystemAttached(
|
||||
TrailSystem,
|
||||
GetRootComponent(),
|
||||
FName(),
|
||||
GetActorLocation(),
|
||||
GetActorRotation(),
|
||||
EAttachLocation::KeepWorldPosition,
|
||||
false
|
||||
);
|
||||
}
|
||||
SpawnTrailSystem();
|
||||
|
||||
if (ProjectileLoop && LoopingSoundAttenuation)
|
||||
{
|
||||
ProjectileLoopComponent = UGameplayStatics::SpawnSoundAttached(
|
||||
|
@ -66,45 +55,15 @@ void AProjectileRocket::BeginPlay()
|
|||
}
|
||||
}
|
||||
|
||||
void AProjectileRocket::DestroyTimerFinished()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void AProjectileRocket::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
|
||||
{
|
||||
if (OtherActor == GetOwner())
|
||||
{
|
||||
return;
|
||||
}
|
||||
APawn* FiringPawn = GetInstigator();
|
||||
if (FiringPawn && HasAuthority())
|
||||
{
|
||||
AController* FiringController = FiringPawn->GetController();
|
||||
if (FiringController)
|
||||
{
|
||||
UGameplayStatics::ApplyRadialDamageWithFalloff(
|
||||
this,
|
||||
Damage,
|
||||
10.f,
|
||||
GetActorLocation(),
|
||||
200.f,
|
||||
500.f,
|
||||
1.f,
|
||||
UDamageType::StaticClass(),
|
||||
TArray<AActor*>(),
|
||||
this,
|
||||
FiringController
|
||||
);
|
||||
}
|
||||
}
|
||||
ExplodeDamage();
|
||||
|
||||
GetWorldTimerManager().SetTimer(
|
||||
DestroyTimer,
|
||||
this,
|
||||
&AProjectileRocket::DestroyTimerFinished,
|
||||
DestroyTime
|
||||
);
|
||||
StartDestroyTimer();
|
||||
|
||||
if (ImpactParticles)
|
||||
{
|
||||
|
@ -114,9 +73,9 @@ void AProjectileRocket::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor,
|
|||
{
|
||||
UGameplayStatics::PlaySoundAtLocation(this, ImpactSound, GetActorLocation());
|
||||
}
|
||||
if (RocketMesh)
|
||||
if (ProjectileMesh)
|
||||
{
|
||||
RocketMesh->SetVisibility(false);
|
||||
ProjectileMesh->SetVisibility(false);
|
||||
}
|
||||
if (CollisionBox)
|
||||
{
|
||||
|
|
|
@ -20,14 +20,7 @@ protected:
|
|||
|
||||
virtual void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) override;
|
||||
virtual void BeginPlay() override;
|
||||
void DestroyTimerFinished();
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
class UNiagaraSystem* TrailSystem;
|
||||
|
||||
UPROPERTY()
|
||||
class UNiagaraComponent* TrailSystemComponent;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
USoundCue* ProjectileLoop;
|
||||
|
||||
|
@ -40,13 +33,4 @@ protected:
|
|||
UPROPERTY(VisibleAnywhere)
|
||||
class URocketMovementComponent* RocketMovementComponent;
|
||||
|
||||
private:
|
||||
|
||||
UPROPERTY(VisibleAnywhere)
|
||||
UStaticMeshComponent* RocketMesh;
|
||||
|
||||
FTimerHandle DestroyTimer;
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
float DestroyTime = 3.f;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue