Files
Continentis/Assets/Scripts/MainGame/Commands/Cmd_PlaySFX.cs
2025-12-10 18:22:26 -05:00

76 lines
2.5 KiB
C#

using System;
using Continentis.MainGame.Character;
using SLSFramework.General;
using SLSFramework.UModAssistance;
using UniRx;
using UnityEngine;
namespace Continentis.MainGame.Commands
{
public class Cmd_PlaySFX : CommandBase
{
public AudioClip sfxClip;
public bool useTargetPosition;
public Vector3 playPosition;
public Vector3 playPositionOffset;
public float volume;
public float overrideDuration;
public bool willWaitUntilFinish;
public Cmd_PlaySFX(string sfxClipID, bool useTargetPosition = true, Vector3 positionOrOffset = default,
bool willWaitUntilFinish = false, float volume = 1f, float overrideDuration = -1f)
{
this.sfxClip = ModManager.GetAsset<AudioClip>(sfxClipID);
this.useTargetPosition = useTargetPosition;
if (useTargetPosition)
{
this.playPosition = Vector3.zero;
this.playPositionOffset = positionOrOffset;
}
else
{
this.playPosition = positionOrOffset;
this.playPositionOffset = Vector3.zero;
}
this.volume = volume;
this.overrideDuration = overrideDuration;
this.willWaitUntilFinish = willWaitUntilFinish;
}
protected override IObservable<Unit> OnExecute(CommandContext outerContext)
{
if (sfxClip == null)
{
Debug.LogWarning("SFX Clip is null.");
return Observable.Return(Unit.Default);
}
return base.OnExecute(outerContext);
}
protected override IObservable<Unit> CoreExecute(CommandContext outerContext)
{
if (useTargetPosition)
{
if (selfContext.context["Target"] is CharacterBase character)
{
playPosition = character.characterView.centerPoint.transform.position;
}
}
AudioManager.PlaySFX(sfxClip, playPosition + playPositionOffset, volume);
float sfxDuration = overrideDuration > 0 ? overrideDuration : sfxClip.length;
if (willWaitUntilFinish)
{
return Observable.Timer(TimeSpan.FromSeconds(sfxDuration)).AsUnitObservable();
}
else
{
return Observable.Return(Unit.Default);
}
}
}
}