sdraw_mods_cvr/ml_prm/SoundManager.cs
2026-04-18 22:42:47 +03:00

141 lines
6.4 KiB
C#

using ABI_RC.Core;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
namespace ml_prm
{
public class SoundManager
{
enum SoundType
{
ImpactHard1 = 0,
ImpactHard2,
ImpactHard3,
ImpactHard4,
ImpactHard5,
ImpactHard6,
ImpactSoft1,
ImpactSoft2,
ImpactSoft3,
ImpactSoft4,
ImpactSoft5,
ImpactSoft6,
ImpactSoft7,
Count
}
public enum ImpactType
{
Hard = 0,
Soft
}
const string c_modName = "PlayerRagdollMod";
public static SoundManager Instance { get; private set; } = null;
bool m_loaded = false;
readonly AudioClip[] m_clips = null;
AudioSource m_audioSource = null;
public SoundManager(Transform p_root)
{
m_clips = new AudioClip[(int)SoundType.Count];
for(int i = 0; i < (int)SoundType.Count; i++)
m_clips[i] = null;
GameObject l_audioSource = new GameObject("[ImpactSource]");
l_audioSource.transform.parent = p_root;
l_audioSource.transform.localPosition = Vector3.zero;
l_audioSource.transform.localRotation = Quaternion.identity;
m_audioSource = l_audioSource.AddComponent<AudioSource>();
m_audioSource.playOnAwake = false;
m_audioSource.loop = false;
m_audioSource.minDistance = 2f;
m_audioSource.maxDistance = 5f;
m_audioSource.dopplerLevel = 0f;
m_audioSource.panStereo = 0f;
m_audioSource.spatialBlend = 0f; // 2D
m_audioSource.spread = 0f;
m_audioSource.rolloffMode = AudioRolloffMode.Linear;
m_audioSource.outputAudioMixerGroup = RootLogic.Instance.mainSfx;
Instance = this;
}
~SoundManager()
{
if(Instance == this)
Instance = null;
if(m_audioSource != null)
Object.Destroy(m_audioSource);
m_audioSource = null;
}
internal void LoadSounds()
{
if(!m_loaded)
{
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard1, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard1.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard2, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard2.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard3, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard3.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard4, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard4.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard5, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard5.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactHard6, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_hard6.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft1, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft1.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft2, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft2.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft3, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft3.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft4, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft4.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft5, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft5.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft6, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft6.wav")));
MelonLoader.MelonCoroutines.Start(LoadAudioClip(SoundType.ImpactSoft7, Path.Combine(MelonLoader.Utils.MelonEnvironment.UserDataDirectory, c_modName, "body_medium_impact_soft7.wav")));
m_loaded = true;
}
}
IEnumerator LoadAudioClip(SoundType p_type, string p_path)
{
using UnityWebRequest l_uwr = UnityWebRequestMultimedia.GetAudioClip("file://" + p_path, AudioType.WAV);
((DownloadHandlerAudioClip)l_uwr.downloadHandler).streamAudio = true;
yield return l_uwr.SendWebRequest();
if((l_uwr.result == UnityWebRequest.Result.ConnectionError) || (l_uwr.result == UnityWebRequest.Result.ProtocolError))
{
MelonLoader.MelonLogger.Warning(l_uwr.error);
yield break;
}
AudioClip l_content;
AudioClip l_clip = (l_content = DownloadHandlerAudioClip.GetContent(l_uwr));
yield return l_content;
if(!l_uwr.isDone || (l_clip == null))
yield break;
m_clips[(int)p_type] = l_clip;
}
public void PlaySound(ImpactType p_type)
{
if(m_loaded)
{
int l_index = -1;
switch(p_type)
{
case ImpactType.Hard:
l_index = (int)SoundType.ImpactHard1 + Random.Range(0, 6);
break;
case ImpactType.Soft:
l_index = (int)SoundType.ImpactSoft1 + Random.Range(0, 7);
break;
}
if((l_index != -1) && (m_clips[l_index] != null))
m_audioSource.PlayOneShot(m_clips[l_index], Settings.ImpactVolume);
}
}
}
}