Add extra weapon firing logic
This commit is contained in:
parent
90fcf30ce5
commit
a90c447ce9
|
@ -95,7 +95,8 @@ void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputCom
|
||||||
|
|
||||||
if (FireAction)
|
if (FireAction)
|
||||||
{
|
{
|
||||||
Input->BindAction(FireAction, ETriggerEvent::Started, this, &APlayerCharacter::FireCallback);
|
Input->BindAction(FireAction, ETriggerEvent::Started, this, &APlayerCharacter::BeginFireCallback);
|
||||||
|
Input->BindAction(FireAction, ETriggerEvent::Completed, this, &APlayerCharacter::EndFireCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QuitAction)
|
if (QuitAction)
|
||||||
|
@ -143,13 +144,32 @@ void APlayerCharacter::JumpCallback(const FInputActionInstance& Instance)
|
||||||
Jump();
|
Jump();
|
||||||
}
|
}
|
||||||
|
|
||||||
void APlayerCharacter::FireCallback(const FInputActionInstance& Instance)
|
void APlayerCharacter::BeginFireCallback(const FInputActionInstance& Instance)
|
||||||
{
|
{
|
||||||
// TODO: Add extra gun fire logic
|
if (CurrentWeapon == nullptr || CurrentWeapon->GetCurrentWeaponStatus()->GetValue() != WeaponState::Idle)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate hits from hitscan
|
IsFiring = true;
|
||||||
TArray<FHitResult> Hits = TArray<FHitResult>();
|
|
||||||
CalculateHits(&Hits);
|
OnFire();
|
||||||
|
|
||||||
|
|
||||||
|
if (CurrentWeapon->GetWeaponProperties()->IsAutomatic)
|
||||||
|
{
|
||||||
|
GetWorldTimerManager().SetTimer(CooldownTimerHandle, this, &APlayerCharacter::WeaponCooldownHandler, CurrentWeapon->GetWeaponProperties()->WeaponCooldown, true);
|
||||||
|
GetWorldTimerManager().SetTimer(FireTimerHandle, this, &APlayerCharacter::OnFire, CurrentWeapon->GetWeaponProperties()->WeaponCooldown, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetWorldTimerManager().SetTimer(CooldownTimerHandle, this, &APlayerCharacter::WeaponCooldownHandler, CurrentWeapon->GetWeaponProperties()->WeaponCooldown, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APlayerCharacter::EndFireCallback(const FInputActionInstance& Instance)
|
||||||
|
{
|
||||||
|
IsFiring = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void APlayerCharacter::QuitCallback(const FInputActionInstance& Instance)
|
void APlayerCharacter::QuitCallback(const FInputActionInstance& Instance)
|
||||||
|
@ -342,3 +362,42 @@ void APlayerCharacter::RemoveCurrentWeaponFromInventory()
|
||||||
// TODO: Add more checking here
|
// TODO: Add more checking here
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void APlayerCharacter::OnFire()
|
||||||
|
{
|
||||||
|
if (!IsFiring)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentWeapon->SetCurrentWeaponStatus(WeaponState::Firing);
|
||||||
|
|
||||||
|
TArray<FHitResult> Hits = TArray<FHitResult>();
|
||||||
|
CalculateHits(&Hits);
|
||||||
|
|
||||||
|
// TODO: Decrement ammo count
|
||||||
|
|
||||||
|
// TODO: Play sound effect
|
||||||
|
|
||||||
|
CurrentWeapon->SetCurrentWeaponStatus(WeaponState::Cooldown);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APlayerCharacter::WeaponCooldownHandler()
|
||||||
|
{
|
||||||
|
if (CurrentWeapon->GetCurrentWeaponStatus()->GetValue() != WeaponState::Idle)
|
||||||
|
{
|
||||||
|
CurrentWeapon->SetCurrentWeaponStatus(WeaponState::Idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsFiring)
|
||||||
|
{
|
||||||
|
GetWorldTimerManager().ClearTimer(FireTimerHandle);
|
||||||
|
GetWorldTimerManager().ClearTimer(CooldownTimerHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APlayerCharacter::ClearAllTimers()
|
||||||
|
{
|
||||||
|
GetWorldTimerManager().ClearTimer(FireTimerHandle);
|
||||||
|
GetWorldTimerManager().ClearTimer(CooldownTimerHandle);
|
||||||
|
}
|
||||||
|
|
|
@ -78,6 +78,12 @@ private:
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
AWeapon* CurrentWeapon = nullptr;
|
AWeapon* CurrentWeapon = nullptr;
|
||||||
|
|
||||||
|
FTimerHandle FireTimerHandle;
|
||||||
|
|
||||||
|
FTimerHandle CooldownTimerHandle;
|
||||||
|
|
||||||
|
bool IsFiring = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Sets default values for this character's properties
|
// Sets default values for this character's properties
|
||||||
APlayerCharacter();
|
APlayerCharacter();
|
||||||
|
@ -99,7 +105,9 @@ public:
|
||||||
|
|
||||||
void JumpCallback(const FInputActionInstance& Instance);
|
void JumpCallback(const FInputActionInstance& Instance);
|
||||||
|
|
||||||
void FireCallback(const FInputActionInstance& Instance);
|
void BeginFireCallback(const FInputActionInstance& Instance);
|
||||||
|
|
||||||
|
void EndFireCallback(const FInputActionInstance& Instance);
|
||||||
|
|
||||||
void QuitCallback(const FInputActionInstance& Instance);
|
void QuitCallback(const FInputActionInstance& Instance);
|
||||||
|
|
||||||
|
@ -130,4 +138,10 @@ public:
|
||||||
void RemoveWeaponFromInventory(int i);
|
void RemoveWeaponFromInventory(int i);
|
||||||
|
|
||||||
void RemoveCurrentWeaponFromInventory();
|
void RemoveCurrentWeaponFromInventory();
|
||||||
|
|
||||||
|
void OnFire();
|
||||||
|
|
||||||
|
void WeaponCooldownHandler();
|
||||||
|
|
||||||
|
void ClearAllTimers();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue