2025-02-21 20:42:52 +01:00
// Fill out your copyright notice in the Description page of Project Settings.
# include "Characters/Components/ShootingComponent.h"
// Sets default values for this component's properties
UShootingComponent : : UShootingComponent ( )
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick . bCanEverTick = true ;
// ...
}
// Called when the game starts
void UShootingComponent : : BeginPlay ( )
{
Super : : BeginPlay ( ) ;
2025-02-22 01:28:07 +01:00
PlayerCharacter = Cast < AExoPlayerCharacter > ( GetOwner ( ) ) ;
2025-02-21 20:42:52 +01:00
}
void UShootingComponent : : Shoot ( )
{
2025-03-23 21:47:10 +01:00
if ( ! IsValid ( CurrentGun ) | | CurrentGun - > CurrentAmmo = = 0 | | bIsReloading | | ! bCanShoot ) return ;
2025-03-15 13:48:39 +01:00
APawn * PawnOwner = Cast < APawn > ( PlayerCharacter ) ;
if ( ! PawnOwner | | ! PawnOwner - > GetController ( ) ) return ;
2025-02-22 01:28:07 +01:00
bCanShoot = false ;
2025-03-23 21:47:10 +01:00
CurrentGun - > CurrentAmmo - - ;
2025-02-21 20:42:52 +01:00
2025-03-15 13:48:39 +01:00
FVector ViewLocation ;
FRotator ViewRotation ;
PawnOwner - > GetController ( ) - > GetPlayerViewPoint ( ViewLocation , ViewRotation ) ;
FVector ForwardVector = ViewRotation . Vector ( ) ;
2025-03-22 13:46:05 +01:00
FVector LineStart = ViewLocation ; //PlayerCharacter->GetActorLocation();
2025-03-23 21:47:10 +01:00
FVector LineEnd = LineStart + ( ForwardVector * CurrentGun - > MaxRange ) ;
2025-02-21 20:42:52 +01:00
FHitResult HitResult ;
FCollisionQueryParams QueryParams ;
2025-02-22 01:28:07 +01:00
QueryParams . AddIgnoredActor ( PlayerCharacter ) ;
2025-02-21 20:42:52 +01:00
2025-03-15 13:48:39 +01:00
// Strza<7A>
2025-02-21 20:42:52 +01:00
bool bHit = GetWorld ( ) - > LineTraceSingleByChannel ( HitResult , LineStart , LineEnd , ECC_Visibility , QueryParams ) ;
if ( bHit & & HitResult . GetActor ( ) & & HitResult . GetActor ( ) - > Implements < UDamageable > ( ) )
{
2025-03-23 21:47:10 +01:00
IDamageable : : Execute_TakeDamage ( HitResult . GetActor ( ) , CurrentGun - > DamageValue ) ;
2025-02-21 20:42:52 +01:00
2025-03-23 21:47:10 +01:00
UE_LOG ( LogTemp , Display , TEXT ( " Shoot. Ammo: %d/%d " ) , CurrentGun - > CurrentAmmo , CurrentGun - > MaxAmmo ) ; // Docelowo tutaj wywo<77> anie UI aktualizuj<75> ce stan ammo
2025-02-21 20:42:52 +01:00
}
2025-03-23 21:47:10 +01:00
PlayerCharacter - > GetWorldTimerManager ( ) . SetTimer ( ShootCooldownTimer , this , & UShootingComponent : : ResetFireCooldown , CurrentGun - > FireRateCooldown , false ) ;
2025-02-22 01:28:07 +01:00
// Odrzut
2025-02-22 20:33:07 +01:00
float RecoilPitch = FMath : : RandRange ( - 1.0f , - 0.5f ) ;
float RecoilYaw = FMath : : RandRange ( - 0.5f , 0.5f ) ;
2025-03-22 13:46:05 +01:00
2025-03-23 21:47:10 +01:00
PlayerCharacter - > AddControllerPitchInput ( RecoilPitch * CurrentGun - > RecoilForceMultiplier ) ;
PlayerCharacter - > AddControllerYawInput ( RecoilYaw * CurrentGun - > RecoilForceMultiplier ) ;
2025-02-22 01:28:07 +01:00
// DEBUG
2025-02-21 20:42:52 +01:00
if ( bShowDebugLine )
DrawDebugLine ( GetWorld ( ) , LineStart , LineEnd , FColor : : Red , false , 1.0f , 0 , 1.0f ) ;
}
2025-03-22 13:46:05 +01:00
void UShootingComponent : : MeleAttack ( )
{
FVector ForwardVector = PlayerCharacter - > GetActorForwardVector ( ) ;
FVector ViewLocation ;
FRotator ViewRotation ;
PlayerCharacter - > GetController ( ) - > GetPlayerViewPoint ( ViewLocation , ViewRotation ) ;
FVector EndVector = ViewLocation + ForwardVector * MeleRange ;
FHitResult Hit ;
FCollisionQueryParams QueryParams ;
QueryParams . AddIgnoredActor ( PlayerCharacter ) ;
2025-03-23 21:47:10 +01:00
if ( bShowDebugLine )
DrawDebugLine ( GetWorld ( ) , ViewLocation , EndVector , FColor : : Red , false , 1.0f , 0 , 1.0f ) ;
2025-03-22 13:46:05 +01:00
if ( GetWorld ( ) - > LineTraceSingleByChannel ( Hit , ViewLocation , EndVector , ECC_Visibility , QueryParams ) )
{
if ( Hit . GetActor ( ) - > Implements < UDamageable > ( ) )
{
IDamageable : : Execute_TakeDamage ( Hit . GetActor ( ) , MeleDamageValue ) ;
}
}
}
2025-02-22 01:28:07 +01:00
void UShootingComponent : : Reload ( )
{
2025-03-23 21:47:10 +01:00
if ( ! IsValid ( CurrentGun ) | | bIsReloading ) return ;
2025-02-22 01:28:07 +01:00
bIsReloading = true ;
2025-03-23 21:47:10 +01:00
CurrentGun - > CurrentAmmo = CurrentGun - > MaxAmmo ;
PlayerCharacter - > GetWorldTimerManager ( ) . SetTimer ( ReloadTimer , this , & UShootingComponent : : ReloadCompleted , CurrentGun - > ReloadTime , false ) ;
2025-02-22 01:28:07 +01:00
2025-03-23 21:47:10 +01:00
UE_LOG ( LogTemp , Display , TEXT ( " Reloaded. Ammo: %d/%d " ) , CurrentGun - > CurrentAmmo , CurrentGun - > MaxAmmo ) ; // Docelowo tutaj wywo<77> anie UI aktualizuj<75> ce stan ammo
2025-02-22 01:28:07 +01:00
}
2025-03-15 20:17:03 +01:00
void UShootingComponent : : PickUpGun ( AGunBase * gunItem )
{
2025-03-23 21:47:10 +01:00
if ( IsValid ( CurrentGun ) & & IsValid ( SecondaryGun ) )
2025-03-15 20:17:03 +01:00
DropGun ( ) ;
2025-03-23 21:47:10 +01:00
AGunBase * NewGun = NewObject < AGunBase > ( ) ;
2025-03-15 20:17:03 +01:00
2025-03-23 21:47:10 +01:00
NewGun - > MaxRange = gunItem - > MaxRange ;
NewGun - > DamageValue = gunItem - > DamageValue ;
NewGun - > FireRateCooldown = gunItem - > FireRateCooldown ;
NewGun - > RecoilForceMultiplier = gunItem - > RecoilForceMultiplier ;
NewGun - > ReloadTime = gunItem - > ReloadTime ;
NewGun - > CurrentAmmo = gunItem - > CurrentAmmo ;
NewGun - > MaxAmmo = gunItem - > MaxAmmo ;
NewGun - > SceneItemClass = gunItem - > GetClass ( ) ;
if ( IsValid ( CurrentGun ) )
SecondaryGun = NewGun ;
else
CurrentGun = NewGun ;
2025-03-15 20:17:03 +01:00
}
void UShootingComponent : : DropGun ( )
{
2025-03-23 21:47:10 +01:00
if ( ! IsValid ( CurrentGun ) ) return ;
2025-03-15 20:17:03 +01:00
2025-03-15 22:43:58 +01:00
FVector ForwardVector = PlayerCharacter - > GetActorForwardVector ( ) ;
FVector PlayerPos = PlayerCharacter - > GetActorLocation ( ) ;
FVector DroppedGunPos = PlayerPos + ( ForwardVector * DropGunRange ) ;
FTransform DroppedGunTransform = PlayerCharacter - > GetActorTransform ( ) ;
DroppedGunTransform . SetLocation ( DroppedGunPos ) ;
2025-03-15 20:17:03 +01:00
2025-03-23 21:47:10 +01:00
AGunBase * DroppedGun = GetWorld ( ) - > SpawnActor < AGunBase > ( CurrentGun - > SceneItemClass , DroppedGunTransform ) ;
2025-03-15 22:43:58 +01:00
if ( DroppedGun )
{
2025-03-23 21:47:10 +01:00
DroppedGun - > MaxRange = CurrentGun - > MaxRange ;
DroppedGun - > DamageValue = CurrentGun - > DamageValue ;
DroppedGun - > FireRateCooldown = CurrentGun - > FireRateCooldown ;
DroppedGun - > RecoilForceMultiplier = CurrentGun - > RecoilForceMultiplier ;
DroppedGun - > ReloadTime = CurrentGun - > ReloadTime ;
DroppedGun - > CurrentAmmo = CurrentGun - > CurrentAmmo ;
DroppedGun - > MaxAmmo = CurrentGun - > MaxAmmo ;
CurrentGun - > Destroy ( ) ;
CurrentGun = nullptr ;
2025-03-15 22:43:58 +01:00
}
2025-03-15 20:17:03 +01:00
}
2025-02-22 01:28:07 +01:00
void UShootingComponent : : ResetFireCooldown ( )
{
bCanShoot = true ;
}
void UShootingComponent : : ReloadCompleted ( )
{
bIsReloading = false ;
}
2025-02-21 20:42:52 +01:00
2025-03-23 21:47:10 +01:00
void UShootingComponent : : SelectGun ( bool bSelectFirstSlot )
{
if ( bSelectFirstSlot ! = bIsFirstGunSelected )
SwitchGun ( ) ;
}
void UShootingComponent : : SwitchGun ( )
{
AGunBase * temp = CurrentGun ;
CurrentGun = SecondaryGun ;
SecondaryGun = temp ;
bIsFirstGunSelected = ! bIsFirstGunSelected ;
// Debug info
if ( bIsFirstGunSelected )
{
UE_LOG ( LogTemp , Display , TEXT ( " Zmiana broni na broń 1 " ) ) ;
}
else
{
UE_LOG ( LogTemp , Display , TEXT ( " Zmiana broni na broń 2 " ) ) ;
}
}
2025-02-21 20:42:52 +01:00
// Called every frame
void UShootingComponent : : TickComponent ( float DeltaTime , ELevelTick TickType , FActorComponentTickFunction * ThisTickFunction )
{
Super : : TickComponent ( DeltaTime , TickType , ThisTickFunction ) ;
// ...
}