Scripts/resources/[standalone]/rprogress/client.lua

379 lines
9.4 KiB
Lua
Raw Normal View History

2024-12-29 20:02:43 +00:00
local OnStart, OnComplete, OnTimeout, Animation = nil, nil, nil, nil
local Run, MiniGameCompleted = false, false
------------------------------------------------------------
-- MAIN FUNCTIONS --
------------------------------------------------------------
function Start(text, duration, linear)
if type(text) ~= "string" then
PrintError("param 'text' must be type:string")
return
end
if tonumber(duration) == nil then
PrintError("param 'duration' must be type:number")
return
end
local options = MergeConfig(Config, {
display = true,
Duration = duration,
Label = text
})
if linear ~= nil then
options.Type = 'linear'
end
options.Async = false
options.MiniGame = false
-- CAN'T SEND FUNCTIONS TO NUI
options.onStart = nil
options.onComplete = nil
OnStart = nil
OnComplete = nil
SendNUIMessage(options)
Run = true
while Run do
DisableControls(options)
Wait(1)
end
end
function Custom(options, static)
local Controls = {
Mouse = Config.DisableControls.Mouse,
Player = Config.DisableControls.Player,
Vehicle = Config.DisableControls.Vehicle,
}
if options.DisableControls ~= nil then
Controls = options.DisableControls
end
-- MERGE USER OPTIONS
options = MergeConfig(Config, options)
options.DisableControls = MergeConfig(Config.DisableControls, Controls)
options.display = true
if options.ShowProgress == true then
options.ShowTimer = false
end
OnStart = options.onStart
OnComplete = options.onComplete
OnTimeout = options.onTimeout
Animation = nil
if options.Animation ~= nil then
Animation = options.Animation
end
-- CAN'T SEND FUNCTIONS TO NUI
options.onStart = nil
options.onComplete = nil
options.onTimeout = nil
-- Static Progress
if static == true then
return options
end
if options.MiniGame then
SetNuiFocus(true, true)
end
SendNUIMessage(options)
Run = true
PlayAnimation(options)
local cancelKey = Config.CancelKey
if options.cancelKey and tonumber(options.cancelKey) then
cancelKey = options.cancelKey
end
if options.Async == false then
while Run do
if IsControlJustPressed(0, cancelKey) and options.canCancel then
OnComplete(true)
TriggerEvent("rprogress:stop")
end
DisableControls(options)
Wait(1)
end
StopAnimation()
else
CreateThread(function()
while Run do
if IsControlJustPressed(0, cancelKey) and options.canCancel then
OnComplete(true)
TriggerEvent("rprogress:stop")
end
DisableControls(options)
Wait(0)
end
end)
end
end
function Linear(text, duration)
Start(text, duration, true)
end
function Stop()
SendNUIMessage({
stop = true
})
end
function Static(config)
local options = Custom(config, true)
options.display = false
options.static = true
SendNUIMessage(options)
return {
Show = function()
options.hide = false
options.show = true
options.progress = false
SendNUIMessage(options)
end,
SetProgress = function(progress)
options.hide = false
options.show = true
options.progress = tonumber(progress)
if options.progress < 0 then
options.progress = 0
elseif options.progress > 100 then
options.progress = 100
end
SendNUIMessage(options)
end,
Hide = function()
options.show = false
options.hide = true
options.progress = false
SendNUIMessage(options)
end,
Destroy = function()
options.show = false
options.hide = false
options.progress = false
options.destroy = true
SendNUIMessage(options)
end
}
end
function MiniGame(options)
if Run then return end
MiniGameCompleted = false
-- MERGE USER OPTIONS
options = MergeConfig(Config.MiniGameOptions, options)
if options.Zone == nil and options.Duration == nil then
local difficulty = "Easy"
if options.Difficulty ~= nil then
difficulty = options.Difficulty
end
options.Zone = Config.MiniGameOptions.Difficulty[difficulty].Zone
options.Duration = Config.MiniGameOptions.Difficulty[difficulty].Duration
end
options.Difficulty = nil
options.MiniGame = true
Custom(options)
if options.Timeout ~= nil and options.Timeout > 0 then
Citizen.SetTimeout(options.Timeout, function()
if OnTimeout ~= nil then
if not MiniGameCompleted then
Stop()
OnTimeout()
end
end
end)
end
end
function DisableControls(options)
if options.DisableControls.Mouse then
DisableControlAction(1, 1, true)
DisableControlAction(1, 2, true)
DisableControlAction(1, 106, true)
end
if options.DisableControls.Player then
DisableControlAction(0, 21, true)
DisableControlAction(0, 30, true)
DisableControlAction(0, 31, true)
DisableControlAction(0, 36, true)
end
if options.DisableControls.Vehicle then
DisableControlAction(0, 71, true)
DisableControlAction(0, 72, true)
DisableControlAction(0, 75, true)
end
end
-- Start the scenario / animation
function PlayAnimation()
if Animation ~= nil then
local player = PlayerPedId()
if DoesEntityExist(player) and not IsEntityDead(player) then
Citizen.CreateThread(function()
if Animation.scenario ~= nil then
TaskStartScenarioInPlace(player, Animation.scenario, 0, true)
else
if Animation.animationDictionary ~= nil and Animation.animationName ~= nil then
if Animation.flag == nil then
Animation.flag = 1
end
RequestAnimDict( Animation.animationDictionary )
while not HasAnimDictLoaded( Animation.animationDictionary ) do
Wait(1)
end
TaskPlayAnim( player, Animation.animationDictionary, Animation.animationName, 3.0, 1.0, -1, Animation.flag, 0, 0, 0, 0 )
end
end
end)
end
end
end
-- Stop the scenario / animation
function StopAnimation()
if Animation ~= nil then
local player = PlayerPedId()
if DoesEntityExist( player ) and not IsEntityDead( player ) then
if Animation.scenario ~= nil then
ClearPedTasks(player)
else
if Animation.animationDictionary ~= nil and Animation.animationName ~= nil then
StopAnimTask(player, Animation.animationDictionary, Animation.animationName, 1.0)
end
end
end
end
end
function Reset()
Run = false
SetNuiFocus(false, false)
end
Reset()
------------------------------------------------------------
-- NUI CALLBACKS --
------------------------------------------------------------
RegisterNUICallback('progress_start', function(data, cb)
if OnStart ~= nil then
OnStart()
end
cb('ok')
end)
RegisterNUICallback('progress_complete', function(data, cb)
Reset()
if OnComplete ~= nil then
OnComplete()
StopAnimation()
end
cb('ok')
end)
RegisterNUICallback('progress_stop', function(data, cb)
Reset()
StopAnimation()
cb('ok')
end)
RegisterNUICallback('progress_minigame_input', function(data, cb)
if not MiniGameCompleted then
if OnComplete ~= nil then
OnComplete(data.success == true)
end
StopAnimation()
MiniGameCompleted = true
end
cb('ok')
end)
RegisterNUICallback('progress_minigame_complete', function(data, cb)
Reset()
cb('ok')
end)
------------------------------------------------------------
-- EVENTS --
------------------------------------------------------------
RegisterNetEvent("rprogress:start")
RegisterNetEvent("rprogress:stop")
RegisterNetEvent("rprogress:custom")
RegisterNetEvent("rprogress:linear")
RegisterNetEvent("rprogress:minigame")
AddEventHandler("rprogress:start", Start)
AddEventHandler("rprogress:stop", Stop)
AddEventHandler("rprogress:custom", function(options)
options.Async = false
options.onStart = nil
options.onComplete = nil
Custom(options)
end)
AddEventHandler("rprogress:linear", Linear)
AddEventHandler("rprogress:minigame", MiniGame)
------------------------------------------------------------
-- EXPORTS --
------------------------------------------------------------
exports('Start', Start)
exports('Custom', Custom)
exports('Stop', Stop)
exports('Static', Static)
exports('Linear', Linear)
exports('MiniGame', MiniGame)