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
 |