// FinalStage Shooting protected override void FinalStageShooting() { if (currentSlot.projectileObject != null) { if (projectilesPerShot > 1) { for (int i = 0; i < projectilesPerShot; i++) { MuzzleToCameraPoint(); Projectile.SpawnFromWeapon(this); projectileOuter.localEulerAngles = nativeOuterAngles; } } else { Projectile.SpawnFromWeapon(this); projectileOuter.localEulerAngles = nativeOuterAngles; } Shell.SpawnFromWeapon(this); } else { Debug.LogError("ERROR: Projectile is not setup! Error in: " + this.name); } base.FinalStageShooting(); if (owner.isPlayer && isEmpty && AmmoBackpack.IsEmpty(currentSlot.ammoIndex) == false) { StartReloading(); } }
// Reloading internal virtual void StartReloading() { if (!isReloading && currentSlot.currentAmmo < maxAmmo && !AmmoBackpack.IsEmpty(currentSlot.ammoIndex)) { StartCoroutine(PlayReload()); } }
// FirstStage Shooting protected override void FirstStageShooting() { if (owner.isPlayer) { if (isEmpty) { if (AmmoBackpack.IsEmpty(currentSlot.ammoIndex)) { m_Audio.pitch = Time.timeScale; m_Audio.PlayOneShot(emptySFX); StartCoroutine(FireRate(.75f)); } else { StartReloading(); } } else if (!isEmpty && !isReloading) { base.FirstStageShooting(); } } else if (owner.isNPC) { SecondStageShooting(); } }
// Play Reload private IEnumerator PlayReload() { isReloading = true; singleShotReady = true; FirstPersonWeaponSway.IronsightUnzoom(); while (FirstPersonWeaponSway.ironsightZooming || FirstPersonWeaponSway.isPlaying) { yield return(null); } float reloadTime = .15f; if (fpWeaponSway != null && fpWeaponSway.reloadClip != null) { reloadTime = fpWeaponSway.reloadClip.length; } if (reloadSFX != null) { reloadTime = reloadSFX.length; } if (reloadSFX != null && fpWeaponSway != null && fpWeaponSway.reloadClip != null) { reloadTime = Mathf.Min(reloadSFX.length, fpWeaponSway.reloadClip.length); } if (fpWeaponSway != null) { fpWeaponSway.PlayReloadAnimation(); } m_Audio.pitch = Time.timeScale; m_Audio.PlayOneShot(reloadSFX); float elapsed = 0f; while (elapsed < reloadTime) { elapsed += Time.deltaTime; yield return(null); } int missingAmmo = Mathf.Max(0, maxAmmo - currentSlot.currentAmmo); int invAmmo = AmmoBackpack.GetCurrentAmmo(currentSlot.ammoIndex); currentSlot.currentAmmo += Mathf.Min(Mathf.Max(0, invAmmo), missingAmmo); invAmmo = Mathf.Max(0, invAmmo -= missingAmmo); AmmoBackpack.SetCurrentAmmo(currentSlot.ammoIndex, invAmmo); HudElements.WeaponInformer.UpdateCurrentAmmoInfo(currentSlot.currentAmmo); HudElements.WeaponInformer.UpdateAllAmmoInfo(invAmmo); isReloading = false; }
// Ammo Pickup private void PickupAmmo() { if (AmmoBackpack.AddAmmo(ammoIndex, ref amount)) { Utils.Audio.PlayClipAtPoint(pickupSound, m_Transform.position); if (pickupType == EPickupType.Ammo || pickupType == EPickupType.Thrown) { DestroyIt(false); } } }
// Start void Start() { for (int i = 0; i < weapons.Length; i++) { WeaponSlot currentSlot = weapons[i]; GameObject currentGO = currentSlot.weapon.gameObject; currentGO.SetActive(true); if (currentSlot.type == EWeaponType.Thrown) { Firearms tmpFA = currentSlot.weapon as Firearms; if (!tmpFA.isEmpty || !AmmoBackpack.IsEmpty(tmpFA.currentSlot.ammoIndex)) { currentSlot.available = true; } else if (AmmoBackpack.IsEmpty(tmpFA.currentSlot.ammoIndex) && tmpFA.isEmpty) { currentSlot.available = false; } } if (weaponsCount >= maxWeapons && currentSlot.type == EWeaponType.Standart) { DropWeapon(i); } else if (currentSlot.available && currentSlot.type == EWeaponType.Standart) { weaponsCount++; } currentGO.SetActive(false); } for (int i = weaponIndex; i < weapons.Length; i++) { if (i != weaponIndex && weapons[i].available) { weaponIndex = i; StartCoroutine(ChangeWeapon()); break; } } UpdateHud(); UpdateInformerAndCrosshair(); }
// ChangeEmpty to FirstAvaliable internal static void ChangeEmptyToFirstAvaliable() { if (!FirstPersonWeaponSway.isChanging && AmmoBackpack.IsEmpty(m_Firearm.currentSlot.ammoIndex)) { if (m_Instance.weapons[weaponIndex].type == EWeaponType.Thrown) { m_Instance.weapons[weaponIndex].available = false; FindFirstAvailableWeapon(); CalculateWeaponsCount(); m_Instance.StartCoroutine(ChangeWeapon()); } else { if (FindFirstAvailableWeapon()) { m_Instance.StartCoroutine(ChangeWeapon()); } } } }
// Update Hud public static void UpdateHud(bool updateAll = false) { if (!PlayerCharacter.Instance.isAlive) { return; } if (!isMelee) { HudElements.Crosshair.UpdatePosition(m_Firearm.dispersion); // HudElements.WeaponInformer.UpdateAmmoIcon(AmmoBackpack.GetHudIcon(m_Firearm.currentSlot.ammoIndex)); HudElements.WeaponInformer.UpdateCurrentAmmoInfo(m_Firearm.currentSlot.currentAmmo); HudElements.WeaponInformer.UpdateAllAmmoInfo(AmmoBackpack.GetCurrentAmmo(m_Firearm.currentSlot.ammoIndex)); HudElements.WeaponInformer.UpdateShootingModeIcon(m_Weapon.firingMode); } if (updateAll) { UpdateInformerAndCrosshair(); } }
// Pickup Activity private static void PickupActivity() { if (inputUse) { if (checkPickup) { tmpPickup.PickupItem(); } inputUse = false; ResetPickup(); } else { if (hitCollider != prevHitCollider || tmpPickup == null) { tmpPickup = hitCollider.GetComponent <IPickup>(); HudElements.Crosshair.SetColor(ECrosshairColor.Normal); } if (!checkPickup) { return; } switch (tmpPickup.PickupType) { case EPickupType.Melee: case EPickupType.Firearms: case EPickupType.Thrown: if (WeaponsManager.WeaponIsAvailable(tmpPickup.WeaponIndex)) { if ((tmpPickup.PickupType != EPickupType.Melee) && (tmpPickup.Amount > 0) && !AmmoBackpack.IsFull(tmpPickup.AmmoIndex)) { crosshairMode = ECrosshairMode.Ammo; } else { crosshairMode = ECrosshairMode.Cancel; } } else if (WeaponsManager.WeaponTypeIsStandart(tmpPickup.WeaponIndex) && WeaponsManager.crowded) { crosshairMode = ECrosshairMode.Swap; } else { crosshairMode = ECrosshairMode.Hand; } break; case EPickupType.Ammo: if (AmmoBackpack.IsFull(tmpPickup.AmmoIndex)) { crosshairMode = ECrosshairMode.Cancel; } else { crosshairMode = ECrosshairMode.Ammo; } break; case EPickupType.Health: if (PlayerCharacter.Instance.isFull) { crosshairMode = ECrosshairMode.Cancel; } else { crosshairMode = ECrosshairMode.Health; } break; default: crosshairMode = ECrosshairMode.Hand; break; } //crosshairMode HudElements.Crosshair.SetPointSprite(crosshairMode); } }