mirror of
https://github.com/Michatec/ptelevision.git
synced 2026-04-01 16:06:29 +02:00
230 lines
7.1 KiB
Lua
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)
|
|
|