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(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 OnExecute(CommandContext outerContext) { if (sfxClip == null) { Debug.LogWarning("SFX Clip is null."); return Observable.Return(Unit.Default); } 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); } } } }