Jump to content

Freeroam GUI fading out.


Karuzo

Recommended Posts

OOP is an acronym of Object Oriented Programming, wich is a programming paradigm and not a language. Freeroam was also written in lua as every other scripts. It has a kind of gui "engine" wich builds the windows from the data given in a table. You have to add te abillity to fad in/out windows to this engine to make what you want (gui.lua file).

Link to comment

Hi, so i have found this example in the wiki :

function guiFade( gui, state ) 
    if state == "in" then -- This state will fade IN the GUI 
    fadeIn = setTimer(guiFade, 50, 1, gui, state) -- We loop the function to make it lower the alpha each 50 ms 
    alpha = guiGetAlpha(gui) -- We get the GUI's actual alpha after each loop 
    guiSetAlpha(gui, alpha - 0.1) -- We set the GUI's actual alpha after each loop 
    if alpha == 0 then -- If the loop reached "0"... 
        guiSetVisible(gui, false) -- We set the GUI visibility to 0 so it won't be clickable or editable 
        killTimer(fadeIn) -- ... We kill the timer 
        fadeIn = nil -- And to make sure it doesn't exist anymore, we set it to nil 
        end 
    elseif state == "out" then -- This state will fade OUT the GUI 
        guiSetVisible(gui, true) -- Since the GUI will still be click-able, we'll set it's visibility to "false" 
        fadeOut = setTimer(guiFade, 50, 1, gui, state) -- We loop the function to make it higher the alpha each 50 ms 
        alpha = guiGetAlpha(gui) -- We get the GUI's actual alpha after each loop 
        guiSetAlpha(gui, alpha + 0.1) -- We set the GUI's actual alpha after each loop 
        if alpha == 1 then -- If the loop reached "1"... 
            killTimer(fadeOut) -- ... We kill the timer 
            fadeOut = nil -- And to make sure it doesn't exist anymore, we set it to nil 
        end 
    end 
end 

but i dont know the main window from freeroam, i just don't understand the structure of the freeroam gui ....

Link to comment

Replace your gui.lua content with this one:

g_gridListContents = {}   -- info about binded gridlists 
g_openedWindows = {}      -- {window1table = true, window2table = true, ...}
 
GRIDLIST_UPDATE_CHUNK_SIZE = 10
 
classInfo = {
    wnd = {className = 'Window', padding = {25, 10, 10, 10}, isContainer = true},
    tbp = {className = 'TabPanel'},
    tab = {className = 'Tab', padding = 10, isContainer = true},
    lbl = {className = 'Label', height = 20},
    btn = {className = 'Button', height = 20, padding = {0, 4}},
    chk = {className = 'CheckBox', height = 20, padding = {0, 6}},
    rad = {className = 'RadioButton', height = 20, padding = {0, 10}},
    txt = {className = 'Edit', width=100, height = 24},
    lst = {className = 'GridList', width = 250, height = 400},
    img = {className = 'StaticImage'}
}
 
function getTextWidth(text)
    return 8*text:len()
end
 
function createWindow(wnd, rebuild)
    if wnd.element then
        if rebuild then
            destroyElement(wnd.element)
        else
            guiSetVisible(wnd.element, true)
            guiBringToFront(wnd.element)
            g_openedWindows[wnd] = true
            if wnd.oncreate then
                wnd.oncreate()
            end
            return
        end
    end
   
    _planWindow(wnd)
    _buildWindow(wnd)
end
 
function _planWindow(wnd, baseWnd, parentWnd, x, y, maxHeightInLine)
    -- simulate building a window to get the proper height
    local wndClass = wnd[1]
   
    if not maxHeightInLine then
        maxHeightInLine = LINE_HEIGHT
    end
   
    local text, padding, parentPadding
    if wndClass ~= 'br' then
        padding = classInfo[wndClass].padding
        if type(padding) == 'number' then
            padding = table.rep(padding, 4)
            classInfo[wndClass].padding = padding
        elseif type(padding) == 'table' then
            if #padding == 1 then
                padding = table.rep(padding[1], 4)
                classInfo[wndClass].padding = padding
            elseif #padding == 2 then
                padding = table.flatten(table.rep(padding, 2))
                classInfo[wndClass].padding = padding
            elseif #padding == 3 then
                table.insert(padding, padding[2])
                classInfo[wndClass].padding = padding
            end
        elseif not padding then
            padding = table.rep(0, 4)
            classInfo[wndClass].padding = padding
        end
       
        text = wnd.text or wnd.id or ''
        if not wnd.width then
            wnd.width = (classInfo[wndClass].width or getTextWidth(text)) +
                (not classInfo[wndClass].isContainer and (padding[2] + padding[4]) or 0)
        end
        if not wnd.height and not classInfo[wndClass].isContainer then
            wnd.height = (classInfo[wndClass].height or LINE_HEIGHT) + padding[1] + padding[3]
        end
    end
    parentPadding = parentWnd and classInfo[parentWnd[1]].padding
   
    if wndClass == 'br' or (not classInfo[wndClass].isContainer and x + wnd.width > parentWnd.width - parentPadding[2]) then
        -- line wrap
        x = parentPadding[4]
        y = y + maxHeightInLine + LINE_MARGIN
 
        maxHeightInLine = LINE_HEIGHT
        if wndClass == 'br' then
            return nil, x, y, maxHeightInLine
        end
    end
    if not wnd.x then
        wnd.x = x
    end
    if not wnd.y then
        wnd.y = y
    end
    wnd.parent = parentWnd
   
    if wnd.controls then
        local childX, childY = padding[4], padding[1]
        local childMaxHeightInLine = LINE_HEIGHT
        local control
        for id, controlwnd in pairs(wnd.controls) do
            control, childX, childY, childMaxHeightInLine = _planWindow(controlwnd, baseWnd or wnd, wnd, childX, childY, childMaxHeightInLine)
        end
        if classInfo[wndClass].isContainer then
            wnd.height = childY + childMaxHeightInLine + padding[3]
        end
    end
   
    if wnd.tabs then
        local maxTabHeight = 0
        for id, tab in pairs(wnd.tabs) do
            tab[1] = 'tab'
            tab.width = wnd.width
            _planWindow(tab, baseWnd, wnd)
            if tab.height > maxTabHeight then
                maxTabHeight = tab.height
            end
        end
        wnd.height = maxTabHeight
    end
   
    if classInfo[wndClass].isContainer then
        return elem
    else
        if wnd.height > maxHeightInLine then
            maxHeightInLine = wnd.height
        end
        return elem, x + wnd.width + CONTROL_MARGIN_RIGHT, y, maxHeightInLine
    end
end
 
function _buildWindow(wnd, baseWnd, parentWnd)
    local wndClass = wnd[1]
    if wndClass == 'br' then
        return
    end
   
    local relX, relY, relWidth, relHeight
    if parentWnd then
        if wnd.x and wnd.y then
            relX = wnd.x/parentWnd.width
            relY = wnd.y/parentWnd.height
        end
        relWidth = wnd.width / parentWnd.width
        relHeight = wnd.height / parentWnd.height
    end
   
    local elem
    if wndClass == 'wnd' then
        local screenWidth, screenHeight = guiGetScreenSize()
        if not wnd.x then
            wnd.x = screenWidth/2 - wnd.width/2
        else
            local i, f = math.modf(wnd.x)
            if f ~= 0 then
                wnd.x = screenWidth * wnd.x
            end
            if wnd.x < 0 then
                wnd.x = screenWidth - math.abs(wnd.x) - wnd.width
            end
        end
        if not wnd.y then
            wnd.y = screenHeight/2 - wnd.height/2
        else
            local i, f = math.modf(wnd.y)
            if f ~= 0 then
                wnd.y = screenHeight * wnd.y
            end
            if wnd.y < 0 then
                wnd.y = screenHeight - math.abs(wnd.y) - wnd.height
            end
        end
        elem = guiCreateWindow(wnd.x, wnd.y, wnd.width, wnd.height, wnd.text, false)
        guiWindowSetSizable(elem, false)
        guiBringToFront(elem)
        g_openedWindows[wnd] = true
    elseif wndClass == 'chk' then
        elem = guiCreateCheckBox(relX, relY, relWidth, relHeight, wnd.text or wnd.id or '', false, true, parentWnd.element)
    elseif wndClass == 'tbp' then
        elem = guiCreateTabPanel(relX, relY, relWidth, relHeight, true, parentWnd.element)
    elseif wndClass == 'tab' then
        elem = guiCreateTab(text, parentWnd.element)
    elseif wndClass == 'lst' then
        elem = guiCreateGridList(relX, relY, relWidth, relHeight, true, parentWnd.element)
        if wnd.columns then
            for i, column in ipairs(wnd.columns) do
                guiGridListAddColumn(elem, column.text or column.attr or '', column.width or 0.9)
            end
        end
    elseif wndClass == 'img' then
        elem = guiCreateStaticImage(relX, relY, relWidth, relHeight, wnd.src or '', true, parentWnd.element)
    else
        elem = _G['guiCreate' .. classInfo[wndClass].className](relX, relY, relWidth, relHeight, wnd.text or wnd.id or '', true, parentWnd.element)
        if wnd.align and wndClass == 'lbl' then
            guiLabelSetHorizontalAlign(elem, wnd.align, true)
        end
    end
    wnd.element = elem
   
    if wnd.controls then
        for id, controlwnd in pairs(wnd.controls) do
            _buildWindow(controlwnd, baseWnd or wnd, wnd)
        end
    end
 
    if wnd.tabs then
        for id, tab in pairs(wnd.tabs) do
            _buildWindow(tab, baseWnd, wnd)
        end
    end
   
    if wnd.rows then
        if wnd.rows.xml then
            -- get rows from xml
            bindGridListToTable(wnd, not gridListHasCache(wnd) and xmlToTable(wnd.rows.xml, wnd.rows.attrs) or false,
                wnd.expandlastlevel or wnd.expandlastlevel == nil)
        else
            -- rows hardcoded in window definition
            bindGridListToTable(wnd, not gridListHasCache(wnd) and wnd.rows or false, false)
        end
    end
   
    local clickhandler = nil
    if wnd.onclick then
        if wndClass == 'img' then
            clickhandler = function(btn, state, x, y)
                local imgX, imgY = getControlScreenPos(wnd)
                wnd.onclick((x - imgX)/wnd.width, (y - imgY)/wnd.height, btn)
            end
        else
            clickhandler = function() wnd.onclick() end
        end
    elseif wnd.window then
        clickhandler = function() toggleWindow(wnd.window) end
    elseif wnd.inputbox then
        clickhandler = function()
            wndInput = {
                'wnd',
                width = 170,
                height = 60,
                controls = {
                    {'txt', id='input', text='', width=60},
                    {'btn', id='ok', onclick=function() wnd.inputbox.callback(getControlText(wndInput, 'input')) closeWindow(wndInput) end},
                    {'btn', id='cancel', closeswindow=true}
                }
            }
            for propname, propval in
