Space Plunder
Loading...
Searching...
No Matches
AProjectileBase Class Reference

#include <ProjectileBase.h>

Inheritance diagram for AProjectileBase:
IProjectile AArrowProjectile AGrenadeProjectile AHomingProjectile

Public Member Functions

 AProjectileBase ()
 
virtual void DelayTrigger ()
 
void SetMesh (UStaticMesh *StaticMesh) const
 
virtual void SetProjectileStats (const struct FWeaponProjectileStats_T &Stats) override
 
virtual void SetDefaultDamage (const float Damage) override
 
virtual void SetActorsToIgnore (const TArray< AActor * > &ActorsToIgnore) override
 
virtual void SetDebuggingMode (const bool bValue) override
 
virtual void SetInstigator (AController *Controller) override
 

Public Attributes

bool bDebuggingMode = false
 

Protected Member Functions

virtual void BeginPlay () override
 
virtual void OnProjectileStop (const FHitResult &HitResult)
 
virtual void ProjectileDestroy ()
 

Protected Attributes

class UCapsuleComponent * CapsuleComponent
 
class UStaticMeshComponent * StaticMeshComponent
 
class UProjectileMovementComponent * ProjectileMovementComponent
 
UNiagaraComponent * TrailEffects
 
struct FWeaponProjectileStats_T ProjectileStats
 
UAudioComponent * ProjectileSound = nullptr
 
class UNiagaraSystem * ExplosionEffects
 
TSubclassOf< AActor > DestructionField
 
TArray< AActor * > DamageActorsToIgnore
 
AController * InstigatorController
 
USceneComponent * HomingTarget
 

Private Member Functions

void SpawnTrailEffects () const
 
void SpawnProjectileSound ()
 
void SetCapsuleSize () const
 
void SpawnImpactEffects (const FVector &Location) const
 
void SpawnImpactSound (const FVector &Location) const
 
void RagdollActor (AActor *Actor) const
 
void AttachToHitActor (AActor *Actor, const FName &BoneName)
 

Private Attributes

float DefaultDamage = 20.0f
 
FHitResult StoredHitResult
 
FTimerHandle ProjectileFTimerHandle
 
FTimerHandle DelayTriggerTimerHandle
 

Constructor & Destructor Documentation

◆ AProjectileBase()

AProjectileBase::AProjectileBase ( )
27{
28 bReplicates = true;
29
30 PrimaryActorTick.bCanEverTick = false;
31 CapsuleComponent = CreateDefaultSubobject<UCapsuleComponent>("Capsule");
32 CapsuleComponent->SetEnableGravity(false);
33 FWalkableSlopeOverride WalkableSlopeOverride;
34 WalkableSlopeOverride.WalkableSlopeBehavior = EWalkableSlopeBehavior::WalkableSlope_Unwalkable;
35 CapsuleComponent->SetWalkableSlopeOverride(WalkableSlopeOverride);
36 CapsuleComponent->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_No;
37 SetRootComponent(CapsuleComponent);
38
39 StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>("Static Mesh");
40 StaticMeshComponent->SetupAttachment(CapsuleComponent);
41 StaticMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);
42
43 TrailEffects = CreateDefaultSubobject<UNiagaraComponent>(TEXT("Trail Effects"));
44 TrailEffects->SetupAttachment(StaticMeshComponent);
45
46 ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>("Projectile Movement");
47 ProjectileMovementComponent->InitialSpeed = 1.0f;
48 ProjectileMovementComponent->bRotationFollowsVelocity = true;
49 ProjectileMovementComponent->OnProjectileStop.AddDynamic(this, &AProjectileBase::OnProjectileStop);
50}
class UCapsuleComponent * CapsuleComponent
Definition ProjectileBase.h:40
class UStaticMeshComponent * StaticMeshComponent
Definition ProjectileBase.h:42
virtual void OnProjectileStop(const FHitResult &HitResult)
Definition ProjectileBase.cpp:178
UNiagaraComponent * TrailEffects
Definition ProjectileBase.h:46
class UProjectileMovementComponent * ProjectileMovementComponent
Definition ProjectileBase.h:44

Member Function Documentation

◆ AttachToHitActor()

