/// <inheritdoc />
        public IPlayingAudioStream Play(Filter playerFilter, string filename, IEntity entity, AudioParams?audioParams = null)
        {
            //TODO: Calculate this from PAS
            var range = audioParams is null || audioParams.Value.MaxDistance <= 0 ? AudioDistanceRange : audioParams.Value.MaxDistance;

            var id = CacheIdentifier();

            var msg = new PlayAudioEntityMessage
            {
                FileName    = filename,
                Coordinates = entity.Transform.Coordinates,
                EntityUid   = entity.Uid,
                AudioParams = audioParams ?? AudioParams.Default,
                Identifier  = id,
            };

            // We clone the filter here as to not modify the original instance.
            if (range > 0.0f)
            {
                playerFilter = playerFilter.Clone().AddInRange(entity.Transform.MapPosition, range);
            }

            RaiseNetworkEvent(msg, playerFilter);

            return(new AudioSourceServer(this, id, playerFilter.Recipients.ToArray()));
        }
Beispiel #2
0
        /// <summary>
        ///     Play an audio file following an entity.
        /// </summary>
        /// <param name="filename">The resource path to the OGG Vorbis file to play.</param>
        /// <param name="entity">The entity "emitting" the audio.</param>
        /// <param name="audioParams"></param>
        /// <param name="range">The max range at which the audio will be heard. Less than or equal to 0 to send to every player.</param>
        public AudioSourceServer PlayFromEntity(string filename, IEntity entity, AudioParams?audioParams = null, int range = AudioDistanceRange)
        {
            var id  = CacheIdentifier();
            var msg = new PlayAudioEntityMessage
            {
                FileName    = filename,
                EntityUid   = entity.Uid,
                AudioParams = audioParams ?? AudioParams.Default,
                Identifier  = id
            };

            if (range <= 0)
            {
                RaiseNetworkEvent(msg);
                return(new AudioSourceServer(this, id));
            }

            var players = _playerManager.GetPlayersInRange(entity.Transform.GridPosition, range);

            foreach (var player in players)
            {
                RaiseNetworkEvent(msg, player.ConnectedClient);
            }

            return(new AudioSourceServer(this, id, players));
        }
Beispiel #3
0
        public IPlayingAudioStream?Play(Filter playerFilter, string filename, EntityUid uid, AudioParams?audioParams = null)
        {
            if (!EntityManager.TryGetComponent <TransformComponent>(uid, out var transform))
            {
                return(null);
            }

            var id = CacheIdentifier();

            var fallbackCoordinates = GetFallbackCoordinates(transform.MapPosition);

            var msg = new PlayAudioEntityMessage
            {
                FileName            = filename,
                Coordinates         = transform.Coordinates,
                FallbackCoordinates = fallbackCoordinates,
                EntityUid           = uid,
                AudioParams         = audioParams ?? AudioParams.Default,
                Identifier          = id,
            };

            RaiseNetworkEvent(msg, playerFilter);

            return(new AudioSourceServer(this, id, playerFilter.Recipients.ToArray()));
        }
        /// <inheritdoc />
        public IPlayingAudioStream Play(Filter playerFilter, string filename, IEntity entity, AudioParams?audioParams = null)
        {
            //TODO: Calculate this from PAS
            var range = audioParams is null || audioParams.Value.MaxDistance <= 0 ? AudioDistanceRange : audioParams.Value.MaxDistance;

            var id = CacheIdentifier();

            var msg = new PlayAudioEntityMessage
            {
                FileName    = filename,
                Coordinates = entity.Transform.Coordinates,
                EntityUid   = entity.Uid,
                AudioParams = audioParams ?? AudioParams.Default,
                Identifier  = id,
            };

            IList <ICommonSession> players;
            var recipients = (playerFilter as IFilter).Recipients;

            if (range > 0.0f)
            {
                players = PasInRange(recipients, entity.Transform.MapPosition, range);
            }
            else
            {
                players = recipients;
            }

            foreach (var player in players)
            {
                RaiseNetworkEvent(msg, player.ConnectedClient);
            }

            return(new AudioSourceServer(this, id, players));
        }
Beispiel #5
0
        /// <summary>
        ///     Play an audio file following an entity.
        /// </summary>
        /// <param name="filename">The resource path to the OGG Vorbis file to play.</param>
        /// <param name="entity">The entity "emitting" the audio.</param>
        /// <param name="audioParams"></param>
        /// <param name="range">The max range at which the audio will be heard. Less than or equal to 0 to send to every player.</param>
        /// <param name="excludedSession">Sessions that won't receive the audio message.</param>
        public AudioSourceServer PlayFromEntity(string filename, IEntity entity, AudioParams?audioParams = null, int range = AudioDistanceRange, IPlayerSession?excludedSession = null)
        {
            var id = CacheIdentifier();

            var msg = new PlayAudioEntityMessage
            {
                FileName    = filename,
                Coordinates = entity.Transform.Coordinates,
                EntityUid   = entity.Uid,
                AudioParams = audioParams ?? AudioParams.Default,
                Identifier  = id,
            };

            if (range <= 0 && excludedSession == null)
            {
                RaiseNetworkEvent(msg);
                return(new AudioSourceServer(this, id));
            }

            var players = range > 0.0f ? _playerManager.GetPlayersInRange(entity.Transform.Coordinates, range) : _playerManager.GetAllPlayers();

            for (var i = players.Count - 1; i >= 0; i--)
            {
                var player = players[i];
                if (player == excludedSession)
                {
                    players.RemoveAt(i);
                    continue;
                }

                RaiseNetworkEvent(msg, player.ConnectedClient);
            }

            return(new AudioSourceServer(this, id, players));
        }
Beispiel #6
0
        private void PlayAudioEntityHandler(PlayAudioEntityMessage ev)
        {
            if (!EntityManager.TryGetEntity(ev.EntityUid, out var entity))
            {
                Logger.Error($"Server tried to play audio file {ev.FileName} on entity {ev.EntityUid} which does not exist.");
                return;
            }

            Play(ev.FileName, entity, ev.AudioParams);
        }
        /// <summary>
        ///     Play an audio file following an entity.
        /// </summary>
        /// <param name="filename">The resource path to the OGG Vorbis file to play.</param>
        /// <param name="entity">The entity "emitting" the audio.</param>
        public void Play(string filename, IEntity entity, AudioParams?audioParams = null)
        {
            var msg = new PlayAudioEntityMessage
            {
                FileName    = filename,
                EntityUid   = entity.Uid,
                AudioParams = audioParams ?? AudioParams.Default
            };

            RaiseNetworkEvent(msg);
        }
Beispiel #8
0
        private void PlayAudioEntityHandler(PlayAudioEntityMessage ev)
        {
            var stream = EntityManager.TryGetEntity(ev.EntityUid, out var entity) ?
                         (PlayingStream?)Play(ev.FileName, entity, ev.AudioParams)
                : (PlayingStream?)Play(ev.FileName, ev.Coordinates, ev.AudioParams);

            if (stream != null)
            {
                stream.NetIdentifier = ev.Identifier;
            }
        }
Beispiel #9
0
        private void PlayAudioEntityHandler(PlayAudioEntityMessage ev)
        {
            if (!EntityManager.TryGetEntity(ev.EntityUid, out var entity))
            {
                Logger.Error(
                    $"Server tried to play audio file {ev.FileName} on entity {ev.EntityUid} which does not exist.");
                return;
            }

            var stream = (PlayingStream?)Play(ev.FileName, entity, ev.AudioParams);

            if (stream != null)
            {
                stream.NetIdentifier = ev.Identifier;
            }
        }