Skip to content

Instantly share code, notes, and snippets.

@warxander
Last active June 28, 2018 10:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save warxander/4ba4c735e594d81f858684809de779fa to your computer and use it in GitHub Desktop.
Save warxander/4ba4c735e594d81f858684809de779fa to your computer and use it in GitHub Desktop.
FiveM Lua Scaleform Module
-- https://scaleform.devtesting.pizza/
Scaleform = { }
Scaleform.__index = Scaleform
local function scaleform_is_valid(scaleform)
if not scaleform or scaleform == 0 then
Citizen.Trace('Invalid scaleform parameter: '..tostring(scaleform))
return false
end
return true
end
local function scaleform_has_loaded(scaleform)
if not scaleform or not HasScaleformMovieLoaded(scaleform) then
Citizen.Trace('Using not loaded scaleform: '..tostring(scaleform))
return false
end
return true
end
local function scaleform_is_int(number)
return type(number) == "number" and not string.find(number, '%.')
end
local function scaleform_render_timed(scaleform, time, renderFunc, ...)
if not scaleform_is_valid(scaleform.scaleform) then return end
local startTime = GetGameTimer()
local transOutTime = 500
while GetTimeDifference(GetGameTimer(), startTime) < time + transOutTime do
Citizen.Wait(0)
if GetGameTimer() - startTime > time then
scaleform:Call('SHARD_ANIM_OUT', 1, 0.33)
startTime = startTime + transOutTime
while GetGameTimer() - startTime < time + transOutTime do
Citizen.Wait(0)
renderFunc(scaleform, ...)
end
break
end
renderFunc(scaleform, ...)
end
end
function Scaleform:Request(id)
if type(id) ~= "string" then
Citizen.Trace('Unable to request id: '..tostring(id))
return nil
end
local object = { }
setmetatable(object, Scaleform)
object.scaleform = RequestScaleformMovie(id)
if not scaleform_is_valid(object.scaleform) then return nil end
while not HasScaleformMovieLoaded(object.scaleform) do Citizen.Wait(0) end
return object
end
function Scaleform:Delete()
if not scaleform_is_valid(self.scaleform) then return end
if not scaleform_has_loaded(self.scaleform) then return end
SetScaleformMovieAsNoLongerNeeded(self.scaleform)
self.scaleform = nil
end
function Scaleform:Call(func, ...)
if not scaleform_is_valid(self.scaleform) then return end
if type(func) ~= "string" then
Citizen.Trace('Unable to call scaleform func: '..tostring(func))
return
end
PushScaleformMovieFunction(self.scaleform, func)
local params = { ... }
for _, param in ipairs(params) do
local paramType = type(param)
if paramType == 'string' then
PushScaleformMovieFunctionParameterString(param)
elseif paramType == 'number' then
if scaleform_is_int(param) then
PushScaleformMovieFunctionParameterInt(param)
else
PushScaleformMovieFunctionParameterFloat(param)
end
elseif paramType == 'boolean' then
PushScaleformMovieFunctionParameterBool(param)
else
Citizen.Trace('Unknown parameter type for scaleform '..tostring(self.scaleform)..': '..tostring(paramType))
return
end
end
PopScaleformMovieFunctionVoid()
end
function Scaleform:Render(x, y, w, h, r, g, b, a)
if not scaleform_is_valid(self.scaleform) then return end
DrawScaleformMovie(self.scaleform, x, y, w, h, r or 255, g or 255, b or 255, a or 255)
end
function Scaleform:RenderFullscreen(r, g, b, a)
if not scaleform_is_valid(self.scaleform) then return end
DrawScaleformMovieFullscreen(self.scaleform, r or 255, g or 255, b or 255, a or 255)
end
function Scaleform:RenderTimed(time, x, y, w, h, r, g, b, a)
scaleform_render_timed(self, time, self.Render, x, y, w, h, r, g, b, a)
end
function Scaleform:RenderFullscreenTimed(time, r, g, b, a)
scaleform_render_timed(self, time, self.RenderFullscreen, r, g, b, a)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment