CurrentHexColor = "#AA00AA"
ThemeR = 170
ThemeG = 0
ThemeB = 170
outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF L9rf Has Been Loaded Successfully.",255,255,255,true)
outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Current Version: #CCCCCC1.8",255,255,255,true)
guiSetInputMode("no_binds_when_editing")
Main = guiCreateWindow(0.28, 0.29, 0.44, 0.43, "L9rf MENU - 1.8 | L9rf - L9rf Team", true)
guiSetVisible(Main,false)
guiSetProperty(Main, "AlwaysOnTop", "True") 
guiWindowSetSizable(Main, false)
guiSetProperty(Main, "CaptionColour", "FFAA00AA")
TAB = guiCreateTabPanel(0.02, 0.08, 0.97, 0.89, true, Main)
guiSetAlpha(TAB, 0.80)
PlayerTab = guiCreateTab("PLAYER", TAB)
Wallhack = guiCreateButton(0.02, 0.43, 0.31, 0.15, "Enable/Disable Wallhack", true, PlayerTab)
guiSetFont(Wallhack, "default-bold-small")
guiSetProperty(Wallhack, "NormalTextColour", "FFAA00AA")
KillMe = guiCreateButton(0.68, 0.43, 0.15, 0.15, "Kill Yourself", true, PlayerTab)
guiSetFont(KillMe, "default-bold-small")
guiSetProperty(KillMe, "NormalTextColour", "FFAA00AA")
Jetpack = guiCreateButton(0.34, 0.43, 0.31, 0.15, "Give/Take Jetpack", true, PlayerTab)
guiSetFont(Jetpack, "default-bold-small")
guiSetProperty(Jetpack, "NormalTextColour", "FFAA00AA")
NoClip = guiCreateButton(0.02, 0.61, 0.31, 0.15, "No Clip", true, PlayerTab)
guiSetFont(NoClip, "default-bold-small")
guiSetProperty(NoClip, "NormalTextColour", "FFAA00AA")
TpPlayer = guiCreateButton(0.68, 0.61, 0.31, 0.15, "Teleport Player", true, PlayerTab)
guiSetFont(TpPlayer, "default-bold-small")
guiSetProperty(TpPlayer, "NormalTextColour", "FFAA00AA")
MaxArmor = guiCreateButton(0.34, 0.81, 0.31, 0.15, "Max Armor", true, PlayerTab)
guiSetFont(MaxArmor, "default-bold-small")
guiSetProperty(MaxArmor, "NormalTextColour", "FFAA00AA")
Revive = guiCreateButton(0.68, 0.81, 0.31, 0.15, "Revive", true, PlayerTab)
guiSetFont(Revive, "default-bold-small")
guiSetProperty(Revive, "NormalTextColour", "FFAA00AA")
SpecPlayer = guiCreateButton(0.02, 0.24, 0.31, 0.15, "Spectate Player", true, PlayerTab)
guiSetFont(SpecPlayer, "default-bold-small")
guiSetProperty(SpecPlayer, "NormalTextColour", "FFAA00AA")
GameSpeedButton = guiCreateButton(0.34, 0.24, 0.31, 0.15, "Game Speed", true, PlayerTab)
guiSetFont(GameSpeedButton, "default-bold-small")
guiSetProperty(GameSpeedButton, "NormalTextColour", "FFAA00AA")
Freeze = guiCreateButton(0.68, 0.24, 0.31, 0.15, "Unfreeze/Freeze", true, PlayerTab)
guiSetFont(Freeze, "default-bold-small")
guiSetProperty(Freeze, "NormalTextColour", "FFAA00AA")
FireMe = guiCreateButton(0.84, 0.43, 0.15, 0.15, "Fire Yourself", true, PlayerTab)
guiSetFont(FireMe, "default-bold-small")
guiSetProperty(FireMe, "NormalTextColour", "FFAA00AA")
VehFly = guiCreateButton(0.34, 0.61, 0.15, 0.15, "Vehicle Fly", true, PlayerTab)
guiSetFont(VehFly, "default-bold-small")
guiSetProperty(VehFly, "NormalTextColour", "FFAA00AA")
VehicleFire = guiCreateButton(0.50, 0.61, 0.15, 0.15, "Fire Vehicle", true, PlayerTab)
guiSetFont(VehicleFire, "default-bold-small")
guiSetProperty(VehicleFire, "NormalTextColour", "FFAA00AA")
TargetNameLabel = guiCreateLabel(0.02, 0.04, 0.21, 0.17, "Input Target Name:", true, PlayerTab)
guiSetFont(TargetNameLabel, "default-bold-small")
guiLabelSetColor(TargetNameLabel, 170, 0, 170)
guiLabelSetHorizontalAlign(TargetNameLabel, "center", false)
guiLabelSetVerticalAlign(TargetNameLabel, "center")
TargetName = guiCreateEdit(0.24, 0.06, 0.26, 0.13, "", true, PlayerTab)
guiSetProperty(TargetName, "NormalTextColour", "FFAA00AA")
GameSpeedLabel = guiCreateLabel(0.51, 0.04, 0.21, 0.17, "Input Game Speed:", true, PlayerTab)
guiSetFont(GameSpeedLabel, "default-bold-small")
guiLabelSetColor(GameSpeedLabel, 170, 0, 170)
guiLabelSetHorizontalAlign(GameSpeedLabel, "center", false)
guiLabelSetVerticalAlign(GameSpeedLabel, "center")
GameSpeed = guiCreateEdit(0.73, 0.06, 0.26, 0.13, "", true, PlayerTab)
guiSetProperty(GameSpeed, "NormalTextColour", "FFAA00AA")
MaxHP = guiCreateButton(0.02, 0.81, 0.15, 0.15, "Max HP", true, PlayerTab)
guiSetFont(MaxHP, "default-bold-small")
guiSetProperty(MaxHP, "NormalTextColour", "FFAA00AA")
GM = guiCreateButton(0.18, 0.81, 0.15, 0.15, "Godmode", true, PlayerTab)
guiSetFont(GM, "default-bold-small")
guiSetProperty(GM, "NormalTextColour", "FFAA00AA")

