155 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			No EOL
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| ---@class RadioChannel
 | |
| ---@field Name string
 | |
| ---@field _members RadioChannelMember[]
 | |
| ---@field _memberLock table
 | |
| RadioChannel = {}
 | |
| RadioChannel.__index = RadioChannel
 | |
| 
 | |
| ---@param name string
 | |
| ---@param members RadioChannelMember[]
 | |
| function RadioChannel.new(name, members)
 | |
|   local self = setmetatable({}, RadioChannel)
 | |
|   self.Name = name
 | |
|   self._members = {}
 | |
|   
 | |
|   if members ~= nil then
 | |
|     for _, member in pairs(members) do
 | |
|       table.insert(self._members, member)
 | |
|     end
 | |
|   end
 | |
|   return self
 | |
| end
 | |
| 
 | |
| ---@param voiceClient VoiceClient
 | |
| ---@return boolean
 | |
| function RadioChannel:IsMember(voiceClient)
 | |
|   return table.any(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return voiceClient.TeamSpeakName == _v.VoiceClient.TeamSpeakName
 | |
|   end)
 | |
| end
 | |
| 
 | |
| ---@param voiceClient VoiceClient
 | |
| ---@param isPrimary boolean
 | |
| function RadioChannel:AddMember(voiceClient, isPrimary)
 | |
|   if not self:IsMember(voiceClient) then
 | |
|     table.insert(self._members, RadioChannelMember.new(self, voiceClient, isPrimary))
 | |
|     voiceClient:TriggerEvent(Event.SaltyChat_SetRadioChannel, self.Name, isPrimary)
 | |
| 
 | |
|     self:UpdateMemberStateBag()
 | |
|   end
 | |
| end
 | |
| 
 | |
| ---@param voiceClient VoiceClient
 | |
| function RadioChannel:RemoveMember(voiceClient)
 | |
|   ---@type RadioChannelMember
 | |
|   local member = table.find(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName
 | |
|   end)
 | |
| 
 | |
|   if member ~= nil then
 | |
|     local memberIndex = table.findIndex(self._members, function (_v)
 | |
|       ---@cast _v RadioChannelMember
 | |
|       return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName
 | |
|     end)
 | |
| 
 | |
|     table.remove(self._members, memberIndex)
 | |
|     voiceClient:TriggerEvent(Event.SaltyChat_SetRadioChannel, nil, member.IsPrimary)
 | |
| 
 | |
|     if member.IsSending then
 | |
|       self:UpdateSenderStateBag()
 | |
|     end
 | |
| 
 | |
|     self:UpdateMemberStateBag()
 | |
|   end
 | |
| end
 | |
| 
 | |
| ---@param voiceClient VoiceClient
 | |
| ---@param isSending boolean
 | |
| function RadioChannel:Send(voiceClient, isSending)
 | |
|   local member = self:TryGetMember(voiceClient)
 | |
|   if not member then return end
 | |
| 
 | |
|   local b = table.any(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return _v.VoiceClient.TeamSpeakName ~= voiceClient.TeamSpeakName and _v.IsSending
 | |
|   end)
 | |
| 
 | |
|   if VoiceManager.Instance.Configuration.EnableRadioHardcoreMode and isSending and b then
 | |
|     voiceClient:TriggerEvent(Event.SaltyChat_ChannelInUse, self.Name)
 | |
|     return
 | |
|   end
 | |
| 
 | |
|   if not voiceClient.IsAlive and isSending then return end
 | |
| 
 | |
|   member.IsSending = isSending
 | |
|   self:UpdateSenderStateBag()
 | |
| end
 | |
| 
 | |
| ---@param voiceClient VoiceClient
 | |
| ---@return RadioChannelMember
 | |
| function RadioChannel:TryGetMember(voiceClient)
 | |
|   ---@type RadioChannelMember
 | |
|   local member = table.find(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName
 | |
|   end)
 | |
| 
 | |
|   return member
 | |
| end
 | |
| 
 | |
| function RadioChannel:UpdateMemberStateBag()
 | |
|   VoiceManager.Instance:SetStateBagKey(State.SaltyChat_RadioChannelMember..":"..self.Name, table.map(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return _v.VoiceClient.TeamSpeakName
 | |
|   end))
 | |
| end
 | |
| 
 | |
| function RadioChannel:UpdateSenderStateBag()
 | |
|   local sender = {}
 | |
|   local membersSending = table.filter(self._members, function (_v)
 | |
|     ---@cast _v RadioChannelMember
 | |
|     return _v.IsSending
 | |
|   end)
 | |
| 
 | |
|   for _, sendingMember in pairs(membersSending) do
 | |
|     ---@cast sendingMember RadioChannelMember
 | |
|     table.insert(sender, {
 | |
|       ServerId = sendingMember.VoiceClient.Player.Handle,
 | |
|       Name = sendingMember.VoiceClient.TeamSpeakName,
 | |
|       Position = sendingMember.VoiceClient.Player.GetPosition()
 | |
|     })
 | |
|   end
 | |
| 
 | |
|   VoiceManager.Instance:SetStateBagKey(State.SaltyChat_RadioChannelSender..":"..self.Name, sender)
 | |
| end
 | |
| 
 | |
| ---@param eventName string
 | |
| ---@param args any
 | |
| function RadioChannel:BroadcastEvent(eventName, args)
 | |
|   for _, member in pairs(self._members) do
 | |
|     ---@cast member RadioChannelMember
 | |
|     member.VoiceClient:TriggerEvent(eventName, args)
 | |
|   end
 | |
| end
 | |
| 
 | |
| ---@class RadioChannelMember
 | |
| ---@field RadioChannel RadioChannel
 | |
| ---@field VoiceClient VoiceClient
 | |
| ---@field IsPrimary boolean
 | |
| ---@field IsSending boolean
 | |
| RadioChannelMember = {}
 | |
| RadioChannelMember.__index = RadioChannelMember
 | |
| 
 | |
| ---@param radioChannel string
 | |
| ---@param voiceClient VoiceClient
 | |
| ---@param isPrimary boolean
 | |
| ---@return RadioChannelMember
 | |
| function RadioChannelMember.new(radioChannel, voiceClient, isPrimary)
 | |
|   local self = setmetatable({}, RadioChannelMember)
 | |
|   self.RadioChannel = radioChannel
 | |
|   self.VoiceClient = voiceClient
 | |
|   self.IsPrimary = isPrimary
 | |
|   return self
 | |
| end | 
