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

#include <HitscanWeaponFramework.h>

Inheritance diagram for AHitscanWeaponFramework:
AWeaponFramework IWeapon

Public Member Functions

 AHitscanWeaponFramework ()
 
virtual void ServerShoot_Implementation () override
 
virtual bool ServerShoot_Validate () override
 
- Public Member Functions inherited from AWeaponFramework
 AWeaponFramework ()
 

Protected Member Functions

virtual bool LineTrace (FHitResult &Hit, FVector &ShotDirection, const FLinearColor &Color=FLinearColor::Green, const FVector &CustomLineEnd=FVector::ZeroVector) const override
 
virtual FHitResult BlindFireWeaponTrace (const float Accuracy, const AActor *ActorToIgnore=nullptr) override
 
virtual float CalculateDistanceDamage (const float Distance) const override
 
- Protected Member Functions inherited from AWeaponFramework
virtual void BeginPlay () override
 
virtual void SetupWeaponEffects ()
 
void LogDebugMessage (const FString &Message, const bool bError=false) const
 
void Server_InitWeapon ()
 
virtual void InitWeapon () override
 
virtual void Fire (const FVector Location, const FRotator Rotation, const AActor *ActorToIgnore, const float Accuracy) override
 
virtual void Reload (const float ReloadTime) override
 
virtual void CancelReload () override
 
virtual void SwitchAutoMode () override
 
virtual void BlindFireWeapon (const FVector Location, const FRotator Rotation, const AActor *ActorToIgnore, const float Accuracy) override
 
virtual void AddAttachment (const FString &AttachmentID) override
 
virtual void ToggleAttachment (const EAttachmentType &AttachmentType) override
 
virtual void MoveUMG (bool bIsRightShoulder) override
 
virtual void Aiming (bool bIsAiming) override
 
virtual FWeaponData_T GetWeaponData () const override
 
virtual FWeaponStats_T GetWeaponStats () const override
 
virtual EWeaponType GetWeaponType () const override
 
virtual EWeaponFireMode GetFireMode () const override
 
virtual FTransform GetPivotPoint () const override
 
virtual FTransform GetAimDownSightSocket () const override
 
virtual float GetWeaponFOV () const override
 
virtual bool IsClipEmpty () const override
 
virtual void SetWeaponData (const FWeaponData_T NewWeaponData) override
 
virtual void SetWeaponShouldAutoReload (const bool bValue) override
 
virtual void SetWeaponMesh (USkeletalMesh *SkeletalMesh) override
 
virtual void SetMuzzleOffset (const FVector &Location, const FRotator &Rotation) override
 
virtual void SetRecoilPivotPoint (const FVector &Location, const FRotator &Rotation) override
 
virtual void SetWeaponMeshHidden (const bool bValue) override
 
void Multicast_SetWeaponMeshHidden (const bool bValue)
 
virtual void SetDebuggingStats (const bool bDebug, const bool bInfinite, const bool bBottomless) override
 
virtual void ToggleLaser (const bool bForceOff=false)
 
void ReceiveFire (FHitResult Hit, APawn *InstigatorPawn)
 
TArray< FWeaponModifiersGetAllWeaponAttachmentModifiers () const
 
TArray< FWeaponAttachmentGetAllWeaponAttachments () const
 
FWeaponAttachment GetWeaponAttachment (const FString &AttachmentID) const
 
bool RemoveAttachment (const FString AttachmentID, const EAttachmentType AttachmentType)
 
void RemoveAllAttachments ()
 
bool CanShoot () const
 
float GetAccuracyMultiplier () const
 
void ApplyDamageToActor (const FHitResult &Hit, FVector ShotDirection, float Multiplier=1.0f)
 
void ServerFire (const FVector Location, const FRotator Rotation, const AActor *ActorToIgnore, const float Accuracy)
 
virtual void ServerShoot ()
 
void ServerSetReloading (const bool bReloading)
 
void ServerReload ()
 
virtual void Server_SetWeaponShouldAutoReload (const bool bValue)
 
void CalculateBulletSpread (FVector &NewBulletSpread) const
 
void OnMeshReplicated ()
 
void OnRep_WeaponStats ()
 

Additional Inherited Members

- Public Attributes inherited from AWeaponFramework
bool bDebuggingMode = false
 
bool bInfiniteAmmo = false
 
bool bBottomlessClip = false
 
float DrawDebugTime = 2.0f
 
float DrawDebugColorDarkMultiplier = 0.1f
 
float DrawDebugColorLightMultiplier = 2.0f
 
float DrawDebugPointSize = 16.0f
 
FLinearColor MainTraceColor = FLinearColor(0.9f, 0.1f, 0.1f)
 
FLinearColor BlindFireTraceColor = FLinearColor(0.1f, 0.9f, 0.1f)
 
bool bTraceComplex = false
 
bool bReturnPhysicalMaterial = false
 
float TraceDistanceTooClose = 0.075f
 
- Protected Attributes inherited from AWeaponFramework
UHitscanWeaponComponent * HitscanWeaponComponent
 
UProjectileWeaponComponent * ProjectileWeaponComponent
 
FVector TraceLocation
 
FRotator TraceRotation
 
const AActor * TraceActorToIgnore
 
TArray< AActor * > ActorsToIgnore
 
APawn * OwnerPawn
 
FWeaponData_T WeaponData
 
EWeaponType WeaponType = EWeaponType::Default
 
USceneComponent * SceneRoot
 
USkeletalMeshComponent * GunMeshComponent
 
USceneComponent * Muzzle
 
USceneComponent * RecoilPivotPoint
 
TArray< UStaticMeshComponent * > AttachmentComponents
 
class UWeaponEffectsComponent * WeaponEffects
 
USkeletalMesh * WeaponMesh
 
TSubclassOf< class AActor > ProjectileClass
 

Detailed Description

This class represents a hitscan weapon in the weapon system. It is a subclass of AWeaponFramework.

See also
HitscanWeaponFramework
AWeaponFramework

Constructor & Destructor Documentation

◆ AHitscanWeaponFramework()

AHitscanWeaponFramework::AHitscanWeaponFramework ( )
13{
15}
EWeaponType WeaponType
Definition WeaponFramework.h:178

Member Function Documentation

◆ BlindFireWeaponTrace()

FHitResult AHitscanWeaponFramework::BlindFireWeaponTrace ( const float Accuracy,
const AActor * ActorToIgnore = nullptr )
overrideprotectedvirtual

Reimplemented from AWeaponFramework.

243{
244 SCOPE_CYCLE_COUNTER(STATGROUP_WeaponSystem_HitScan);
245 TRACE_CPUPROFILER_EVENT_SCOPE(AHitscanWeaponFramework::BlindFireWeaponTrace);
246 //- Linetrace but from the MuzzleLocation //
247 //- V2 has the LineEnd calculated from the Muzzle Location //
248 TraceLocation = Muzzle->GetComponentLocation();
249 FHitResult BlindFireHit;
250 FVector ShotDirection;
251 LineTrace(BlindFireHit, ShotDirection, BlindFireTraceColor);
252 //- Apply Damage //
253 if(BlindFireHit.GetActor() != nullptr)
254 {
255 ApplyDamageToActor(BlindFireHit, ShotDirection, CalculateDistanceDamage(BlindFireHit.Distance));
256 }
257 return BlindFireHit;
258}
virtual float CalculateDistanceDamage(const float Distance) const override
Definition HitscanWeaponFramework.cpp:260
virtual FHitResult BlindFireWeaponTrace(const float Accuracy, const AActor *ActorToIgnore=nullptr) override
Definition HitscanWeaponFramework.cpp:242
virtual bool LineTrace(FHitResult &Hit, FVector &ShotDirection, const FLinearColor &Color=FLinearColor::Green, const FVector &CustomLineEnd=FVector::ZeroVector) const override
Definition HitscanWeaponFramework.cpp:186
FLinearColor BlindFireTraceColor
Definition WeaponFramework.h:51
void ApplyDamageToActor(const FHitResult &Hit, FVector ShotDirection, float Multiplier=1.0f)
Definition WeaponFramework.cpp:703
FVector TraceLocation
Definition WeaponFramework.h:164
USceneComponent * Muzzle
Definition WeaponFramework.h:187

