Lua compilation API

From Multi Theft Auto: Wiki
Revision as of 02:52, 21 November 2022 by Sheenidgs137 (talk | contribs) (Fixed typo API Parameters from luasource to obfuscate)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

This page is a guide for Lua compilation API.

Syntax

POST "http://luac.mtasa.com/index.php"

Parameters

  • luasource: type file the file content
  • compile: type value set to 1 to enable compilation
  • debug: type value set to 1 to enable debug information
  • obfuscate: type value
    • Set to 1 to enable some obfuscation
    • Set to 2 to enable more obfuscation (From 1.5.2-9.07903)
    • Set to 3 to enable even more obfuscation (From 1.5.6-9.18728)

Examples

Linux example using curl

FROM="example.lua"
TO="compiled.lua"
curl -s -X POST -F compile=1 -F debug=0 -F obfuscate=3 -F [email protected]$FROM http://luac.mtasa.com/ > $TO

Linux example using luac replacement

luac_mta -e3 -o compiled.lua example.lua
if [ $? -ne 0 ]; then
   echo "Error"
fi

Need luac_mta (R13 2019-07-12) for Linux 32 bit or Linux 64 bit

Windows batch file example using curl

set FROM="example.lua"
set TO="compiled.lua"
curl.exe -s -X POST -F compile=1 -F debug=0 -F obfuscate=3 -F [email protected]%FROM% http://luac.mtasa.com/ > %TO%

Get curl.exe
(Original from http://curl.haxx.se/download.html)

Windows example using luac.exe replacement

luac_mta.exe -e3 -o compiled.lua example.lua
IF NOT ERRORLEVEL 1 goto lp1
   echo "Error"
:lp1

Get luac_mta.exe (R12 2019-07-12) only x86

Lua example

-- This example allows you to compile all resource scripts by using /compilelua command.

local compileEnabled = 1
local debugLevel = 0
local obfuscateLevel = 3
local apiCodes = {
	["ERROR Nothing to do - Please select compile and/or obfuscate"] = true,
	["ERROR Could not compile file"] = true,
	["ERROR Could not read file"] = true,
	["ERROR Already compiled"] = true,
	["ERROR Already encrypted"] = true,
}

local function loadScriptsFromMeta()
	local metaFile = xmlLoadFile("meta.xml")

	if not metaFile then
		outputDebugString("[LUAC]: Failed to load scripts from meta.", 4, 255, 127, 0)

		return false
	end

	local metaChildren = xmlNodeGetChildren(metaFile)
	local scriptsTable = {}

	for nodeID = 1, #metaChildren do
		local metaNode = metaChildren[nodeID]
		local fileSrc = xmlNodeGetAttribute(metaNode, "src")

		if fileSrc then
			local luaScript = stringFind(fileSrc, ".lua")

			if luaScript then
				scriptsTable[#scriptsTable + 1] = fileSrc
			end
		end
	end

	xmlUnloadFile(metaFile)

	return scriptsTable
end

local function loadResourceScript(pPath)
	local scriptExists = fileExists(pPath)

	if not scriptExists then
		outputDebugString("[LUAC]: '"..pPath.."' doesn't exists.", 4, 255, 127, 0)

		return false
	end

	local scriptHandler = fileOpen(pPath)

	if not scriptHandler then
		outputDebugString("[LUAC]: '"..pPath.."' failed to open.", 4, 255, 127, 0)

		return false
	end

	local scriptSize = fileGetSize(scriptHandler)
	local scriptRaw = fileRead(scriptHandler, scriptSize)

	fileClose(scriptHandler)

	return scriptRaw
end

local function onScriptCompile(pCompiledLUA, pErrors, pScript)
	local compileSuccess = pErrors == 0

	if not compileSuccess then
		outputDebugString("[LUAC]: '"..pScript.."' failed to compile.", 4, 255, 127, 0)

		return false
	end

	local compileError = apiCodes[pCompiledLUA]

	if compileError then
		outputDebugString("[LUAC]: '"..pScript.."' failed to compile - "..pCompiledLUA, 4, 255, 127, 0)

		return false
	end

	local compiledScript = fileCreate("luac/"..pScript)

	if not compiledScript then
		outputDebugString("[LUAC]: '"..pScript.."' failed to create.", 4, 255, 127, 0)

		return false
	end

	fileWrite(compiledScript, pCompiledLUA)
	fileClose(compiledScript)

	outputDebugString("[LUAC]: '"..pScript.."' compiled successfully.", 4, 255, 127, 0)

	return true
end

function compileLuaScripts(pPlayer)
	local fetchURL = string.format("https://luac.mtasa.com/?compile=%i&debug=%i&obfuscate=%i", compileEnabled, debugLevel, obfuscateLevel)
	local resourceScripts = loadScriptsFromMeta()
	local postData = true

	for scriptID = 1, #resourceScripts do
		local scriptPath = resourceScripts[scriptID]
		local scriptRaw = loadResourceScript(scriptPath)

		fetchRemote(fetchURL, onScriptCompile, scriptRaw, postData, scriptPath)
	end
end
addCommandHandler("compilelua", compileLuaScripts)

Changelog

Version Description
2014-08-10 encrypt has been renamed to obfuscate.
blockdecompile has been removed.