Jump to content

Freeroam GUI fading out.


Karuzo

Recommended Posts

Posted

Hi Guys,

i want to let the freeroam f1panel fading in and out, but i dont know how ..

i know i have to do it with the Alpha of the GUI but the freeroam Panel is written in OOP and not in LUA ( as much as i seen it. )

So have could i make this ?

Posted

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).

Owner of [HUN]Magyar Play Szerver 1.4, IP: 31.220.43.153:22003

Posted

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 ....

Posted

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

San Andreas Utopia RPG (SAUR) Owner & Developer.

560x95_FFFFFF_FF9900_000000_000000.png

Education is the most powerful weapon which you can use to change the world.

Posted

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.

San Andreas Utopia RPG (SAUR) Owner & Developer.

560x95_FFFFFF_FF9900_000000_000000.png

Education is the most powerful weapon which you can use to change the world.

Posted

Do you want the main GUI to fade or all of them?

San Andreas Utopia RPG (SAUR) Owner & Developer.

560x95_FFFFFF_FF9900_000000_000000.png

Education is the most powerful weapon which you can use to change the world.

Posted

You're welcome.

San Andreas Utopia RPG (SAUR) Owner & Developer.

560x95_FFFFFF_FF9900_000000_000000.png

Education is the most powerful weapon which you can use to change the world.

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...