quantum-space-buddies/QSB/Audio/QSBPlayerAudioController.cs
2022-10-05 00:15:45 -04:00

102 lines
2.9 KiB
C#

using QSB.PlayerBodySetup.Remote;
using QSB.Utility;
using UnityEngine;
namespace QSB.Audio;
[UsedInUnityProject]
public class QSBPlayerAudioController : MonoBehaviour
{
public OWAudioSource _oneShotExternalSource;
public OWAudioSource _repairToolSource;
public OWAudioSource _damageAudioSource;
private AudioManager _audioManager;
public void Start()
{
_audioManager = Locator.GetAudioManager();
// TODO: This should be done in the Unity project
var damageAudio = new GameObject("DamageAudioSource");
damageAudio.SetActive(false);
damageAudio.transform.SetParent(transform, false);
damageAudio.transform.localPosition = Vector3.zero;
_damageAudioSource = damageAudio.AddComponent<OWAudioSource>();
_damageAudioSource._audioSource = damageAudio.GetAddComponent<AudioSource>();
_damageAudioSource.SetTrack(_repairToolSource.GetTrack());
_damageAudioSource.spatialBlend = 1f;
_damageAudioSource.gameObject.GetAddComponent<QSBDopplerFixer>();
damageAudio.SetActive(true);
}
public void PlayEquipTool()
=> _oneShotExternalSource?.PlayOneShot(AudioType.ToolTranslatorEquip);
public void PlayUnequipTool()
=> _oneShotExternalSource?.PlayOneShot(AudioType.ToolTranslatorUnequip);
public void PlayTurnOnFlashlight()
=> _oneShotExternalSource?.PlayOneShot(AudioType.ToolFlashlightOn);
public void PlayTurnOffFlashlight()
=> _oneShotExternalSource?.PlayOneShot(AudioType.ToolFlashlightOff);
public void PlayWearSuit()
=> PlayOneShot(AudioType.PlayerSuitWearSuit);
public void PlayRemoveSuit()
=> PlayOneShot(AudioType.PlayerSuitRemoveSuit);
public void PlayOneShot(AudioType audioType, float pitch = 1f, float volume = 1f)
{
if (_oneShotExternalSource)
{
_oneShotExternalSource.pitch = pitch;
_oneShotExternalSource.PlayOneShot(audioType, volume);
}
}
public void PlayFootstep(AudioType audioType, float pitch) =>
PlayOneShot(audioType, pitch, 0.7f);
public void OnJump(float pitch) =>
PlayOneShot(AudioType.MovementJump, pitch, 0.7f);
private void StartHazardDamage(HazardVolume.HazardType latestHazardType)
{
var type = AudioType.EnterVolumeDamageHeat_LP;
if (latestHazardType == HazardVolume.HazardType.DARKMATTER)
{
type = AudioType.EnterVolumeDamageGhostfire_LP;
}
else if (latestHazardType == HazardVolume.HazardType.FIRE)
{
type = AudioType.EnterVolumeDamageFire_LP;
}
_damageAudioSource.clip = _audioManager.GetSingleAudioClip(type, true);
_damageAudioSource.Stop();
_damageAudioSource.FadeIn(0.2f, true, true, 1f);
}
private void EndHazardDamage()
{
if (_damageAudioSource.isPlaying)
{
_damageAudioSource.FadeOut(0.5f, OWAudioSource.FadeOutCompleteAction.STOP, 0f);
}
}
public void SetHazardDamage(HazardVolume.HazardType latestHazardType)
{
if (latestHazardType == HazardVolume.HazardType.NONE)
{
EndHazardDamage();
}
else
{
StartHazardDamage(latestHazardType);
}
}
}