Link to comment

Yes, I just noticed that function you posted doesn't use boolean ( true and false ), but string "in" and "out".

Copy my code again and also replace this part in fr_client.lua:

addEventHandler('onClientResourceStart', g_ResRoot, 
    function() 
        fadeCamera(true) 
        setTimer(getPlayers, 1000, 1) 
         
        bindKey('f1', 'down', toggleFRWindow) 
        createWindow(wndMain) 
        guiSetAlpha(wndMain.element, 1) 
        guiLabelSetColor(getControl(wndMain, "xpos"), 0, 255, 0) 
        guiLabelSetColor(getControl(wndMain, "ypos"), 0, 255, 0) 
        guiLabelSetColor(getControl(wndMain, "zpos"), 0, 255, 0) 
        hideAllWindows(false) 
        guiCheckBoxSetSelected(getControl(wndMain, 'jetpack'), doesPedHaveJetPack(g_Me)) 
        guiCheckBoxSetSelected(getControl(wndMain, 'falloff'), canPedBeKnockedOffBike(g_Me)) 
        setJetpackMaxHeight ( 9001 ) 
        triggerServerEvent('onLoadedAtClient', g_ResRoot, g_Me)      
    end 
) 

With:

addEventHandler('onClientResourceStart', g_ResRoot, 
    function() 
        fadeCamera(true) 
        setTimer(getPlayers, 1000, 1) 
         
        bindKey('f1', 'down', toggleFRWindow) 
        createWindow(wndMain) 
        guiSetAlpha(wndMain.element, 1) 
        guiLabelSetColor(getControl(wndMain, "xpos"), 0, 255, 0) 
        guiLabelSetColor(getControl(wndMain, "ypos"), 0, 255, 0) 
        guiLabelSetColor(getControl(wndMain, "zpos"), 0, 255, 0) 
        hideAllWindows(false) 
        guiCheckBoxSetSelected(getControl(wndMain, 'jetpack'), doesPedHaveJetPack(g_Me)) 
        guiCheckBoxSetSelected(getControl(wndMain, 'falloff'), canPedBeKnockedOffBike(g_Me)) 
        setJetpackMaxHeight ( 9001 ) 
        triggerServerEvent('onLoadedAtClient', g_ResRoot, g_Me)      
    end 
) 

Edit: Hold on, I just tested the script and it doesn't work, I'll check what's wrong and reply.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...