123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- using System;
- using UnityEngine;
- using UnityEngine.UI;
- using System.Collections.Generic;
- namespace HQFPSWeapons.UserInterface
- {
- public class WeaponPropertiesDisplayer : HUD_DisplayerBehaviour
- {
- #region Internal
- [Serializable]
- public struct FireModeDisplayer
- {
- [BHeader("GENERAL", true)]
- public Image FireModeImage;
- [Space]
- [BHeader("Fire Mode Sprites...", order = 100)]
- public Sprite SafetyModeSprite;
- public Sprite SemiAutoModeSprite;
- public Sprite FullAutoModeSprite;
- public Sprite BurstModeSprite;
- }
- [Serializable]
- public class AmmoAmountDisplayer
- {
- [BHeader("GENERAL", true)]
- public Text StorageTxt;
- [Range(1, 100)]
- public int MaxMagSize = 30;
- [Range(1, 100)]
- [Tooltip("At what percent the ammo in the magazine is considered low (e.g. reload message will appear)")]
- public float LowAmmoPercent = 30;
- [Space]
- public GridLayoutGroup BulletsLayoutGroup;
- public Image BulletImage;
- [Space]
- public Color NormalBulletColor = Color.white;
- public Color LowAmmoBulletColor = Color.red;
- public Color BulletConsumedColor = Color.black;
- [Space]
- [Group]
- public BulletDisplayer[] BulletDisplayers;
- [Space]
- [BHeader("Reload Message...", order = 100)]
- public Image ReloadMessage = null;
- // Not visible in the inspector
- public List<Image> BulletImages = new List<Image>(30);
- // -- Internal --
- [Serializable]
- public struct BulletDisplayer
- {
- [DatabaseItem]
- public string CorrespondingItem;
- public Sprite BulletSprite;
- public Vector2 BulletSpriteSize;
- public Vector2 LayoutGroupSpacing;
- public int XOffset;
- public float BulletLineWidth;
- }
- }
- #endregion
- [SerializeField]
- private Animator m_Animator = null;
- [SerializeField]
- private Image m_WeaponIconImg = null;
- [Space]
- [SerializeField]
- [Group]
- private AmmoAmountDisplayer m_AmmoDisplayer = null;
- [SerializeField]
- [Group]
- private FireModeDisplayer m_FireModeDisplayer = new FireModeDisplayer();
- private int m_LastCountInMagazine;
- private bool m_IsNewWeapon;
- private EquipmentHandler m_MainEquipmentHandler;
- private RectTransform m_BulletsLayoutGroupRct;
-
- public override void OnPostAttachment()
- {
- OnActiveEquipmentItemChanged(null);
- Player.ActiveEquipmentItem.AddChangeListener(OnActiveEquipmentItemChanged);
- Player.ChangeFireMode.AddListener(UpdateFireModeUI);
- m_MainEquipmentHandler = Player.transform.GetComponentInChildren<EquipmentHandler>();
- //Spawn the bullet images and remove the original one
- if (m_AmmoDisplayer.BulletImage != null)
- {
- for (int i = 0; i < m_AmmoDisplayer.MaxMagSize; i++)
- m_AmmoDisplayer.BulletImages.Add(Instantiate(m_AmmoDisplayer.BulletImage,
- m_AmmoDisplayer.BulletImage.rectTransform.position, //Position
- m_AmmoDisplayer.BulletImage.rectTransform.rotation, //Rotation
- m_AmmoDisplayer.BulletsLayoutGroup.transform)); //Parent
- m_AmmoDisplayer.BulletImage.enabled = false;
- m_BulletsLayoutGroupRct = m_AmmoDisplayer.BulletsLayoutGroup.GetComponent<RectTransform>();
- }
- }
- private void OnActiveEquipmentItemChanged(EquipmentItem Weapon)
- {
- if (m_MainEquipmentHandler == null)
- return;
- if (m_MainEquipmentHandler.CurrentItem != null)
- m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.RemoveChangeListener(UpdateAmmoUI);
- m_IsNewWeapon = true;
- if (m_MainEquipmentHandler.CurrentItem == null || !m_MainEquipmentHandler.CurrentItem.NeedsAmmoToUse)
- {
- m_Animator.SetBool("Show", false);
- return;
- }
- else
- m_Animator.SetBool("Show", true);
- m_LastCountInMagazine = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get().CurrentInMagazine;
- m_WeaponIconImg.sprite = m_MainEquipmentHandler.CurrentlyAttachedItem.Data.Icon;
- UpdateAmmoUI(m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get());
- m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.AddChangeListener(UpdateAmmoUI);
-
- //Change the bullet images
- if (m_MainEquipmentHandler.CurrentItem != null)
- {
- for (int i = 0; i < m_AmmoDisplayer.BulletDisplayers.Length; i++)
- {
- if (m_AmmoDisplayer.BulletDisplayers[i].CorrespondingItem == m_MainEquipmentHandler.CurrentlyAttachedItem.Data.Name)
- {
- for (int j = 0; j < m_AmmoDisplayer.BulletImages.Count; j++)
- {
- m_AmmoDisplayer.BulletImages[j].gameObject.SetActive(false);
- }
- for (int j = 0; j < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); j++)
- {
- m_AmmoDisplayer.BulletImages[j].gameObject.SetActive(true);
- m_AmmoDisplayer.BulletImages[j].transform.localScale = m_AmmoDisplayer.BulletDisplayers[i].BulletSpriteSize;
- m_AmmoDisplayer.BulletImages[j].sprite = m_AmmoDisplayer.BulletDisplayers[i].BulletSprite;
- }
- m_BulletsLayoutGroupRct.sizeDelta = new Vector2(m_AmmoDisplayer.BulletDisplayers[i].BulletLineWidth, m_BulletsLayoutGroupRct.sizeDelta.y);
- m_AmmoDisplayer.BulletsLayoutGroup.spacing = m_AmmoDisplayer.BulletDisplayers[i].LayoutGroupSpacing;
- m_AmmoDisplayer.BulletsLayoutGroup.padding.left = m_AmmoDisplayer.BulletDisplayers[i].XOffset;
- }
- }
- }
- // Disable the firing mode image if the currently equipped weapon doesn't have a fire mode property
- if (m_MainEquipmentHandler.CurrentlyAttachedItem.HasProperty("FireMode"))
- m_FireModeDisplayer.FireModeImage.enabled = true;
- else
- m_FireModeDisplayer.FireModeImage.enabled = false;
- UpdateFireModeUI();
- m_IsNewWeapon = false;
- }
- private void UpdateAmmoUI(EquipmentItem.AmmoInfo ammoInfo)
- {
- if(m_MainEquipmentHandler == null)
- return;
- int newCountInMagazine = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Val.CurrentInMagazine;
- //If the player used the Weapon, consume the bullet
- if (!m_IsNewWeapon && m_Animator != null && m_LastCountInMagazine > newCountInMagazine)
- {
- m_Animator.SetTrigger("Ammo Consumed");
- m_AmmoDisplayer.BulletImages[m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - ammoInfo.CurrentInMagazine - 1].color = m_AmmoDisplayer.BulletConsumedColor;
- }
- //If the player is reloading add the bullets back up
- else if (m_LastCountInMagazine < newCountInMagazine && !m_IsNewWeapon)
- {
- for (int i = m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - ammoInfo.CurrentInMagazine; i < m_AmmoDisplayer.BulletImages.Count; i++)
- {
- m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
- }
- }
- //If the player changed weapons activate as many bullets as the current weapon has in the magazine
- else if (m_IsNewWeapon)
- {
- for (int i = 0; i < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); i++)
- {
- m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.BulletConsumedColor;
- }
- for (int i = m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - newCountInMagazine; i < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); i++)
- {
- m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
- }
- }
- //Activate Reload Message.
- if (newCountInMagazine <= m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() * (m_AmmoDisplayer.LowAmmoPercent / 100))
- {
- m_AmmoDisplayer.ReloadMessage.gameObject.SetActive(true);
- }
- else
- m_AmmoDisplayer.ReloadMessage.gameObject.SetActive(false);
- //Change the bullets color to the "low bullet color".
- if (newCountInMagazine <= m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() * (m_AmmoDisplayer.LowAmmoPercent / 100))
- {
- for (int i = 0; i < m_AmmoDisplayer.BulletImages.Count; i++)
- {
- if (m_AmmoDisplayer.BulletImages[i].color == m_AmmoDisplayer.NormalBulletColor)
- m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.LowAmmoBulletColor;
- }
- }
- //Change the bullets color back to normal bullet color.
- else
- {
- for (int i = 0; i < m_AmmoDisplayer.BulletImages.Count; i++)
- {
- if(m_AmmoDisplayer.BulletImages[i].color == m_AmmoDisplayer.LowAmmoBulletColor)
- m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
- }
- }
- //Update the storage Text
- m_AmmoDisplayer.StorageTxt.text = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get().CurrentInStorage.ToString();
- m_LastCountInMagazine = newCountInMagazine;
- }
- private void UpdateFireModeUI()
- {
- //If the current weapon doesn't have a "Fire Mode" disable the fire mode image
- if (m_MainEquipmentHandler.CurrentItem == null || !m_MainEquipmentHandler.CurrentlyAttachedItem.HasProperty("FireMode"))
- {
- m_FireModeDisplayer.FireModeImage.color = Color.clear;
- return;
- }
- else
- m_FireModeDisplayer.FireModeImage.color = Color.white;
- //Get fire mode
- m_Animator.SetTrigger("Fire Mode Changed");
- int fireMode = (int)m_MainEquipmentHandler.CurrentlyAttachedItem.GetProperty("FireMode").Val.Current;
- //Get the fire mode property
- if (fireMode == (int)ProjectileBasedWeapon.FireMode.Burst)
- m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.BurstModeSprite;
- else if (fireMode == (int)ProjectileBasedWeapon.FireMode.FullAuto)
- m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.FullAutoModeSprite;
- else if (fireMode == (int)ProjectileBasedWeapon.FireMode.SemiAuto)
- m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.SemiAutoModeSprite;
- else if (fireMode == (int)ProjectileBasedWeapon.FireMode.Safety)
- m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.SafetyModeSprite;
- }
- }
- }
|