void AProjectileBase::AttachToHitActor ( AActor * Actor,
const FName & BoneName )
private
160{
161 if(Actor == nullptr){return;}
162 ICharacterBaseInterface* CharacterHit = Cast<ICharacterBaseInterface>(Actor);
163 if(CharacterHit != nullptr)
164 {
165 USkeletalMeshComponent* CharacterMesh = CharacterHit->GetCharacterMesh();
166 if(CharacterMesh != nullptr)
167 {
168 AttachToComponent(CharacterMesh, FAttachmentTransformRules::KeepWorldTransform, BoneName);
169 }
170 }
171 else
172 {
173 AttachToActor(Actor, FAttachmentTransformRules::KeepWorldTransform, BoneName);
174 }
175}
Definition CustomCharacter.h:19
virtual USkeletalMeshComponent * GetCharacterMesh() const =0

◆ BeginPlay()

void AProjectileBase::BeginPlay ( )
overrideprotectedvirtual

Reimplemented in AHomingProjectile.

93{
94 Super::BeginPlay();
95 if(ProjectileMovementComponent != nullptr)
96 {
104 }
108 //@TODO have it on COnstruction
110}
struct FWeaponProjectileStats_T ProjectileStats
Definition ProjectileBase.h:54
void SpawnProjectileSound()
Definition ProjectileBase.cpp:122
void SetCapsuleSize() const
Definition ProjectileBase.cpp:130
void SetMesh(UStaticMesh *StaticMesh) const
Definition ProjectileBase.cpp:58
void SpawnTrailEffects() const
Definition ProjectileBase.cpp:112
float GravityScale
Definition WeaponStructs.h:357
bool bRotationFollowsVelocity
Definition WeaponStructs.h:349
float Friction
Definition WeaponStructs.h:355
bool bShouldBounce
Definition WeaponStructs.h:351
class UStaticMesh * StaticMesh
Definition WeaponStructs.h:371
FVector Velocity
Definition WeaponStructs.h:359
float Bounciness
Definition WeaponStructs.h:353
float InitialSpeed
Definition WeaponStructs.h:347

◆ DelayTrigger()

void AProjectileBase::DelayTrigger ( )
virtual
53{
56}
FHitResult StoredHitResult
Definition ProjectileBase.h:84
bool bDelayedTrigger
Definition WeaponStructs.h:340

◆ OnProjectileStop()

