// Pre Fire void AWeapon::PreFire() { // BP Pre Fire BP_PreFire(); if (!ThePlayer)return; // If player stopped shooting stop event if (!bShooting ) { ThePlayer->GetWorldTimerManager().ClearTimer(PreFireTimeHandle); return; } // Currently Equiping this weapon, delay a bit if (ThePlayer->IsAnimState(EAnimState::Equip)) { // try after a small delay FTimerHandle MyHandle; ThePlayer->GetWorldTimerManager().SetTimer(MyHandle, this, &AWeapon::PreFire, 0.2, false); return; } // Wrong Weapon or Player Anim State if (!CanShoot())return; // Ammo Check if (!MainFire.CanFire()) { // BP No Ammo BP_NoAmmo(); // if have ammo, start reloading if (CanReload())ReloadWeaponStart(); return; } // The real fire event Fire(); // Use Ammo if (bUseAmmo)UseMainFireAmmo(); // 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); }
visibility_t NPC_CheckVisibility ( gentity_t *ent, int flags ) { // flags should never be 0 if ( !flags ) { return VIS_NOT; } // check PVS if ( flags & CHECK_PVS ) { if ( !gi.inPVS ( ent->currentOrigin, NPC->currentOrigin ) ) { return VIS_NOT; } } if ( !(flags & (CHECK_360|CHECK_FOV|CHECK_SHOOT)) ) { return VIS_PVS; } // check within visrange if (flags & CHECK_VISRANGE) { if( !InVisrange ( ent ) ) { return VIS_PVS; } } // check 360 degree visibility //Meaning has to be a direct line of site if ( flags & CHECK_360 ) { if ( !CanSee ( ent ) ) { return VIS_PVS; } } if ( !(flags & (CHECK_FOV|CHECK_SHOOT)) ) { return VIS_360; } // check FOV if ( flags & CHECK_FOV ) { if ( !InFOV ( ent, NPC, NPCInfo->stats.hfov, NPCInfo->stats.vfov) ) { return VIS_360; } } if ( !(flags & CHECK_SHOOT) ) { return VIS_FOV; } // check shootability if ( flags & CHECK_SHOOT ) { if ( !CanShoot ( ent, NPC ) ) { return VIS_FOV; } } return VIS_SHOOT; }
// 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); }
void ARadeCharacter::FireStart_Implementation() { // Check if player has weapn and is in state to fire weapon if (TheWeapon && CanShoot()) TheWeapon->FireStart(); }