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 (bFireButtonPressed)
if (bCanFire)
{
FHitResult HitResult;
TraceUnderCrosshairs(HitResult);
ServerFire(HitResult.ImpactPoint);
bCanFire = false;
ServerFire(HitTarget);
if (EquippedWeapon)
{
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)
{
if (Character == nullptr || WeaponToEquip == nullptr) return;

View File

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

View File

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