void onVoiceBatchUpdate(VoicePaketBatchUpdate data, NetPeer peer) { try { var con = VoicePlugin.GetConnection(_connectionInfo.ServerGUID); if (con == null) { return; } var mute = new HashSet <ushort>(con.GetChannel(con.IngameChannel).AllClients); mute.Remove(con.LocalClientId); var unmute = new HashSet <ushort>(); if (data.Data.Length > 0) { data.Data.ForEach(d => { if (d.ClientID == 0) { d.ClientID = con.GetClientId(d.ClientName); } if (d.ClientID != 0) { mute.Remove(d.ClientID); unmute.Add(d.ClientID); con.GetClient(d.ClientID)?.UpdatePosition(d.Position, d.VolumeModifier, false, false); } }); } if (mute.SetEquals(con._MutedClients) && unmute.SetEquals(con._UnmutedClients)) { return; } VoicePlugin.Log("BatchUpdate {0}", data.Data.Length); con._UnmutedClients = new ConcurrentHashSet <ushort>(unmute); con._MutedClients = new ConcurrentHashSet <ushort>(mute); con._MutedClients.TryRemove(con.LocalClientId); con.DoMuteActions(); } catch (Exception ex) { VoicePlugin.Log(ex.ToString()); } }
/// <summary> /// Send a voice update to a client /// </summary> /// <param name="targetId">target client</param> /// <param name="data">new voice data</param> public void SendUpdate(long targetId, IEnumerable <VoiceLocationInformation> data) { if (_connectedPeers.TryGetValue(targetId, out var peer)) { if (peer.ConnectionState == ConnectionState.Connected) { var p = new VoicePaketBatchUpdate(); List <BatchDataRecord> list = new List <BatchDataRecord>(); foreach (var item in data) { list.Add(new BatchDataRecord() { ClientID = item.ClientID, Position = item.Position, VolumeModifier = item.VolumeModifier, ClientName = item.ClientID == 0 ? item.Name : String.Empty }); } p.Data = list.ToArray(); //Logger.Debug("SendUpdate {0} {1} Records => {2}",targetId, data.Count(),p.Data.Length); SendTo(peer, p, DeliveryMethod.ReliableOrdered); } } }