WeaponPropertiesDisplayer.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using System.Collections.Generic;
  5. namespace HQFPSWeapons.UserInterface
  6. {
  7. public class WeaponPropertiesDisplayer : HUD_DisplayerBehaviour
  8. {
  9. #region Internal
  10. [Serializable]
  11. public struct FireModeDisplayer
  12. {
  13. [BHeader("GENERAL", true)]
  14. public Image FireModeImage;
  15. [Space]
  16. [BHeader("Fire Mode Sprites...", order = 100)]
  17. public Sprite SafetyModeSprite;
  18. public Sprite SemiAutoModeSprite;
  19. public Sprite FullAutoModeSprite;
  20. public Sprite BurstModeSprite;
  21. }
  22. [Serializable]
  23. public class AmmoAmountDisplayer
  24. {
  25. [BHeader("GENERAL", true)]
  26. public Text StorageTxt;
  27. [Range(1, 100)]
  28. public int MaxMagSize = 30;
  29. [Range(1, 100)]
  30. [Tooltip("At what percent the ammo in the magazine is considered low (e.g. reload message will appear)")]
  31. public float LowAmmoPercent = 30;
  32. [Space]
  33. public GridLayoutGroup BulletsLayoutGroup;
  34. public Image BulletImage;
  35. [Space]
  36. public Color NormalBulletColor = Color.white;
  37. public Color LowAmmoBulletColor = Color.red;
  38. public Color BulletConsumedColor = Color.black;
  39. [Space]
  40. [Group]
  41. public BulletDisplayer[] BulletDisplayers;
  42. [Space]
  43. [BHeader("Reload Message...", order = 100)]
  44. public Image ReloadMessage = null;
  45. // Not visible in the inspector
  46. public List<Image> BulletImages = new List<Image>(30);
  47. // -- Internal --
  48. [Serializable]
  49. public struct BulletDisplayer
  50. {
  51. [DatabaseItem]
  52. public string CorrespondingItem;
  53. public Sprite BulletSprite;
  54. public Vector2 BulletSpriteSize;
  55. public Vector2 LayoutGroupSpacing;
  56. public int XOffset;
  57. public float BulletLineWidth;
  58. }
  59. }
  60. #endregion
  61. [SerializeField]
  62. private Animator m_Animator = null;
  63. [SerializeField]
  64. private Image m_WeaponIconImg = null;
  65. [Space]
  66. [SerializeField]
  67. [Group]
  68. private AmmoAmountDisplayer m_AmmoDisplayer = null;
  69. [SerializeField]
  70. [Group]
  71. private FireModeDisplayer m_FireModeDisplayer = new FireModeDisplayer();
  72. private int m_LastCountInMagazine;
  73. private bool m_IsNewWeapon;
  74. private EquipmentHandler m_MainEquipmentHandler;
  75. private RectTransform m_BulletsLayoutGroupRct;
  76. public override void OnPostAttachment()
  77. {
  78. OnActiveEquipmentItemChanged(null);
  79. Player.ActiveEquipmentItem.AddChangeListener(OnActiveEquipmentItemChanged);
  80. Player.ChangeFireMode.AddListener(UpdateFireModeUI);
  81. m_MainEquipmentHandler = Player.transform.GetComponentInChildren<EquipmentHandler>();
  82. //Spawn the bullet images and remove the original one
  83. if (m_AmmoDisplayer.BulletImage != null)
  84. {
  85. for (int i = 0; i < m_AmmoDisplayer.MaxMagSize; i++)
  86. m_AmmoDisplayer.BulletImages.Add(Instantiate(m_AmmoDisplayer.BulletImage,
  87. m_AmmoDisplayer.BulletImage.rectTransform.position, //Position
  88. m_AmmoDisplayer.BulletImage.rectTransform.rotation, //Rotation
  89. m_AmmoDisplayer.BulletsLayoutGroup.transform)); //Parent
  90. m_AmmoDisplayer.BulletImage.enabled = false;
  91. m_BulletsLayoutGroupRct = m_AmmoDisplayer.BulletsLayoutGroup.GetComponent<RectTransform>();
  92. }
  93. }
  94. private void OnActiveEquipmentItemChanged(EquipmentItem Weapon)
  95. {
  96. if (m_MainEquipmentHandler == null)
  97. return;
  98. if (m_MainEquipmentHandler.CurrentItem != null)
  99. m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.RemoveChangeListener(UpdateAmmoUI);
  100. m_IsNewWeapon = true;
  101. if (m_MainEquipmentHandler.CurrentItem == null || !m_MainEquipmentHandler.CurrentItem.NeedsAmmoToUse)
  102. {
  103. m_Animator.SetBool("Show", false);
  104. return;
  105. }
  106. else
  107. m_Animator.SetBool("Show", true);
  108. m_LastCountInMagazine = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get().CurrentInMagazine;
  109. m_WeaponIconImg.sprite = m_MainEquipmentHandler.CurrentlyAttachedItem.Data.Icon;
  110. UpdateAmmoUI(m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get());
  111. m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.AddChangeListener(UpdateAmmoUI);
  112. //Change the bullet images
  113. if (m_MainEquipmentHandler.CurrentItem != null)
  114. {
  115. for (int i = 0; i < m_AmmoDisplayer.BulletDisplayers.Length; i++)
  116. {
  117. if (m_AmmoDisplayer.BulletDisplayers[i].CorrespondingItem == m_MainEquipmentHandler.CurrentlyAttachedItem.Data.Name)
  118. {
  119. for (int j = 0; j < m_AmmoDisplayer.BulletImages.Count; j++)
  120. {
  121. m_AmmoDisplayer.BulletImages[j].gameObject.SetActive(false);
  122. }
  123. for (int j = 0; j < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); j++)
  124. {
  125. m_AmmoDisplayer.BulletImages[j].gameObject.SetActive(true);
  126. m_AmmoDisplayer.BulletImages[j].transform.localScale = m_AmmoDisplayer.BulletDisplayers[i].BulletSpriteSize;
  127. m_AmmoDisplayer.BulletImages[j].sprite = m_AmmoDisplayer.BulletDisplayers[i].BulletSprite;
  128. }
  129. m_BulletsLayoutGroupRct.sizeDelta = new Vector2(m_AmmoDisplayer.BulletDisplayers[i].BulletLineWidth, m_BulletsLayoutGroupRct.sizeDelta.y);
  130. m_AmmoDisplayer.BulletsLayoutGroup.spacing = m_AmmoDisplayer.BulletDisplayers[i].LayoutGroupSpacing;
  131. m_AmmoDisplayer.BulletsLayoutGroup.padding.left = m_AmmoDisplayer.BulletDisplayers[i].XOffset;
  132. }
  133. }
  134. }
  135. // Disable the firing mode image if the currently equipped weapon doesn't have a fire mode property
  136. if (m_MainEquipmentHandler.CurrentlyAttachedItem.HasProperty("FireMode"))
  137. m_FireModeDisplayer.FireModeImage.enabled = true;
  138. else
  139. m_FireModeDisplayer.FireModeImage.enabled = false;
  140. UpdateFireModeUI();
  141. m_IsNewWeapon = false;
  142. }
  143. private void UpdateAmmoUI(EquipmentItem.AmmoInfo ammoInfo)
  144. {
  145. if(m_MainEquipmentHandler == null)
  146. return;
  147. int newCountInMagazine = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Val.CurrentInMagazine;
  148. //If the player used the Weapon, consume the bullet
  149. if (!m_IsNewWeapon && m_Animator != null && m_LastCountInMagazine > newCountInMagazine)
  150. {
  151. m_Animator.SetTrigger("Ammo Consumed");
  152. m_AmmoDisplayer.BulletImages[m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - ammoInfo.CurrentInMagazine - 1].color = m_AmmoDisplayer.BulletConsumedColor;
  153. }
  154. //If the player is reloading add the bullets back up
  155. else if (m_LastCountInMagazine < newCountInMagazine && !m_IsNewWeapon)
  156. {
  157. for (int i = m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - ammoInfo.CurrentInMagazine; i < m_AmmoDisplayer.BulletImages.Count; i++)
  158. {
  159. m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
  160. }
  161. }
  162. //If the player changed weapons activate as many bullets as the current weapon has in the magazine
  163. else if (m_IsNewWeapon)
  164. {
  165. for (int i = 0; i < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); i++)
  166. {
  167. m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.BulletConsumedColor;
  168. }
  169. for (int i = m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() - newCountInMagazine; i < m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize(); i++)
  170. {
  171. m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
  172. }
  173. }
  174. //Activate Reload Message.
  175. if (newCountInMagazine <= m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() * (m_AmmoDisplayer.LowAmmoPercent / 100))
  176. {
  177. m_AmmoDisplayer.ReloadMessage.gameObject.SetActive(true);
  178. }
  179. else
  180. m_AmmoDisplayer.ReloadMessage.gameObject.SetActive(false);
  181. //Change the bullets color to the "low bullet color".
  182. if (newCountInMagazine <= m_MainEquipmentHandler.CurrentItem.TryGetMagazineSize() * (m_AmmoDisplayer.LowAmmoPercent / 100))
  183. {
  184. for (int i = 0; i < m_AmmoDisplayer.BulletImages.Count; i++)
  185. {
  186. if (m_AmmoDisplayer.BulletImages[i].color == m_AmmoDisplayer.NormalBulletColor)
  187. m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.LowAmmoBulletColor;
  188. }
  189. }
  190. //Change the bullets color back to normal bullet color.
  191. else
  192. {
  193. for (int i = 0; i < m_AmmoDisplayer.BulletImages.Count; i++)
  194. {
  195. if(m_AmmoDisplayer.BulletImages[i].color == m_AmmoDisplayer.LowAmmoBulletColor)
  196. m_AmmoDisplayer.BulletImages[i].color = m_AmmoDisplayer.NormalBulletColor;
  197. }
  198. }
  199. //Update the storage Text
  200. m_AmmoDisplayer.StorageTxt.text = m_MainEquipmentHandler.CurrentItem.CurrentAmmoInfo.Get().CurrentInStorage.ToString();
  201. m_LastCountInMagazine = newCountInMagazine;
  202. }
  203. private void UpdateFireModeUI()
  204. {
  205. //If the current weapon doesn't have a "Fire Mode" disable the fire mode image
  206. if (m_MainEquipmentHandler.CurrentItem == null || !m_MainEquipmentHandler.CurrentlyAttachedItem.HasProperty("FireMode"))
  207. {
  208. m_FireModeDisplayer.FireModeImage.color = Color.clear;
  209. return;
  210. }
  211. else
  212. m_FireModeDisplayer.FireModeImage.color = Color.white;
  213. //Get fire mode
  214. m_Animator.SetTrigger("Fire Mode Changed");
  215. int fireMode = (int)m_MainEquipmentHandler.CurrentlyAttachedItem.GetProperty("FireMode").Val.Current;
  216. //Get the fire mode property
  217. if (fireMode == (int)ProjectileBasedWeapon.FireMode.Burst)
  218. m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.BurstModeSprite;
  219. else if (fireMode == (int)ProjectileBasedWeapon.FireMode.FullAuto)
  220. m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.FullAutoModeSprite;
  221. else if (fireMode == (int)ProjectileBasedWeapon.FireMode.SemiAuto)
  222. m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.SemiAutoModeSprite;
  223. else if (fireMode == (int)ProjectileBasedWeapon.FireMode.Safety)
  224. m_FireModeDisplayer.FireModeImage.sprite = m_FireModeDisplayer.SafetyModeSprite;
  225. }
  226. }
  227. }