Jump to content

[Aporte] Lua Compiler | v.Beta


Recommended Posts

hH4laaK.png

Este pequeño sistema de compilación de scripts en el juego, nos permite, gracias al uso de tablas dentro del código del mismo, compilar varios scritps a la vez, utilizando la API que nos ofrece la plataforma Multi Theft Auto para la compilación de nuestros scripts.

PacUeOw.png

El sistema cuenta solo con un comando simple, el cual puede ser utilizado tanto por el jugador dentro del juego (editando la línea 26, agregando nuestro nombre), como por la consola, que es el 'jugador' o 'elemento' que tiene permisos por defecto para usar el comando.

  • /compile [0 o 1]: Este comando comando nos permite iniciar la compilación de nuestros scripts, así también elegir entre 0 o 1 el Extra obfuscation, si queremos añadirlo a la compilación de nuestro script.

fjcchIU.png

Código server.lua server-side

tocompile = { "archivo_a_compilar.lua" } 
-- Los archivos a compilar se deben añadir en esta tabla con el orden indicado 
-- "archivo.lua", "archivo.lua"... 
  
function fileSave(filePath, fileContent) 
    if fileExists(filePath) then 
        fileDelete(filePath) 
    end 
    local file = fileCreate(filePath) 
    fileWrite(file, fileContent) 
    fileClose(file) 
end 
  
function fileLoad(filePath) 
    if fileExists(filePath) then 
        local file = fileOpen(filePath) 
        local fileContent = fileRead(file, fileGetSize(file)) 
        fileClose(file) 
        return fileContent 
    end 
end 
  
addCommandHandler( "compile", 
    function( player, _, obfuscate ) 
        if getPlayerName( player ) == "Console" then 
            if tonumber( obfuscate ) then 
                for i=1, #tocompile do 
                    local name = tocompile[ i ] 
                    local to = "luac_"..name 
                    if fetchRemote("https://luac.multitheftauto.com/?compile=1&debug=0&obfuscate="..obfuscate.."", function(data) fileSave(to, data) end, fileLoad(name), true) then 
                        outputDebugString( "Script "..name.." succefully compiled. Obfuscate: "..obfuscate )  
                    else 
                        outputDebugString( "Script "..name.." can not be found or compiled" ) 
                    end 
                end 
            else 
                outputDebugString( "Set an obfuscate numer (0 = nil, 1 = some)" ) 
            end 
        end 
    end 
) 

Código meta.xml

  
    

oIogPRU.png

Aviso: El script necesita permisos para el uso de fetchRemote. Utiliza aclrequest allow [nombre] all para darle todos los permisos. Uso del comando desde la consola.

Link to comment

Mvysi12.png

+ Retirado el comando y añadido un panel DX para la selección de scripts a compilar, con el banner del script incluido.

v7YWDV6.png

+ Añadido setting en el archivo meta.xml el cual nos permite cambiar el nombre del comando para el uso del sistema.

+ Comprobaciones de si el archivo existe o no en ambos lados del script. Tanto cliente como servidor.

+ Carpetas individuales en la estructura de archivos del script, que nos permite almacenar los archivos a compilar en una de las carpetas y archivos compilados en otra de las carpetas.

+ Checkbox que al seleccionarlo nos permita borrar el archivo de la carpeta tras su compilación, y, quedarnos con el script compilado.

+ Apartado size en la gridlist, indicando el tamaño que tiene el archivo mediante la función fileGetSize,

+ En caso de que el archivo en la tabla no exista, no se enviará a la gridlist lado cliente.

Link to comment
Es mejor tener un script que compile cualquier archivo .lua a .luac :v

Eso es lo que estoy intentando hacer. ¿Debo hacer un loop con getResources y getResourceScripts, ¿cierto?

Gracias @El_Zorro

No es necesario utilizar MTA, con un script BAT o SH se puede hacer mas simple sin sobrecargar MTA.

Si, bueno, eso es fácil también. Pero la idea para esto es que se haga dentro del juego con un panel :roll::lol:

Link to comment

hH4laaK.png

UJLS2tw.png

Esta nueva versión del script Lua Compiler añade un simple panel en el juego con el cual podremos empezar a compilar nuestros archivos de una forma más compacta y simple. Lo único que deberemos hacer para cargar nuestros archivos es añadirlos a la carpeta tocompile y en la tabla tocompile dentro del juego, así:

local tocompile = { "archivo.lua", "archivo.lua"... } 

En el panel se añade posibilidad de eliminar el archivo original en caso de que queramos, marcando una simple checkbox, hará que el archivo original se elimine completamente de la carpeta tocompile. Los archivos que se cargan en la gui serán solamente los existentes. En caso de que no haya un archivo existente en la carpeta o en la tabla, no se leerá.

oIogPRU.png

fjcchIU.png

Código server.lua

local tocompile = { "archivo.lua" } -- Archivos de la carpeta tocompile 
local command = get( 'command' ) 
  
function fileSave(filePath, fileContent) 
    if fileExists(filePath) then 
        fileDelete(filePath) 
    end 
    local file = fileCreate(filePath) 
    fileWrite(file, fileContent) 
    fileClose(file) 
end 
  
function fileLoad(filePath) 
    if fileExists(filePath) then 
        local file = fileOpen(filePath) 
        local fileContent = fileRead(file, fileGetSize(file)) 
        fileClose(file) 
        return fileContent 
    end 
end 
  
function compileScript( script, borrar ) 
    local borrar = tonumber( borrar ) 
    if script and borrar then 
        local name = tostring( script ) 
        local to = "luac_"..name 
        if fileExists( ":compiler/tocompile/"..name ) then 
            if borrar == 1 then 
                local r = fileDelete( ":compiler/tocompile/"..name ) 
                if r then 
                    outputChatBox( "#FFFFFFFile #00ff00"..name.." #FFFFFFsuccefully #800000deleted #fffffffrom the script", source, 255, 255, 255, true ) 
                end 
            end      
            if not ( fileExists( ":compiler/compiled/"..to ) ) then 
                local result = fetchRemote("https://luac.multitheftauto.com/?compile=1&debug=0&obfuscate=1", function(data) fileSave(":compiler/compiled/"..to, data) end, fileLoad(name), true) 
                if result then 
                    outputChatBox( "#FFFFFFFile #00ff00"..name.." #FFFFFFsuccefully compiled. New file: #00ff00"..to.."", source, 255, 255, 255, true ) 
                    outputDebugString( "File "..name.." succefully compiled. New file: "..to.."" ) 
                else 
                    outputDebugString( "File "..name.." can not be compiled" ) 
                    outputChatBox( "#ffffff[#800000Compiler v.1.0#ffffff] File #00ff00"..name.." #ffffffcan not be compiled." ) 
                end 
            else 
                outputChatBox( "#FFFFFFFile #00ff00"..name.." #FFFFFFexists and its #800000compiled#ffffff, look inside #00ff00compiled #FFFFFFfolder", source, 255, 255, 255, true ) 
                showCursor( source, false ) 
            end 
        else 
            outputDebugString( "File "..name.." does not exists" ) 
            outputChatBox( "[Compiler v.1.0] File "..name.." does not exists." ) 
        end 
    end 
    return false 
end 
addEvent( "compiler:compile", true ) 
addEventHandler( "compiler:compile", getRootElement( ), compileScript ) 
  
addCommandHandler( command, 
    function( player ) 
        if #tocompile > 0 then 
            local enviar_tabla = { } 
            for i=1, #tocompile do 
                local name = tocompile[i]    
                if fileExists( ":compiler/tocompile/"..name ) then 
                    local file = fileOpen( ":compiler/tocompile/"..name ) 
                    local size = fileGetSize( file ) 
                    table.insert( enviar_tabla, { name = name, size = size } ) 
                    fileClose( file ) 
                end 
            end 
            triggerClientEvent( player, "compiler:opengui", player, enviar_tabla ) 
            enviar_tabla = { } 
        else 
            outputChatBox( "[Compiler v.1.0] There are not files to compile." ) 
        end 
    end 
) 

Código client.lua

local sx, sy = guiGetScreenSize( ) 
local sourceX, sourceY = 1366, 768 
local open 
  
function isMouseInPosition ( x, y, width, height ) 
    if ( not isCursorShowing ( ) ) then 
        return false 
    end 
  
    local sx, sy = guiGetScreenSize ( ) 
    local cx, cy = getCursorPosition ( ) 
    local cx, cy = ( cx * sx ), ( cy * sy ) 
    if ( cx >= x and cx <= x + width ) and ( cy >= y and cy <= y + height ) then 
        return true 
    else 
        return false 
    end 
end 
  
function createGUIElements( ) 
    checkbox_delete = guiCreateCheckBox( (743/sourceX)*sx, (592/sourceY)*sy, (22/sourceX)*sx, (15/sourceY)*sy, "", true, false)   
    resources_gridlist = guiCreateGridList( (748/sourceX)*sx, (302/sourceY)*sy, (246/sourceX)*sx, (285/sourceY)*sy, false) 
    guiGridListAddColumn(resources_gridlist, "File", 0.5) 
    guiGridListAddColumn(resources_gridlist, "Size", 0.5)     
    addEventHandler( "onClientRender", root, drawDX ) 
    open = true 
end 
  
function removeGUIElements( ) 
    destroyElement( resources_gridlist ) 
    destroyElement( checkbox_delete ) 
    removeEventHandler( "onClientRender", root, drawDX ) 
    showCursor( false ) 
    open = false 
end 
  
function drawDX () 
    local selected = guiGridListGetSelectedItem( resources_gridlist ) 
    dxDrawRectangle( (732/sourceX)*sx, (243/sourceY)*sy, (276/sourceX)*sx, (405/sourceY)*sy, tocolor(0, 0, 0, 131), false) 
    dxDrawImage( (738/sourceX)*sx, (243/sourceY)*sy, (270/sourceX)*sx, (55/sourceY)*sy, ":compiler/compiler.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) 
    if isMouseInPosition( (743/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy ) then 
        dxDrawRectangle( (743/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy, tocolor(255, 255, 255, 131), false) 
        dxDrawText("Compile", (743/sourceX)*sx, (614/sourceY)*sy, (840/sourceX)*sx, (637/sourceY)*sy, tocolor(0, 0, 0, 255), (sy/sourceY)*1.00, "default-bold", "center", "center", false, false, false, false, false)   
    else 
        dxDrawRectangle( (743/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy, tocolor(0, 0, 0, 131), false) 
        dxDrawText("Compile", (743/sourceX)*sx, (614/sourceY)*sy, (840/sourceX)*sx, (637/sourceY)*sy, tocolor(255, 255, 255, 255), (sy/sourceY)*1.00, "default-bold", "center", "center", false, false, false, false, false)     
    end 
    if isMouseInPosition( (897/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy ) then 
        dxDrawRectangle( (897/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy, tocolor(255, 255, 255, 131), false) 
        dxDrawText("Close", (897/sourceX)*sx, (614/sourceY)*sy, (994/sourceX)*sx, (638/sourceY)*sy, tocolor(0, 0, 0, 255), 1.00, "default-bold", "center", "center", false, false, false, false, false) 
    else 
        dxDrawRectangle( (897/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy, tocolor(0, 0, 0, 131), false) 
        dxDrawText("Close", (897/sourceX)*sx, (614/sourceY)*sy, (994/sourceX)*sx, (638/sourceY)*sy, tocolor(255, 255, 255, 255), 1.00, "default-bold", "center", "center", false, false, false, false, false) 
    end 
    if selected then 
        local file_name = guiGridListGetItemText( resources_gridlist, selected, 1 ) 
        dxDrawText("Delete "..file_name.." when finish compile", (775/sourceX)*sx, (593/sourceY)*sy, (712/sourceX)*sx, (607/sourceY)*sy, tocolor(255, 255, 255, 255), (sy/sourceY)*0.70, "default-bold", "left", "center", false, false, false, false, false) 
    end 
end 
  
addEventHandler( "onClientClick", root, 
    function( button, state ) 
        if button == "left" and state == "down" and open == true then 
            local boton_cerrar = isMouseInPosition( (897/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy ) 
            local boton_compilar = isMouseInPosition( (743/sourceX)*sx, (614/sourceY)*sy, (97/sourceX)*sx, (24/sourceY)*sy ) 
            if boton_cerrar then 
                removeGUIElements( ) 
            end 
            if boton_compilar then 
                local selected = guiGridListGetSelectedItem( resources_gridlist ) 
                local file = guiGridListGetItemText( resources_gridlist, selected, 1 ) 
                if selected and file then 
                    if guiCheckBoxGetSelected( checkbox_delete ) then 
                        triggerServerEvent( "compiler:compile", getLocalPlayer( ), file, 1 ) 
                        removeGUIElements( ) 
                        showCursor( false ) 
                    else 
                        triggerServerEvent( "compiler:compile", getLocalPlayer( ), file, 0 ) 
                        removeGUIElements( ) 
                        showCursor( false )                  
                    end 
                else 
                    outputChatBox( "Select a resource from the list or close the panel.", 255, 145, 0 ) 
                end 
            end 
        end 
    end 
) 
  
addEvent( "compiler:opengui", true ) 
addEventHandler( "compiler:opengui", getRootElement( ), 
    function( table ) 
        if open == nil or open == false then 
            createGUIElements( ) 
            for i=1, #table do 
                local data = table[i] 
                local file = fileExists( ":compiler/tocompile/"..data.name ) 
                if fileExists then 
                    local row = guiGridListAddRow( resources_gridlist ) 
                    guiGridListSetItemText(resources_gridlist, row, 1, data.name, false, false)      
                    guiGridListSetItemText(resources_gridlist, row, 2, data.size, false, false)      
                end 
            end 
            showCursor( true ) 
        end 
    end 
) 

Código meta.xml

  
    

Descarga la imagen del script aquí: Click

Descarga el script hecho: Aqui

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