bool Weapon::FrameNext(float dt){ SPADES_MARK_FUNCTION(); bool fired = false; bool dryFire = false; if(shooting && (!reloading || IsReloadSlow())){ // abort slow reload reloading = false; if(time >= nextShotTime && ammo > 0) { fired = true; ammo--; if(world->GetListener()) world->GetListener()->PlayerFiredWeapon(owner); nextShotTime = time + GetDelay(); }else if(time >= nextShotTime){ dryFire = true; } } if(reloading){ if(time >= reloadEndTime) { // reload done reloading = false; if(IsReloadSlow()){ ammo++; stock--; Reload(); }else{ int newStock; newStock = std::max(0, stock - GetClipSize() + ammo); ammo += stock - newStock; stock = newStock; } if(world->GetListener()) world->GetListener()->PlayerReloadedWeapon(owner); } } time += dt; if(dryFire && !lastDryFire){ if(world->GetListener()) world->GetListener()->PlayerDryFiredWeapon(owner); } lastDryFire = dryFire; return fired; }
void Weapon::Reload(bool manual) { SPADES_MARK_FUNCTION(); if (reloading) return; if (ammo >= GetClipSize()) return; if (stock == 0) return; if (IsReloadSlow() && ammo > 0 && shooting) return; if (manual) slowReloadLeftCount = stock - std::max(0, stock - GetClipSize() + ammo); reloading = true; shooting = false; reloadStartTime = time; reloadEndTime = time + GetReloadTime(); if (world->GetListener()) world->GetListener()->PlayerReloadingWeapon(owner); }
bool Weapon::IsReadyToShoot() { return ammo > 0 && time >= nextShotTime && (!reloading || IsReloadSlow()); }
bool Weapon::FrameNext(float dt) { SPADES_MARK_FUNCTION(); bool ownerIsLocalPlayer = owner->IsLocalPlayer(); bool fired = false; bool dryFire = false; if (shooting && (!reloading || IsReloadSlow())) { // abort slow reload reloading = false; if (!shootingPreviously) { nextShotTime = std::max(nextShotTime, time); } // Automatic operation of weapon. if (time >= nextShotTime && (ammo > 0 || !ownerIsLocalPlayer)) { fired = true; // Consume an ammo. // Ammo count tracking is disabled for remote players because the server doesn't // send enough information for us to do that. if (ownerIsLocalPlayer) { ammo--; } if (world->GetListener()) { world->GetListener()->PlayerFiredWeapon(owner); } nextShotTime += GetDelay(); } else if (time >= nextShotTime) { dryFire = true; } shootingPreviously = true; } else { shootingPreviously = false; } if (reloading) { if (time >= reloadEndTime) { // reload done reloading = false; if (IsReloadSlow()) { // for local player, server sends // new ammo/stock value if (ammo < GetClipSize() && stock > 0 && !ownerIsLocalPlayer) { ammo++; stock--; } slowReloadLeftCount--; if (slowReloadLeftCount > 0) Reload(false); else if (world->GetListener()) world->GetListener()->PlayerReloadedWeapon(owner); } else { // for local player, server sends // new ammo/stock value if (!ownerIsLocalPlayer) { int newStock; newStock = std::max(0, stock - GetClipSize() + ammo); ammo += stock - newStock; stock = newStock; } if (world->GetListener()) world->GetListener()->PlayerReloadedWeapon(owner); } } } time += dt; if (dryFire && !lastDryFire) { if (world->GetListener()) world->GetListener()->PlayerDryFiredWeapon(owner); } lastDryFire = dryFire; return fired; }
bool Weapon::IsReadyToShoot() { return (ammo > 0 || !owner->IsLocalPlayer()) && time >= nextShotTime && (!reloading || IsReloadSlow()); }