◆ CalculateDistanceDamage()

float AHitscanWeaponFramework::CalculateDistanceDamage ( const float Distance) const
overrideprotectedvirtual

Reimplemented from AWeaponFramework.

261{
262 SCOPE_CYCLE_COUNTER(STATGROUP_WeaponSystem_HitScan);
263 TRACE_CPUPROFILER_EVENT_SCOPE(AHitscanWeaponFramework::CalculateDistanceDamage);
264 const float MaxDamageMultiplier = GetWeaponStats().MaxDamageMultiplier;
265 const float MinDamageMultiplier = GetWeaponStats().MinDamageMultiplier;
266 const float WeaponRangeMin = GetWeaponStats().WeaponRangeMin;
267 const float WeaponRangeMax = GetWeaponStats().WeaponRangeMax;
268 //- Full damage up to WeaponRangeMin
269 if (Distance <= WeaponRangeMin)
270 {
271 LogDebugMessage(FString::Printf(TEXT("Weapon Distance %.2f Multiplier: %.2f (BELOW MIN DISTANCE = MAX Multiplier)"), Distance, MaxDamageMultiplier));
272 return MaxDamageMultiplier;
273 }
274 //- Damage decreases linearly between WeaponRangeMin and WeaponRangeMax
275 if (Distance <= WeaponRangeMax)
276 {
277 const float Alpha = (Distance - WeaponRangeMin) / (WeaponRangeMax - WeaponRangeMin);
278 LogDebugMessage(FString::Printf(TEXT("Weapon Distance %.2f Multiplier: %.2f (IN BETWEEN DISTANCE)"), Distance, FMath::Lerp(MaxDamageMultiplier, MinDamageMultiplier, Alpha)));
279 return FMath::Lerp(MaxDamageMultiplier, MinDamageMultiplier, Alpha);
280 }
281 //- Constant minimum damage beyond WeaponRangeMax
282 LogDebugMessage(FString::Printf(TEXT("Weapon Distance %.2f Multiplier: %.2f (FATHER THAN MAX DISTANCE = MIN MULTIPLIER)"), Distance, MinDamageMultiplier));
283 return MinDamageMultiplier;
284}
virtual FWeaponStats_T GetWeaponStats() const override
Definition WeaponFramework.cpp:900
void LogDebugMessage(const FString &Message, const bool bError=false) const
Definition WeaponFramework.cpp:323
float MaxDamageMultiplier
Definition WeaponStructs.h:685
float WeaponRangeMax
Definition WeaponStructs.h:682
float MinDamageMultiplier
Definition WeaponStructs.h:688
float WeaponRangeMin
Definition WeaponStructs.h:679

◆ LineTrace()

bool AHitscanWeaponFramework::LineTrace ( FHitResult & Hit,
FVector & ShotDirection,
const FLinearColor & Color = FLinearColor::Green,
const FVector & CustomLineEnd = FVector::ZeroVector ) const
overrideprotectedvirtual

Reimplemented from AWeaponFramework.

