1
0

AudioMaster.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using Il2Cpp;
  2. using MelonLoader;
  3. using System.Collections;
  4. using UnityEngine;
  5. namespace AudioMgr
  6. {
  7. public static class AudioMaster
  8. {
  9. private static AudioListener _playerListener;
  10. private static bool _playerGotBGMQueue = false;
  11. private static Queue _playerBGMQueue;
  12. private static GameObject _masterParent;
  13. private static Panel_OptionsMenu _vanillaSoundOptionsMenu;
  14. private static bool _isVanillaMusicDisabled = false;
  15. public enum SourceType { SFX, BGM, Voice, Ambience, Custom };
  16. public static void MoveMasterToPlayer()
  17. {
  18. if (GameManager.GetMainCamera() != null)
  19. {
  20. _masterParent.transform.position = GameManager.GetVpFPSCamera().gameObject.transform.position;
  21. }
  22. }
  23. public static void CreateMasterParent()
  24. {
  25. if (_masterParent == null)
  26. {
  27. SettingMaster.Setup();
  28. _masterParent = new GameObject("AudioStalker");
  29. UnityEngine.GameObject.DontDestroyOnLoad(_masterParent);
  30. _playerListener = _masterParent.AddComponent<AudioListener>();
  31. }
  32. }
  33. private static void SearchAndDestroyListeners()
  34. {
  35. AudioListener[] foundListeners = UnityEngine.Object.FindObjectsOfType<AudioListener>();
  36. foreach (AudioListener singleKill in foundListeners)
  37. {
  38. UnityEngine.Object.Destroy(singleKill);
  39. }
  40. }
  41. /// <summary>
  42. /// Creates a new ClipManager instance for loading audioclips from files or bundles.
  43. /// </summary>
  44. /// <returns>New "ClipManager" class instance. Manage yourself</returns>
  45. public static ClipManager NewClipManager()
  46. {
  47. ClipManager newManager = new ClipManager();
  48. return newManager;
  49. }
  50. /// <summary>
  51. /// Creates a new AudioSource on targetobject. Used for single short audioclips.
  52. /// </summary>
  53. /// <returns>New "Shot" class instance. Manage yourself</returns>
  54. /// <param name="targetObject">Parentobject for new audiosource</param>
  55. /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
  56. ///
  57. public static Shot CreateShot(GameObject targetObject, SourceType sourceType)
  58. {
  59. Shot newAudioSource = targetObject.AddComponent<Shot>();
  60. newAudioSource.Setup(sourceType);
  61. return newAudioSource;
  62. }
  63. /// <summary>
  64. /// Creates a new AudioSource on the player. Used for single short audioclips that emit from the player (eg. voice)
  65. /// </summary>
  66. /// <returns>New "Shot" class instance. Manage yourself</returns>
  67. /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
  68. ///
  69. public static Shot CreatePlayerShot(SourceType sourceType)
  70. {
  71. Shot newAudioSource = _masterParent.AddComponent<Shot>();
  72. newAudioSource.Setup(sourceType);
  73. return newAudioSource;
  74. }
  75. /// <summary>
  76. /// Creates a new AudioSource on targetobject. Used for playing a list of audioclips.
  77. /// </summary>
  78. /// <returns>New "Queue" class instance. Manage yourself</returns>
  79. /// <param name="targetObject">Parentobject for new audiosource</param>
  80. /// <param name="clipManager">ClipManager that acts as the playlist</param>
  81. /// <param name="timeGap">Pause between clips. Use 0f for gapless playback</param>
  82. /// <param name="loopType">Enum Queue.Loop.* - Loop single clip / Loop complete list / Randomize play order (never stop)</param>
  83. /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
  84. ///
  85. public static Queue CreateQueue(GameObject targetObject, ClipManager clipManager, float timeGap, Queue.Loop loopType, SourceType sourceType)
  86. {
  87. Queue newAudioSource = targetObject.AddComponent<Queue>();
  88. newAudioSource.Setup(clipManager, timeGap, loopType, sourceType);
  89. return newAudioSource;
  90. }
  91. /// <summary>
  92. /// Creates a new AudioSource on the player. Used for playing a list of audioclips.
  93. /// </summary>
  94. /// <returns>New "Queue" class instance. Manage yourself</returns>
  95. /// <param name="clipManager">ClipManager that acts as the playlist</param>
  96. /// <param name="timeGap">Pause between clips. Use 0f for gapless playback</param>
  97. /// <param name="loopType">Enum Queue.Loop.* - Loop single clip / Loop complete list / Randomize play order (never stop)</param>
  98. /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
  99. ///
  100. public static Queue CreatePlayerQueue(ClipManager clipManager, float timeGap, Queue.Loop loopType, SourceType sourceType)
  101. {
  102. if (_playerGotBGMQueue && sourceType == SourceType.BGM)
  103. {
  104. MelonLogger.Msg("Player already got a queue for BGM attached. Returning null");
  105. return null;
  106. }
  107. if (sourceType == SourceType.BGM)
  108. {
  109. _playerBGMQueue = _masterParent.AddComponent<Queue>();
  110. _playerBGMQueue.Setup(clipManager, timeGap, loopType, sourceType);
  111. _playerGotBGMQueue = true;
  112. return _playerBGMQueue;
  113. }
  114. Queue newAudioSource = _masterParent.AddComponent<Queue>();
  115. newAudioSource.Setup(clipManager, timeGap, loopType, sourceType);
  116. return newAudioSource;
  117. }
  118. /// <summary>
  119. /// Removes any Queue on the player with the source type BGM.
  120. /// </summary>
  121. ///
  122. public static void RemovePlayerBGMQueue()
  123. {
  124. if (_playerGotBGMQueue)
  125. {
  126. MelonLogger.Msg("Hostile takeover of BGM source on playerobject!");
  127. _playerGotBGMQueue = false;
  128. _playerBGMQueue = null;
  129. }
  130. }
  131. public static Panel_OptionsMenu vanillaAudioOptionsMenu
  132. {
  133. get
  134. {
  135. return _vanillaSoundOptionsMenu;
  136. }
  137. set
  138. {
  139. _vanillaSoundOptionsMenu = value;
  140. }
  141. }
  142. public static AudioListener audioListener
  143. {
  144. get
  145. {
  146. return _playerListener;
  147. }
  148. }
  149. public static bool vanillaMusicDisabled
  150. {
  151. get
  152. {
  153. return _isVanillaMusicDisabled;
  154. }
  155. set
  156. {
  157. _isVanillaMusicDisabled = value;
  158. }
  159. }
  160. }
  161. }