public void Play() { if (IsEmitter) { var position = Game1.player.Position; Listener.Position = new Vector3(0, position.X * Distance, position.Y * Distance); Sound?.Apply3D(new AudioListener[] { Listener }, Emitter); } Sound?.Play(); IsPlaying = true; UpdateThread = new Thread(Update); UpdateThread.Start(); }
public void Update() { try { while (!Sound.IsDisposed && IsPlaying && Sound.State == SoundState.Playing) { if (IsEmitter) { var position = Game1.player.Position; var t = new Vector3(0, position.X * Distance, position.Y * Distance); if (t != Listener.Position) { Listener.Position = t; Sound?.Apply3D(Listener, Emitter); } } float mainvol = (Ambient ? Game1.ambientPlayerVolume : Game1.musicPlayerVolume); float optionsvol = (Ambient ? Game1.options.ambientVolumeLevel : Game1.options.musicVolumeLevel); if (IsEmitter && MaxDistance < GetSquaredDistance(Game1.player.getTileLocation(), EmitterTile)) { optionsvol = 0f; } SetVolume(Math.Min(optionsvol, mainvol)); Thread.Sleep(1); } } catch (Exception e) { CustomMusicMod.SMonitor.Log(e.Message + ";" + e.StackTrace, StardewModdingAPI.LogLevel.Error); } IsPlaying = false; }