188{
189 TRACE_CPUPROFILER_EVENT_SCOPE(AWeaponFramework::LineTrace);
190 SCOPE_CYCLE_COUNTER(STATGROUP_WeaponSystem_Weapons);
191 const FVector ForwardVector = (FRotationMatrix(TraceRotation).GetScaledAxis( EAxis::X ));
192 FVector BulletSpread;
193 CalculateBulletSpread(BulletSpread);
194 ShotDirection = -TraceRotation.Vector();
195 const FVector LineEnd = ((ForwardVector * GetWeaponStats().GunRange) + TraceLocation) + BulletSpread;
196
197 ECollisionChannel CollisionChannel = UEngineTypes::ConvertToCollisionChannel(UEngineTypes::ConvertToTraceType(ECC_GameTraceChannel4));
198 static const FName LineTraceSingleName(TEXT("LineTraceSingle"));
199 FCollisionQueryParams Params;// = ConfigureCollisionParams(LineTraceSingleName, bTraceComplex, ActorsToIgnore, bIgnoreSelf, WorldContextObject);
200 // Params.bDebugQuery
201 Params.bTraceComplex = bTraceComplex;
202 Params.bReturnPhysicalMaterial = bReturnPhysicalMaterial;
203 bool const bHit = GetWorld() ? GetWorld()->LineTraceSingleByChannel(Hit, TraceLocation, LineEnd, CollisionChannel, Params) : false;
204
205 if(UBaseHelpersBPLib::GetDrawDebugType(bDebuggingMode) != EDrawDebugTrace::None)
206 {
207 const bool bPersistent = UBaseHelpersBPLib::GetDrawDebugType(bDebuggingMode) == EDrawDebugTrace::Persistent;
208 const float LifeTime = (UBaseHelpersBPLib::GetDrawDebugType(bDebuggingMode) == EDrawDebugTrace::ForDuration) ? DrawDebugTime : 0.f;
209
210 if (bHit && Hit.bBlockingHit)
211 {
212 const FLinearColor DarkerColor = FLinearColor(Color.R * DrawDebugColorDarkMultiplier, Color.G * DrawDebugColorDarkMultiplier, Color.B * DrawDebugColorDarkMultiplier, Color.A);
213 const FLinearColor LighterColor = FLinearColor((Color.R + 0.1f) * DrawDebugColorLightMultiplier, (Color.G + 0.1f) * DrawDebugColorLightMultiplier, (Color.B + 0.1f) * DrawDebugColorLightMultiplier, Color.A);
214 // Red up to the blocking hit, green thereafter
215 DrawDebugLine(GetWorld(), TraceLocation, Hit.ImpactPoint, Color.ToFColor(true), bPersistent, LifeTime);
216 DrawDebugLine(GetWorld(), Hit.ImpactPoint, LineEnd, LighterColor.ToFColor(true), bPersistent, LifeTime);
217 DrawDebugPoint(GetWorld(), Hit.ImpactPoint, DrawDebugPointSize, DarkerColor.ToFColor(true), bPersistent, LifeTime);
218 }
219 else
220 {
221 // no hit means all red
222 DrawDebugLine(GetWorld(), TraceLocation, LineEnd, Color.ToFColor(true), bPersistent, LifeTime);
223 }
224 }
225 return bHit;
226 // return GetWorld()->LineTraceSingleByChannel(
227 // );
228 // return UKismetSystemLibrary::LineTraceSingle(
229 // this,
230 // TraceLocation,
231 // LineEnd,
232 // UEngineTypes::ConvertToTraceType(ECC_GameTraceChannel4),
233 // bTraceComplex,
234 // ActorsToIgnore,
235 // UBaseHelpersBPLib::GetDrawDebugType(bDebuggingMode),
236 // Hit,
237 // true,
238 // Color, Color,
239 // DrawDebugTime);
240}
void CalculateBulletSpread(FVector &NewBulletSpread) const
Definition WeaponFramework.cpp:729
bool bDebuggingMode
Definition WeaponFramework.h:35
float DrawDebugColorLightMultiplier
Definition WeaponFramework.h:45
float DrawDebugColorDarkMultiplier
Definition WeaponFramework.h:43
float DrawDebugTime
Definition WeaponFramework.h:41
FRotator TraceRotation
Definition WeaponFramework.h:165
bool bTraceComplex
Definition WeaponFramework.h:54
virtual bool LineTrace(FHitResult &Hit, FVector &ShotDirection, const FLinearColor &Color=FLinearColor::Green, const FVector &CustomLineEnd=FVector::ZeroVector) const
Definition WeaponFramework.cpp:658
float DrawDebugPointSize
Definition WeaponFramework.h:47
bool bReturnPhysicalMaterial
Definition WeaponFramework.h:56
static EDrawDebugTrace::Type GetDrawDebugType(const bool bDebuggingMode)
Definition BaseHelpersBPLib.cpp:910
float GunRange
Definition WeaponStructs.h:676

◆ ServerShoot_Implementation()

