EasyLua V1
Key Required VerifiedUniversal

EasyLua V1

Universal Scriptvxstyvxsty 72.2K views 440 executesUpdated Feb 18, 2025
1.7/ 5(35 votes)
122334% Positive
Lua Script•246 lines (9100 chars)
--[[
    (BEFORE YOU READ THE REST, I WANTED TO TELL YOU THAT JESUS LOVES YOU)
    EasyLua is a script made to help new roblox exploiters, providing them with functions like DownloadImage, comments that guide them through the script.

    How to use this script?

    local API = loadstring(game:HttpGet(ScriptUrl))()

    And then you can use the API's functions like you see them.
    Made by ballsman3761 on discord.
]]

--* Services

local HttpService = game:GetService("HttpService")

--^ Variables (Localization for performance, because using string.find multiple times is slower than doing local v1 = string.find and using v1):

local string, table, task, Instance, game, debug = string, table, task, Instance, workspace.Parent, debug

local find, gsub, sub, rep, format, match, gmatch, split, byte, char, lower, upper = string.find, string.gsub, string.sub, string.rep, string.format, string.match, string.gmatch, string.split, string.byte, string.char, string.lower, string.upper
local tfind, tinsert, tconcat, tunpack, tclear = table.find, table.insert, table.concat, table.unpack, table.clear

local Instance_new = Instance.new

local UDim2_fromOffset = UDim2.fromOffset
local deg, sqrt, atan2, random, clamp, min, max = math.deg, math.sqrt, math.atan2, math.random, math.clamp, math.min, math.max

--& Lua(u) Globals

local pcall, next, tostring, tonumber, assert, typeof, tick, setfenv, getfenv, getmetatable, setmetatable, error, newproxy = pcall, next, tostring, tonumber, assert, typeof, tick, setfenv, getfenv, getmetatable, setmetatable, error, newproxy
local wait, spawn, delay = task.wait, task.spawn, task.delay

local API = {
    Version = "1.0.1"
}

local Request = (syn and syn.request or fluxus and fluxus.request or http and http.request or request or function(Args) -- HTTP Request function for low level executors.
        -- Args: {Url: string, Method: string, Headers: table | nil, Body: string | nil}
        Args = Args or {};
        local Url, Method, Headers, Body = Args.Url, Args.Method, Args.Headers, Args.Body

        --! Assertions
        assert(Url, "Missing request url.")
        assert(Method, "Missing request method.")

        --* Main Function

        local Content = {}

        HttpService:RequestInternal({
            Url = Url,
            Method = Method,
            Headers = Headers,
            Body = Body
        }):Start(function(Success, Returned)
            Content = Returned
            Content.Success = Success
        end)

        repeat
            wait()
        until
            Content.Success ~= nil

        return Content;
    end)

function API:DownloadImage(Url, SaveAs) -- Url is the image you want to download, for example, https://cdn.discordapp.com/avatars/..., SaveAs is the file you want to save it as.
    assert(typeof(Url) == "string", "Invalid argument #1 to DownloadImage, string expected got \"" .. tostring(Url) .. "\"")
    assert(typeof(SaveAs) == "string", "Invalid argument #2 to DownloadImage, string expected got \"" .. tostring(SaveAs) .. "\"")

    writefile(SaveAs, Request({
        Url = Url,
        Method = "GET"
    }).Body) -- Basically, this makes a file with the name being SaveAs's value, And the content being the content of the url given.

    return SaveAs -- Returns the path of the image. (SaveAs)
end