TrollTab = guiCreateTab("TROLL", TAB)
TargetNameLabelTroll = guiCreateLabel(0.02, 0.04, 0.21, 0.17, "Input Target Name:", true, TrollTab)
guiSetFont(TargetNameLabelTroll, "default-bold-small")
guiLabelSetColor(TargetNameLabelTroll, 170, 0, 170)
guiLabelSetHorizontalAlign(TargetNameLabelTroll, "center", false)
guiLabelSetVerticalAlign(TargetNameLabelTroll, "center")
TargetNameTroll = guiCreateEdit(0.24, 0.06, 0.26, 0.13, "", true, TrollTab)
guiSetProperty(TargetNameTroll, "NormalTextColour", "FFAA00AA")
BombClick = guiCreateButton(0.02, 0.43, 0.31, 0.15, "Bomb Click", true, TrollTab)
guiSetFont(BombClick, "default-bold-small")
guiSetProperty(BombClick, "NormalTextColour", "FFAA00AA")
ExplodePlayers = guiCreateButton(0.34, 0.43, 0.31, 0.15, "Explode Players", true, TrollTab)
guiSetFont(ExplodePlayers, "default-bold-small")
guiSetProperty(ExplodePlayers, "NormalTextColour", "FFAA00AA")
ExplodeVehicles = guiCreateButton(0.68, 0.43, 0.31, 0.15, "Explode Vehicles", true, TrollTab)
guiSetFont(ExplodeVehicles, "default-bold-small")
guiSetProperty(ExplodeVehicles, "NormalTextColour", "FFAA00AA")
ExplodeAPlayer = guiCreateButton(0.02, 0.61, 0.31, 0.15, "Explode Target", true, TrollTab)
guiSetFont(ExplodeAPlayer, "default-bold-small")
guiSetProperty(ExplodeAPlayer, "NormalTextColour", "FFAA00AA")
StartVehicleEngine = guiCreateButton(0.34, 0.61, 0.31, 0.15, "Start Engine", true, TrollTab)
guiSetFont(StartVehicleEngine, "default-bold-small")
guiSetProperty(StartVehicleEngine, "NormalTextColour", "FFAA00AA")
FreecamPlayer = guiCreateButton(0.68, 0.61, 0.31, 0.15, "Freecam", true, TrollTab)
guiSetFont(FreecamPlayer, "default-bold-small")
guiSetProperty(FreecamPlayer, "NormalTextColour", "FFAA00AA")
UnlockVeh = guiCreateButton(0.02, 0.80, 0.31, 0.15, "Unlock Vehicles", true, TrollTab)
guiSetFont(UnlockVeh, "default-bold-small")
guiSetProperty(UnlockVeh, "NormalTextColour", "FFAA00AA")
FixVehicle = guiCreateButton(0.34, 0.80, 0.31, 0.15, "Repair Vehicle", true, TrollTab)
guiSetFont(FixVehicle, "default-bold-small")
guiSetProperty(FixVehicle, "NormalTextColour", "FFAA00AA")
AddNitro = guiCreateButton(0.68, 0.80, 0.31, 0.15, "Add Nitro", true, TrollTab)
guiSetFont(AddNitro, "default-bold-small")
guiSetProperty(AddNitro, "NormalTextColour", "FFAA00AA")
SOON = guiCreateButton(0.02, 0.24, 0.31, 0.15, "SOON", true, TrollTab)
guiSetFont(SOON, "default-bold-small")
guiSetEnabled(SOON,false)
guiSetProperty(SOON, "NormalTextColour", "FFAA00AA")
SOON = guiCreateButton(0.34, 0.24, 0.31, 0.15, "SOON", true, TrollTab)
guiSetFont(SOON, "default-bold-small")
guiSetEnabled(SOON,false)
guiSetProperty(SOON, "NormalTextColour", "FFAA00AA")
SOON = guiCreateButton(0.68, 0.24, 0.31, 0.15, "SOON", true, TrollTab)
guiSetFont(SOON, "default-bold-small")
guiSetEnabled(SOON,false)
guiSetProperty(SOON, "NormalTextColour", "FFAA00AA")

ExecutorTab = guiCreateTab("EXECUTOR", TAB)
LuaCode = guiCreateMemo(0.02, 0.04, 0.57, 0.74, "", true, ExecutorTab)
ExecuteButton = guiCreateButton(0.02, 0.81, 0.57, 0.15, "Inject Lua Script", true, ExecutorTab)
guiSetFont(ExecuteButton, "default-bold-small")
guiSetProperty(ExecuteButton, "NormalTextColour", "FFAA00AA")
ShowData = guiCreateButton(0.64, 0.04, 0.31, 0.15, "Show All Data ( 1.6 )", true, ExecutorTab)
guiSetFont(ShowData, "default-bold-small")
guiSetProperty(ShowData, "NormalTextColour", "FFAA00AA")
ShowDataTarget = guiCreateButton(0.64, 0.54, 0.31, 0.15, "Show All Target Data ( 1.6 )", true, ExecutorTab)
guiSetFont(ShowDataTarget, "default-bold-small")
guiSetProperty(ShowDataTarget, "NormalTextColour", "FFAA00AA")
TargetNameExecutor = guiCreateEdit(0.64, 0.35, 0.31, 0.15, "", true, ExecutorTab)
ShowDebugHook = guiCreateButton(0.64, 0.81, 0.31, 0.15, "Show Debug Hook", true, ExecutorTab)
guiSetFont(ShowDebugHook, "default-bold-small")
guiSetProperty(ShowDebugHook, "NormalTextColour", "FFAA00AA")

