91 - Automatic Fire

This commit is contained in:
Kingsmedia 2022-05-06 22:54:23 +02:00
parent 3a5ca822aa
commit 76289d97e4
5 changed files with 66 additions and 22 deletions

Binary file not shown.

View File

@ -173,20 +173,63 @@ void UCombatComponent::OnRep_EquippedWeapon()
} }
} }
void UCombatComponent::FireButtonPressed(bool bPressed) void UCombatComponent::Fire()
{ {
bFireButtonPressed = bPressed; if (bCanFire)
if (bFireButtonPressed)
{ {
FHitResult HitResult; bCanFire = false;
TraceUnderCrosshairs(HitResult); ServerFire(HitTarget);
ServerFire(HitResult.ImpactPoint);
if (EquippedWeapon) if (EquippedWeapon)
{ {
CrosshairShootingFactor = 0.75f; CrosshairShootingFactor = 0.75f;
} }
StartFireTimer();
}
}
void UCombatComponent::FireButtonPressed(bool bPressed)
{
bFireButtonPressed = bPressed;
if (bFireButtonPressed && EquippedWeapon)
{
Fire();
}
}
void UCombatComponent::StartFireTimer()
{
if (EquippedWeapon == nullptr || Character == nullptr) return;
Character->GetWorldTimerManager().SetTimer(FireTimer, this, &UCombatComponent::FireTimerFinished, EquippedWeapon->FireDelay);
}
void UCombatComponent::FireTimerFinished()
{
if (EquippedWeapon == nullptr) return;
bCanFire = true;
if (bFireButtonPressed && EquippedWeapon->bAutomatic)
{
Fire();
}
}
void UCombatComponent::ServerFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
MulticastFire(TraceHitTarget);
}
void UCombatComponent::MulticastFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
if (EquippedWeapon == nullptr) return;
if (Character)
{
Character->PlayFireMontage(bAiming);
EquippedWeapon->Fire(TraceHitTarget);
} }
} }
@ -237,21 +280,6 @@ void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult)
} }
} }
void UCombatComponent::ServerFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
MulticastFire(TraceHitTarget);
}
void UCombatComponent::MulticastFire_Implementation(const FVector_NetQuantize& TraceHitTarget)
{
if (EquippedWeapon == nullptr) return;
if (Character)
{
Character->PlayFireMontage(bAiming);
EquippedWeapon->Fire(TraceHitTarget);
}
}
void UCombatComponent::EquipWeapon(AWeapon* WeaponToEquip) void UCombatComponent::EquipWeapon(AWeapon* WeaponToEquip)
{ {
if (Character == nullptr || WeaponToEquip == nullptr) return; if (Character == nullptr || WeaponToEquip == nullptr) return;

View File

@ -32,6 +32,7 @@ protected:
UFUNCTION() UFUNCTION()
void OnRep_EquippedWeapon(); void OnRep_EquippedWeapon();
void Fire();
void FireButtonPressed(bool bPressed); void FireButtonPressed(bool bPressed);
@ -87,4 +88,11 @@ private:
void InterpFOV(float DeltaTime); void InterpFOV(float DeltaTime);
FVector HitTarget; FVector HitTarget;
// Automatic fire
FTimerHandle FireTimer;
bool bCanFire = true;
void StartFireTimer();
void FireTimerFinished();
}; };

View File

@ -51,6 +51,14 @@ public:
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
float ZoomInterpSpeed = 20.f; float ZoomInterpSpeed = 20.f;
// Automatic fire
UPROPERTY(EditAnywhere, Category = Combat)
bool bAutomatic = true;
UPROPERTY(EditAnywhere, Category = Combat)
float FireDelay = .15f;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;