if (IsAmmoEmpty && !IsReloading)
{
//Play Empty Sound
USoundBase* EmptyAmmoSound = MuzzleConfig.EmptyAmmoSound.Get();
if (!IsValid(EmptyAmmoSound))
{
EmptyAmmoSound = MuzzleConfig.EmptyAmmoSound.LoadSynchronous();
}
UGameplayStatics::PlaySoundAtLocation(GetWorld(), EmptyAmmoSound, PistolMeshRef->GetComponentLocation());
//Play Anim Montage
UAnimMontage* EmptyAmmoMontage = UUtilFunctionLibrary::GetAnimMontageFromAssetID(MuzzleConfig.EmptyAmmoMontage);
UAnimInstance* PistolAnim = PistolMeshRef->GetAnimInstance();
if (IsValid(PistolAnim))
{
if (PistolAnim->Montage_IsActive(EmptyAmmoMontage))
{
PistolAnim->Montage_SetPlayRate(EmptyAmmoMontage, 1.0f);
if (false == PistolAnim->Montage_IsPlaying(EmptyAmmoMontage))
{
PistolAnim->Montage_Resume(EmptyAmmoMontage);
}
}
else
{
FAlphaBlend AlphaBlend;
AlphaBlend.SetBlendTime(0.2f);
AlphaBlend.SetBlendOption(EAlphaBlendOption::Linear);
EmptyAmmoMontage->BlendIn = AlphaBlend;
EmptyAmmoMontage->BlendOut = AlphaBlend;
float AnimMontageSecond = PistolAnim->Montage_Play(EmptyAmmoMontage);
}
}
return;
}
if (!IsShootDelayComplete || IsReloading)
{
return;
}
FLatentActionInfo LatentActionInfo;
LatentActionInfo.ExecutionFunction = FName("ShootingDelay");
LatentActionInfo.CallbackTarget = this;
LatentActionInfo.UUID = 2;
LatentActionInfo.Linkage = 0;
UKismetSystemLibrary::Delay(GetWorld(), MuzzleConfig.FireDelay, LatentActionInfo);
IsShootDelayComplete = false;
LeftAmmoNum -= 1;
SetLeftAmmoValue(LeftAmmoNum, TotalAmmoNum);
if (IsShootState)
{
//Emitter Muzzle Fx
UParticleSystem* ShootFx = MuzzleConfig.ShootFx.Get();
if (!IsValid(ShootFx))
{
ShootFx = MuzzleConfig.ShootFx.LoadSynchronous();
}
UGameplayStatics::SpawnEmitterAttached(ShootFx, PistolMeshRef, "Muzzle", FVector::ZeroVector, FRotator::ZeroRotator, EAttachLocation::KeepRelativeOffset);
//Play Shell Fx
UParticleSystem* ShellFx = MuzzleConfig.ShellFx.Get();
if (!IsValid(ShellFx))
{
ShellFx = MuzzleConfig.ShellFx.LoadSynchronous();
}
UGameplayStatics::SpawnEmitterAttached(ShellFx, PistolMeshRef, "Shells", FVector::ZeroVector, FRotator::ZeroRotator, EAttachLocation::KeepRelativeOffset);
//Play Shoot Sound
USoundBase* ShootSound = MuzzleConfig.ShootSound.Get();
if (!IsValid(ShootSound))
{
ShootSound = MuzzleConfig.ShootSound.LoadSynchronous();
}
UGameplayStatics::PlaySoundAtLocation(GetWorld(), ShootSound, PistolMeshRef->GetComponentLocation());
//Play Shell Sound
USoundBase* ShellSound = MuzzleConfig.ShellSound.Get();
if (!IsValid(ShellSound))
{
ShellSound = MuzzleConfig.ShootSound.LoadSynchronous();
}
UGameplayStatics::PlaySoundAtLocation(GetWorld(), ShellSound, PistolMeshRef->GetComponentLocation());
//Apply Damage
FHitResult hitResult(ForceInit);
FVector start = FirstPersonCamera->GetComponentLocation();
FVector end = start + FirstPersonCamera->GetForwardVector() * 1000000.0f;
FCollisionQueryParams TraceParams;
TraceParams.bTraceComplex = false;
TraceParams.AddIgnoredActor(this);
bool hit = GetWorld()->LineTraceSingleByChannel(hitResult, start, end, ECC_GameTraceChannel2, TraceParams);
if (hit)
{
AActor* hitActor = hitResult.Actor.Get();
if (IsValid(hitActor))
{
UGameplayStatics::ApplyDamage(hitActor, 1.0f, HostController, this, UDamageType::StaticClass());
}
}
//Spawn Projectile
USkeletalMeshSocket const* BoneSocket = PistolMeshRef->GetSocketByName("Muzzle");
if (IsValid(BoneSocket))
{
UClass* ProjectileClass = UFLUtils::LoadClassEx<UClass>("/Game/ThirdContent/MPS_V2/Game/Blueprints/Projectile_BP.Projectile_BP_C");
if (IsValid(ProjectileClass))
{
FTransform BoneTrans = BoneSocket->GetSocketTransform(PistolMeshRef);
FQuat Quat = BoneTrans.GetRotation();
FRotator Rotation = Quat.Rotator();
float Pitch = FirstPersonCamera->GetComponentRotation().Pitch;
FVector Forward = FirstPersonCamera->GetForwardVector();
Rotation = Forward.Rotation();
AActor* Projectile = SCPGAMEINSTANCE(this)->GetWorld()->SpawnActor<AActor>(ProjectileClass, BoneTrans.GetLocation(), Rotation);
}
}
//Play Anim Montage
UAnimMontage* ShootMontage = UUtilFunctionLibrary::GetAnimMontageFromAssetID(MuzzleConfig.ShootMontage);
UAnimInstance* PistolAnim = PistolMeshRef->GetAnimInstance();
if (IsValid(PistolAnim))
{
if (PistolAnim->Montage_IsActive(ShootMontage))
{
PistolAnim->Montage_SetPlayRate(ShootMontage, 1.0f);
if (false == PistolAnim->Montage_IsPlaying(ShootMontage))
{
PistolAnim->Montage_Resume(ShootMontage);
}
}
else
{
FAlphaBlend AlphaBlend;
AlphaBlend.SetBlendTime(0.2f);
AlphaBlend.SetBlendOption(EAlphaBlendOption::Linear);
ShootMontage->BlendIn = AlphaBlend;
ShootMontage->BlendOut = AlphaBlend;
float AnimMontageSecond = PistolAnim->Montage_Play(ShootMontage);
}
}
if (MuzzleConfig.CameraShakeEffect.Num() > 0)
{
CameraShake(ShootShake, MuzzleConfig.CameraShakeEffect[0], 1.0f);
}
}