PanelThemes = {
    [1] = {"Purple",170,0,170,"FFAA00AA","#AA00AA"},
    [2] = {"Red",255,0,0,"FFFF0000","#FF0000"},
    [3] = {"Green",0,255,0,"FF00FF00","#00FF00"},
    [4] = {"Blue",0,0,255,"FF0000FF","#0000FF"},
    [5] = {"White",255,255,255,"FFFFFFFF","#FFFFFF"},
    [6] = {"Orange",255,165,40,"FFFFA528","#FFA500"},
    [7] = {"Yellow",255,255,0,"FFFFFF00","#FFFF00"},
}

SettingsTab = guiCreateTab("SETTINGS", TAB)
KeybindLabel = guiCreateLabel(0.02, 0.04, 0.21, 0.17, "Open Menu Key:", true, SettingsTab)
guiSetFont(KeybindLabel, "default-bold-small")
guiLabelSetColor(KeybindLabel, 170, 0, 170)
guiLabelSetHorizontalAlign(KeybindLabel, "center", false)
guiLabelSetVerticalAlign(KeybindLabel, "center")
Keybind = guiCreateEdit(0.24, 0.06, 0.26, 0.13, "num_dec", true, SettingsTab)
guiEditSetReadOnly(Keybind,true)
guiSetProperty(Keybind, "NormalTextColour", "FFAA00AA")
InfoDevelopers = guiCreateLabel(0.05, 0.15, 0.52, 0.17, "Telegram: @L9rf | @TheMeArsham", true, SettingsTab)
guiSetFont(InfoDevelopers, "default-bold-small")
guiLabelSetColor(InfoDevelopers, 170, 0, 170)
guiLabelSetVerticalAlign(InfoDevelopers, "center")

InfoDevelopersDiscord = guiCreateLabel(0.05, 0.26, 0.52, 0.17, "discord.gg/l9rf | l9rf", true, SettingsTab)
guiSetFont(InfoDevelopersDiscord, "default-bold-small")
guiLabelSetColor(InfoDevelopersDiscord, 170, 0, 170)
guiLabelSetVerticalAlign(InfoDevelopersDiscord, "center")

ThemeCombo = guiCreateComboBox(0.55, 0.08, 0.35, 0.30, "Choose Your Theme", true, SettingsTab)
ThemeSet = guiCreateButton(0.55, 0.4, 0.35, 0.15, "Set Theme", true, SettingsTab)
guiSetFont(ThemeSet, "default-bold-small")
guiSetProperty(ThemeSet, "NormalTextColour", "FFAA00AA")

for LoadThemes=1,#PanelThemes do
    guiComboBoxAddItem(ThemeCombo,PanelThemes[LoadThemes][1])
    addEventHandler("onClientGUIClick",getRootElement(),function()
        if source == ThemeSet and guiComboBoxGetSelected(ThemeCombo) ~= -1 then
            ThemeID = guiComboBoxGetSelected(ThemeCombo) + 1
            refreshThemeMenu(PanelThemes[ThemeID][2],PanelThemes[ThemeID][3],PanelThemes[ThemeID][4],PanelThemes[ThemeID][5],PanelThemes[ThemeID][6])
        end
    end)
end

function refreshThemeMenu(R,G,B,StringCode,HexColorCode)
    ThemeR = tonumber(R)
    ThemeG = tonumber(G)
    ThemeB = tonumber(B)
    guiSetProperty(Main, "CaptionColour", tostring(StringCode))
    guiSetProperty(Wallhack, "NormalTextColour", tostring(StringCode))
    guiSetProperty(KillMe, "NormalTextColour", tostring(StringCode))
    guiSetProperty(Jetpack, "NormalTextColour", tostring(StringCode))
    guiSetProperty(NoClip, "NormalTextColour", tostring(StringCode))
    guiSetProperty(TpPlayer, "NormalTextColour", tostring(StringCode))
    guiSetProperty(MaxArmor, "NormalTextColour", tostring(StringCode))
    guiSetProperty(Revive, "NormalTextColour", tostring(StringCode))
    guiSetProperty(SpecPlayer, "NormalTextColour", tostring(StringCode))
    guiSetProperty(GameSpeedButton, "NormalTextColour", tostring(StringCode))
    guiSetProperty(Freeze, "NormalTextColour", tostring(StringCode))
    guiSetProperty(FireMe, "NormalTextColour", tostring(StringCode))
    guiSetProperty(VehFly, "NormalTextColour", tostring(StringCode))
    guiSetProperty(VehicleFire, "NormalTextColour", tostring(StringCode))
    guiSetProperty(TargetName, "NormalTextColour", tostring(StringCode))
    guiSetProperty(GameSpeed, "NormalTextColour", tostring(StringCode))
    guiSetProperty(MaxHP, "NormalTextColour", tostring(StringCode))
    guiSetProperty(GM, "NormalTextColour", tostring(StringCode))
    guiSetProperty(TargetNameTroll, "NormalTextColour", tostring(StringCode))
    guiSetProperty(BombClick, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ExplodePlayers, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ExplodeVehicles, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ExplodeAPlayer, "NormalTextColour", tostring(StringCode))
    guiSetProperty(StartVehicleEngine, "NormalTextColour", tostring(StringCode))
    guiSetProperty(FreecamPlayer, "NormalTextColour", tostring(StringCode))
    guiSetProperty(FreecamPlayer, "NormalTextColour", tostring(StringCode))
    guiSetProperty(UnlockVeh, "NormalTextColour", tostring(StringCode))
    guiSetProperty(UnlockVeh, "NormalTextColour", tostring(StringCode))
    guiSetProperty(FixVehicle, "NormalTextColour", tostring(StringCode))
    guiSetProperty(AddNitro, "NormalTextColour", tostring(StringCode))
    guiSetProperty(SOON, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ExecuteButton, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ShowData, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ShowDataTarget, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ShowDebugHook, "NormalTextColour", tostring(StringCode))
    guiSetProperty(Keybind, "NormalTextColour", tostring(StringCode))
    guiSetProperty(ThemeSet, "NormalTextColour", tostring(StringCode))
    guiLabelSetColor(TargetNameLabel, tonumber(R),tonumber(G),tonumber(B))
    guiLabelSetColor(GameSpeedLabel, tonumber(R),tonumber(G),tonumber(B))
    guiLabelSetColor(TargetNameLabelTroll, tonumber(R),tonumber(G),tonumber(B))
    guiLabelSetColor(KeybindLabel, tonumber(R),tonumber(G),tonumber(B))
    guiLabelSetColor(InfoDevelopers, tonumber(R),tonumber(G),tonumber(B))
    guiLabelSetColor(InfoDevelopersDiscord, tonumber(R),tonumber(G),tonumber(B))
    CurrentHexColor = tostring(HexColorCode)