function API:GetImage(Type, Data)
    --[[
        When Type is Url, it will send a GET request to the second parameter and use the content of it,
        When Type is File, it will read the file and use it's content.

        Extra Note:

        I believe the only supported image types as of 18th of february 2025 are .png, .jpg, .ico is unsupported, i don't know about the rest.
    ]]

    assert(typeof(Type) == "string", "Invalid argument #1 to GetImage, string expected got " .. tostring(Type))
    assert(typeof(Data) == "string", "Invalid argument #2 to GetImage, string expected got " .. tostring(Data))

    local File;
    local temp_file_name = HttpService:GenerateGUID(false)
    local use_files = lower(Type) ~= "url"

    File = not use_files and API:DownloadImage(Data, temp_file_name) or Data

    assert(isfile(File), "No file with the path \"" .. File .. "\" found.")

    if not use_files then
        delay(3, function()
            delfile(temp_file_name) -- Delete the file we just created because it's still cached and we can use the image, deleting it gives the user less storage usage & less flooding of their workspace folder.
        end)
    end

    return getcustomasset(File)
end

function API:CreateBridge(Handler)
    --[[
        Okay, this is a little complex for new scripters so i'll try my best to explain it:

        This function creates a bridge, basically something you can GET and POST data from & to, How it works is:

        local Bridge = API:CreateBridge(function(Path, ...) print("Bridge received request, path:",Path,"extra arguments:",...) end)

        This, whenever the Bridge object you created gets a sent a request, Will print what path the request was sent to, and the arguments it had.

        This can be useful for creating memory efficent scripts, like:

        local Bridge = API:CreateBridge(...)

        game.Players.PlayerAdded:Connect(function(plr)
            Bridge:Post("/main", {
                Event = "PlayerAdded",
                Player = plr
            })
        end)

        This can be used for fancy transferring of data across your script, and pretty cool to use.

        To stop the bridge, You're given a key to protect other functions from disabling the bridge, You're given a 128 character long key, and only that key can be used to stop the bridge,

        Syntax:

        local Bridge, Key = ...
        Bridge:Stop(Key)

        If you do:

        Bridge:Stop("hi")

        It will not work, because hi isnt equal to the Key.
    ]]

    local Generated = ""
    local addr = match(tostring(function()end), "0x.+")

    for _ = 1, 4 do Generated = Generated .. HttpService:GenerateGUID(random(1,2) == 2) end

    local Object = newproxy(true)
    
    local Event = Instance_new("BindableEvent")
    
    local Connections = {}
    local Connection;

    Connection = Event.Event:Connect(Handler)

    local mt = {
        __index = {
            Post = function(_, ...)
                return Event:Fire(...)
            end,
            Stop = function(_, ValidationKey)
                if ValidationKey == Generated then
                    Connection:Disconnect()

                    for _, C in next, Connections do
                        C:Disconnect()
                    end

                    tclear(Connections)
                end
            end
        },
        __tostring = function()
            return "Bridge: " .. addr
        end,
        __metatable = "This metatable is protected."
    }

    getmetatable(Object).__index = mt.__index
    getmetatable(Object).__newindex = mt.__newindex
    getmetatable(Object).__tostring = mt.__tostring

    return Object, Generated
end

function API:GetPageContent(Url: string)
    --[[
        Sends a GET request to the given Url
    ]]

    assert(typeof(Url) == "string", "Invalid argument #1 to 'GetPageContent', string expected got " .. typeof(Url))

    return Request({
        Url = Url,
        Method = "GET"
    })
end

function API:GetJSON(Url: string)
    --[[
        Sends a GET request to the given Url, attempts to parse the response as json and returns:
        a, b
        where a is the parsed content (nil if failed), and b is if the script was able to parse the json.
    ]]

    assert(typeof(Url) == "string", "Invalid argument #1 to 'GetPageContent', string expected got " .. typeof(Url))

    local b, a = pcall(HttpService.JSONDecode, HttpService, Request({
        Url = Url,
        Method = "GET"
    }).Body)


    return b and a or nil, b
end

--* File System:

function API:MoveFile(Source: string, To: string, Rename: string | nil, OnlyCopy: boolean | nil)
    --[[
        * Moves a file from the path `Source` to the path `To`, renames the file to `Rename` if given, For example:
        * We have a file in folder1, called passwords.json, we wanna move it to folder2.
        * You do: API:MoveFile("folder1/passwords.json", "folder2")
        * If you wanna rename it aswell, for example: passwords.json -> passwords.txt, just do:
        * API:MoveFile("folder1/passwords.json", "folder2", "passwords.txt")
        * OnlyCopy: If true, then it does not delete the source file, Used for copying files without deleting them.
    ]]

    assert(typeof(Source) == "string", "Invalid argument #1 to 'MoveFile', string expected got " .. typeof(Source))
    assert(typeof(To) == "string", "Invalid argument #2 to 'MoveFile', string expected got " .. typeof(To))
    assert(isfile(Source), "Invalid source! File " .. tostring(Source) .. " does not exist!")

    local FileName = split(gsub(Source, "/", "\\"), "\\")
    FileName = Rename or FileName[#FileName]

    writefile(To .. "/" .. FileName, readfile(Source))
    if not OnlyCopy then delfile(Source) end
end

return API

Features & Information

(BEFORE YOU READ THE REST, I WANTED TO TELL YOU THAT JESUS LOVES YOU) EasyLua is a script made to help new roblox exploiters, providing them with functions like DownloadImage, comments that guide them through the script, Keep in mind this is still V1, I'll add functions like :CreateESP, ... later, I just wanted to showcase what I'm working on. How to use this script? local API = loadstring(game:HttpGet(ScriptUrl))() And then you can use the API's functions like you see them. Made by ballsman3761 on discord. Version 1.0.1: Added API:MoveFile, Added API:GetPageContent, Added API:GetJSON. Docs are in the script.
#free#opensource#beginners#roblox#coding

Community Comments (20)

NegaBoyNegaBoyFeb 18, 2025(edited)

you put it in auto execute ?

debug_coloneldebug_colonelFeb 18, 2025(edited)

@NegaBoy read the description

vxstyvxstyFeb 18, 2025(edited)

@debug_colonel It's not even for a game I don't know what vro is saying 💔

debug_coloneldebug_colonelFeb 18, 2025(edited)

@vxsty also nice script i think it will really help ppl who just started learning LuaU

vxstyvxstyFeb 18, 2025(edited)

@debug_colonel Thank you very much, I don't know what to add more to it though.

annabelmartinverannabelmartinverFeb 18, 2025(edited)

It doesn’t work :(

vxstyvxstyFeb 19, 2025(edited)

@annabelmartinver What doesnt

NolanzNolanzFeb 20, 2025(edited)

@annabelmartinver It's a guide, not a script to play with

alimkulovalimkulovFeb 20, 2025(edited)

Wow, you'll literally make half the scripts from the entire library, like a toolbox on the hands of a beginner!

ssukhitassukhitaFeb 21, 2025(edited)

where do yall learn to make exploit scripts bro im using ai for it and cant even make * work 💔

AthergamingAthergamingMar 12, 2025(edited)

cool

NegaBoyNegaBoyMar 22, 2025(edited)

are you supposed to read this script ? 😭

MalrousMalrousApr 1, 2025

@vxsty i am trying to make a tool like yours named LuaTools, but the way to add global methods is to store them in a table? for example: table:method(parameter)

zxcvzxcvApr 4, 2025

Nice guide!

vxsty add a do*entation or examples or uses of this

vxstyvxstyApr 8, 2025

@Malrous I don't get what you mean, If you mean like namecalls, Like game:HttpGet, You can do table:method(...), If you mean globals like writefile, getgenv().global_name = value

vxstyvxstyApr 8, 2025

@Haol920 Thank you!

vxstyvxstyApr 8, 2025

@UnnesscaryInventions Its in the script

MalrousMalrousApr 12, 2025

@vxsty Thanks! I knew about making this after my comment but before your reply but that can still help me with later projects!

AxonHubAxonHubJun 30, 2025

Can't really find a use for this

More Scripts for Universal Scripts