internal bool IsMember(VoiceClient voiceClient) { lock (_members) { return(_members.Any(m => m.VoiceClient == voiceClient)); } }
internal void AddMember(VoiceClient voiceClient, bool isPrimary) { lock (_members) { if (_members.Any(m => m.VoiceClient == voiceClient)) { return; } _members.Add(new RadioChannelMember(this, voiceClient, isPrimary)); voiceClient.Player.EmitLocked("SaltyChat:RadioSetChannel", Name, isPrimary); foreach (var member in _members.Where(m => m.IsSending)) { voiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", member.VoiceClient.Player, Name, true, false, member.VoiceClient.Player.Position); } } }
internal void SetSpeaker(VoiceClient voiceClient, bool isEnabled) { List <RadioChannelMember> radioChannelMembers; lock (_members) { radioChannelMembers = _members; } var radioChannelMember = radioChannelMembers.FirstOrDefault(m => m.VoiceClient == voiceClient); if (radioChannelMember == null || radioChannelMember.IsSpeakerEnabled == isEnabled) { return; } radioChannelMember.IsSpeakerEnabled = isEnabled; var sendingMembers = radioChannelMembers.Where(m => m.IsSending).ToArray(); if (!sendingMembers.Any()) { return; } if (isEnabled || radioChannelMembers.Any(m => m.IsSpeakerEnabled)) { foreach (var sendingMember in sendingMembers) { Send(sendingMember.VoiceClient, true); } } else { foreach (var sendingMember in sendingMembers) { foreach (var client in VoiceManager.Instance.VoiceClients.Where(v => radioChannelMembers.All(m => m.VoiceClient != v))) { client.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", sendingMember.VoiceClient.Player, Name, false, false, sendingMember.VoiceClient.Player.Position, false, new string[0]); } } } }
internal void RemoveMember(VoiceClient voiceClient) { lock (_members) { var member = _members.FirstOrDefault(m => m.VoiceClient == voiceClient); if (member == null) { return; } if (member.IsSending) { if (member.VoiceClient.IsRadioSpeakerEnabled) { foreach (var client in VoiceManager.Instance.VoiceClients) { client.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", voiceClient.Player, Name, false, true, voiceClient.Player.Position, false, Array.Empty <string>()); } } else { foreach (var client in VoiceManager.Instance.VoiceClients) { client.Player.EmitLocked("SaltyChat:PlayerIsSending", voiceClient.Player, Name, false, true, voiceClient.Player.Position); } } } _members.Remove(member); foreach (var channelMember in _members.Where(m => m.IsSending)) { voiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", channelMember.VoiceClient.Player, Name, false, false, channelMember.VoiceClient.Player.Position); } voiceClient.Player.EmitLocked("SaltyChat:RadioLeaveChannel", null, member.IsPrimary); } }
internal void Send(VoiceClient voiceClient, bool isSending) { RadioChannelMember radioChannelMember; lock (_members) { radioChannelMember = _members.FirstOrDefault(m => m.VoiceClient == voiceClient); } if (radioChannelMember == null) { return; } var stateChanged = radioChannelMember.IsSending != isSending; radioChannelMember.IsSending = isSending; var channelMembers = Members; var onSpeaker = channelMembers.Where(m => m.VoiceClient.IsRadioSpeakerEnabled && m.VoiceClient != voiceClient).ToArray(); if (onSpeaker.Length > 0) { var channelMemberNames = onSpeaker.Select(m => m.VoiceClient.TeamSpeakName).ToArray(); foreach (var remoteClient in VoiceManager.Instance.VoiceClients) { remoteClient.Player.EmitLocked("SaltyChat:PlayerIsSendingRelayed", voiceClient.Player, Name, isSending, stateChanged, voiceClient.Player.Position, IsMember(remoteClient), channelMemberNames); } } else { foreach (var member in channelMembers) { member.VoiceClient.Player.EmitLocked("SaltyChat:PlayerIsSending", voiceClient.Player, Name, isSending, stateChanged, voiceClient.Player.Position); } } }