end

WallDistance = 150
IsWallHackON = false
IsVehFly = false
Godmode = false
IsProjectileEnabled = false
IsL9rfFreecamEnabled = false
InKeybindMode = false

function RGBToHex(r, g, b)
	return string.format("#%02x%02x%02x", 
		math.floor(r),
		math.floor(g),
		math.floor(b))
end

WallHack = {}
WallHack.boneRelations = {
    [8] = {
        [4] = {
            [22] = {
                [23] = {
                    [24] = false,
                },
            },
            [32] = {
                [33] = {
                    [34] = false,
                },
            },
            [3] = {
                [2] = {
                    [1] = {
                        [51] = {
                            [52] = {
                                [53] = {
                                    [54] = false,
                                },
                            },
                        },
                        [41] = {
                            [42] = {
                                [43] = {
                                    [44] = false,
                                },
                            },
                        },
                    },
                },
            },
        },
    },
}

WallHack.render = function()
    local x1, y1, z1 = getCameraMatrix()
    for _, player in pairs(getElementsByType("player")) do
        local x, y, z = getElementPosition(player)
        local dist = getDistanceBetweenPoints3D(x1, y1, z1, x, y, z)
        if (dist <= WallDistance) then
            local scx, scy = getScreenFromWorldPosition(x, y, z, 0.02)
            if (scx and scy) then
                for boneId, boneRelation in pairs(WallHack.boneRelations) do
                    WallHack.drawNames(player, dist)
                    WallHack.drawBones(player, boneId, boneRelation, dist)
                end
            end
        end
    end
end
WallHack.drawNames = function(player, dist)
    local headX, headY, headZ = getPedBonePosition(player, 8)
    headZ = headZ + 0.5
    local scrHeadX, scrHeadY = getScreenFromWorldPosition(headX, headY, headZ, 0.02)
    if (scrHeadX and scrHeadY) then
        local PosX,PosY,PosZ = getElementPosition(localPlayer)
        local name = getPlayerName(player)
        local id = getElementData(player,"ID") or "Unknown"
        local health = getElementHealth(player)
        local armor = getPedArmor(player)
        local healthR, healthG, healthB = interpolateBetween(255, 89, 89, 125, 197, 118, (health / 100), "Linear")
        local armorR, armorG, armorB = interpolateBetween(180, 180, 180, 50, 179, 239, (armor / 100), "Linear")
        local text = name .. " "..CurrentHexColor.."[" .. id .. "]" .. "\n" ..RGBToHex(healthR, healthG, healthB) .. "[" .. math.floor(health) .. "%" .. "] " ..RGBToHex(armorR, armorG, armorB) .. "[" .. math.floor(armor) .. "%" .. "]"
        local scale = interpolateBetween(1.3, 0, 0, 0.1, 0, 0, (dist / WallDistance), "Linear")
        dxDrawText(text:gsub("#%x%x%x%x%x%x", ""), scrHeadX + 1, scrHeadY + 1, scrHeadX + 1, scrHeadY + 1, tocolor(0, 0, 0, 255), scale, "default-bold", "center", "bottom", false, false, true, true)
        dxDrawText(text, scrHeadX, scrHeadY, scrHeadX, scrHeadY, tocolor(255, 255, 255, 255), scale, "default-bold", "center", "bottom", false, false, true, true)
        dxDrawLine3D(PosX,PosY,PosZ,PosX2,PosY2,PosZ2,tocolor(ThemeR,ThemeG,ThemeB),1.0, true)
    end
end
WallHack.drawBones = function(player, _boneId, _boneRelation, dist)
    if (not (player and _boneId and _boneRelation)) then
        return
    end

    local rootX, rootY, rootZ = getPedBonePosition(player, _boneId)

    for boneId, boneRelation in pairs(_boneRelation) do
        local boneX, boneY, boneZ = getPedBonePosition(player, boneId)
        dxDrawLine3D(rootX, rootY, rootZ, boneX, boneY, boneZ, tocolor(ThemeR,ThemeG,ThemeB), (dist / WallDistance) * 30, true)
        if (boneRelation) then
            WallHack.drawBones(player, boneId, boneRelation, dist)
        end
    end