void AProjectileBase::OnProjectileStop ( const FHitResult & HitResult)
protectedvirtual
179{
180 if(!HasAuthority())
181 {
182 return;
183 }
185 {
186 GetWorld()->GetTimerManager().SetTimer(DelayTriggerTimerHandle, this, &AProjectileBase::DelayTrigger, ProjectileStats.TriggerDelay, false);
187 StoredHitResult = HitResult;
188 return;
189 }
190 if(CapsuleComponent != nullptr){CapsuleComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);}
191 // if
192 if(HitResult.PhysMaterial.Get() != nullptr)
193 {
194 UE_LOG(LogWeaponSystem, Error, TEXT("Physical Material Hit"));
195 UE_LOG(LogWeaponSystem, Error, TEXT("Physical Material: %s"), *HitResult.PhysMaterial.Get()->GetName());
196 }
198 {
199 AttachToHitActor(HitResult.GetActor(), HitResult.BoneName);
200 }
201
202 SpawnImpactEffects(HitResult.Location);
203 SpawnImpactSound(HitResult.Location);
204
205 TArray<AActor*> ActorsToIgnore;
206 //- Should ignore Self //
207 if(ProjectileStats.bIgnoreOwner || ProjectileStats.DamageType == UBulletDamage::StaticClass() || ProjectileStats.DamageType == UElectricalDamage::StaticClass() || ProjectileStats.DamageType == UFireDamage::StaticClass())
208 {
209 ActorsToIgnore = DamageActorsToIgnore;
210 DamageActorsToIgnore.Add(GetOwner());
211 }
212 // //- Should hit self //
213 if(ProjectileStats.DamageType == UExplosionDamage::StaticClass())
214 {
215 ActorsToIgnore.Empty();
216 }
217
218 const FVector TraceStart = HitResult.ImpactPoint;
219 const FVector TraceEnd = TraceStart - FVector(1.0f,1.0f,1.0f);
220
221 TArray<FHitResult> SphereHits;
222 const bool bHit = UKismetSystemLibrary::SphereTraceMulti(
223 this, TraceStart, TraceEnd,
224 ProjectileStats.DamageOuterRadius, UEngineTypes::ConvertToTraceType(ECC_GameTraceChannel4),
226 SphereHits, true, FLinearColor::Red, FLinearColor::Yellow, 2.0f);
228 {
229 if(HitResult.Component != nullptr)
230 {
231 if(HitResult.Component->IsSimulatingPhysics())
232 {
233 const FVector ProjectileVelocity = GetVelocity() * ProjectileStats.ImpulseMultiplier;
234 const FVector ClampedVector = UKismetMathLibrary::ClampVectorSize(ProjectileVelocity, 0.0, ProjectileStats.ImpulseMax);
235 HitResult.Component->AddImpulseAtLocation(ClampedVector, HitResult.Location, HitResult.BoneName);
236 }
237 }
238 RagdollActor(HitResult.GetActor());
240 {
241 DrawDebugSphere(GetWorld(), TraceStart, ProjectileStats.DamageInnerRadius, 4, FColor::Emerald, false, 2.0f);
242 }
243 TArray<AActor*> ActorsPushed;
244 if(bHit)
245 {
246 for(FHitResult& SphereHit : SphereHits)
247 {
248 if(SphereHit.Component != nullptr)
249 {
250 UPrimitiveComponent* PrimitiveComponent = Cast<UPrimitiveComponent>(SphereHit.Component);
251 if(PrimitiveComponent != nullptr)
252 {
253 if(ActorsPushed.Contains(SphereHit.GetActor())){continue;}
254 ERadialImpulseFalloff ImpulseFalloff = ERadialImpulseFalloff::RIF_Constant;
256 {
257 ImpulseFalloff = ERadialImpulseFalloff::RIF_Linear;
258 }
259 ACharacter* CharacterHit = Cast<ACharacter>(SphereHit.GetActor());
260 if(CharacterHit != nullptr)
261 {
262 const float ExplosionDistance = UKismetMathLibrary::Vector_Distance(HitResult.ImpactPoint,CharacterHit->GetActorLocation());
263 const float ExplosionClamped = UKismetMathLibrary::MapRangeClamped(ExplosionDistance, 0.0f, ProjectileStats.CharacterExplosionClampMax, ProjectileStats.CharacterExplosionClampMaxOutput, ProjectileStats.CharacterExplosionClampMinOutput);
264 FRotator LookAtRotation = UKismetMathLibrary::FindLookAtRotation(HitResult.ImpactPoint, SphereHit.GetActor()->GetActorLocation());
265 const FVector LaunchVelocity = LookAtRotation.Vector() * ProjectileStats.RadialForceStrength * ExplosionClamped;
266 CharacterHit->LaunchCharacter(LaunchVelocity, true, true);
267 PrimitiveComponent->AddRadialForce(HitResult.ImpactPoint, ProjectileStats.DamageOuterRadius, ProjectileStats.RadialForceStrength, ImpulseFalloff, true);
268 }
269 else
270 {
271 PrimitiveComponent->AddRadialForce(HitResult.ImpactPoint, ProjectileStats.DamageOuterRadius, ProjectileStats.RadialForceStrength, ImpulseFalloff, true);
272 }
273 ActorsPushed.AddUnique(SphereHit.GetActor());
274 }
275 }
276 }
277 }
278 }
279 if(bDebuggingMode){UE_LOG(LogWeaponSystem,Warning,TEXT("Projectile Stop"));}
281 {
282 UGameplayStatics::ApplyRadialDamageWithFalloff(this, DefaultDamage, 1.0f, HitResult.ImpactPoint, ProjectileStats.DamageInnerRadius, ProjectileStats.DamageOuterRadius, ProjectileStats.DamageFalloff, ProjectileStats.DamageType, ActorsToIgnore, this, InstigatorController);
283 }
285 {
286 StaticMeshComponent->SetHiddenInGame(true);
287 StaticMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision);
288 }
289 if(TrailEffects != nullptr)
290 {
291 TrailEffects->DestroyComponent();
292 }
293 if(ProjectileSound != nullptr)
294 {
295 ProjectileSound->Stop();
296 ProjectileSound->DestroyComponent();
297 }
299 {
300 GetWorld()->GetTimerManager().SetTimer(ProjectileFTimerHandle,this, &AProjectileBase::ProjectileDestroy, ProjectileStats.DestroyDelay, false);
301 }
302}
FTimerHandle ProjectileFTimerHandle
Definition ProjectileBase.h:86
bool bDebuggingMode
Definition ProjectileBase.h:22
void RagdollActor(AActor *Actor) const
Definition ProjectileBase.cpp:149
virtual void ProjectileDestroy()
Definition ProjectileBase.cpp:304
void SpawnImpactSound(const FVector &Location) const
Definition ProjectileBase.cpp:143
void AttachToHitActor(AActor *Actor, const FName &BoneName)
Definition ProjectileBase.cpp:159
AController * InstigatorController
Definition ProjectileBase.h:67
void SpawnImpactEffects(const FVector &Location) const
Definition ProjectileBase.cpp:137
TArray< AActor * > DamageActorsToIgnore
Definition ProjectileBase.h:65
UAudioComponent * ProjectileSound
Definition ProjectileBase.h:57
float DefaultDamage
Definition ProjectileBase.h:82
virtual void DelayTrigger()
Definition ProjectileBase.cpp:52
FTimerHandle DelayTriggerTimerHandle
Definition ProjectileBase.h:87
static EDrawDebugTrace::Type GetDrawDebugType(const bool bDebuggingMode)
Definition BaseHelpersBPLib.cpp:910
bool bImpulseFalloffLinear
Definition WeaponStructs.h:314
float CharacterExplosionClampMinOutput
Definition WeaponStructs.h:324
TSubclassOf< UDamageType > DamageType
Definition WeaponStructs.h:298
bool bDealsDamage
Definition WeaponStructs.h:296
float ImpulseMultiplier
Definition WeaponStructs.h:316
float CharacterExplosionClampMax
Definition WeaponStructs.h:320
float TriggerDelay
Definition WeaponStructs.h:342
bool bSticky
Definition WeaponStructs.h:363
float CharacterExplosionClampMaxOutput
Definition WeaponStructs.h:322
float RadialForceStrength
Definition WeaponStructs.h:312
bool bDealsImpulse
Definition WeaponStructs.h:310
float DamageFalloff
Definition WeaponStructs.h:307
bool bHideMeshOnHit
Definition WeaponStructs.h:336
bool bDestroyAfterHit
Definition WeaponStructs.h:366
float ImpulseMax
Definition WeaponStructs.h:318
float DestroyDelay
Definition WeaponStructs.h:368
float DamageOuterRadius
Definition WeaponStructs.h:304
float DamageInnerRadius
Definition WeaponStructs.h:301
bool bIgnoreOwner
Definition WeaponStructs.h:334