void AHitscanWeaponFramework::ServerShoot_Implementation ( )
overridevirtual
18{
19 TRACE_CPUPROFILER_EVENT_SCOPE(AWeaponFramework::ServerShoot_Implementation);
20 SCOPE_CYCLE_COUNTER(STATGROUP_WeaponSystem_Weapons);
21 ActorsToIgnore.Emplace(GetOwner());
24 //- Bullet is only Decreased in fire Function //
25 if(GetWeaponStats().bMultiFire)
26 {
28 }
29 if(!bBottomlessClip){LogDebugMessage(FString::Printf(TEXT("Current Ammo: %i"), WeaponData.CurrentAmmo));}
30
31
32 //- Weapon Effects //
33 WeaponEffects->WeaponFireNoiseEvent(GetWeaponStats().bSilenced);
34 WeaponEffects->MuzzleFlashEvent(GetWeaponStats().MuzzleFlashOffset);
35
36
37 FHitResult Hit;
38 FVector ShotDirection;
39 bool bSuccess = LineTrace(Hit, ShotDirection, MainTraceColor);
40
41 //- Defaults for Impact Effects
42 FVector TracerEndPoint = Hit.TraceEnd;
43 TArray<FVector> HitLocations;
44
45 //- No Hit //
46 if(!bSuccess)
47 {
48 TracerEndPoint = Hit.TraceEnd;
49 HitLocations.Add(Hit.TraceEnd);
50 if(WeaponEffects != nullptr)
51 {
52 WeaponEffects->TracerEvent(HitLocations);
53 }
55 return;
56 }
57
58 //- Check how close the gun is to the hit location
59 FVector MuzzleLocation = Muzzle->GetComponentLocation();
60 FVector NormalVector = (MuzzleLocation - Hit.Location);
61 NormalVector.Normalize(0.0001);
62 FVector ForwardVector = (FRotationMatrix(TraceRotation).GetScaledAxis( EAxis::X ));
63 float VectorDistance = UKismetMathLibrary::Dot_VectorVector(NormalVector,(ForwardVector * -1));
64 if(VectorDistance < TraceDistanceTooClose)
65 {
66 //- If the gun is too close to the Hit location
67 //- eg. gun against the wall
68 FHitResult BlindFireHit = BlindFireWeaponTrace(GetAccuracyMultiplier());
69 if(BlindFireHit.bBlockingHit)
70 {
71 HitLocations.Add(BlindFireHit.Location);
72 ApplyDamageToActor(BlindFireHit, ShotDirection, CalculateDistanceDamage(BlindFireHit.Distance));
73 ReceiveFire(BlindFireHit, OwnerPawn);
74 if(WeaponEffects != nullptr)
75 {
76 WeaponEffects->ImpactEvent(BlindFireHit);
77 }
78 LogDebugMessage(FString::Printf(TEXT("Hit 1: X %f,Y: %f,Z: %f"), BlindFireHit.Location.X, BlindFireHit.Location.Y, BlindFireHit.Location.Z));
79 }
80 else
81 {
82 HitLocations.Add(BlindFireHit.TraceEnd);
83 ApplyDamageToActor(BlindFireHit, ShotDirection, CalculateDistanceDamage(BlindFireHit.Distance));
84 ReceiveFire(BlindFireHit, OwnerPawn);
85 if(WeaponEffects != nullptr)
86 {
87 WeaponEffects->ImpactEvent(BlindFireHit);
88 }
89 LogDebugMessage(FString::Printf(TEXT("Hit 1.5: X %f,Y: %f,Z: %f"), BlindFireHit.TraceEnd.X, BlindFireHit.TraceEnd.Y, BlindFireHit.TraceEnd.Z));
90 }
91 }
92 else
93 {
94 //- Check if Anything is between the player and where they should be shooting //
95 //- i.e. can see someone around the corner but gun is pointed at the wall //
96
97 //todo Change this to Linetrace Function, TraceLocation = Hit.Location
98 // way to change just the end
99 FHitResult HitCheck;
100 ActorsToIgnore.Add(Hit.GetActor());
101
102
103 //- LineTrace, Did we hit something
104 if(UKismetSystemLibrary::LineTraceSingle(this,
105 Hit.Location,
106 MuzzleLocation,
107 UEngineTypes::ConvertToTraceType(ECC_GameTraceChannel4),
109 //~ Debugging
111 true, FLinearColor::Blue,
112 FLinearColor::Blue, DrawDebugTime))
113 {
114 FHitResult BlindFireHit = BlindFireWeaponTrace(GetAccuracyMultiplier());
115 if(BlindFireHit.bBlockingHit)
116 {
117 HitLocations.Add(BlindFireHit.Location);
118 ApplyDamageToActor(BlindFireHit, ShotDirection, CalculateDistanceDamage(BlindFireHit.Distance));
119 ReceiveFire(BlindFireHit, OwnerPawn);
120 if(WeaponEffects != nullptr)
121 {
122 WeaponEffects->ImpactEvent(BlindFireHit);
123 }
124 LogDebugMessage(FString::Printf(TEXT("Hit 2: X %f,Y: %f,Z: %f"), BlindFireHit.Location.X, BlindFireHit.Location.Y, BlindFireHit.Location.Z));
125 }
126 else
127 {
128 HitLocations.Add(BlindFireHit.TraceEnd);
129 ApplyDamageToActor(BlindFireHit, ShotDirection, CalculateDistanceDamage(BlindFireHit.Distance));
130 ReceiveFire(BlindFireHit, OwnerPawn);
131 if(WeaponEffects != nullptr)
132 {
133 WeaponEffects->ImpactEvent(BlindFireHit);
134 }
135 LogDebugMessage(FString::Printf(TEXT("Hit 2.5: X %f,Y: %f,Z: %f"), BlindFireHit.TraceEnd.X, BlindFireHit.TraceEnd.Y, BlindFireHit.TraceEnd.Z));
136 }
137 }
138 else
139 {
140 //- Nothing in the way
141 if(Hit.GetActor() != nullptr)
142 {
143 ApplyDamageToActor(Hit, ShotDirection, CalculateDistanceDamage(Hit.Distance));
144 LogDebugMessage(FString::Printf(TEXT("Hit 3: X %f,Y: %f,Z: %f"), Hit.Location.X, Hit.Location.Y, Hit.Location.Z));
145 HitLocations.Add(Hit.Location);
147 if(WeaponEffects != nullptr)
148 {
149 WeaponEffects->ImpactEvent(Hit);
150 }
151 }
152 }
153 //Remove as the var is kept
154 ActorsToIgnore.Remove(Hit.GetActor());
155 }
156 WeaponEffects->TracerEvent(HitLocations);
157 // EPhysicalSurface SurfaceType = SurfaceType_Default;
158 // SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
159
160 //- v1 Replication?
161 // if(HasAuthority())
162 // {
163 // HitScanTrace.TraceTo = TracerEndPoint;
164 // // HitScanTrace.SurfaceType = SurfaceType;
165 // HitScanTrace.a++;
166 //
167 // }
168 //todo temp
169 // EPhysicalSurface SurfaceType = SurfaceType_Default;
170 // SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
171 //
172 // PlayFireEffects(TracerEndPoint);
173 // if(HasAuthority())
174 // {
175 // HitScanTrace.TraceTo = TracerEndPoint;
176 // HitScanTrace.SurfaceType = SurfaceType;
177 // HitScanTrace.a++;
178 // }
179}
FLinearColor MainTraceColor
Definition WeaponFramework.h:49
float GetAccuracyMultiplier() const
Definition WeaponFramework.h:133
bool bBottomlessClip
Definition WeaponFramework.h:39
APawn * OwnerPawn
Definition WeaponFramework.h:173
TArray< AActor * > ActorsToIgnore
Definition WeaponFramework.h:170
void ReceiveFire(FHitResult Hit, APawn *InstigatorPawn)
class UWeaponEffectsComponent * WeaponEffects
Definition WeaponFramework.h:193
float TraceDistanceTooClose
Definition WeaponFramework.h:59
FWeaponData_T WeaponData
Definition WeaponFramework.h:176
int32 CurrentAmmo
Definition WeaponStructs.h:880

◆ ServerShoot_Validate()

bool AHitscanWeaponFramework::ServerShoot_Validate ( )
overridevirtual
182{
183 return Super::ServerShoot_Validate();
184}

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