379 lines
9.4 KiB
Lua
379 lines
9.4 KiB
Lua
|
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)
|