LEAP Documentation 40220
Documentation for the LEAP project
WeaponInstanceRanged.h
Go to the documentation of this file.
1// Copyright Blue Isle Studios Inc 2018. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "Kismet/KismetMathLibrary.h"
8#include "WeaponInstanceRanged.generated.h"
9
10UENUM(BlueprintType)
11enum class EMovementSpreadType : uint8
12{
13 NONE = 0,
14 MoveTime = 1, // Move Time applies spread based on for how long you have been moving
15 VelocityBased = 2, // Velocity Based lets you control spread amounts based on your speed using a curve;
16};
17
23 class UCurveFloat;
24
25UCLASS()
26class PROJECTX_API UWeaponInstanceRanged : public UWeaponInstance
27{
28 GENERATED_UCLASS_BODY()
29
30//~ Begin UActorComponent Interface.
31public:
32 virtual void BeginPlay() override;
33 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
34//~ End UActorComponent Interface.
35
36public:
37 virtual bool CanFire(EWeaponError& ErrorMessage, uint8 Mode) const override;
38 virtual bool Fire(uint8 Mode, float WorldTimeOverride) override;
39 virtual void FireComplete(uint8 Mode = 0) override;
40 virtual void PrimaryFire(uint8 RemainingBurstCount); //BurstCount is the number of bursts left for this sequence.
41 virtual float GetDamage(const FHitResult& HitResult, float DamgeModifier, const UWeaponComponent* WeaponComponent = NULL) const override;
42 virtual bool IsHeadshot(const FHitResult& HitResult) const override;
43 virtual float GetMovementSpreadModifier() const override;
44 virtual float GetReticleSpreadMultiplier() const override;
45 virtual float GetWeaponSpread() const override;
46
47 /* Curve that modifies damage based on hit distance (in UU) */
48 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
49 UCurveFloat* DamageFalloffCurve = NULL;
50protected:
51 virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
52 virtual void PlayWeaponFireEffects(uint8 BurstCounter = 0) override;
53 virtual void PlayRecoil();
54
55 virtual void UpdateSpread();
56 virtual float GetCurrentSpread() const;
57 virtual void ApplyConeSpread(FVector& Direction, float ProjectilePercent = 0.0f) const;
58 virtual void ApplySpreadPattern(FVector& Direction, int ProjectileNum = 0) const;
59 virtual void UpdateMovementSpread();
60
61protected:
62 //This is a weird number. It signifies how many shots have been validated for this weapon.
63 UPROPERTY()
64 uint8 FireValidationCount = 0;
65 /* How many validations do we grant per fire? */
66 UPROPERTY()
67 uint8 ValidationsPerFire = 1;
68
69 UPROPERTY()
70 uint32 SpreadInterpolationID = INDEX_NONE;
71
72 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Recoil")
73 bool bHasRecoil = false;
74 /* Recoil played per shot expressed as pitch (x) and yaw (y) */
75 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Recoil", meta = (EditCondition = "bHasRecoil"))
76 FVector2D Recoil = FVector2D(0.05f, 0.05f);
77 /* Rate at which recoil is applied */
78 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Recoil", meta = (EditCondition = "bHasRecoil"))
79 float RecoilRate = 0.075f;
80 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Recoil", meta = (EditCondition = "bHasRecoil"))
81 TEnumAsByte<EEasingFunc::Type> RecoilEaseType;
82
83 /* Modifies the recoil of weapons depending on tight aim progress */
84 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Tight Aim", meta = (EditCondition = "bCanTightAim && bHasRecoil", DisplayAfter = "TightAimSpreadModifier"))
85 FVector2D TightAimRecoilModifier = FVector2D(1.f, 1.f);
86 /* Modifies the recoil rate of weapons depending on tight aim progress */
87 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Tight Aim", meta = (EditCondition = "bCanTightAim && bHasRecoil", DisplayAfter = "TightAimRecoilModifier"))
88 float TightAimRecoilRateModifier = 1.f;
89 /*Multiplier on spread when the weapon is TightAiming. Normal strength is 1.0f */
90 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Tight Aim", meta = (EditCondition = "bCanTightAim"))
91 float TightAimSpreadPerShotMultiplier = 1.0f;
92 /*Multiplier on spread decay rate when the weapon is TightAiming. Normal strength is 1.0f */
93 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Tight Aim", meta = (EditCondition = "bCanTightAim"))
94 float TightAimSpreadDecayRateMultiplier = 1.0f;
95
96 /* does the weapon have a spread*/
97 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread")
98 bool bHasSpread = false;
99 /*Is the spread random or evenly distributed using a spread pattern? */
100 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread")
101 bool bRandomSpread = true;
102
103 /* Does this weapon support Movement-Based Spread?*/
104 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased")
105 bool bHasMovementBasedSpread = false;
106 /* What type of movement based spread is applied to this weapon? */
107 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased", meta = (EditCondition = "bHasMovementBasedSpread"))
109 /* Does this weapon support Movement-Based Spread?*/
110 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|Tight Aim", meta = (EditCondition = "bHasMovementBasedSpread"))
111 bool bApplyMovementSpreadWhenTightAiming = true;
112 /* How much of the movement-based spread to be applied when tight aiming? [0-1] */
113 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|Tight Aim", meta = (EditCondition = "bHasMovementBasedSpread && bApplyMovementSpreadWhenTightAiming"))
114 float MovementSpreadTightAimingMultiplier = 1.f;
115 /* A multiplier to the spread caused by movement when it reaches its max amount*/
116 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|MoveTime", meta = (EditCondition = "bHasMovementBasedSpread && MovementSpreadType == EMovementSpreadType::MoveTime"))
117 float MovementSpreadMultiplier = 1.2f;
118 /* How long does it take for the max movement-based spread multiplier to be added at full (in seconds)? */
119 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|MoveTime", meta = (EditCondition = "bHasMovementBasedSpread && MovementSpreadType == EMovementSpreadType::MoveTime"))
120 float TimeToReachMaxMovementSpreadMultiplier = 0.25f;
121 /* How long does it take for the weapon to recovery from a full movement-based spread multiplier (in seconds)? */
122 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|MoveTime", meta = (EditCondition = "bHasMovementBasedSpread && MovementSpreadType == EMovementSpreadType::MoveTime"))
123 float TimeToRecoveryFromMovementSpreadMultiplier = 0.25f;
124 /*Multiplier on cone spread when crouching. Normal strength is 1.0f */
125 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|Crouch", meta = (EditCondition = "bCanTightAim"))
126 float CrouchConeSpreadMultiplier = 1.0f;
127
128 /* A curve that control how much movement-based spread we will apply based on the current speed */
129 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread|MovementBased|VelocityBased", meta = (EditCondition = "bHasMovementBasedSpread && MovementSpreadType == EMovementSpreadType::VelocityBased"))
130 UCurveFloat* VelocityBasedSpreadCurve = NULL;
131
132 /* An Weapon Spread Data Asset that can be used for baked spreads */
133 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread", meta = (EditCondition = "bHasSpread && !bRandomSpread"))
134 UWeaponSpreadDataAsset* BakedSpreadConfigDataAsset = NULL;
135 /* A zero conespread is perfect aim, larger numbers will cause shots to miss further targets more frequently. (Number is in degrees). Value interpolates from X to Y based WeaponFiringTime / BloomTime */
136 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread", meta = (EditCondition = "bHasSpread"))
137 FVector2D SpreadRange = FVector2D(0.0f, 15.0f);
138 /* Incrementation of spread per shot (in percent) */
139 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread", meta = (EditCondition = "bHasSpread"))
140 float SpreadPerShot = 0.1f;
141 /* Rate at which spread decays */
142 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Spread", meta = (EditCondition = "bHasSpread"))
143 float SpreadDecayRate = 1.0f;
144
145 float CurrentMovementSpreadModifier = 1.f;
146 float MovementSpreadModifierOnStop = 1.f;
147 FTimerHandle BurstTimer;
148
149public:
150 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Burst Fire")
151 bool bBurstFire = false;
152 /* Number of bursts per fire. */
153 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Burst Fire", meta = (EditCondition = "bBurstFire"))
154 uint8 BurstCount = 3;
155 /* Time between bursts. */
156 UPROPERTY(EditDefaultsOnly, Category = "Weapon|Burst Fire", meta = (EditCondition = "bBurstFire"))
157 float BurstRate = 0.1f;
158
159public:
160 static void FormatTraceMultiHitResults(TArray<FHitResult>& HitResults, const UWeaponInstanceRanged* Weapon);
161};
EWeaponError
Definition: WeaponComponent.h:15
EMovementSpreadType
Definition: WeaponInstanceRanged.h:12
Definition: WeaponInstance.h:220
Definition: WeaponInstanceRanged.h:27
Definition: WeaponSpreadDataAsset.h:27