end

Fly = {}
Fly.state = false
Fly.speedMultipliers = {
    ["lshift"] = 4,
    ["lalt"] = 0.25,
}
Fly.render = function(delta)
    if (isChatBoxInputActive() or isConsoleActive()) then return end

    if getPedOccupiedVehicle(localPlayer) then return end

    local x, y, z = getElementPosition(localPlayer)
    local camX, camY, camZ, camTX, camTY, camTZ = getCameraMatrix()
    camTX, camTY = camTX - camX, camTY - camY

    delta = delta * 0.1
    for key, multiplier in pairs(Fly.speedMultipliers) do
        if (getKeyState(key)) then
            delta = delta * multiplier
        end
    end
    local multiplier = delta / math.sqrt(camTX * camTX + camTY * camTY)
    camTX, camTY = camTX * multiplier, camTY * multiplier

    if (getKeyState("w")) then
        x, y = x + camTX, y + camTY
        setElementPosition(localPlayer, x, y, z)
        setElementRotation(localPlayer, 0, 0, rotationFromCamera(0))
    end
    if (getKeyState("s")) then
        x, y = x - camTX, y - camTY
        setElementPosition(localPlayer, x, y, z)
        setElementRotation(localPlayer, 0, 0, rotationFromCamera(180))
    end
    if (getKeyState("a")) then
        x, y = x - camTY, y + camTX
        setElementPosition(localPlayer, x, y, z)
        setElementRotation(localPlayer, 0, 0, rotationFromCamera(270))
    end
    if (getKeyState("d")) then
        x, y = x + camTY, y - camTX
        setElementPosition(localPlayer, x, y, z)
        setElementRotation(localPlayer, 0, 0, rotationFromCamera(90))
    end
    if (getKeyState("space")) then
        z = z + delta
        setElementPosition(localPlayer, x, y, z)
    end
    if (getKeyState("lctrl")) then
        z = z - delta
        setElementPosition(localPlayer, x, y, z)
    end
end
function rotationFromCamera(offset)
    local camX, camY, _, camTX, camTY = getCameraMatrix()
    local deltaX, deltaY = camTX - camX, camTY - camY
    local rotZ = math.deg(math.atan(deltaY / deltaX))
    if ((deltaY >= 0 and deltaX <= 0) or (deltaY <= 0 and deltaX <= 0)) then
        rotZ = rotZ + 180
    end
    return -rotZ + 90 + offset
end

function L9rfProjectile(button, state, _, _, x, y, z)
    if IsProjectileEnabled and not guiGetVisible(Main) then
        if (button == "left" and state == "down") then
            createProjectile(localPlayer, 21, x, y, z + 0.1)
        end
    end
end

function changeKeybind(button,press)
    if InKeybindMode then
        if (press) then
            if button ~= "mouse1" then
                InKeybindMode = false
                unbindKey(tostring(guiGetText(Keybind)),"down",ShowOrHideL9rf)
                guiSetAlpha(Keybind,1.0)
                guiSetText(Keybind,tostring(button))
                bindKey(tostring(guiGetText(Keybind)),"down",ShowOrHideL9rf)
            end
        end
    end
end
addEventHandler("onClientKey",root,changeKeybind)

