Files
ptelevision/client/tv.lua
2025-11-02 00:37:42 +01:00

230 lines
7.1 KiB
Lua

local TelevisionsLocal = {}
function SetChannel(index)
TriggerServerEvent("ptelevision:event", CURRENT_SCREEN, "ptv_status", {
type = "play",
channel = index,
})
end
function GetChannelList()
if not Channels then return {} end
local channel_list = {}
local menu_list = {}
local current = 1
local screen = CURRENT_SCREEN
local ent = screen.entity
local _, status = GetTelevision(screen.coords)
local channel = nil
if (status) then
channel = status.channel
end
for index,value in pairs(Channels) do
channel_list[#channel_list+1] = {index = index, url = value.url}
menu_list[#menu_list+1] = "Channel #" .. index .. " (".. value.name ..")"
if channel ~= nil and channel == index then
current = #channel_list
end
end
return {list = channel_list, display = menu_list, current = current}
end
function BroadcastMenu()
local _source = GetPlayerServerId(PlayerId())
for k,v in pairs(Channels) do
if (v.source == _source) then
TriggerServerEvent("ptelevision:broadcast", nil)
return
end
end
local input = lib.inputDialog('Live Broadcast', {'Channel Name:', 'Broadcast URL:'})
if (input[1] and input[2]) then
TriggerServerEvent("ptelevision:broadcast", {name = input[1], url = input[2]})
end
end
function WebBrowserMenu()
lib.hideMenu()
local input = lib.inputDialog('Web Browser', {'URL:'})
if input then
TriggerServerEvent("ptelevision:event", CURRENT_SCREEN, "ptv_status", {
type = "browser",
url = input[1]
})
end
Citizen.Wait(300)
OpenTVMenu()
end
function VideoMenu()
lib.hideMenu()
local input = lib.inputDialog('Video Player', {
{ type = 'input', label = 'Video URL' },
{ type = 'checkbox', label = 'Loop Video' },
{ type = 'checkbox', label = 'Show Video Controls' }
})
if input then
TriggerServerEvent("ptelevision:event", CURRENT_SCREEN, "ptv_status", {
type = "play",
url = input[1],
loop = input[2],
showControls = input[3]
})
end
Citizen.Wait(300)
OpenTVMenu()
end
function VolumeMenu()
lib.hideMenu()
local input = lib.inputDialog('Volume', {'Set Volume (0-100):'})
if (tonumber(input[1])) then
local coords = CURRENT_SCREEN.coords
SetVolume(coords, tonumber(input[1])/100)
end
Citizen.Wait(300)
OpenTVMenu()
end
function OpenTVMenu()
local screen = CURRENT_SCREEN
if not screen then return end
lib.hideMenu()
local ChannelList = GetChannelList()
lib.registerMenu({
id = 'ptelevision-menu',
title = 'Television',
position = 'top-right',
onSideScroll = function(selected, scrollIndex, args)
if (selected == 3) then
SetChannel(ChannelList.list[scrollIndex].index)
end
end,
options = {
{label = 'Videos', description = 'Play a video or stream on the screen.'},
{label = 'Web Browser', description = 'Access the web via your TV.'},
{label = 'TV Channels', values = ChannelList.display, description = 'Live TV Channels in San Andreas!', defaultIndex = ChannelList.current},
{label = 'Interact With Screen', description = 'Allows you to control on-screen elements.'},
{label = 'Set Volume', description = 'Sets your TV\'s volume (For yourself).'},
{label = 'Close Menu', close = true},
}
}, function(selected, scrollIndex, args)
if (selected == 1) then
VideoMenu()
elseif (selected == 2) then
WebBrowserMenu()
elseif (selected == 3) then
SetChannel(ChannelList.list[scrollIndex].index)
OpenTVMenu()
elseif selected == 4 then
SetInteractScreen(true)
elseif selected == 5 then
VolumeMenu()
end
end)
lib.showMenu('ptelevision-menu')
end
function PlayBrowser(data)
while not IsDuiAvailable(duiObj) do Wait(10) end
setDuiURL(data.url)
end
function PlayVideo(data)
while not IsDuiAvailable(duiObj) do Wait(10) end
if (getDuiURL() ~= DEFAULT_URL) then
waitForLoad = true
setDuiURL(DEFAULT_URL)
while waitForLoad do Wait(10) end
end
SendDuiMessage(duiObj, json.encode({
setVideo = true,
data = data
}))
end
function ResetDisplay()
setDuiURL(DEFAULT_URL)
end
function GetTelevisionLocal(coords)
for k,v in pairs(TelevisionsLocal) do
if #(v3(v.coords) - v3(coords)) < 0.01 then
return k, v
end
end
end
function SetTelevisionLocal(coords, key, value)
local index, data = GetTelevisionLocal(coords)
if (index ~= nil) then
if (TelevisionsLocal[index] == nil) then
TelevisionsLocal[index] = {}
end
TelevisionsLocal[index][key] = value
else
index = GetGameTimer()
while TelevisionsLocal[index] do
index = index + 1
Citizen.Wait(0)
end
if (TelevisionsLocal[index] == nil) then
TelevisionsLocal[index] = {}
end
TelevisionsLocal[index][key] = value
end
TelevisionsLocal[index].coords = coords
return index
end
RegisterNetEvent("ptelevision:event", function(data, index, key, value)
Televisions = data
local data = Televisions[index]
local screen = CURRENT_SCREEN
if (screen and #(v3(screen.coords) - v3(data.coords)) < 0.001) then
local index, data = GetTelevision(screen.coords)
if (index) then
local event = value
if (event.type == "play") then
local data = { url = event.url, loop = event.loop, showControls = event.showControls }
if (event.channel) then
data = Channels[event.channel]
data.channel = event.channel
end
PlayVideo(data)
elseif (event.type == "browser") then
PlayBrowser({ url = event.url })
end
end
end
SetTelevisionLocal(Televisions[index].coords, "start_time", GetGameTimer())
end)
RegisterNetEvent("ptelevision:broadcast", function(data, index)
Channels = data
if getDuiURL() == DEFAULT_URL then
local screen = CURRENT_SCREEN
local tvObj = screen.entity
local _, status = GetTelevision(screen.coords)
if (status and status.channel == index and data[index] == nil) then
ResetDisplay()
Citizen.Wait(10)
end
SendDuiMessage(duiObj, json.encode({
showNotification = true,
channel = index,
data = data[index]
}))
end
end)
RegisterCommand('tv', function()
OpenTVMenu()
end, false)
RegisterCommand('broadcast', function()
BroadcastMenu()
end, false)