mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
222 lines
5.4 KiB
Lua
222 lines
5.4 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
local ix = ix
|
|
|
|
ix.radio = ix.radio or {}
|
|
ix.radio.channels = ix.radio.channels or {}
|
|
|
|
ix.radio.types = {}
|
|
ix.radio.types.whisper = 1
|
|
ix.radio.types.talk = 2
|
|
ix.radio.types.yell = 3
|
|
ix.radio.types.scream = 4
|
|
|
|
local ipairs = ipairs
|
|
local istable = istable
|
|
local table = table
|
|
|
|
function ix.radio:RegisterChannel(uniqueID, data)
|
|
if (self.channels[uniqueID]) then
|
|
return
|
|
end
|
|
|
|
if (!istable(data)) then
|
|
ErrorNoHalt("[Radio] Tentative d'enregistrement de la chaîne \"" .. uniqueID .. "\" avec des données invalides.")
|
|
return
|
|
end
|
|
|
|
data.uniqueID = uniqueID
|
|
data.name = data.name or uniqueID
|
|
|
|
if (!data.color) then
|
|
data.color = Color(96, 179, 0, 255)
|
|
end
|
|
|
|
data.listeners = {}
|
|
data.listenersByKeys = {}
|
|
data.stationaries = {}
|
|
|
|
data.priority = data.priority or 0
|
|
|
|
if (data.icon and isstring(data.icon)) then
|
|
data.icon = ix.util.GetMaterial(data.icon)
|
|
end
|
|
|
|
self.channels[uniqueID] = data
|
|
|
|
if (data.shortcutCommand) then
|
|
local sc = data.shortcutCommand
|
|
local a = string.sub(sc, 1, 1)
|
|
ix.command.Add(sc.."Radio", {
|
|
alias = {a, data.alias},
|
|
arguments = ix.type.text,
|
|
OnCheckAccess = function(_, client)
|
|
return client:GetCharacter() and ix.radio:CharacterHasChannel(client:GetCharacter(), uniqueID)
|
|
end,
|
|
OnRun = function(_, client, text)
|
|
return ix.radio:SayOnRadio(client, text, ix.radio.types.talk, uniqueID)
|
|
end
|
|
})
|
|
|
|
ix.command.Add(sc.."Whisper", {
|
|
alias = {a.."W", (data.alias or a).."W"},
|
|
arguments = ix.type.text,
|
|
OnCheckAccess = function(_, client)
|
|
return client:GetCharacter() and ix.radio:CharacterHasChannel(client:GetCharacter(), uniqueID)
|
|
end,
|
|
OnRun = function(_, client, text)
|
|
return ix.radio:SayOnRadio(client, text, ix.radio.types.whisper, uniqueID)
|
|
end,
|
|
})
|
|
|
|
ix.command.Add(sc.."Yell", {
|
|
alias = {a.."Y", (data.alias or a).."Y"},
|
|
arguments = ix.type.text,
|
|
OnCheckAccess = function(_, client)
|
|
return client:GetCharacter() and ix.radio:CharacterHasChannel(client:GetCharacter(), uniqueID)
|
|
end,
|
|
OnRun = function(_, client, text)
|
|
return ix.radio:SayOnRadio(client, text, ix.radio.types.yell, uniqueID)
|
|
end,
|
|
})
|
|
end
|
|
|
|
return data
|
|
end
|
|
|
|
function ix.radio:RemoveChannel(uniqueID)
|
|
self.channels[uniqueID] = nil
|
|
end
|
|
|
|
function ix.radio:FindByID(channelID)
|
|
if (!channelID or channelID == "") then return end
|
|
|
|
if (self.channels[channelID]) then
|
|
return self.channels[channelID]
|
|
else
|
|
local zone, channel, qt = string.match(channelID, "^freq_(%d)_(%d?%d)_(%d?%d)$")
|
|
if (zone and channel and qt) then
|
|
local qtText = zone == "1" and " QT" or " DQT"
|
|
self:RegisterChannel(channelID, {
|
|
name = zone.."-"..channel..qtText..qt,
|
|
icon = "willardnetworks/chat/radio_icon.png"
|
|
})
|
|
|
|
return self.channels[channelID]
|
|
end
|
|
|
|
local freq = string.match(channelID, "^freq_(%d%d)$")
|
|
if (freq and tonumber(freq) and tonumber(freq) >= 10) then
|
|
self:RegisterChannel(channelID, {
|
|
name = freq,
|
|
icon = "willardnetworks/chat/radio_icon.png",
|
|
backpackRadio = true
|
|
})
|
|
|
|
return self.channels[channelID]
|
|
end
|
|
end
|
|
end
|
|
|
|
function ix.radio.sortFunc(a, b)
|
|
a, b = ix.radio:FindByID(a), ix.radio:FindByID(b)
|
|
if (!a) then
|
|
return false
|
|
elseif (!b) then
|
|
return true
|
|
elseif (a.priority != b.priority) then
|
|
return a.priority > b.priority
|
|
else
|
|
return a.name < b.name
|
|
end
|
|
end
|
|
|
|
function ix.radio:GetAllChannelsFromChar(character)
|
|
local channels = table.Copy(character:GetRadioChannels())
|
|
|
|
local inventory = character:GetInventory()
|
|
local items = inventory:GetItems()
|
|
for _, item in pairs(items) do
|
|
if (item.isRadio) then
|
|
if (item.GetChannels) then
|
|
for _, v in ipairs(item:GetChannels()) do
|
|
channels[#channels + 1] = v
|
|
end
|
|
elseif (item.GetChannel and item:GetChannel()) then
|
|
channels[#channels + 1] = item:GetChannel()
|
|
end
|
|
end
|
|
end
|
|
|
|
local faction = ix.faction.indices[character:GetFaction()]
|
|
if (faction and istable(faction.radioChannels)) then
|
|
for _, channel in ipairs(faction.radioChannels) do
|
|
channels[#channels + 1] = channel
|
|
end
|
|
end
|
|
|
|
hook.Run("AdjustCharacterRadioChannels", character, channels)
|
|
|
|
local seen = {}
|
|
for i = #channels, 1, -1 do
|
|
if (seen[channels[i]]) then
|
|
table.remove(channels, i)
|
|
else
|
|
seen[channels[i]] = true
|
|
end
|
|
end
|
|
|
|
table.sort(channels, ix.radio.sortFunc)
|
|
return channels
|
|
end
|
|
|
|
function ix.radio:CharacterHasChannel(character, channelID)
|
|
local channel = self:FindByID(channelID)
|
|
if (!channel) then return false end
|
|
|
|
channelID = channel.uniqueID
|
|
|
|
local faction = ix.faction.indices[character:GetFaction()]
|
|
if (faction and istable(faction.radioChannels)) then
|
|
for _, chnlID in ipairs(faction.radioChannels) do
|
|
if (chnlID == channelID) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
local inventory = character:GetInventory()
|
|
local items = inventory:GetItems()
|
|
for _, item in pairs(items) do
|
|
if (item.isRadio) then
|
|
if (item.GetChannels) then
|
|
for _, v in ipairs(item:GetChannels()) do
|
|
if (v == channelID) then
|
|
return true
|
|
end
|
|
end
|
|
elseif (item:GetChannel() == channelID) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
local channels = character:GetRadioChannels()
|
|
for _, chnl in ipairs(channels) do
|
|
if (chnl == channelID) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return hook.Run("HasCharacterRadioChannel", character, channelID)
|
|
end
|