◆ ProjectileDestroy()

void AProjectileBase::ProjectileDestroy ( )
protectedvirtual
305{
306 if(bDebuggingMode){UE_LOG(LogWeaponSystem,Warning,TEXT("Projectile Destory"));}
307 GetWorld()->GetTimerManager().ClearTimer(ProjectileFTimerHandle);
308 Destroy();
309}

◆ RagdollActor()

void AProjectileBase::RagdollActor ( AActor * Actor) const
private
150{
151 if(Actor == nullptr){return;}
152 ICharacterBaseInterface* CharacterHit = Cast<ICharacterBaseInterface>(Actor);
153 if(CharacterHit != nullptr)
154 {
155 CharacterHit->Ragdoll();
156 }
157}
virtual void Ragdoll()=0

◆ SetActorsToIgnore()

void AProjectileBase::SetActorsToIgnore ( const TArray< AActor * > & ActorsToIgnore)
overridevirtual

Implements IProjectile.

78{
79 DamageActorsToIgnore.Append(ActorsToIgnore);
80}

◆ SetCapsuleSize()

void AProjectileBase::SetCapsuleSize ( ) const
private
131{
132 if(CapsuleComponent == nullptr){return;}
135}
float CapsuleRadius
Definition WeaponStructs.h:282
float CapsuleHalfHeight
Definition WeaponStructs.h:280

◆ SetDebuggingMode()

void AProjectileBase::SetDebuggingMode ( const bool bValue)
overridevirtual

Implements IProjectile.

83{
84 bDebuggingMode = bValue;
85}