addEventHandler("onClientClick", root, L9rfProjectile)
addEventHandler("onClientGUIClick",getRootElement(),function()
	if source == SpecPlayer then
        if getPlayerFromName(tostring(guiGetText(TargetName))) then
            X,Y,Z = getElementPosition(localPlayer)
            X2,Y2,Z2 = getElementPosition(getPlayerFromName(tostring(guiGetText(TargetName))))
            setElementPosition(localPlayer,X2,Y2,Z2+10)
            setCameraTarget(getPlayerFromName(tostring(guiGetText(TargetName))))
            setElementPosition(localPlayer,X,Y,Z)
            if getPlayerFromName(tostring(guiGetText(TargetName))) == localPlayer then
                setElementFrozen(localPlayer,false)
            else
                setElementFrozen(localPlayer,true)
            end
        else
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Player Not Found.",255,255,255,true)
        end
    elseif source == GameSpeedButton then
        if tonumber(guiGetText(GameSpeed)) then
            if tonumber(guiGetText(GameSpeed)) >= 0.1 and tonumber(guiGetText(GameSpeed)) <= 10 then
                setGameSpeed(tonumber(guiGetText(GameSpeed)))
            else
                outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Please Input a Valid Number.",255,255,255,true)
            end
        else
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Please Input a Valid Number.",255,255,255,true)
        end
    elseif source == Freeze then
        if isElementFrozen(localPlayer) then
            setElementFrozen(localPlayer,false)
            toggleAllControls(true)
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF You Are No Longer Frozen.",255,255,255,true)
        else
            setElementFrozen(localPlayer,true)
            toggleAllControls(false)
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF You Are Frozen.",255,255,255,true)
        end
    elseif source == Wallhack then
        if IsWallHackON then
            IsWallHackON = false
            removeEventHandler("onClientRender", root, WallHack.render)
        else
            IsWallHackON = true
            addEventHandler("onClientRender", root, WallHack.render)
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF To Change Wallhack Distance Please Use: /walldistance.",255,255,255,true)
        end
    elseif source == Jetpack then
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Not Working.",255,255,255,true)
    elseif source == KillMe then
        setElementHealth(localPlayer,0)
    elseif source == FireMe then
        setPedOnFire(localPlayer,true)
    elseif source == NoClip then
        Fly.state = not Fly.state
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF No Clip Is Now " ..(Fly.state and "ON" or "OFF")..".",255,255,255,true)
        removeEventHandler("onClientPreRender", root, Fly.render)
        setElementFrozen(localPlayer, Fly.state)
        setElementCollisionsEnabled(localPlayer, not Fly.state)
        if (Fly.state) then
            addEventHandler("onClientPreRender", root, Fly.render)
        end
    elseif source == VehFly then
        IsVehFly = not IsVehFly
        setWorldSpecialPropertyEnabled("aircars",IsVehFly)
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Vehicle Fly Is Now " ..(IsVehFly and "ON" or "OFF")..".",255,255,255,true)
    elseif source == VehicleFire then
        setElementHealth(getPedOccupiedVehicle(localPlayer),200)
    elseif source == TpPlayer then
        if getPlayerFromName(tostring(guiGetText(TargetName))) then
            setElementPosition(localPlayer,getElementPosition(getPlayerFromName(tostring(guiGetText(TargetName)))))
            setElementInterior(localPlayer,getElementInterior(getPlayerFromName(tostring(guiGetText(TargetName)))))
            setElementDimension(localPlayer,getElementDimension(getPlayerFromName(tostring(guiGetText(TargetName)))))
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Teleported To "..tostring(getPlayerName(getPlayerFromName(tostring(guiGetText(TargetName)))))..".",255,255,255,true)
        else
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Player Not Found.",255,255,255,true)
        end
    elseif source == MaxHP then
        setElementHealth(localPlayer,100)
    elseif source == GM then
        Godmode = not Godmode
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Godmode Fly Is Now " ..(Godmode and "ON" or "OFF")..".",255,255,255,true)
    elseif source == MaxArmor then
        setPedArmor(localPlayer,100)
    elseif source == Revive then
        setElementHealth(localPlayer,100)
        setCameraTarget(localPlayer)
        if isElementFrozen(localPlayer) then
            setElementFrozen(localPlayer,false)
        end
        toggleAllControls(localPlayer,true)
        setGameSpeed(1)
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Revived.",255,255,255,true)
    elseif source == BombClick then
        IsProjectileEnabled = not IsProjectileEnabled
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Bomb Click Is Now " ..(IsProjectileEnabled and "ON" or "OFF")..".",255,255,255,true)
    elseif source == ExplodePlayers then
        for Index, Players in ipairs(getElementsByType("player")) do
            if Players ~= localPlayer then
                x,y,z = getElementPosition(Players)
                createProjectile(localPlayer, 20, x, y, z, nil, Players)
            end
        end
    elseif source == ExplodeVehicles then
        for Index, Vehicles in ipairs(getElementsByType("vehicle")) do
            if isPedInVehicle(localPlayer) then
                if Vehicles ~= getPedOccupiedVehicle(localPlayer) then
                    blowVehicle(Vehicles,true)
                end
            else
                blowVehicle(Vehicles,true)
            end
        end
    elseif source == ExplodeAPlayer then
        if getPlayerFromName(tostring(guiGetText(TargetNameTroll))) then
            x,y,z = getElementPosition(getPlayerFromName(tostring(guiGetText(TargetNameTroll))))
            createProjectile(localPlayer, 20, x, y, z, nil, getPlayerFromName(tostring(guiGetText(TargetNameTroll))))
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF "..tostring(getPlayerName(getPlayerFromName(tostring(guiGetText(TargetNameTroll))))).." ***** Up.",255,255,255,true)
        else
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Player Not Found.",255,255,255,true)
        end
    elseif source == UnlockVeh then
        for Index, Vehicles in ipairs(getElementsByType("vehicle")) do
            setVehicleLocked(Vehicles,false)
        end
    elseif source == FixVehicle then
        if isPedInVehicle(localPlayer) then
            fixVehicle(getPedOccupiedVehicle(localPlayer))
        end
    elseif source == AddNitro then 
        addVehicleUpgrade(getPedOccupiedVehicle(localPlayer),1010)
    elseif source == ShowData then
        outputChatBox("================================================",255,255,255,true)
        local data = getAllElementData(localPlayer)
        for k, v in pairs(data) do
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF "..k..": "..tostring(v),255,255,255,true)
        end
        outputChatBox("================================================",255,255,255,true)
    elseif source == ShowDataTarget then
        if getPlayerFromName(tostring(guiGetText(TargetNameExecutor))) then
            outputChatBox("================================================",255,255,255,true)
        local data = getAllElementData(getPlayerFromName(tostring(guiGetText(TargetNameExecutor))))
        for k, v in pairs(data) do
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF "..k..": "..tostring(v),255,255,255,true)
        end
        outputChatBox("================================================",255,255,255,true)
        else
            outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Player Not Found.",255,255,255,true)
        end
    elseif source == ShowDebugHook then
        IsShowDebugHook = not IsShowDebugHook
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF DebugHook Is Now " ..(IsShowDebugHook and "ON" or "OFF")..".",255,255,255,true)
    elseif source == ExecuteButton then
        local LuaScript = guiGetText(LuaCode) 
        local ExecuteCode = loadstring(LuaScript)
        ExecuteCode()
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Lua Script Injected.",255,255,255,true)
    elseif source == StartVehicleEngine then
        if isPedInVehicle(localPlayer) then
            setVehicleEngineState(getPedOccupiedVehicle(localPlayer),true)
        end
    elseif source == FreecamPlayer then
        if IsL9rfFreecamEnabled then
            setFreecamDisabled()
            IsL9rfFreecamEnabled = false
        else
            setFreecamEnabled()
            IsL9rfFreecamEnabled = true
        end
        setElementFrozen(localPlayer,IsL9rfFreecamEnabled)
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Freecam Is Now " ..(IsL9rfFreecamEnabled and "ON" or "OFF")..".",255,255,255,true)
    elseif source == Keybind then
        if not InKeybindMode then
            InKeybindMode = true
            guiSetAlpha(Keybind,0.5)
        end
    else
        if InKeybindMode then
            InKeybindMode = false
            guiSetAlpha(Keybind,1.0)
        end
	end
end)

function changeWallhackDistance(Cmd,Distance)
    if tonumber(Distance) then
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Your Wallhack Distance Changed To: "..Distance..".",255,255,255,true)
        WallDistance = tonumber(Distance)
    else
        outputChatBox(""..CurrentHexColor.."[L9rf]:#FFFFFF Please Input a Valid Number.",255,255,255,true)
    end
end
addCommandHandler("walldistance",changeWallhackDistance,false,false)
addEventHandler("onClientRender", root,
function()
if Godmode == true then
setPedArmor(localPlayer,1)
end
end)
function godmodeFunction(attacker, weapon, bodypart)
if Godmode == true then
cancelEvent()
end
end
addEventHandler("onClientPlayerDamage", localPlayer, godmodeFunction)
addDebugHook("preFunction", function(sourceResource, functionName, isAllowedByACL, luaFilename, luaLineNumber, ...)
    if IsShowDebugHook then
        local args = {...}
        outputChatBox(""..CurrentHexColor.."[L9rf-DEBUG]:#FFFFFF "..inspect(args).."",255,255,255,true)
    end
end, {"triggerServerEvent"})

function ShowOrHideL9rf()
    guiSetVisible(Main, not guiGetVisible(Main))
    showCursor(guiGetVisible(Main))
end
bindKey(tostring(guiGetText(Keybind)),"down",ShowOrHideL9rf)

local speed = 0
local strafespeed = 0
local rotX, rotY = 0,0
local velocityX, velocityY, velocityZ

local options = {
	invertMouseLook = false,
	normalMaxSpeed = 2,
	slowMaxSpeed = 0.05,
	fastMaxSpeed = 10,
	smoothMovement = true,
	acceleration = 0.3,
	decceleration = 0.15,
	mouseSensitivity = 0.05,
	maxYAngle = 188,
	key_fastMove = "lshift",
	key_slowMove = "lalt",
	key_forward = "w",
	key_backward = "s",
	key_left = "a",
	key_right = "d"
}

local mouseFrameDelay = 0

local rootElement = getRootElement()
local localPlayer = getLocalPlayer()

local getKeyState = getKeyState
do
	local mta_getKeyState = getKeyState
	function getKeyState(key)
		if isMTAWindowActive() then
			return false
		else
			return mta_getKeyState(key)
		end
	end
end


local function freecamFrame ()
	local cameraAngleX = rotX
	local cameraAngleY = rotY
	local freeModeAngleZ = math.sin(cameraAngleY)
	local freeModeAngleY = math.cos(cameraAngleY) * math.cos(cameraAngleX)
	local freeModeAngleX = math.cos(cameraAngleY) * math.sin(cameraAngleX)
	local camPosX, camPosY, camPosZ = getCameraMatrix()
	local camTargetX = camPosX + freeModeAngleX * 100
	local camTargetY = camPosY + freeModeAngleY * 100
	local camTargetZ = camPosZ + freeModeAngleZ * 100
	local mspeed = options.normalMaxSpeed
	if getKeyState ( options.key_fastMove ) then
		mspeed = options.fastMaxSpeed
	elseif getKeyState ( options.key_slowMove ) then
		mspeed = options.slowMaxSpeed
	end
	
	if options.smoothMovement then
		local acceleration = options.acceleration
		local decceleration = options.decceleration
		local speedKeyPressed = false
		if getKeyState ( options.key_forward ) then
			speed = speed + acceleration 
			speedKeyPressed = true
		end
		if getKeyState ( options.key_backward ) then
			speed = speed - acceleration 
			speedKeyPressed = true
		end
		local strafeSpeedKeyPressed = false
		if getKeyState ( options.key_right ) then
			if strafespeed > 0 then
				strafespeed = 0
			end
			strafespeed = strafespeed - acceleration / 2
			strafeSpeedKeyPressed = true
		end
		if getKeyState ( options.key_left ) then
			if strafespeed < 0 then
				strafespeed = 0
			end
			strafespeed = strafespeed + acceleration / 2
			strafeSpeedKeyPressed = true
		end
		if speedKeyPressed ~= true then
			if speed > 0 then
				speed = speed - decceleration
			elseif speed < 0 then
				speed = speed + decceleration
			end
		end
		if strafeSpeedKeyPressed ~= true then
			if strafespeed > 0 then
				strafespeed = strafespeed - decceleration
			elseif strafespeed < 0 then
				strafespeed = strafespeed + decceleration
			end
		end
		if speed > -decceleration and speed < decceleration then
			speed = 0
		elseif speed > mspeed then
			speed = mspeed
		elseif speed < -mspeed then
			speed = -mspeed
		end
		if strafespeed > -(acceleration / 2) and strafespeed < (acceleration / 2) then
			strafespeed = 0
		elseif strafespeed > mspeed then
			strafespeed = mspeed
		elseif strafespeed < -mspeed then
			strafespeed = -mspeed
		end
	else
		speed = 0
		strafespeed = 0
		if getKeyState ( options.key_forward ) then speed = mspeed end
		if getKeyState ( options.key_backward ) then speed = -mspeed end
		if getKeyState ( options.key_left ) then strafespeed = mspeed end
		if getKeyState ( options.key_right ) then strafespeed = -mspeed end
	end
	local camAngleX = camPosX - camTargetX
	local camAngleY = camPosY - camTargetY
	local camAngleZ = 0
	local angleLength = math.sqrt(camAngleX*camAngleX+camAngleY*camAngleY+camAngleZ*camAngleZ)
	local camNormalizedAngleX = camAngleX / angleLength
	local camNormalizedAngleY = camAngleY / angleLength
	local camNormalizedAngleZ = 0
	local normalAngleX = 0
	local normalAngleY = 0
	local normalAngleZ = 1
	local normalX = (camNormalizedAngleY * normalAngleZ - camNormalizedAngleZ * normalAngleY)
	local normalY = (camNormalizedAngleZ * normalAngleX - camNormalizedAngleX * normalAngleZ)
	local normalZ = (camNormalizedAngleX * normalAngleY - camNormalizedAngleY * normalAngleX)
	camPosX = camPosX + freeModeAngleX * speed
	camPosY = camPosY + freeModeAngleY * speed
	camPosZ = camPosZ + freeModeAngleZ * speed
	camPosX = camPosX + normalX * strafespeed
	camPosY = camPosY + normalY * strafespeed
	camPosZ = camPosZ + normalZ * strafespeed
	velocityX = (freeModeAngleX * speed) + (normalX * strafespeed)
	velocityY = (freeModeAngleY * speed) + (normalY * strafespeed)
	velocityZ = (freeModeAngleZ * speed) + (normalZ * strafespeed)
	camTargetX = camPosX + freeModeAngleX * 100
	camTargetY = camPosY + freeModeAngleY * 100
	camTargetZ = camPosZ + freeModeAngleZ * 100
	setCameraMatrix ( camPosX, camPosY, camPosZ, camTargetX, camTargetY, camTargetZ )
end

local function freecamMouse (cX,cY,aX,aY)
	if isCursorShowing() or isMTAWindowActive() then
		mouseFrameDelay = 5
		return
	elseif mouseFrameDelay > 0 then
		mouseFrameDelay = mouseFrameDelay - 1
		return
	end
	local width, height = guiGetScreenSize()
	aX = aX - width / 2 
	aY = aY - height / 2
	if options.invertMouseLook then
		aY = -aY
	end
	rotX = rotX + aX * options.mouseSensitivity * 0.01745
	rotY = rotY - aY * options.mouseSensitivity * 0.01745
	
	local PI = math.pi
	if rotX > PI then
		rotX = rotX - 2 * PI
	elseif rotX < -PI then
		rotX = rotX + 2 * PI
	end
	
	if rotY > PI then
		rotY = rotY - 2 * PI
	elseif rotY < -PI then
		rotY = rotY + 2 * PI
	end
	if rotY < -PI / 2.05 then
	   rotY = -PI / 2.05
	elseif rotY > PI / 2.05 then
		rotY = PI / 2.05
	end
end

function setFreecamEnabled (x, y, z)
	if (x and y and z) then
		setCameraMatrix ( camPosX, camPosY, camPosZ )
	end
    toggleAllControls(false)
	addEventHandler("onClientRender", rootElement, freecamFrame)
	addEventHandler("onClientCursorMove",rootElement, freecamMouse)
	
	return true
end

function setFreecamDisabled(dontChangeFixedMode)
	if removeEventHandler("onClientRender", rootElement, freecamFrame) then
		velocityX,velocityY,velocityZ = 0,0,0
		speed = 0
		strafespeed = 0
        SetX,SetY,SetZ = getCameraMatrix()
        if isPedInVehicle(localPlayer) then
            setElementPosition ( getPedOccupiedVehicle(localPlayer), SetX, SetY, SetZ )
        else
            setElementPosition ( localPlayer, SetX, SetY, SetZ )
        end
		removeEventHandler("onClientCursorMove",rootElement, freecamMouse)
        toggleAllControls(true)
		if not dontChangeFixedMode then
			setCameraTarget( localPlayer )
		end
		
		return true
	end
	return false
end 

Lua online compiler

Write, Run & Share Lua code online using OneCompiler's Lua online compiler for free. It's one of the robust, feature-rich online compilers for Lua language, running the latest Lua version 5.4. Getting started with the OneCompiler's Lua editor is easy and fast. The editor shows sample boilerplate code when you choose language as Lua and start coding.

Taking inputs (stdin)

OneCompiler's Lua online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample Lua program which takes name as input and prints hello message with your name.

name = io.read("*a")
print ("Hello ", name)

About Lua

Lua is a light weight embeddable scripting language which is built on top of C. It is used in almost all kind of applications like games, web applications, mobile applications, image processing etc. It's a very powerful, fast, easy to learn, open-source scripting language.

Syntax help

Variables

  • By default all the variables declared are global variables
  • If the variables are explicitly mentioned as local then they are local variables.
  • Lua is a dynamically typed language and hence only the values will have types not the variables.

Examples

-- global variables
a = 10

-- local variables

local x = 30
Value TypeDescription
numberRepresents numbers
stringRepresents text
nilDifferentiates values whether it has data or not
booleanValue can be either true or false
functionRepresents a sub-routine
userdataRepresents arbitary C data
threadRepresents independent threads of execution.
tableCan hold any value except nil

Loops

1. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(condition)
do
--code
end

2. Repeat-Until:

Repeat-Until is also used to iterate a set of statements based on a condition. It is very similar to Do-While, it is mostly used when you need to execute the statements atleast once.

repeat
   --code
until( condition )

3. For:

For loop is used to iterate a set of statements based on a condition.

for init,max/min value, increment
do
   --code
end

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increase re-usuability and modularity.

optional_function_scope function function_name( argument1, argument2, argument3........, argumentn)
--code
return params with comma seperated
end