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) { }); }
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>()); }
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); } }