◆ SetDefaultDamage()

void AProjectileBase::SetDefaultDamage ( const float Damage)
overridevirtual

Implements IProjectile.

73{
75}

◆ SetInstigator()

void AProjectileBase::SetInstigator ( AController * Controller)
overridevirtual

Implements IProjectile.

88{
89 InstigatorController = Controller;
90}

◆ SetMesh()

void AProjectileBase::SetMesh ( UStaticMesh * StaticMesh) const
59{
60 if(StaticMeshComponent != nullptr && StaticMesh != nullptr)
61 {
62 StaticMeshComponent->SetStaticMesh(StaticMesh);
64 }
65}
FRotator RotationOffset
Definition WeaponStructs.h:373

◆ SetProjectileStats()

void AProjectileBase::SetProjectileStats ( const struct FWeaponProjectileStats_T & Stats)
overridevirtual

Implements IProjectile.

68{
69 ProjectileStats = Stats;
70}

◆ SpawnImpactEffects()

void AProjectileBase::SpawnImpactEffects ( const FVector & Location) const
private
138{
139 if(ProjectileStats.ImpactEffects == nullptr){return;}
140 UNiagaraFunctionLibrary::SpawnSystemAtLocation(this, ProjectileStats.ImpactEffects, Location);
141}
class UNiagaraSystem * ImpactEffects
Definition WeaponStructs.h:286

◆ SpawnImpactSound()

void AProjectileBase::SpawnImpactSound ( const FVector & Location) const
private
144{
145 if(ProjectileStats.ImpactSound == nullptr){return;}
146 UGameplayStatics::SpawnSoundAtLocation(this, ProjectileStats.ImpactSound, Location);
147}
class USoundBase * ImpactSound
Definition WeaponStructs.h:290

◆ SpawnProjectileSound()

void AProjectileBase::SpawnProjectileSound ( )
private
123{
124 if(StaticMeshComponent != nullptr && ProjectileStats.ProjectileSound != nullptr)
125 {
126 ProjectileSound = UGameplayStatics::SpawnSoundAttached(ProjectileStats.ProjectileSound, StaticMeshComponent);
127 }
128}
class USoundBase * ProjectileSound
Definition WeaponStructs.h:292

◆ SpawnTrailEffects()

void AProjectileBase::SpawnTrailEffects ( ) const
private
113{
114 if(ProjectileStats.TrailEffects == nullptr)
115 {
116 TrailEffects->DestroyComponent();
117 return;
118 }
120}
class UNiagaraSystem * TrailEffects
Definition WeaponStructs.h:288

Member Data Documentation

◆ bDebuggingMode

bool AProjectileBase::bDebuggingMode = false

◆ CapsuleComponent

class UCapsuleComponent* AProjectileBase::CapsuleComponent
protected

◆ DamageActorsToIgnore

TArray<AActor*> AProjectileBase::DamageActorsToIgnore
protected

◆ DefaultDamage

float AProjectileBase::DefaultDamage = 20.0f
private

◆ DelayTriggerTimerHandle

FTimerHandle AProjectileBase::DelayTriggerTimerHandle
private

◆ DestructionField

TSubclassOf<AActor> AProjectileBase::DestructionField
protected

◆ ExplosionEffects

class UNiagaraSystem* AProjectileBase::ExplosionEffects
protected

◆ HomingTarget

USceneComponent* AProjectileBase::HomingTarget
protected

◆ InstigatorController

AController* AProjectileBase::InstigatorController
protected

◆ ProjectileFTimerHandle

FTimerHandle AProjectileBase::ProjectileFTimerHandle
private

◆ ProjectileMovementComponent

class UProjectileMovementComponent* AProjectileBase::ProjectileMovementComponent
protected

◆ ProjectileSound

UAudioComponent* AProjectileBase::ProjectileSound = nullptr
protected

◆ ProjectileStats

struct FWeaponProjectileStats_T AProjectileBase::ProjectileStats
protected

◆ StaticMeshComponent

class UStaticMeshComponent* AProjectileBase::StaticMeshComponent
protected

◆ StoredHitResult

FHitResult AProjectileBase::StoredHitResult
private

◆ TrailEffects

UNiagaraComponent* AProjectileBase::TrailEffects
protected

The documentation for this class was generated from the following files: