Пример #1
0
 private static void _vs_VoiceClientConnected(string clientGUID, string teamspeakID, ushort teamspeakClientID, long connectionID, string clientName, bool micMuted, bool speakersMuted)
 {
     _vs.ConfigureClient(connectionID, "Halifax", false);
     _vs.SendUpdate(connectionID, new PureVoice.VoiceLocationInformation(teamspeakClientID)
     {
     });
 }
Пример #2
0
        public void UpdateTeamspeakForUser(Client player, List <Client> allPlayers)
        {
            var playerPos     = player.position;
            var playerRot     = player.rotation;
            var rotation      = Math.PI / 180 * (playerRot.Z * -1);
            var playerVehicle = player.vehicle;
            var cId           = player.handle.Value;

            if (!player.hasData("VOICE_ID"))
            {
                if (player.hasData("VOICE_TIMEOUT") && (player.getData("VOICE_TIMEOUT") < DateTime.Now))
                {
                    API.triggerResourceEvent("PUREVOICE_CLIENT_NOVOICE", player);
                    player.kick("Please install the TS3 PureVoice Plugin");
                }
                return;
            }
            var targetId = player.getData("VOICE_ID");

            var playersIHear = new Dictionary <string, VoiceLocationInformation>();

            // Players near me
            var inRangePlayers = allPlayers.Where(cl => (cl != player) && (cl.position.DistanceTo2D(playerPos) <= VoiceMaxRange) && (cl.dimension == player.dimension) && cl.hasData("VOICE_TS_ID")).ToList();

            if (inRangePlayers != null)
            {
                foreach (var streamedPlayer in inRangePlayers)
                {
                    var n = GetTeamspeakID(streamedPlayer);
                    if (streamedPlayer == player)
                    {
                        continue;
                    }

                    var streamedPlayerPos = streamedPlayer.position;
                    var distance          = playerPos.DistanceTo(streamedPlayerPos);
                    var range             = 5; // VoiceRange of streamed player in meters, maybe make this a player-Data?
                    var volumeModifier    = 0f;

                    if (distance <= range)
                    {
                        if (Math.Abs(streamedPlayerPos.Z - playerPos.Z) > range)
                        {
                            continue;
                        }

                        var subPos = streamedPlayerPos.Subtract(playerPos);

                        var x = subPos.X * Math.Cos(rotation) - subPos.Y * Math.Sin(rotation);
                        var y = subPos.X * Math.Sin(rotation) + subPos.Y * Math.Cos(rotation);

                        if (distance > 2)
                        {
                            volumeModifier = (float)(distance / range) * -10f;
                        }
                        if (volumeModifier > 0)
                        {
                            volumeModifier = 0;
                        }
                        volumeModifier = Math.Min(10.0f, Math.Max(-10.0f, volumeModifier));
                        if (!playersIHear.ContainsKey(n))
                        {
                            playersIHear[n] = new VoiceLocationInformation(n, GetTeamspeakClientID(streamedPlayer));
                        }
                        playersIHear[n].Update(new TSVector((float)(Math.Round(x * 1000) / 1000), (float)(Math.Round(y * 1000) / 1000), 0), (float)(Math.Round(volumeModifier * 1000) / 1000), false);
                    }
                }
            }


            // Players in same vehicle are always near
            if (player.isInVehicle)
            {
                var others = player.vehicle.occupants.ToList();
                if (others != null)
                {
                    others.Remove(player);
                    others.ForEach(p =>
                    {
                        var tsId = GetTeamspeakID(p);
                        if (!playersIHear.ContainsKey(tsId))
                        {
                            playersIHear[tsId] = new VoiceLocationInformation(tsId, GetTeamspeakClientID(p));
                        }
                        playersIHear[tsId].Update(new TSVector(0, 0, 0), 4, true);
                    });
                }
            }

            PlayerHears[player.handle.Value] = playersIHear;

            _voiceServer.SendUpdate(targetId, playersIHear.Count > 0 ? playersIHear.Values.ToList() : new List <VoiceLocationInformation>());
        }
