Exemple #1
0
		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;
		}
Exemple #2
0
		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);
		}
Exemple #3
0
		bool Weapon::IsReadyToShoot()  {
			return ammo > 0 && time >= nextShotTime &&
			(!reloading || IsReloadSlow());
		}
Exemple #4
0
		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;
		}
Exemple #5
0
		bool Weapon::IsReadyToShoot() {
			return (ammo > 0 || !owner->IsLocalPlayer()) && time >= nextShotTime &&
			       (!reloading || IsReloadSlow());
		}