Files
wnsrc/gamemodes/helix/plugins/radio/libs/sh_radio.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

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