Пример #3
0
        public void UpdateTeamspeakForUser(Client player, List <Client> allPlayers)
        {
            var playerPos     = player.GetVoicePosition();
            var playerRot     = player.rotation;
            var rotation      = Math.PI / 180 * (playerRot.Z * -1);
            var playerVehicle = player.vehicle;
            var targetId      = player.GetData("VOICE_ID", 0L);
            var cId           = player.GetCharacterId();

            if (targetId == 0)
            {
                return;
            }

            if (player.IsDead())
            {
                _voiceServer.SendUpdate(targetId, new List <VoiceLocationInformation>());
                return;
            }


            var           playersIHear = new Dictionary <string, VoiceLocationInformation>();
            List <string> mutePlayer   = new List <string>();
            var           debugVoice   = player.GetData("_DEBUG_VOICE", false);
            var           preface      = $"DEBUGVOICE '{player.socialClubName}' => ";

            if (debugVoice)
            {
                logger.Debug($"{preface} {playerPos}");
            }

            // Players near me
            var inRangePlayers = allPlayers.Where(cl => (cl != player) && (cl.IsReady()) && (cl.GetVoicePosition().DistanceTo2D(playerPos) <= 50) && (cl.dimension == player.dimension)).ToList();

            if (inRangePlayers != null)
            {
                if (debugVoice)
                {
                    logger.Debug($"{preface} {inRangePlayers.Count} in range");
                }
                foreach (var streamedPlayer in inRangePlayers)
                {
                    var n = streamedPlayer.GetTeamspeakID();
                    if (streamedPlayer.IsDead() || (streamedPlayer == player) || !player.IsReady() || !streamedPlayer.IsReady() || string.IsNullOrEmpty(n))
                    {
                        continue;
                    }

                    var streamedPlayerPos = streamedPlayer.GetVoicePosition();
                    var distance          = playerPos.DistanceTo(streamedPlayerPos);
                    var range             = streamedPlayer.GetData <int>("VOICE_RANGE_INT", 5); // VoiceRange of streamed player in meters
                    var volumeModifier    = 0f;
                    if (debugVoice)
                    {
                        logger.Debug($"{preface} '{streamedPlayer.GetCharacterName()}' d:{distance} r:{range} {distance < range} {streamedPlayerPos}");
                    }
                    if (distance <= range)
                    {
                        if (Math.Abs(streamedPlayerPos.Z - playerPos.Z) > range)
                        {
                            logger.Debug($"{preface} drop {streamedPlayer.GetCharacterName()} ZRange {Math.Abs(streamedPlayerPos.Z - playerPos.Z)} Speakrange {range} dist {distance}");
                            continue;
                        }

                        var subPos = streamedPlayerPos.Subtract(playerPos);

                        var x = subPos.X * Math.Cos(rotation) - subPos.Y * Math.Sin(rotation);
                        var y = subPos.X * Math.Sin(rotation) + subPos.Y * Math.Cos(rotation);

                        if (distance > 2)
                        {
                            volumeModifier = (float)(distance / range) * -10f;
                        }
                        if (volumeModifier > 0)
                        {
                            volumeModifier = 0;
                        }
                        volumeModifier = Math.Min(10.0f, Math.Max(-10.0f, volumeModifier));

                        var tData = playersIHear.GetOrAdd(n, new VoiceLocationInformation(n, streamedPlayer.GetTeamspeakClientID()));

                        /* Make sure distance and volume modifier is within TS range -10 ... +10 */
                        var xPos   = Math.Max(-10f, Math.Min(10f, (float)(Math.Round(x * 1000) / 1000)));
                        var yPos   = Math.Max(-10f, Math.Min(10f, (float)(Math.Round(y * 1000) / 1000)));
                        var volMod = Math.Max(-10f, Math.Min(10f, (float)(Math.Round(volumeModifier * 1000) / 1000)));

                        tData.Update(new TSVector(xPos, yPos, 0), volMod, false);
                    }
                }
            }
            // Player i phone with
            if (player.hasData("CALLING_PLAYER_NAME") && (player.GetData("CALL_IS_STARTED", 0) == 1))
            {
                var callingPlayerName = player.GetData("CALLING_PLAYER_NAME", String.Empty);
                if (!String.IsNullOrEmpty(callingPlayerName))
                {
                    var p = GetPlayerByTeamspeakId(callingPlayerName);
                    if (debugVoice)
                    {
                        logger.Debug($"{preface} phonecall {p.GetCharacterName()}");
                    }
                    var tData = playersIHear.GetOrAdd(callingPlayerName, new VoiceLocationInformation(callingPlayerName, p.GetTeamspeakClientID()));
                    tData.Update(new TSVector(10, 0, 0), 5, true);
                }
            }

            // Radio/Walkie Talkie
            if (player.GetRadioMode() != RadioModes.OFF)
            {
                var radioVolume  = player.GetData("RADIO_VOLUME", 4);
                var radioPlayers = RadioController.GetSpeakingPlayersTeamspeak(player, player.GetRadioChannel());
                radioPlayers.ForEach(fpl =>
                {
                    var p = GetPlayerByTeamspeakId(fpl);
                    if (debugVoice)
                    {
                        logger.Debug($"{preface} Radio {p.GetCharacterName()}");
                    }
                    var tData = playersIHear.GetOrAdd(fpl, new VoiceLocationInformation(fpl, p.GetTeamspeakClientID()));
                    tData.Update(new TSVector(10, 0, 0), radioVolume, true);
                });
            }

            if (player.isInVehicle)
            {
                var others = player.vehicle?.occupants.ToList();
                if (others != null)
                {
                    others.Remove(player);
                    others.ForEach(p =>
                    {
                        if (debugVoice)
                        {
                            logger.Debug($"{preface} inSameVehcile {p.GetCharacterName()}");
                        }

                        var tsId  = p.GetTeamspeakID();
                        var tData = playersIHear.GetOrAdd(tsId, new VoiceLocationInformation(tsId, p.GetTeamspeakClientID()));
                        tData.Update(new TSVector(0, 0, 0), 4, true);
                    });
                }
            }

            PlayerHears[player.GetCharacterId()] = playersIHear;


            if (!player.IsDead())
            {
                if (debugVoice)
                {
                    logger.Debug($"{preface} {playersIHear.Count} entries");
                    playersIHear.Values.ForEach(v =>
                    {
                        logger.Debug($"{preface} hears {v.ClientID} v:{v.VolumeModifier} p:{v.Position}");
                    });
                }
                _voiceServer.SendUpdate(targetId, playersIHear.Values);
            }
        }