forked from Simnation/Main
232 lines
5.9 KiB
Lua
232 lines
5.9 KiB
Lua
--[[
|
|
https://github.com/overextended/ox_lib
|
|
|
|
This file is licensed under LGPL-3.0 or higher <https://www.gnu.org/licenses/lgpl-3.0.en.html>
|
|
|
|
Copyright © 2025 Linden <https://github.com/thelindat>
|
|
]]
|
|
|
|
---@class renderTargetTable
|
|
---@field name string
|
|
---@field model string | number
|
|
|
|
---@class detailsTable
|
|
---@field name string
|
|
---@field fullScreen? boolean
|
|
---@field x? number
|
|
---@field y? number
|
|
---@field width? number
|
|
---@field height? number
|
|
---@field renderTarget? renderTargetTable
|
|
|
|
---@class Scaleform : OxClass
|
|
---@field scaleform number
|
|
---@field draw boolean
|
|
---@field target number
|
|
---@field targetName string
|
|
---@field sfHandle? number
|
|
---@field fullScreen boolean
|
|
---@field private private { isDrawing: boolean }
|
|
lib.scaleform = lib.class('Scaleform')
|
|
|
|
--- Converts the arguments into data types usable by scaleform
|
|
---@param argsTable (number | string | boolean)[]
|
|
local function convertArgs(argsTable)
|
|
for i = 1, #argsTable do
|
|
local arg = argsTable[i]
|
|
local argType = type(arg)
|
|
|
|
if argType == 'string' then
|
|
ScaleformMovieMethodAddParamPlayerNameString(arg)
|
|
elseif argType == 'number' then
|
|
if math.type(arg) == 'integer' then
|
|
ScaleformMovieMethodAddParamInt(arg)
|
|
else
|
|
ScaleformMovieMethodAddParamFloat(arg)
|
|
end
|
|
elseif argType == 'boolean' then
|
|
ScaleformMovieMethodAddParamBool(arg)
|
|
else
|
|
error(('Unsupported Parameter type [%s]'):format(argType))
|
|
end
|
|
end
|
|
end
|
|
|
|
---@param expectedType 'boolean' | 'integer' | 'string'
|
|
---@return boolean | integer | string
|
|
local function retrieveReturnValue(expectedType)
|
|
local result = EndScaleformMovieMethodReturnValue()
|
|
|
|
lib.waitFor(function()
|
|
if IsScaleformMovieMethodReturnValueReady(result) then
|
|
return true
|
|
end
|
|
end, "Failed to retrieve return value", 1000)
|
|
|
|
if expectedType == "integer" then
|
|
return GetScaleformMovieMethodReturnValueInt(result)
|
|
elseif expectedType == "boolean" then
|
|
return GetScaleformMovieMethodReturnValueBool(result)
|
|
else
|
|
return GetScaleformMovieMethodReturnValueString(result)
|
|
end
|
|
end
|
|
|
|
---@param details detailsTable | string
|
|
---@return nil
|
|
function lib.scaleform:constructor(details)
|
|
details = type(details) == 'table' and details or { name = details }
|
|
|
|
local scaleform = lib.requestScaleformMovie(details.name)
|
|
|
|
self.sfHandle = scaleform
|
|
self.private.isDrawing = false
|
|
|
|
self.fullScreen = details.fullScreen or false
|
|
self.x = details.x or 0
|
|
self.y = details.y or 0
|
|
self.width = details.width or 0
|
|
self.height = details.height or 0
|
|
|
|
if details.renderTarget then
|
|
self:setRenderTarget(details.renderTarget.name, details.renderTarget.model)
|
|
end
|
|
end
|
|
|
|
---@param name string
|
|
---@param args? (number | string | boolean)[]
|
|
---@param returnValue? string
|
|
---@return any
|
|
function lib.scaleform:callMethod(name, args, returnValue)
|
|
if not self.sfHandle then
|
|
return error("attempted to call method with invalid scaleform handle")
|
|
end
|
|
|
|
BeginScaleformMovieMethod(self.sfHandle, name)
|
|
|
|
if args and type(args) == 'table' then
|
|
convertArgs(args)
|
|
end
|
|
|
|
if returnValue then
|
|
return retrieveReturnValue(returnValue)
|
|
end
|
|
|
|
EndScaleformMovieMethod()
|
|
end
|
|
|
|
---@param isFullscreen boolean
|
|
---@return nil
|
|
function lib.scaleform:setFullScreen(isFullscreen)
|
|
self.fullScreen = isFullscreen
|
|
end
|
|
|
|
---@param x number
|
|
---@param y number
|
|
---@param width number
|
|
---@param height number
|
|
---@return nil
|
|
function lib.scaleform:setProperties(x, y, width, height)
|
|
if self.fullScreen then
|
|
lib.print.info('Cannot set properties when full screen is enabled')
|
|
return
|
|
end
|
|
|
|
self.x = x
|
|
self.y = y
|
|
self.width = width
|
|
self.height = height
|
|
end
|
|
|
|
---@param name string
|
|
---@param model string|number
|
|
---@return nil
|
|
function lib.scaleform:setRenderTarget(name, model)
|
|
if self.target then
|
|
ReleaseNamedRendertarget(self.targetName)
|
|
end
|
|
|
|
if type(model) == 'string' then
|
|
model = joaat(model)
|
|
end
|
|
|
|
if not IsNamedRendertargetRegistered(name) then
|
|
RegisterNamedRendertarget(name, false)
|
|
|
|
if not IsNamedRendertargetLinked(model) then
|
|
LinkNamedRendertarget(model)
|
|
end
|
|
|
|
self.target = GetNamedRendertargetRenderId(name)
|
|
self.targetName = name
|
|
end
|
|
end
|
|
|
|
function lib.scaleform:isDrawing()
|
|
return self.private.isDrawing
|
|
end
|
|
|
|
function lib.scaleform:draw()
|
|
if self.target then
|
|
SetTextRenderId(self.target)
|
|
SetScriptGfxDrawOrder(4)
|
|
SetScriptGfxDrawBehindPausemenu(true)
|
|
SetScaleformFitRendertarget(self.sfHandle, true)
|
|
end
|
|
|
|
if self.fullScreen then
|
|
DrawScaleformMovieFullscreen(self.sfHandle, 255, 255, 255, 255, 0)
|
|
else
|
|
if not self.x or not self.y or not self.width or not self.height then
|
|
error('attempted to draw scaleform without setting properties')
|
|
else
|
|
DrawScaleformMovie(self.sfHandle, self.x, self.y, self.width, self.height, 255, 255, 255, 255, 0)
|
|
end
|
|
end
|
|
|
|
if self.target then
|
|
SetTextRenderId(1)
|
|
end
|
|
end
|
|
|
|
function lib.scaleform:startDrawing()
|
|
if self.private.isDrawing then
|
|
return
|
|
end
|
|
|
|
self.private.isDrawing = true
|
|
|
|
CreateThread(function()
|
|
while self:isDrawing() do
|
|
self:draw()
|
|
Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
---@return nil
|
|
function lib.scaleform:stopDrawing()
|
|
if not self.private.isDrawing then
|
|
return
|
|
end
|
|
|
|
self.private.isDrawing = false
|
|
end
|
|
|
|
---@return nil
|
|
function lib.scaleform:dispose()
|
|
if self.sfHandle then
|
|
SetScaleformMovieAsNoLongerNeeded(self.sfHandle)
|
|
end
|
|
|
|
if self.target then
|
|
ReleaseNamedRendertarget(self.targetName)
|
|
end
|
|
|
|
self.sfHandle = nil
|
|
self.target = nil
|
|
self.private.isDrawing = false
|
|
end
|
|
|
|
---@return Scaleform
|
|
return lib.scaleform
|