void AConstructorWeapon::AltFire() { Super::AltFire(); if (GetWorld() && GetWorld()->GetAuthGameMode() && GetWorld()->GetAuthGameMode<ARadeGameMode>()) { TheLevelBlockConstructor = GetWorld()->GetAuthGameMode<ARadeGameMode>()->TheLevelBlockConstructor; } if (TheLevelBlockConstructor) { FVector CamLoc; FRotator CamRot; ThePlayer->Controller->GetPlayerViewPoint(CamLoc, CamRot); // Get the camera position and rotation FVector StartTrace = Mesh1P->GetSocketLocation(TEXT("FireSocket")); FVector Direction = CamRot.Vector(); FVector EndTrace = StartTrace + Direction *MainFire.FireDistance; if (TheLevelBlockConstructor->DestroyBlock(EndTrace, this)) UseAltFireAmmo(); } }
// Pre Alt Fire void AWeapon::PreAltFire() { if (!ThePlayer)return; // Bp Pre Alternative Fire BP_PreAltFire(); // If not shooting , stop everything if (!bShooting) { ThePlayer->GetWorldTimerManager().ClearTimer(PreAltFireTimeHandle); return; } // Currently Equiping this weapon if (ThePlayer->ArmsAnimInstance && ThePlayer->ArmsAnimInstance->IsAnimState(EAnimState::Equip)) { // Try after a small delay FTimerHandle MyHandle; ThePlayer->GetWorldTimerManager().SetTimer(MyHandle, this, &AWeapon::PreAltFire, 0.2, false); return; } // Wrong Player Anim State if (!CanShoot())return; // Seprate Ammo check if (bAltFireSeparateAmmo) { if (!AlternativeFire.CanFire()) { // BP no ammo for Alt fire BP_NoAmmo(); return; } } // Unified ammo Check else if (AlternativeFire.FireCost > 0 && AlternativeFire.FireCost > MainFire.CurrentAmmo) { BP_NoAmmo(); return; } // The real Alt fire event AltFire(); // Use Alt Fire Ammo if (bUseAmmo)UseAltFireAmmo(); // Set Player Anim State ThePlayer->ServerSetAnimID(EAnimState::Fire); // Decrease move speed when shooting ThePlayer->ResetMoveSpeed(); /// Stop Fire Anim FTimerHandle MyHandle; ThePlayer->GetWorldTimerManager().SetTimer(MyHandle, this, &AWeapon::StopFireAnim, 0.1, false); }