quantum-space-buddies/QSB/Audio/QSBJetpackThrusterAudio.cs

99 lines
2.6 KiB
C#

using QSB.Player;
using QSB.Utility;
using UnityEngine;
namespace QSB.Audio;
[UsedInUnityProject]
internal class QSBJetpackThrusterAudio : QSBThrusterAudio
{
public OWAudioSource _underwaterSource;
public OWAudioSource _oxygenSource;
public OWAudioSource _boostSource;
private PlayerInfo _attachedPlayer;
private bool _wasBoosting;
// Taken from Player_Body settings
private const float maxTranslationalThrust = 6f;
private bool _underwater;
private RemotePlayerFluidDetector _fluidDetector;
public void Init(PlayerInfo player)
{
_attachedPlayer = player;
enabled = true;
_fluidDetector = player.FluidDetector;
_fluidDetector.OnEnterFluidType += OnEnterExitFluidType;
_fluidDetector.OnExitFluidType += OnEnterExitFluidType;
}
private void OnDestroy()
{
if (_fluidDetector != null)
{
_fluidDetector.OnEnterFluidType -= OnEnterExitFluidType;
_fluidDetector.OnExitFluidType -= OnEnterExitFluidType;
}
}
private void OnEnterExitFluidType(FluidVolume.Type type)
{
_underwater = _fluidDetector.InFluidType(FluidVolume.Type.WATER);
}
private void Update()
{
if(_attachedPlayer == null)
{
enabled = false;
return;
}
var acc = _attachedPlayer.JetpackAcceleration.AccelerationVariableSyncer.Value;
var thrustFraction = acc.magnitude / maxTranslationalThrust;
// TODO: Sync
var usingBooster = false;
var usingOxygen = false;
float targetVolume = usingBooster ? 0f : thrustFraction;
float targetPan = -acc.x / maxTranslationalThrust * 0.4f;
UpdateTranslationalSource(_translationalSource, targetVolume, targetPan, !_underwater && !usingOxygen);
UpdateTranslationalSource(_underwaterSource, targetVolume, targetPan, _underwater);
UpdateTranslationalSource(_oxygenSource, targetVolume, targetPan, !_underwater && usingOxygen);
if (!_wasBoosting && usingBooster)
{
_boostSource.FadeIn(0.3f, false, false, 1f);
}
else if (_wasBoosting && !usingBooster)
{
_boostSource.FadeOut(0.3f, OWAudioSource.FadeOutCompleteAction.STOP, 0f);
}
_wasBoosting = usingBooster;
}
private void UpdateTranslationalSource(OWAudioSource source, float targetVolume, float targetPan, bool active)
{
if (!active)
{
targetVolume = 0f;
targetPan = 0f;
}
if (!source.isPlaying && targetVolume > 0f)
{
source.SetLocalVolume(0f);
source.Play();
}
else if (source.isPlaying && source.volume <= 0f)
{
source.Stop();
}
source.SetLocalVolume(Mathf.MoveTowards(source.GetLocalVolume(), targetVolume, 5f * Time.deltaTime));
source.panStereo = Mathf.MoveTowards(source.panStereo, targetPan, 5f * Time.deltaTime);
}
}