├── .gitignore ├── .DS_Store ├── .gitattributes ├── default.project.json ├── main.lua ├── CONTRIBUTING.md ├── Build ├── Header.luau ├── DarkLua.json └── init.luau ├── rokit.toml ├── Src ├── Utils │ ├── Loader.luau │ ├── Connections.luau │ ├── Services.luau │ ├── GUI │ │ ├── Notifiers │ │ │ ├── Linoria.luau │ │ │ └── Doors.luau │ │ ├── Notify.luau │ │ ├── Creator.luau │ │ └── Addons.luau │ ├── Universal │ │ ├── Twerk.luau │ │ ├── Fly.luau │ │ └── ControlModule.luau │ ├── BloxstrapRPC.luau │ ├── Logs.luau │ ├── FileHelper.luau │ └── ExecutorSupport.luau ├── Places │ ├── Utils │ │ ├── 3008 │ │ │ └── ESP.luau │ │ ├── R&D │ │ │ ├── Chat.luau │ │ │ ├── Assets.luau │ │ │ ├── ConnectionsFuncs.luau │ │ │ └── ESP.luau │ │ ├── Template │ │ │ └── ConnectionsFuncs.luau │ │ ├── Universal │ │ │ ├── Assets.luau │ │ │ ├── Player.luau │ │ │ ├── Aimbot.luau │ │ │ ├── ConnectionsFuncs.luau │ │ │ └── ESP.luau │ │ ├── Doors │ │ │ ├── Doors │ │ │ │ ├── Padlock.luau │ │ │ │ ├── Player.luau │ │ │ │ ├── BreakerBox.luau │ │ │ │ ├── Entities.luau │ │ │ │ └── Assets.luau │ │ │ └── Lobby │ │ │ │ └── Preset.luau │ │ └── Babft │ │ │ └── ConnectionsFuncs.luau │ ├── Tabs │ │ ├── 3008 │ │ │ ├── Exploits.luau │ │ │ └── Main.luau │ │ ├── R&D │ │ │ └── Main.luau │ │ ├── Universal │ │ │ ├── Exploits.luau │ │ │ ├── Main.luau │ │ │ └── Visuals.luau │ │ ├── Babft │ │ │ └── Main.luau │ │ └── Doors │ │ │ └── Lobby │ │ │ └── Main.luau │ └── Loaders │ │ ├── Template.luau │ │ ├── Doors │ │ └── Lobby.luau │ │ ├── Babft │ │ └── Babft.luau │ │ ├── Universal.luau │ │ └── R&D │ │ └── R&D.luau ├── Mappings.luau └── init.client.luau ├── .vscode ├── settings.json └── tasks.json ├── LICENSE ├── .github └── workflows │ ├── onchange.yml │ └── release.yml ├── README.md └── .lune ├── task.luau ├── luau.luau ├── stdio.luau ├── regex.luau ├── process.luau ├── serde.luau └── fs.luau /.gitignore: -------------------------------------------------------------------------------- 1 | Distribution 2 | sourcemap.json 3 | tests/ -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mspaint-cc/mspaint/HEAD/.DS_Store -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /default.project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mspaint", 3 | "tree": { 4 | "$path": "Src" 5 | } 6 | } -------------------------------------------------------------------------------- /main.lua: -------------------------------------------------------------------------------- 1 | loadstring(game:HttpGet("https://github.com/notpoiu/mspaint/releases/latest/download/Script.luau"))() -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | when creating commit messages follow the [conventional commits standard](https://www.conventionalcommits.org/en/v1.0.0/). 2 | -------------------------------------------------------------------------------- /Build/Header.luau: -------------------------------------------------------------------------------- 1 | --[[ 2 | This script is NOT intended to be modified. 3 | To view the source code, see the 'Src' folder on the official GitHub repository. 4 | 5 | Authors: upio, deivid, mstudio45 & bacalhauz 6 | GitHub: https://github.com/notpoiu/mspaint 7 | Discord: https://discord.gg/mspaint 8 | --]] -------------------------------------------------------------------------------- /rokit.toml: -------------------------------------------------------------------------------- 1 | # This file lists tools managed by Rokit, a toolchain manager for Roblox projects. 2 | # For more information, see https://github.com/rojo-rbx/rokit 3 | 4 | # New tools can be added by running `rokit add ` in a terminal. 5 | 6 | [tools] 7 | rojo = "rojo-rbx/rojo@7.4.4" 8 | darklua = "seaofvoices/darklua@0.13.1" 9 | lune = "lune-org/lune@0.8.8" 10 | -------------------------------------------------------------------------------- /Src/Utils/Loader.luau: -------------------------------------------------------------------------------- 1 | return function(scriptType: "Utils" | "Tabs", name: string) 2 | local scriptPath = script.Parent.Parent.Places[scriptType][shared.ScriptFolder or "Universal"] 3 | 4 | if shared.Mapping and shared.Mapping["Exclusions"] then 5 | local ExclusionPath = shared.ScriptExclusion or shared.Mapping["Main"] 6 | return require(scriptPath[ExclusionPath][name]) 7 | end 8 | 9 | require(scriptPath[name]) 10 | end -------------------------------------------------------------------------------- /Src/Utils/Connections.luau: -------------------------------------------------------------------------------- 1 | local Connect = {} 2 | shared.Connections = {} 3 | 4 | function Connect:GiveSignal(signal: RBXScriptConnection | RBXScriptSignal) 5 | table.insert(shared.Connections, signal) 6 | end 7 | 8 | function Connect:DisconnectSignal(signal: RBXScriptConnection | RBXScriptSignal) 9 | if not signal then return end 10 | 11 | if signal.Connected then 12 | signal:Disconnect() 13 | end 14 | end 15 | 16 | return Connect -------------------------------------------------------------------------------- /Src/Places/Utils/R&D/Chat.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.Chat(message: string) 10 | local chatEvents = shared.ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents") 11 | local sayMessage = chatEvents and chatEvents:FindFirstChild("SayMessageRequest") 12 | 13 | if sayMessage then 14 | sayMessage:FireServer(message, "All") 15 | end 16 | end -------------------------------------------------------------------------------- /Src/Utils/Services.luau: -------------------------------------------------------------------------------- 1 | local cloneref = (cloneref or function(instance: any) return instance end) 2 | 3 | local Services = {} 4 | function Services:GetService(serviceName: string) 5 | if shared[serviceName] then return shared[serviceName] end 6 | 7 | local service = cloneref(game:GetService(serviceName)) 8 | shared[serviceName] = service 9 | 10 | return service 11 | end 12 | 13 | function Services:GetServices(serviceNames: table) 14 | for _, serviceName: string in ipairs(serviceNames) do 15 | Services:GetService(serviceName) 16 | end 17 | end 18 | 19 | return Services -------------------------------------------------------------------------------- /Src/Places/Utils/R&D/Assets.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.ChildCheck(child) 10 | if not child:IsA("Model") then return end 11 | 12 | if Toggles.BatteryESP.Value and child.Name == "battery" then 13 | Script.Functions.BatteryESP(child) 14 | elseif Toggles.LockerESP.Value and child.Name == "hidelocker" then 15 | Script.Functions.LockerESP(child) 16 | elseif Toggles.TableESP.Value and child.Name == "hidetable" then 17 | Script.Functions.TableESP(child) 18 | end 19 | end -------------------------------------------------------------------------------- /Build/DarkLua.json: -------------------------------------------------------------------------------- 1 | { 2 | "generator": { 3 | "name": "dense", 4 | "column_span": 9999999999 5 | }, 6 | "rules": [ 7 | "convert_local_function_to_assign", 8 | "convert_index_to_field", 9 | "compute_expression", 10 | "group_local_assignment", 11 | "filter_after_early_return", 12 | "remove_comments", 13 | "remove_empty_do", 14 | "remove_function_call_parens", 15 | "remove_nil_declaration", 16 | "remove_method_definition", 17 | "remove_spaces", 18 | "remove_types", 19 | "remove_unused_if_branch", 20 | "remove_unused_variable", 21 | "remove_unused_while", 22 | { 23 | "rule": "rename_variables", 24 | "include_functions": true, 25 | "globals": [ 26 | "$default", 27 | "$roblox" 28 | ] 29 | } 30 | ] 31 | } -------------------------------------------------------------------------------- /Src/Places/Utils/Template/ConnectionsFuncs.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.SetupCharacterConnection(newCharacter) 10 | shared.Character = newCharacter 11 | shared.Humanoid = shared.Character:WaitForChild("Humanoid") 12 | shared.RootPart = shared.Character:WaitForChild("HumanoidRootPart") 13 | end 14 | 15 | function Script.Functions.SetupBloxstrapRPCConnection() 16 | shared.Connect:GiveSignal(shared.Players.PlayerAdded:Connect(function(player) 17 | Script.Functions.UpdateBloxstrapRPC() 18 | end)) 19 | 20 | shared.Connect:GiveSignal(shared.Players.PlayerRemoving:Connect(function(player) 21 | Script.Functions.UpdateBloxstrapRPC() 22 | end)) 23 | end -------------------------------------------------------------------------------- /Src/Mappings.luau: -------------------------------------------------------------------------------- 1 | return { 2 | [2440500124] = { 3 | ["Folder"] = "Doors", 4 | ["Main"] = "Doors", 5 | ["Name"] = "DOORS", 6 | ["Exclusions"] = { 7 | [6516141723] = "Lobby", 8 | [12308344607] = "Lobby" 9 | } 10 | }, 11 | 12 | -- Regular 3008 13 | [1000233041] = { 14 | ["Folder"] = "3008", 15 | ["Main"] = "3008", 16 | ["Name"] = "3008" 17 | }, 18 | 19 | -- 100 Players 3008 20 | [3462404408] = { 21 | ["Folder"] = "3008", 22 | ["Main"] = "3008", 23 | ["Name"] = "3008" 24 | }, 25 | 26 | [2091953627] = { 27 | ["Folder"] = "R&D", 28 | ["Main"] = "R&D", 29 | ["Name"] = "R&D" 30 | }, 31 | 32 | [210851291] = { 33 | ["Folder"] = "Babft", 34 | ["Main"] = "Babft", 35 | ["Name"] = "Build A Boat For Treasure" 36 | } 37 | } -------------------------------------------------------------------------------- /Src/Utils/GUI/Notifiers/Linoria.luau: -------------------------------------------------------------------------------- 1 | local Linoria = {} 2 | 3 | function Linoria:Alert(options) 4 | if not shared.Library then return warn("No Linoria library") end 5 | Linoria:Notify(options) 6 | 7 | if shared.CheckToggle("NotifySound", true) then 8 | local sound = Instance.new("Sound", shared.SoundService) do 9 | sound.SoundId = "rbxassetid://4590662766" 10 | sound.Volume = shared.NotifyVolume 11 | sound.PlayOnRemove = true 12 | sound:Destroy() 13 | end 14 | end 15 | end 16 | 17 | function Linoria:Notify(options) 18 | if not shared.Library then return warn("No Linoria library") end 19 | 20 | options = shared.Script.Functions.EnforceTypes(options, { 21 | Description = "No Message", 22 | Time = 5, 23 | }) 24 | 25 | shared.Library:Notify(options.Description, options.Time) 26 | end 27 | 28 | return Linoria -------------------------------------------------------------------------------- /Src/Utils/Universal/Twerk.luau: -------------------------------------------------------------------------------- 1 | local Twerk = { 2 | TwerkAnimation = nil, 3 | TwerkTrack = nil, 4 | } 5 | 6 | function Twerk:Setup() 7 | if not Twerk.TwerkAnimation then 8 | Twerk.TwerkAnimation = Instance.new("Animation") 9 | Twerk.TwerkAnimation.AnimationId = "rbxassetid://12874447851" 10 | end 11 | if not shared.Humanoid then return end 12 | 13 | Twerk.TwerkTrack = shared.Humanoid:LoadAnimation(Twerk.TwerkAnimation) 14 | Twerk.TwerkTrack.Looped = true 15 | end 16 | 17 | function Twerk:Set(value: boolean) 18 | if not shared.Humanoid then return end 19 | 20 | if not Twerk.TwerkAnimation then Twerk:Setup() end 21 | if not Twerk.TwerkTrack then return end 22 | 23 | if value then 24 | Twerk.TwerkTrack:Play() 25 | else 26 | Twerk.TwerkTrack:Stop() 27 | end 28 | end 29 | 30 | function Twerk:Enable() Twerk:Set(true) end 31 | function Twerk:Disable() Twerk:Set(false) end 32 | 33 | return Twerk -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "luau-lsp.sourcemap.rojoProjectFile": "default.project.json", 3 | "luau-lsp.sourcemap.enabled": true, 4 | "luau-lsp.require.mode": "relativeToFile", 5 | "luau-lsp.require.directoryAliases": { 6 | "@lune": ".lune" 7 | }, 8 | "luau-lsp.types.definitionFiles": [".vscode/exploitTypes.d.luau"], 9 | "luau-lsp.plugin.maximumRequestBodySize": "256mb", 10 | "luau-lsp.types.robloxSecurityLevel": "RobloxScriptSecurity", 11 | "luau-lsp.sourcemap.autogenerate": true, 12 | "luau-lsp.sourcemap.includeNonScripts": true, 13 | "luau-lsp.ignoreGlobs": [ 14 | 15 | ], 16 | "rerun.command": "lune run Build bundle input='default.project.json' minify=true output='Distribution/Script.luau' env-name='Script' darklua-config-path='Build/DarkLua.json' temp-dir-base='Distribution' verbose=true", 17 | "robloxLsp.diagnostics.globals": [ 18 | "firesignal", 19 | "wax", 20 | "getgenv" 21 | ] 22 | } -------------------------------------------------------------------------------- /Src/Places/Utils/Universal/Assets.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.ChildCheck(child) 10 | if not (child:IsA("BasePart") or child:IsA("Decal")) then 11 | return 12 | end 13 | 14 | if child:IsA("BasePart") then 15 | if Toggles.AntiLag.Value then 16 | if not child:GetAttribute("Material") then child:SetAttribute("Material", child.Material) end 17 | if not child:GetAttribute("Reflectance") then child:SetAttribute("Reflectance", child.Reflectance) end 18 | 19 | child.Material = Enum.Material.Plastic 20 | child.Reflectance = 0 21 | end 22 | elseif child:IsA("Decal") and Toggles.AntiLag.Value then 23 | if not child:GetAttribute("Transparency") then child:SetAttribute("Transparency", child.Transparency) end 24 | child.Transparency = 1 25 | end 26 | end 27 | 28 | -------------------------------------------------------------------------------- /Src/Places/Utils/Universal/Player.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.DistanceFromCharacter(position: Instance | Vector3, getPositionFromCamera: boolean | nil) 10 | if not position then return 9e9 end 11 | if typeof(position) == "Instance" then 12 | position = position:GetPivot().Position 13 | end 14 | 15 | if getPositionFromCamera and (shared.Camera or workspace.CurrentCamera) then 16 | local cameraPosition = if shared.Camera then shared.Camera.CFrame.Position else workspace.CurrentCamera.CFrame.Position 17 | 18 | return (cameraPosition - position).Magnitude 19 | end 20 | 21 | if shared.RootPart then 22 | return (shared.RootPart.Position - position).Magnitude 23 | elseif shared.Camera then 24 | return (shared.Camera.CFrame.Position - position).Magnitude 25 | end 26 | 27 | return 9e9 28 | end -------------------------------------------------------------------------------- /Src/Utils/BloxstrapRPC.luau: -------------------------------------------------------------------------------- 1 | local BloxstrapRPC = {} 2 | 3 | type RichPresence = { 4 | details: string?, 5 | state: string?, 6 | timeStart: number?, 7 | timeEnd: number?, 8 | smallImage: RichPresenceImage?, 9 | largeImage: RichPresenceImage? 10 | } 11 | 12 | type RichPresenceImage = { 13 | assetId: number?, 14 | hoverText: string?, 15 | clear: boolean?, 16 | reset: boolean? 17 | } 18 | 19 | function BloxstrapRPC.SendMessage(command: string, data: any) 20 | local json = shared.HttpService:JSONEncode({ 21 | command = command, 22 | data = data 23 | }) 24 | 25 | print("[BloxstrapRPC] " .. json) 26 | end 27 | 28 | function BloxstrapRPC.SetRichPresence(data: RichPresence) 29 | if data.timeStart ~= nil then 30 | data.timeStart = math.round(data.timeStart) 31 | end 32 | 33 | if data.timeEnd ~= nil then 34 | data.timeEnd = math.round(data.timeEnd) 35 | end 36 | 37 | BloxstrapRPC.SendMessage("SetRichPresence", data) 38 | end 39 | 40 | return BloxstrapRPC -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "[mspaint] Clean Distribution", 6 | "type": "shell", 7 | "command": "rm -f Distribution/Script.luau", 8 | "windows": { 9 | "options": { 10 | "shell": { 11 | "executable": "C:\\Windows\\System32\\cmd.exe", 12 | "args": ["/c"] 13 | } 14 | }, 15 | "command": "del /q /s Distribution\\*", 16 | }, 17 | "problemMatcher": [] 18 | }, 19 | { 20 | "label": "[mspaint] Windows - Build script", 21 | "type": "shell", 22 | "command": "lune run Build bundle input=\"default.project.json\" minify=false output=\"Distribution/Script.luau\" env-name=\"Script\" darklua-config-path=\"Build/DarkLua.json\" temp-dir-base=\"Distribution\" verbose=true", 23 | "group": { 24 | "kind": "build", 25 | "isDefault": true 26 | }, 27 | "options": { 28 | "cwd": "${workspaceFolder}" 29 | }, 30 | "dependsOn": "[mspaint] Clean Distribution" 31 | } 32 | ] 33 | } 34 | 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 upio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Build/init.luau: -------------------------------------------------------------------------------- 1 | --[[ 2 | Wax - A Fast Runtime-Based Lua 5.1x+/Luau Project Bundler, Using Roblox Models and Module-Require Semantics 3 | MIT License | Copyright (c) 2023-2024 Latte Softworks 4 | ]] 5 | 6 | -- You set the following string to "latest" (case insensitive), or any version tag 7 | -- on Wax's releases page (e.g. "0.4.1") 8 | local WaxVersion = "latest" 9 | 10 | ------------------------------------------------------------------------------- 11 | 12 | local Network, Luau, FileSystem = require("@lune/net"), require("@lune/luau"), require("@lune/fs") 13 | 14 | local FileLink = if string.lower(WaxVersion) == "latest" then 15 | "https://github.com/latte-soft/wax/releases/latest/download/wax.luau" 16 | else `https://github.com/latte-soft/wax/releases/download/{WaxVersion}/wax.luau` 17 | 18 | if not FileSystem.isDir("Distribution") then 19 | FileSystem.writeDir("Distribution") 20 | end 21 | 22 | Luau.load(Network.request(FileLink).body, { 23 | debugName = "Wax", 24 | })() 25 | 26 | FileSystem.writeFile("Distribution/Script.luau", `{FileSystem.readFile("Build/Header.luau")}\n\n{FileSystem.readFile("Distribution/Script.luau")}`) -------------------------------------------------------------------------------- /Src/Utils/GUI/Notify.luau: -------------------------------------------------------------------------------- 1 | local Notify = {} 2 | 3 | local Linoria = require("Notifiers/Linoria") 4 | local Doors = require("Notifiers/Doors") 5 | 6 | function Notify:Notify(options) 7 | if shared.NotifyStyle == "Linoria" or options.ForceLinoria == true then 8 | local linoriaMessage = options["LinoriaMessage"] or options.Description 9 | options.Description = linoriaMessage 10 | 11 | Linoria:Notify(options) 12 | elseif shared.NotifyStyle == "Doors" and shared.ScriptName == "DOORS" then 13 | options["Warning"] = nil 14 | Doors:Notify(options) 15 | end 16 | end 17 | 18 | function Notify:Alert(options) 19 | if shared.NotifyStyle == "Linoria" or options.ForceLinoria == true then 20 | local linoriaMessage = options["LinoriaMessage"] or options.Description 21 | options.Description = linoriaMessage 22 | 23 | Linoria:Alert(options) 24 | elseif shared.NotifyStyle == "Doors" and shared.ScriptName == "DOORS" then 25 | if options.Warning then 26 | options["Warning"] = nil 27 | Doors:Alert(options) 28 | else 29 | Doors:Notify(options) 30 | end 31 | end 32 | end 33 | 34 | function Notify:Log(options) Notify:Notify(options) end 35 | 36 | return Notify -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Doors/Padlock.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.GetPadlockCode(paper: Tool) 10 | if paper:FindFirstChild("UI") then 11 | local code = {} 12 | 13 | for _, image: ImageLabel in pairs(paper.UI:GetChildren()) do 14 | if image:IsA("ImageLabel") and tonumber(image.Name) then 15 | code[image.ImageRectOffset.X .. image.ImageRectOffset.Y] = {tonumber(image.Name), "_"} 16 | end 17 | end 18 | 19 | for _, image: ImageLabel in pairs(shared.PlayerGui.PermUI.Hints:GetChildren()) do 20 | if image.Name == "Icon" then 21 | if code[image.ImageRectOffset.X .. image.ImageRectOffset.Y] then 22 | code[image.ImageRectOffset.X .. image.ImageRectOffset.Y][2] = image.TextLabel.Text 23 | end 24 | end 25 | end 26 | 27 | local normalizedCode = {} 28 | for _, num in pairs(code) do 29 | normalizedCode[num[1]] = num[2] 30 | end 31 | 32 | return table.concat(normalizedCode) 33 | end 34 | 35 | return "_____" 36 | end -------------------------------------------------------------------------------- /.github/workflows/onchange.yml: -------------------------------------------------------------------------------- 1 | name: Pushed 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**.luau' 7 | - '**.lua' 8 | - '**.rbxm' 9 | - '**.json' 10 | pull_request: 11 | paths: 12 | - '**.luau' 13 | - '**.lua' 14 | - '**.rbxm' 15 | - '**.json' 16 | 17 | permissions: 18 | contents: write 19 | 20 | jobs: 21 | build: 22 | name: Bundle Script 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | with: 27 | submodules: true 28 | 29 | - name: Setup RoKit 30 | uses: CompeyDev/setup-rokit@v0.1.2 31 | 32 | - name: Install Necessary Tools 33 | run: | 34 | rokit trust rojo-rbx/rojo 35 | rokit trust lune-org/lune 36 | rokit trust seaofvoices/darklua 37 | rokit install 38 | 39 | - name: Bundle 40 | run: lune run Build bundle input='default.project.json' minify=false output='Distribution/Script.luau' env-name='Script' darklua-config-path='Build/DarkLua.json' temp-dir-base='Distribution' verbose=true ci-mode=true 41 | 42 | - name: Upload Minified Script to Artifacts 43 | uses: actions/upload-artifact@v4 44 | with: 45 | name: Script.luau 46 | path: Distribution/Script.luau 47 | -------------------------------------------------------------------------------- /Src/Places/Tabs/R&D/Main.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | Script.LastSpeed = if shared.Humanoid then shared.Humanoid.WalkSpeed else 16 10 | 11 | --// Main \\-- 12 | local PlayerGroupBox = Tabs.Main:AddLeftGroupbox("Player") do 13 | PlayerGroupBox:AddToggle("SpeedHack", { 14 | Text = "Speed Hack", 15 | Default = false 16 | }) 17 | 18 | PlayerGroupBox:AddSlider("WalkSpeed", { 19 | Text = "Walk Speed", 20 | Default = 16, 21 | Min = 0, 22 | Max = 75, 23 | Rounding = 0, 24 | Compact = true 25 | }) 26 | 27 | PlayerGroupBox:AddDivider() 28 | 29 | PlayerGroupBox:AddToggle("InfStamina", { 30 | Text = "Infinite Stamina", 31 | Default = false, 32 | Visible = wax.shared.ExecutorSupport["getrenv"] 33 | }) 34 | 35 | PlayerGroupBox:AddToggle("InfFlashlight", { 36 | Text = "Infinite Flashlight", 37 | Default = false, 38 | Visible = wax.shared.ExecutorSupport["getrenv"] 39 | }) 40 | end 41 | 42 | --// Player \\-- 43 | Toggles.SpeedHack:OnChanged(function(value) 44 | if not shared.Humanoid then return end 45 | 46 | if value then 47 | Script.LastSpeed = shared.Humanoid.WalkSpeed 48 | end 49 | 50 | shared.Humanoid.WalkSpeed = if value then Options.WalkSpeed.Value else Script.LastSpeed 51 | end) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mspaint 2 | > [!IMPORTANT] 3 | > This version is deprecated. Join our Discord server at https://mspaint.cc/ to get the new version. 4 | 5 | A decent script hub that *was* free and open source 6 | 7 | ```lua 8 | -- THIS IS THE OLD SCRIPT, WE DO NOT ADVISE YOU USING THIS AS OVER TIME STUFF WILL GET PATCHED 9 | loadstring(game:HttpGet("https://raw.githubusercontent.com/notpoiu/mspaint/main/main.lua"))() 10 | ``` 11 | 12 | **Links**: 13 | - [🌐 Website](https://www.mspaint.cc/) 14 | - [💬 Discord](https://discord.gg/mspaint) 15 | 16 | # Addons 17 | You can find documentation on how to create an addon here: https://docs.upio.dev/mspaint/addons/getting_started 18 | 19 | # Website 20 | our website is at https://www.mspaint.cc (source code here at https://github.com/notpoiu/webmspaint) 21 | 22 | ## Bundling mspaint via wax 23 | To bundle all the scripts, you have to follow these steps: 24 | 25 | 1. Install [rokit](https://github.com/rojo-rbx/rokit) if you haven't already 26 | 2. Open Powershell or the command-line shell of your liking and [cd to this repository](https://www.quora.com/What-does-it-mean-to-CD-into-a-directory-and-how-can-I-do-that-Can-someone-explain-it-in-a-laymans-term) 27 | 3. Run `rokit install` and wait for it to install all the dependencies 28 | 4. Run `lune run Build bundle input='default.project.json' minify=false output='Distribution/Script.luau' env-name="Script" darklua-config-path="Build/DarkLua.json" temp-dir-base="Distribution" verbose=true` 29 | 30 | You can find the bundled script in `/Distribution/Script.luau`. 31 | -------------------------------------------------------------------------------- /Src/Utils/Logs.luau: -------------------------------------------------------------------------------- 1 | local Logs = { 2 | Debug = true, --or getgenv().mspaint_dev_mode, 3 | 4 | FirstTime = true, 5 | Folder = "mspaint/logs", 6 | FileName = nil 7 | } 8 | Logs.FileHelper = wax.shared.FileHelper.new(Logs.Folder) 9 | 10 | --// Functions \\-- 11 | function TableToMessage(tbl: table) 12 | for idx, val in ipairs(tbl) do 13 | tbl[idx] = tostring(val) 14 | end 15 | 16 | return table.concat(tbl, " ") 17 | end 18 | 19 | function GenerateLogFileName() 20 | local date = os.date("*t") 21 | return string.format( 22 | "log_%04d-%02d-%02d_%02d-%02d-%02d.log", 23 | date.year, date.month, date.day, 24 | date.hour, date.min, date.sec 25 | ) 26 | end 27 | 28 | function Log(prefix: string, func, ...) 29 | local message = string.format("[%s] ", prefix) .. TableToMessage({ ... }) 30 | local printer = func or print 31 | printer(message) 32 | 33 | task.spawn(function() 34 | if wax.shared.ExecutorSupport["_SupportsFileSystem"] then 35 | if not Logs.FileName then 36 | Logs.FileName = GenerateLogFileName() 37 | end 38 | 39 | Logs.FileHelper.AppendFile(Logs.FileName, message) 40 | end 41 | end) 42 | end 43 | 44 | function Logs:Log(...) Log("INFO", print, ...) end 45 | function Logs:Warn(...) Log("WARN", warn, ...) end 46 | function Logs:Error(...) Log("ERROR", error, ...) end 47 | function Logs:Debug(...) 48 | if not Logs.Debug then return end 49 | Log("DEBUG", print, ...) 50 | end 51 | 52 | return Logs -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Doors/Player.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.DistanceFromCharacter(position: Instance | Vector3, getPositionFromCamera: boolean | nil) 10 | if not position then return 9e9 end 11 | if typeof(position) == "Instance" then 12 | position = position:GetPivot().Position 13 | end 14 | 15 | if getPositionFromCamera and (shared.Camera or workspace.CurrentCamera) then 16 | local cameraPosition = if shared.Camera then shared.Camera.CFrame.Position else workspace.CurrentCamera.CFrame.Position 17 | 18 | return (cameraPosition - position).Magnitude 19 | end 20 | 21 | if shared.RootPart then 22 | return (shared.RootPart.Position - position).Magnitude 23 | elseif shared.Camera then 24 | return (shared.Camera.CFrame.Position - position).Magnitude 25 | end 26 | 27 | return 9e9 28 | end 29 | 30 | function Script.Functions.IsInViewOfPlayer(instance: Instance, range: number | nil, exclude: table | nil) 31 | if not instance then return false end 32 | if not Script.Collision then return false end 33 | 34 | local raycastParams = RaycastParams.new() 35 | raycastParams.FilterType = Enum.RaycastFilterType.Exclude 36 | 37 | local filter = exclude or {} 38 | table.insert(filter, shared.Character) 39 | 40 | raycastParams.FilterDescendantsInstances = filter 41 | 42 | local direction = (instance:GetPivot().Position - Script.Collision.Position).unit * (range or 9e9) 43 | local raycast = workspace:Raycast(Script.Collision.Position, direction, raycastParams) 44 | 45 | if raycast and raycast.Instance then 46 | if raycast.Instance:IsDescendantOf(instance) or raycast.Instance == instance then 47 | return true 48 | end 49 | 50 | return false 51 | end 52 | 53 | return false 54 | end -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | version: 7 | description: 'Version of this release (e.g. v3.0)' 8 | required: true 9 | default: '3.0' 10 | summary: 11 | description: 'Summary of this release' 12 | required: true 13 | default: 'Initial release' 14 | push: 15 | tags: ["v*.*.*"] 16 | 17 | permissions: 18 | contents: write 19 | 20 | jobs: 21 | create-release: 22 | name: Create Release and install Rokit 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | 27 | - name: Create Release 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | run: | 31 | gh release create v${{ github.event.inputs.version }} --title "${{ github.event.inputs.version }}" --notes "${{ github.event.inputs.summary }}" --latest 32 | 33 | build-script: 34 | needs: ["create-release"] 35 | name: Bundle Script 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | with: 40 | submodules: true 41 | 42 | - name: Setup RoKit 43 | uses: CompeyDev/setup-rokit@v0.1.2 44 | 45 | - name: Install Necessary Tools 46 | run: | 47 | rokit trust rojo-rbx/rojo 48 | rokit trust lune-org/lune 49 | rokit trust seaofvoices/darklua 50 | rokit install 51 | 52 | - name: Bundle 53 | run: lune run Build bundle input='default.project.json' minify=true output='Distribution/Script.luau' env-name='Script' darklua-config-path='Build/DarkLua.json' temp-dir-base='Distribution' verbose=true ci-mode=true 54 | 55 | - name: Upload Minified Script to Release 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | run: | 59 | gh release upload v${{ github.event.inputs.version }} "Distribution/Script.luau" 60 | 61 | - name: Upload Minified Script to Artifacts 62 | uses: actions/upload-artifact@v4 63 | with: 64 | name: Script.luau 65 | path: Distribution/Script.luau -------------------------------------------------------------------------------- /Src/Places/Tabs/Universal/Exploits.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | --// Exploits \\-- 10 | local AimbotGroupBox = Tabs.Exploits:AddLeftGroupbox("Aimbot") do 11 | AimbotGroupBox:AddToggle("EnableAimbot", { 12 | Text = "Enable Aimbot", 13 | Default = false 14 | }):AddKeyPicker("EnableAimbotKey", { 15 | Mode = shared.Library.IsMobile and "Toggle" or "Hold", 16 | Default = "MB2", 17 | Text = "Enable Aimbot", 18 | SyncToggleState = shared.Library.IsMobile 19 | }) 20 | 21 | AimbotGroupBox:AddToggle("AimbotSmooth", { 22 | Text = "Enable Aimbot Smoothness", 23 | Default = false 24 | }) 25 | 26 | AimbotGroupBox:AddSlider("AimbotSmoothness", { 27 | Text = "Smoothness", 28 | Default = 20, 29 | Min = 0, 30 | Max = 100, 31 | Rounding = 0, 32 | Compact = true 33 | }) 34 | 35 | AimbotGroupBox:AddDropdown("AimbotTargetPart", { 36 | AllowNull = false, 37 | Values = {"Head", "HumanoidRootPart"}, 38 | Default = "Head", 39 | Multi = false, 40 | 41 | Text = "Target Part" 42 | }) 43 | 44 | AimbotGroupBox:AddDropdown("AimbotClosestMethod", { 45 | AllowNull = false, 46 | Values = {"Mouse", "Character"}, 47 | Default = "Mouse", 48 | Multi = false, 49 | 50 | Text = "Get Closest From" 51 | }) 52 | 53 | AimbotGroupBox:AddDivider() 54 | 55 | AimbotGroupBox:AddToggle("AimbotTeam", { 56 | Text = "Team Check", 57 | Default = false 58 | }) 59 | AimbotGroupBox:AddToggle("AimbotWall", { 60 | Text = "Wall Check", 61 | Default = false 62 | }) 63 | end 64 | 65 | local TrollingGroupBox = Tabs.Exploits:AddRightGroupbox("Trolling") do 66 | TrollingGroupBox:AddToggle("Twerk", { 67 | Text = "Twerk", 68 | Default = false 69 | }) 70 | end 71 | 72 | 73 | Toggles.Twerk:OnChanged(function(value) 74 | shared.Twerk:Set(value) 75 | end) -------------------------------------------------------------------------------- /Src/Places/Utils/R&D/ConnectionsFuncs.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.SetupCharacterConnection(newCharacter) 10 | shared.Character = newCharacter 11 | shared.Humanoid = shared.Character:WaitForChild("Humanoid") 12 | shared.RootPart = shared.Character:WaitForChild("HumanoidRootPart") 13 | end 14 | 15 | function Script.Functions.SetupLightingConnection() 16 | shared.Connect:GiveSignal(shared.Lighting:GetPropertyChangedSignal("Ambient"):Connect(function() 17 | if shared.Lighting.Ambient ~= Script.CurrentAmbient and shared.Lighting.Ambient ~= Color3.new(1, 1, 1) then 18 | Script.CurrentAmbient = shared.Lighting.Ambient 19 | end 20 | 21 | if Toggles.Fullbright.Value then 22 | shared.Lighting.Ambient = Color3.new(1, 1, 1) 23 | end 24 | end)) 25 | 26 | shared.Connect:GiveSignal(shared.Lighting.ChildAdded:Connect(function(child) 27 | if Toggles.NoBlur.Value and child:IsA("Blur") then 28 | child.Enabled = false 29 | end 30 | end)) 31 | end 32 | 33 | function Script.Functions.SetupRoomConnection(room) 34 | if Script.LoadedRooms[room] then return end 35 | Script.LoadedRooms[room] = true 36 | 37 | if Toggles.DoorESP.Value then 38 | Script.Functions.DoorESP(room) 39 | end 40 | 41 | for _, child in pairs(room:GetDescendants()) do 42 | task.spawn(Script.Functions.ChildCheck, child) 43 | end 44 | 45 | shared.Connections[room] = room.DescendantAdded:Connect(function(child) 46 | task.delay(0.1, Script.Functions.ChildCheck, child) 47 | end) 48 | end 49 | 50 | function Script.Functions.SetupUIConnection(GUI) 51 | Script.MainUI = GUI or shared.PlayerGui:WaitForChild("MainGui") 52 | 53 | if Toggles.NoFlashlightShadow.Value then 54 | local slender = Script.MainUI:WaitForChild("slender") 55 | if slender then 56 | slender.ImageTransparency = 1 57 | for _, bar in pairs(slender:GetChildren()) do 58 | bar.Visible = false 59 | end 60 | end 61 | end 62 | end -------------------------------------------------------------------------------- /Src/Utils/Universal/Fly.luau: -------------------------------------------------------------------------------- 1 | local Fly = { 2 | FlyBody = nil, 3 | FlyGyro = nil, 4 | Enabled = false, 5 | Speed = 15 6 | } 7 | 8 | function Fly:Setup() 9 | local flyBody = Instance.new("BodyVelocity") 10 | flyBody.Velocity = Vector3.zero 11 | flyBody.MaxForce = Vector3.one * 9e9 12 | 13 | local flyGyro = Instance.new("BodyGyro") 14 | flyGyro.P = 9e4 15 | flyGyro.MaxTorque = Vector3.one * 9e9 16 | 17 | Fly.FlyBody = flyBody 18 | Fly.FlyGyro = flyGyro 19 | 20 | shared.Connections["Fly"] = shared.RunService.RenderStepped:Connect(function() 21 | if not Fly.Enabled or (if shared.Library then shared.Library.Unloaded == true else true) then return end 22 | 23 | local velocity = Vector3.zero 24 | local moveVector = shared.ControlModule:GetMoveVector() 25 | velocity = -((shared.Camera.CFrame.LookVector * moveVector.Z) - (shared.Camera.CFrame.RightVector * moveVector.X)) 26 | 27 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.Space) then velocity += shared.Camera.CFrame.UpVector end 28 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then velocity -= shared.Camera.CFrame.UpVector end 29 | 30 | Fly.FlyBody.Velocity = velocity * Fly.Speed 31 | Fly.FlyGyro.CFrame = shared.Camera.CFrame 32 | end) 33 | end 34 | 35 | function Fly:Stop() 36 | if shared.Humanoid then shared.Humanoid.PlatformStand = false end 37 | 38 | shared.Connect:DisconnectSignal(shared.Connections["Fly"]) 39 | if Fly.FlyBody then Fly.FlyBody:Destroy() end 40 | if Fly.FlyGyro then Fly.FlyGyro:Destroy() end 41 | end 42 | 43 | function Fly:Set(value: boolean) 44 | if not shared.RootPart then 45 | return warn("shared.RootPart is nil.") 46 | end 47 | 48 | Fly.Enabled = value 49 | if shared.Humanoid then shared.Humanoid.PlatformStand = value end 50 | Fly.FlyBody.Parent = if value then shared.RootPart else nil 51 | Fly.FlyGyro.Parent = if value then shared.RootPart else nil 52 | end 53 | 54 | function Fly:Enable() Fly:Set(true) end 55 | function Fly:Disable() Fly:Set(false) end 56 | function Fly:Toggle() Fly:Set(not Fly.Enabled) end 57 | 58 | function Fly:SetSpeed(speed: number) 59 | Fly.Speed = speed 60 | end 61 | 62 | return Fly -------------------------------------------------------------------------------- /Src/Places/Utils/Babft/ConnectionsFuncs.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.SetupCharacterConnection(newCharacter) 10 | shared.Character = newCharacter 11 | shared.Humanoid = shared.Character:WaitForChild("Humanoid") 12 | if shared.Humanoid then 13 | Script.LastSpeed = shared.Humanoid.WalkSpeed 14 | 15 | shared.Twerk:Setup() 16 | if Toggles.Twerk.Value then 17 | shared.Twerk:Enable() 18 | end 19 | 20 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("WalkSpeed"):Connect(function() 21 | if shared.Humanoid.WalkSpeed ~= Options.WalkSpeed.Value then 22 | Script.LastSpeed = shared.Humanoid.WalkSpeed 23 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = Options.WalkSpeed.Value end 24 | end 25 | end)) 26 | 27 | 28 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("JumpPower"):Connect(function() 29 | if not shared.Humanoid.UseJumpPower then return end 30 | if shared.Humanoid.JumpPower ~= Options.JumpPower.Value then 31 | Script.LastJumpPower = shared.Humanoid.JumpPower 32 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpPower = Options.JumpPower.Value end 33 | end 34 | end)) 35 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("JumpHeight"):Connect(function() 36 | if shared.Humanoid.UseJumpPower then return end 37 | if shared.Humanoid.JumpHeight ~= Options.JumpPower.Value then 38 | Script.LastJumpPower = shared.Humanoid.JumpHeight 39 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpHeight = Options.JumpPower.Value end 40 | end 41 | end)) 42 | end 43 | 44 | shared.RootPart = shared.Character:WaitForChild("HumanoidRootPart") 45 | 46 | task.delay(0.25, Script.Functions.AutoFarm) 47 | end 48 | 49 | function Script.Functions.SetupBloxstrapRPCConnection() 50 | shared.Connect:GiveSignal(shared.Players.PlayerAdded:Connect(function(player) 51 | Script.Functions.UpdateBloxstrapRPC() 52 | end)) 53 | 54 | shared.Connect:GiveSignal(shared.Players.PlayerRemoving:Connect(function(player) 55 | Script.Functions.UpdateBloxstrapRPC() 56 | end)) 57 | end -------------------------------------------------------------------------------- /Src/Utils/FileHelper.luau: -------------------------------------------------------------------------------- 1 | local FileHelper = {} 2 | 3 | function FileHelper.new(basepath: string) 4 | local self = setmetatable({}, { 5 | __index = function(self, key) 6 | local accessed = rawget(self, key) 7 | 8 | if typeof(accessed) == "function" then 9 | return function(...) 10 | if not shared.ExecutorSupport["_SupportsFileSystem"] then return end 11 | 12 | return accessed(self, ...) 13 | end 14 | end 15 | 16 | return accessed 17 | end 18 | }) 19 | 20 | self.BasePath = basepath 21 | 22 | self.BuildPresetStructure = function() 23 | if not isfolder(self.BasePath) then 24 | makefolder(self.BasePath) 25 | end 26 | end 27 | 28 | self.CreateFile = function(name: string, data: string) 29 | self.BuildPresetStructure() 30 | writefile(self.BasePath .. "/" .. name, data) 31 | end 32 | 33 | self.AppendFile = function(name: string, data: string) 34 | self.BuildPresetStructure() 35 | appendfile(self.BasePath .. "/" .. name, data) 36 | end 37 | 38 | self.GetFiles = function() 39 | return listfiles(self.BasePath) 40 | end 41 | 42 | self.ReadFile = function(name: string) 43 | return readfile(self.BasePath .. "/" .. name) 44 | end 45 | 46 | self.IsFile = function(name: string) 47 | return isfile(self.BasePath .. "/" .. name) 48 | end 49 | 50 | self.DeleteFile = function(name: string) 51 | delfile(self.BasePath .. "/" .. name) 52 | end 53 | 54 | self.GetFilesClean = function() 55 | local files = {} 56 | for _, file in pairs(listfiles(self.BasePath)) do 57 | local name = FileHelper.GetFileNameFromPath(file) 58 | if name then 59 | table.insert(files, name) 60 | end 61 | end 62 | 63 | return files 64 | end 65 | 66 | self.GetFileNameFromPath = function(path: string, extention: string | nil) 67 | return FileHelper.GetFileNameFromPath(path, extention) 68 | end 69 | 70 | return self 71 | end 72 | 73 | function FileHelper.GetFileNameFromPath(path: string, extention: string | nil) 74 | local fileExtension = extention or ".json" 75 | 76 | if path:sub(-#fileExtension) == fileExtension then 77 | path = path:gsub("\\", "/") 78 | 79 | local pos = path:find("/[^/]*$") 80 | if pos then 81 | return path:sub(pos + 1, -#fileExtension - 1) 82 | end 83 | end 84 | 85 | return nil 86 | end 87 | 88 | return FileHelper -------------------------------------------------------------------------------- /.lune/task.luau: -------------------------------------------------------------------------------- 1 | --[=[ 2 | @class Task 3 | 4 | Built-in task scheduler & thread spawning 5 | 6 | ### Example usage 7 | 8 | ```lua 9 | local task = require("@lune/task") 10 | 11 | -- Waiting for a certain amount of time 12 | task.wait(1) 13 | print("Waited for one second") 14 | 15 | -- Running a task after a given amount of time 16 | task.delay(2, function() 17 | print("Ran after two seconds") 18 | end) 19 | 20 | -- Spawning a new task that runs concurrently 21 | task.spawn(function() 22 | print("Running instantly") 23 | task.wait(1) 24 | print("One second passed inside the task") 25 | end) 26 | 27 | print("Running after task.spawn yields") 28 | ``` 29 | ]=] 30 | local task = {} 31 | 32 | --[=[ 33 | @within Task 34 | 35 | Stops a currently scheduled thread from resuming. 36 | 37 | @param thread The thread to cancel 38 | ]=] 39 | function task.cancel(thread: thread) end 40 | 41 | --[=[ 42 | @within Task 43 | 44 | Defers a thread or function to run at the end of the current task queue. 45 | 46 | @param functionOrThread The function or thread to defer 47 | @return The thread that will be deferred 48 | ]=] 49 | function task.defer(functionOrThread: thread | (T...) -> ...any, ...: T...): thread 50 | return nil :: any 51 | end 52 | 53 | --[=[ 54 | @within Task 55 | 56 | Delays a thread or function to run after `duration` seconds. 57 | 58 | @param functionOrThread The function or thread to delay 59 | @return The thread that will be delayed 60 | ]=] 61 | function task.delay( 62 | duration: number, 63 | functionOrThread: thread | (T...) -> ...any, 64 | ...: T... 65 | ): thread 66 | return nil :: any 67 | end 68 | 69 | --[=[ 70 | @within Task 71 | 72 | Instantly runs a thread or function. 73 | 74 | If the spawned task yields, the thread that spawned the task 75 | will resume, letting the spawned task run in the background. 76 | 77 | @param functionOrThread The function or thread to spawn 78 | @return The thread that was spawned 79 | ]=] 80 | function task.spawn(functionOrThread: thread | (T...) -> ...any, ...: T...): thread 81 | return nil :: any 82 | end 83 | 84 | --[=[ 85 | @within Task 86 | 87 | Waits for *at least* the given amount of time. 88 | 89 | The minimum wait time possible when using `task.wait` is limited by the underlying OS sleep implementation. 90 | For most systems this means `task.wait` is accurate down to about 5 milliseconds or less. 91 | 92 | @param duration The amount of time to wait 93 | @return The exact amount of time waited 94 | ]=] 95 | function task.wait(duration: number?): number 96 | return nil :: any 97 | end 98 | 99 | return task 100 | -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Lobby/Preset.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | Script.PresetHelper = wax.shared.FileHelper.new("mspaint/doors/presets") 8 | Script.ElevatorPresetData = {} 9 | Script.ElevatorPresets = {} 10 | 11 | -- Functions 12 | function Script.Functions.CreatePreset(name: string, data: table) 13 | local presetData = Script.Functions.EnforceTypes(data, { 14 | Floor = "Hotel", 15 | MaxPlayers = 1, 16 | Modifiers = nil, 17 | FriendsOnly = true 18 | }) 19 | 20 | Script.PresetHelper.CreateFile(name .. ".json", shared.HttpService:JSONEncode(presetData)) 21 | end 22 | 23 | function Script.Functions.LoadPresets() 24 | table.clear(Script.ElevatorPresets) 25 | table.clear(Script.ElevatorPresetData) 26 | 27 | for _, file in pairs(Script.PresetHelper.GetFilesClean()) do 28 | local success, ret = pcall(function() 29 | local data = Script.PresetHelper.ReadFile(file .. ".json") 30 | return shared.HttpService:JSONDecode(data) 31 | end) 32 | 33 | if success then 34 | Script.ElevatorPresetData[file] = Script.Functions.EnforceTypes(ret, { 35 | Floor = "Hotel", 36 | MaxPlayers = 1, 37 | Modifiers = nil, 38 | FriendsOnly = true 39 | }) 40 | 41 | table.insert(Script.ElevatorPresets, file) 42 | else 43 | shared.Notify:Alert({ 44 | Description = "Failed to load preset: " .. file 45 | }) 46 | end 47 | end 48 | 49 | Options.Elevator_PresetList:SetValues(Script.ElevatorPresets) 50 | Options.Elevator_PresetList:SetValue(nil) 51 | end 52 | 53 | function Script.Functions.LoadPreset(name: string) 54 | local success, ret = pcall(function() 55 | local data = Script.PresetHelper.ReadFile(name .. ".json") 56 | return shared.HttpService:JSONDecode(data) 57 | end) 58 | 59 | if not success then 60 | shared.Notify:Alert({ 61 | Description = "Failed to load preset: " .. name .. ".json" 62 | }) 63 | return 64 | end 65 | 66 | local presetData = Script.Functions.EnforceTypes(ret, { 67 | Floor = "Hotel", 68 | MaxPlayers = 1, 69 | Modifiers = nil, 70 | FriendsOnly = true 71 | }) 72 | 73 | local data = { 74 | ["FriendsOnly"] = presetData.FriendsOnly, 75 | ["Destination"] = presetData.Floor, 76 | ["Mods"] = presetData.Modifiers or {}, 77 | ["MaxPlayers"] = tostring(presetData.MaxPlayers) 78 | } 79 | 80 | Script.CreateElevator:FireServer(data) 81 | 82 | shared.Notify:Alert({ 83 | Description = "Loaded elevator preset: " .. name 84 | }) 85 | end -------------------------------------------------------------------------------- /Src/Utils/Universal/ControlModule.luau: -------------------------------------------------------------------------------- 1 | local ControlModule = if wax.shared.ExecutorSupport["require"] and shared.PlayerScripts:FindFirstChild("PlayerModule") then wax.require(shared.PlayerScripts:WaitForChild("PlayerModule"):WaitForChild("ControlModule")) else { replaced = true } 2 | 3 | if ControlModule.replaced == true then 4 | ControlModule = { 5 | replaced = true, 6 | 7 | GamepadMoveVector = Vector3.zero, 8 | ThumbstickMoveVector = Vector3.zero, 9 | ThumbstickRadius = 15, 10 | TouchInput = nil, 11 | TouchStartPosition = nil, 12 | } 13 | 14 | function ControlModule:GetMoveVector(): Vector3 15 | local x, z = 0, 0 16 | 17 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.W) then z -= 1 end 18 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.S) then z += 1 end 19 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.A) then x -= 1 end 20 | if shared.UserInputService:IsKeyDown(Enum.KeyCode.D) then x += 1 end 21 | 22 | return Vector3.new(x, 0, z) + ControlModule.ThumbstickMoveVector + ControlModule.GamepadMoveVector 23 | end 24 | 25 | shared.Connect:GiveSignal(shared.UserInputService.InputChanged:Connect(function(input, gameProcessed) 26 | if gameProcessed then return end 27 | 28 | if input.UserInputType == Enum.UserInputType.Gamepad1 and input.KeyCode == Enum.KeyCode.Thumbstick1 then 29 | ControlModule.GamepadMoveVector = Vector3.new(input.Position.X, 0, -input.Position.Y) 30 | end 31 | end)) 32 | 33 | shared.Connect:GiveSignal(shared.UserInputService.TouchStarted:Connect(function(input) 34 | ControlModule.TouchInput = input 35 | ControlModule.TouchStartPosition = input.Position 36 | end)) 37 | 38 | shared.Connect:GiveSignal(shared.UserInputService.TouchMoved:Connect(function(input) 39 | if input ~= ControlModule.TouchInput then return end 40 | 41 | if ControlModule.TouchStartPosition and input.Position then 42 | local moveDirection = (input.Position - ControlModule.TouchStartPosition).Unit 43 | local distance = (input.Position - ControlModule.TouchStartPosition).Magnitude 44 | 45 | if distance > ControlModule.ThumbstickRadius then 46 | distance = ControlModule.ThumbstickRadius 47 | end 48 | 49 | local adjustedDistance = distance / ControlModule.ThumbstickRadius 50 | ControlModule.ThumbstickMoveVector = Vector3.new(moveDirection.X * adjustedDistance, 0, moveDirection.Y * adjustedDistance) 51 | end 52 | end)) 53 | 54 | shared.Connect:GiveSignal(shared.UserInputService.TouchEnded:Connect(function(input) 55 | if input ~= ControlModule.TouchInput then return end 56 | 57 | ControlModule.ThumbstickMoveVector = Vector3.new(0, 0, 0) 58 | ControlModule.TouchInput = nil 59 | end)) 60 | end 61 | 62 | return ControlModule -------------------------------------------------------------------------------- /Src/Places/Utils/Universal/Aimbot.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | Script.AimbotRayParams = RaycastParams.new() 9 | Script.AimbotRayParams.FilterType = Enum.RaycastFilterType.Exclude 10 | 11 | --// Functions \\-- 12 | function Script.Functions.AimbotCondition(player: Player) 13 | if not (player ~= shared.LocalPlayer and player.Character and player.Character[Options.AimbotTargetPart.Value] and player.Character:FindFirstChild("Humanoid") and player.Character.Humanoid.Health > 0) then return end 14 | if Toggles.AimbotTeam.Value and shared.LocalPlayer.Team ~= nil and player.Team == shared.LocalPlayer.Team then return end 15 | 16 | return true 17 | end 18 | 19 | function Script.Functions.WallCheck(partPosition: Vector3) 20 | Script.AimbotRayParams.FilterDescendantsInstances = {shared.Character} 21 | return workspace:Raycast(shared.Camera.CFrame.Position, shared.Camera.CFrame.Position - partPosition, Script.AimbotRayParams) ~= nil 22 | end 23 | 24 | function Script.Functions.GetClosestFromMouse() 25 | local closestDistance = math.huge 26 | local closestCharacter = nil 27 | 28 | for _, player in pairs(shared.Players:GetPlayers()) do 29 | if not Script.Functions.AimbotCondition(player) then continue end 30 | 31 | local charPos, onScreen = shared.Camera:WorldToViewportPoint(player.Character[Options.AimbotTargetPart.Value].Position) 32 | if not onScreen then continue end 33 | 34 | if Toggles.AimbotWall.Value and Script.Functions.WallCheck(player.Character[Options.AimbotTargetPart.Value].Position) then continue end 35 | 36 | local playerDistance = (shared.UserInputService:GetMouseLocation() - Vector2.new(charPos.X, charPos.Y)).Magnitude 37 | 38 | if playerDistance < closestDistance then 39 | closestDistance = playerDistance 40 | closestCharacter = player.Character 41 | end 42 | end 43 | 44 | return closestCharacter 45 | end 46 | 47 | function Script.Functions.GetClosestFromCharacter() 48 | local closestDistance = math.huge 49 | local closestCharacter = nil 50 | 51 | for _, player in pairs(shared.Players:GetPlayers()) do 52 | if not Script.Functions.AimbotCondition(player) then continue end 53 | 54 | local _, onScreen = shared.Camera:WorldToViewportPoint(player.Character[Options.AimbotTargetPart.Value].Position) 55 | if not onScreen then continue end 56 | 57 | if Toggles.AimbotWall.Value and Script.Functions.WallCheck(player.Character[Options.AimbotTargetPart.Value].Position) then continue end 58 | 59 | local playerDistance = Script.Functions.DistanceFromCharacter(player.Character) 60 | 61 | if playerDistance < closestDistance then 62 | closestDistance = playerDistance 63 | closestCharacter = player.Character 64 | end 65 | end 66 | 67 | return closestCharacter 68 | end -------------------------------------------------------------------------------- /Src/Places/Utils/Universal/ConnectionsFuncs.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.SetupChildConnection() 10 | for _, child in pairs(shared.Workspace:GetDescendants()) do 11 | task.spawn(Script.Functions.ChildCheck, child) 12 | end 13 | 14 | shared.Connections["ChildConnection"] = shared.Workspace.DescendantAdded:Connect(function(child) 15 | task.delay(0.1, Script.Functions.ChildCheck, child) 16 | end) 17 | end 18 | 19 | function Script.Functions.SetupCharacterConnection(newCharacter) 20 | shared.Character = newCharacter 21 | shared.Humanoid = shared.Character:WaitForChild("Humanoid") 22 | if shared.Humanoid then 23 | Script.LastSpeed = shared.Humanoid.WalkSpeed 24 | 25 | shared.Twerk:Setup() 26 | if Toggles.Twerk.Value then 27 | shared.Twerk:Enable() 28 | end 29 | 30 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("WalkSpeed"):Connect(function() 31 | if shared.Humanoid.WalkSpeed ~= Options.WalkSpeed.Value then 32 | Script.LastSpeed = shared.Humanoid.WalkSpeed 33 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = Options.WalkSpeed.Value end 34 | end 35 | end)) 36 | 37 | 38 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("JumpPower"):Connect(function() 39 | if not shared.Humanoid.UseJumpPower then return end 40 | if shared.Humanoid.JumpPower ~= Options.JumpPower.Value then 41 | Script.LastJumpPower = shared.Humanoid.JumpPower 42 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpPower = Options.JumpPower.Value end 43 | end 44 | end)) 45 | shared.Connect:GiveSignal(shared.Humanoid:GetPropertyChangedSignal("JumpHeight"):Connect(function() 46 | if shared.Humanoid.UseJumpPower then return end 47 | if shared.Humanoid.JumpHeight ~= Options.JumpPower.Value then 48 | Script.LastJumpPower = shared.Humanoid.JumpHeight 49 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpHeight = Options.JumpPower.Value end 50 | end 51 | end)) 52 | end 53 | 54 | shared.RootPart = shared.Character:WaitForChild("HumanoidRootPart") 55 | end 56 | 57 | function Script.Functions.SetupOtherPlayerConnection(player: Player) 58 | if player.Character then 59 | if Toggles.PlayerESP and Toggles.PlayerESP.Value then 60 | Script.Functions.PlayerESP(player) 61 | end 62 | end 63 | 64 | shared.Connect:GiveSignal(player.CharacterAdded:Connect(function(newCharacter) 65 | task.delay(0.1, function() 66 | if Toggles.PlayerESP and Toggles.PlayerESP.Value then 67 | Script.Functions.PlayerESP(player) 68 | end 69 | end) 70 | end)) 71 | end 72 | 73 | function Script.Functions.SetupBloxstrapRPCConnection() 74 | shared.Connect:GiveSignal(shared.Players.PlayerAdded:Connect(function(player) 75 | Script.Functions.UpdateBloxstrapRPC() 76 | end)) 77 | 78 | shared.Connect:GiveSignal(shared.Players.PlayerRemoving:Connect(function(player) 79 | Script.Functions.UpdateBloxstrapRPC() 80 | end)) 81 | end -------------------------------------------------------------------------------- /Src/Utils/GUI/Notifiers/Doors.luau: -------------------------------------------------------------------------------- 1 | local Doors = {} 2 | 3 | --// Player Variables \\-- 4 | local mainUI 5 | 6 | --// Functions \\-- 7 | function Doors:Notify(unsafeOptions) 8 | assert(typeof(unsafeOptions) == "table", "Expected a table as options argument but got " .. typeof(unsafeOptions)) 9 | 10 | mainUI = mainUI or shared.PlayerGui:WaitForChild("MainUI", 2.5) 11 | if not mainUI then return end 12 | 13 | local options = shared.Script.Functions.EnforceTypes(unsafeOptions, { 14 | Title = "No Title", 15 | Description = "No Text", 16 | Reason = "", 17 | NotificationType = "NOTIFICATION", 18 | Image = "6023426923", 19 | Color = nil, 20 | Time = nil, 21 | 22 | TweenDuration = 0.8 23 | }) 24 | 25 | local acheivement = mainUI.AchievementsHolder.Achievement:Clone() 26 | acheivement.Size = UDim2.new(0, 0, 0, 0) 27 | acheivement.Frame.Position = UDim2.new(1.1, 0, 0, 0) 28 | acheivement.Name = "LiveAchievement" 29 | acheivement.Visible = true 30 | 31 | acheivement.Frame.TextLabel.Text = options.NotificationType 32 | 33 | if options.Color ~= nil then 34 | acheivement.Frame.TextLabel.TextColor3 = options.Color 35 | acheivement.Frame.UIStroke.Color = options.Color 36 | acheivement.Frame.Glow.ImageColor3 = options.Color 37 | end 38 | 39 | acheivement.Frame.Details.Desc.Text = tostring(options.Description) 40 | acheivement.Frame.Details.Title.Text = tostring(options.Title) 41 | acheivement.Frame.Details.Reason.Text = tostring(options.Reason or "") 42 | 43 | if options.Image:match("rbxthumb://") or options.Image:match("rbxassetid://") then 44 | acheivement.Frame.ImageLabel.Image = tostring(options.Image or "rbxassetid://0") 45 | else 46 | acheivement.Frame.ImageLabel.Image = "rbxassetid://" .. tostring(options.Image or "0") 47 | end 48 | 49 | acheivement.Parent = mainUI.AchievementsHolder 50 | acheivement.Sound.SoundId = "rbxassetid://10469938989" 51 | 52 | acheivement.Sound.Volume = 1 53 | 54 | if shared.Toggles.NotifySound.Value then 55 | acheivement.Sound:Play() 56 | end 57 | 58 | task.spawn(function() 59 | acheivement:TweenSize(UDim2.new(1, 0, 0.2, 0), "In", "Quad", options.TweenDuration, true) 60 | 61 | task.wait(0.8) 62 | 63 | acheivement.Frame:TweenPosition(UDim2.new(0, 0, 0, 0), "Out", "Quad", 0.5, true) 64 | 65 | shared.TweenService:Create(acheivement.Frame.Glow, TweenInfo.new(1, Enum.EasingStyle.Quad, Enum.EasingDirection.In),{ 66 | ImageTransparency = 1 67 | }):Play() 68 | 69 | if options.Time ~= nil then 70 | if typeof(options.Time) == "number" then 71 | task.wait(options.Time) 72 | elseif typeof(options.Time) == "Instance" then 73 | options.Time.Destroying:Wait() 74 | end 75 | else 76 | task.wait(5) 77 | end 78 | 79 | acheivement.Frame:TweenPosition(UDim2.new(1.1, 0, 0, 0), "In", "Quad", 0.5, true) 80 | task.wait(0.5) 81 | acheivement:TweenSize(UDim2.new(1, 0, -0.1, 0), "InOut", "Quad", 0.5, true) 82 | task.wait(0.5) 83 | acheivement:Destroy() 84 | end) 85 | end 86 | 87 | function Doors:Alert(options) 88 | assert(typeof(options) == "table", "Expected a table as options argument but got " .. typeof(options)) 89 | 90 | options["NotificationType"] = "WARNING" 91 | options["Color"] = Color3.new(1, 0, 0) 92 | options["TweenDuration"] = 0.3 93 | 94 | Doors:Notify(options) 95 | end 96 | 97 | function Doors:Warn(options) Doors:Alert(options) end 98 | 99 | return Doors -------------------------------------------------------------------------------- /Src/Places/Loaders/Template.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Player Variables \\-- 9 | shared.Character = shared.LocalPlayer.Character or shared.LocalPlayer.CharacterAdded:Wait() 10 | shared.Humanoid = nil 11 | 12 | --// Functions \\-- 13 | Script._mspaint_custom_captions = Instance.new("ScreenGui") do 14 | local Frame = Instance.new("Frame", Script._mspaint_custom_captions) 15 | local TextLabel = Instance.new("TextLabel", Frame) 16 | local UITextSizeConstraint = Instance.new("UITextSizeConstraint", TextLabel) 17 | 18 | Script._mspaint_custom_captions.Parent = shared.ReplicatedStorage 19 | Script._mspaint_custom_captions.ZIndexBehavior = Enum.ZIndexBehavior.Sibling 20 | 21 | Frame.AnchorPoint = Vector2.new(0.5, 0.5) 22 | Frame.BackgroundColor3 = shared.Library.MainColor 23 | Frame.BorderColor3 = shared.Library.AccentColor 24 | Frame.BorderSizePixel = 2 25 | Frame.Position = UDim2.new(0.5, 0, 0.8, 0) 26 | Frame.Size = UDim2.new(0, 200, 0, 75) 27 | shared.Library:AddToRegistry(Frame, { 28 | BackgroundColor3 = "MainColor", 29 | BorderColor3 = "AccentColor" 30 | }) 31 | 32 | TextLabel.BackgroundColor3 = Color3.fromRGB(255, 255, 255) 33 | TextLabel.BackgroundTransparency = 1.000 34 | TextLabel.BorderColor3 = Color3.fromRGB(0, 0, 0) 35 | TextLabel.BorderSizePixel = 0 36 | TextLabel.Size = UDim2.new(1, 0, 1, 0) 37 | TextLabel.Font = Enum.Font.Code 38 | TextLabel.Text = "" 39 | TextLabel.TextColor3 = shared.Library.FontColor 40 | TextLabel.TextScaled = true 41 | TextLabel.TextSize = 14 42 | TextLabel.TextWrapped = true 43 | shared.Library:AddToRegistry(TextLabel, { 44 | TextColor3 = "FontColor" 45 | }) 46 | 47 | UITextSizeConstraint.MaxTextSize = 35 48 | 49 | function Script.Functions.HideCaptions() 50 | Script._mspaint_custom_captions.Parent = shared.ReplicatedStorage 51 | end 52 | 53 | local CaptionsLastUsed = os.time() 54 | function Script.Functions.Captions(caption: string) 55 | CaptionsLastUsed = os.time() 56 | 57 | if Script._mspaint_custom_captions.Parent == shared.ReplicatedStorage then 58 | local success = pcall(function() 59 | Script._mspaint_custom_captions.Parent = if gethui then gethui() else shared.CoreGui 60 | end) 61 | 62 | if not success then 63 | Script._mspaint_custom_captions.Parent = shared.PlayerGui 64 | end 65 | end 66 | 67 | TextLabel.Text = caption 68 | 69 | task.spawn(function() 70 | task.wait(5) 71 | if os.time() - CaptionsLastUsed >= 5 then 72 | Script.Functions.HideCaptions() 73 | end 74 | end) 75 | end 76 | end 77 | 78 | shared.Load("Utils", "ConnectionsFuncs") 79 | 80 | --// Tabs \\-- 81 | Script.Tabs = { 82 | Main = shared.Window:AddTab("Main"), 83 | } 84 | 85 | shared.Load("Tabs", "Main") 86 | 87 | --// Metamethod hooks \\-- 88 | 89 | --// Connections \\-- 90 | shared.Connect:GiveSignal(shared.LocalPlayer.CharacterAdded:Connect(function(newCharacter) 91 | task.delay(1, Script.Functions.SetupCharacterConnection, newCharacter) 92 | end)) 93 | 94 | --// Load \\-- 95 | task.spawn(Script.Functions.SetupCharacterConnection, shared.Character) 96 | 97 | --// Unload \\-- 98 | shared.Library:OnUnload(function() 99 | print("Unloading " .. shared.ScriptName .. "...") 100 | end) 101 | 102 | getgenv().mspaint_loaded = true -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Doors/BreakerBox.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.EnableBreaker(breaker, value) 10 | breaker:SetAttribute("Enabled", value) 11 | 12 | if value then 13 | breaker:FindFirstChild("PrismaticConstraint", true).TargetPosition = -0.2 14 | breaker.Light.Material = Enum.Material.Neon 15 | breaker.Light.Attachment.Spark:Emit(1) 16 | breaker.Sound.Pitch = 1.3 17 | else 18 | breaker:FindFirstChild("PrismaticConstraint", true).TargetPosition = 0.2 19 | breaker.Light.Material = Enum.Material.Glass 20 | breaker.Sound.Pitch = 1.2 21 | end 22 | 23 | breaker.Sound:Play() 24 | end 25 | 26 | function Script.Functions.SolveBreakerBox(breakerBox) 27 | if not Options.AutoBreakerSolverMethod then return end 28 | if not breakerBox then return end 29 | 30 | local code = breakerBox:FindFirstChild("Code", true) 31 | local correct = breakerBox:FindFirstChild("Correct", true) 32 | 33 | repeat task.wait() until code.Text ~= "..." or not breakerBox:IsDescendantOf(workspace) 34 | if not breakerBox:IsDescendantOf(workspace) then return end 35 | 36 | shared.Notify:Alert({ 37 | Title = "Auto Breaker Solver", 38 | Description = "Solving the breaker box...", 39 | Reason = "" 40 | }) 41 | 42 | if Options.AutoBreakerSolverMethod.Value == "Legit" then 43 | Script.Temp.UsedBreakers = {} 44 | if shared.Connections["Reset"] then shared.Connections["Reset"]:Disconnect() end 45 | if shared.Connections["Code"] then shared.Connections["Code"]:Disconnect() end 46 | 47 | local breakers = {} 48 | for _, breaker in pairs(breakerBox:GetChildren()) do 49 | if breaker.Name == "BreakerSwitch" then 50 | local id = string.format("%02d", breaker:GetAttribute("ID")) 51 | breakers[id] = breaker 52 | end 53 | end 54 | 55 | if code:FindFirstChild("Frame") then 56 | Script.Functions.AutoBreaker(code, breakers) 57 | 58 | shared.Connections["Reset"] = correct:GetPropertyChangedSignal("Playing"):Connect(function() 59 | if correct.Playing then table.clear(Script.Temp.UsedBreakers) end 60 | end) 61 | 62 | shared.Connections["Code"] = code:GetPropertyChangedSignal("Text"):Connect(function() 63 | task.delay(0.1, Script.Functions.AutoBreaker, code, breakers) 64 | end) 65 | end 66 | else 67 | repeat task.wait(0.1) 68 | Script.RemotesFolder.EBF:FireServer() 69 | until not workspace.CurrentRooms["100"]:FindFirstChild("DoorToBreakDown") 70 | 71 | shared.Notify:Alert({ 72 | Title = "Auto Breaker Solver", 73 | Description = "The breaker box has been successfully solved.", 74 | }) 75 | end 76 | end 77 | 78 | function Script.Functions.AutoBreaker(code, breakers) 79 | local newCode = code.Text 80 | if not tonumber(newCode) and newCode ~= "??" then return end 81 | 82 | local isEnabled = code.Frame.BackgroundTransparency == 0 83 | local breaker = breakers[newCode] 84 | 85 | if newCode == "??" and #Script.Temp.UsedBreakers == 9 then 86 | for i = 1, 10 do 87 | local id = string.format("%02d", i) 88 | 89 | if not table.find(Script.Temp.UsedBreakers, id) then 90 | breaker = breakers[id] 91 | end 92 | end 93 | end 94 | 95 | if breaker then 96 | table.insert(Script.Temp.UsedBreakers, newCode) 97 | if breaker:GetAttribute("Enabled") ~= isEnabled then 98 | Script.Functions.EnableBreaker(breaker, isEnabled) 99 | end 100 | end 101 | end -------------------------------------------------------------------------------- /Src/Places/Tabs/Universal/Main.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | Script.LastVoidValue = workspace.FallenPartsDestroyHeight 10 | Script.LastSpeed = if shared.Humanoid then shared.Humanoid.WalkSpeed else 16 11 | 12 | --// Main \\-- 13 | local PlayerGroupBox = Tabs.Main:AddLeftGroupbox("Player") do 14 | PlayerGroupBox:AddToggle("SpeedHack", { 15 | Text = "Speed Hack", 16 | Default = false 17 | }) 18 | 19 | PlayerGroupBox:AddSlider("WalkSpeed", { 20 | Text = "Walk Speed", 21 | Default = 16, 22 | Min = 0, 23 | Max = 100, 24 | Rounding = 0, 25 | Compact = true 26 | }) 27 | 28 | PlayerGroupBox:AddToggle("JumpPowerHack", { 29 | Text = "Jump Power Hack", 30 | Default = false 31 | }) 32 | 33 | PlayerGroupBox:AddSlider("JumpPower", { 34 | Text = "Jump Power", 35 | Default = 50, 36 | Min = 0, 37 | Max = 200, 38 | Rounding = 0, 39 | Compact = true 40 | }) 41 | 42 | PlayerGroupBox:AddDivider() 43 | 44 | PlayerGroupBox:AddToggle("InstaInteract", { 45 | Text = "Instant Interact", 46 | Default = false 47 | }) 48 | 49 | PlayerGroupBox:AddToggle("DisableRobloxVoid", { 50 | Text = "Disable Roblox Void", 51 | Default = false 52 | }) 53 | 54 | PlayerGroupBox:AddDivider() 55 | 56 | PlayerGroupBox:AddToggle("Noclip", { 57 | Text = "Noclip", 58 | Default = false 59 | }):AddKeyPicker("NoclipKey", { 60 | Mode = "Toggle", 61 | Default = "N", 62 | Text = "Noclip", 63 | SyncToggleState = true 64 | }) 65 | 66 | PlayerGroupBox:AddToggle("Fly", { 67 | Text = "Fly", 68 | Default = false 69 | }):AddKeyPicker("FlyKey", { 70 | Mode = "Toggle", 71 | Default = "F", 72 | Text = "Fly", 73 | SyncToggleState = true 74 | }) 75 | 76 | PlayerGroupBox:AddSlider("FlySpeed", { 77 | Text = "Fly Speed", 78 | Default = 16, 79 | Min = 0, 80 | Max = 100, 81 | Rounding = 0, 82 | Compact = true 83 | }) 84 | end 85 | 86 | --// Player \\-- 87 | Toggles.SpeedHack:OnChanged(function(value) 88 | if not shared.Humanoid then return end 89 | 90 | if value then 91 | Script.LastSpeed = shared.Humanoid.WalkSpeed 92 | end 93 | 94 | shared.Humanoid.WalkSpeed = if value then Options.WalkSpeed.Value else Script.LastSpeed 95 | end) 96 | 97 | Toggles.JumpPowerHack:OnChanged(function(value) 98 | if not shared.Humanoid then return end 99 | 100 | if value then 101 | Script.LastJumpPower = if shared.Humanoid.UseJumpPower then shared.Humanoid.JumpPower else shared.Humanoid.JumpHeight 102 | end 103 | 104 | if shared.Humanoid.UseJumpPower then 105 | shared.Humanoid.JumpPower = if value then Options.JumpPower.Value else Script.LastJumpPower 106 | else 107 | shared.Humanoid.JumpHeight = if value then Options.JumpPower.Value else Script.LastJumpPower 108 | end 109 | end) 110 | 111 | Toggles.DisableRobloxVoid:OnChanged(function(value) 112 | if value then 113 | workspace.FallenPartsDestroyHeight = (0 / 0) 114 | else 115 | workspace.FallenPartsDestroyHeight = Script.LastVoidValue 116 | end 117 | end) 118 | 119 | Toggles.Noclip:OnChanged(function(value) 120 | if not shared.Character then return end 121 | 122 | for _, part in pairs(shared.Character:GetDescendants()) do 123 | if not part:IsA("BasePart") then continue end 124 | part.CanCollide = value 125 | end 126 | end) 127 | 128 | Toggles.Fly:OnChanged(function(value) 129 | if not shared.Fly.FlyBody then shared.Fly:Setup() end 130 | 131 | shared.Fly:Set(value) 132 | end) 133 | 134 | Options.FlySpeed:OnChanged(function(value) 135 | shared.Fly:SetSpeed(value) 136 | end) -------------------------------------------------------------------------------- /.lune/luau.luau: -------------------------------------------------------------------------------- 1 | --[=[ 2 | @interface CompileOptions 3 | @within Luau 4 | 5 | The options passed to the luau compiler while compiling bytecode. 6 | 7 | This is a dictionary that may contain one or more of the following values: 8 | 9 | * `optimizationLevel` - Sets the compiler option "optimizationLevel". Defaults to `1`. 10 | * `coverageLevel` - Sets the compiler option "coverageLevel". Defaults to `0`. 11 | * `debugLevel` - Sets the compiler option "debugLevel". Defaults to `1`. 12 | 13 | Documentation regarding what these values represent can be found [here](https://github.com/Roblox/luau/blob/bd229816c0a82a8590395416c81c333087f541fd/Compiler/include/luacode.h#L13-L39). 14 | ]=] 15 | export type CompileOptions = { 16 | optimizationLevel: number?, 17 | coverageLevel: number?, 18 | debugLevel: number?, 19 | } 20 | 21 | --[=[ 22 | @interface LoadOptions 23 | @within Luau 24 | 25 | The options passed while loading a luau chunk from an arbitrary string, or bytecode. 26 | 27 | This is a dictionary that may contain one or more of the following values: 28 | 29 | * `debugName` - The debug name of the closure. Defaults to `luau.load(...)`. 30 | * `environment` - A custom environment to load the chunk in. Setting a custom environment will deoptimize the chunk and forcefully disable codegen. Defaults to the global environment. 31 | * `injectGlobals` - Whether or not to inject globals in the custom environment. Has no effect if no custom environment is provided. Defaults to `true`. 32 | * `codegenEnabled` - Whether or not to enable codegen. Defaults to `false`. 33 | ]=] 34 | export type LoadOptions = { 35 | debugName: string?, 36 | environment: { [string]: any }?, 37 | injectGlobals: boolean?, 38 | codegenEnabled: boolean?, 39 | } 40 | 41 | --[=[ 42 | @class Luau 43 | 44 | Built-in library for generating luau bytecode & functions. 45 | 46 | ### Example usage 47 | 48 | ```lua 49 | local luau = require("@lune/luau") 50 | 51 | local bytecode = luau.compile("print('Hello, World!')") 52 | local callableFn = luau.load(bytecode) 53 | 54 | -- Additionally, we can skip the bytecode generation and load a callable function directly from the code itself. 55 | -- local callableFn = luau.load("print('Hello, World!')") 56 | 57 | callableFn() 58 | ``` 59 | 60 | Since luau bytecode is highly compressible, it may also make sense to compress it using the `serde` library 61 | while transmitting large amounts of it. 62 | ]=] 63 | local luau = {} 64 | 65 | --[=[ 66 | @within Luau 67 | 68 | Compiles sourcecode into Luau bytecode 69 | 70 | An error will be thrown if the sourcecode given isn't valid Luau code. 71 | 72 | ### Example usage 73 | 74 | ```lua 75 | local luau = require("@lune/luau") 76 | 77 | -- Compile the source to some highly optimized bytecode 78 | local bytecode = luau.compile("print('Hello, World!')", { 79 | optimizationLevel = 2, 80 | coverageLevel = 0, 81 | debugLevel = 1, 82 | }) 83 | ``` 84 | 85 | @param source The string that will be compiled into bytecode 86 | @param compileOptions The options passed to the luau compiler that will output the bytecode 87 | 88 | @return luau bytecode 89 | ]=] 90 | function luau.compile(source: string, compileOptions: CompileOptions?): string 91 | return nil :: any 92 | end 93 | 94 | --[=[ 95 | @within Luau 96 | 97 | Generates a function from either bytecode or sourcecode 98 | 99 | An error will be thrown if the sourcecode given isn't valid luau code. 100 | 101 | ### Example usage 102 | 103 | ```lua 104 | local luau = require("@lune/luau") 105 | 106 | local bytecode = luau.compile("print('Hello, World!')") 107 | local callableFn = luau.load(bytecode, { 108 | debugName = "'Hello, World'" 109 | }) 110 | 111 | callableFn() 112 | ``` 113 | 114 | @param source Either luau bytecode or string source code 115 | @param loadOptions The options passed to luau for loading the chunk 116 | 117 | @return luau chunk 118 | ]=] 119 | function luau.load(source: string, loadOptions: LoadOptions?): (...any) -> ...any 120 | return nil :: any 121 | end 122 | 123 | return luau 124 | -------------------------------------------------------------------------------- /Src/Places/Utils/Universal/ESP.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local ESPLibrary = loadstring(game:HttpGet("https://raw.githubusercontent.com/deividcomsono/MS-ESP/refs/heads/main/source.lua"))() 8 | shared.ESPLibrary = ESPLibrary 9 | 10 | type ESP = { 11 | Color: Color3, 12 | Object: Instance, 13 | Offset: Vector3, 14 | Text: string, 15 | TextParent: Instance, 16 | Type: string, 17 | Player: Player, 18 | } 19 | 20 | function Script.Functions.ESP(args: ESP) 21 | if not args.Object then return Script.Functions.Warn("ESP Object is nil") end 22 | 23 | local ESPManager = { 24 | Object = args.Object, 25 | Text = args.Text or "No Text", 26 | Color = args.Color or Color3.new(), 27 | MaxDistance = args.MaxDistance or 5000, 28 | Offset = args.Offset or Vector3.zero, 29 | Type = args.Type or "None", 30 | Player = args.Player or false, 31 | OnDestroy = args.OnDestroy or nil, 32 | 33 | Invisible = false, 34 | Humanoid = nil 35 | } 36 | 37 | local ESPInstance = ESPLibrary.ESP.Highlight({ 38 | Name = ESPManager.Text, 39 | Model = ESPManager.Object, 40 | MaxDistance = ESPManager.MaxDistance, 41 | StudsOffset = ESPManager.Offset, 42 | 43 | FillColor = ESPManager.Color, 44 | OutlineColor = ESPManager.Color, 45 | TextColor = ESPManager.Color, 46 | TextSize = Options.ESPTextSize.Value or 16, 47 | 48 | FillTransparency = Options.ESPFillTransparency.Value, 49 | OutlineTransparency = Options.ESPOutlineTransparency.Value, 50 | 51 | Tracer = { 52 | Enabled = true, 53 | From = Options.ESPTracerStart.Value, 54 | Color = ESPManager.Color 55 | }, 56 | 57 | Arrow = { 58 | Enabled = true, 59 | CenterOffset = Options.ESPArrowCenterOffset.Value, 60 | Color = ESPManager.Color 61 | }, 62 | 63 | OnDestroy = ESPManager.OnDestroy or function() 64 | if ESPManager.Object.PrimaryPart and ESPManager.Invisible then ESPManager.Object.PrimaryPart.Transparency = 1 end 65 | if ESPManager.Humanoid then ESPManager.Humanoid:Destroy() end 66 | end 67 | }) 68 | 69 | if ESPManager.Player then 70 | Script.ESPTable[ESPManager.Type][ESPManager.Player] = ESPInstance 71 | else 72 | table.insert(Script.ESPTable[ESPManager.Type], ESPInstance) 73 | end 74 | 75 | return ESPInstance 76 | end 77 | 78 | function Script.Functions.PlayerESP(player: Player) 79 | if not (player.Character and player.Character.PrimaryPart and player.Character:FindFirstChild("Humanoid") and player.Character.Humanoid.Health > 0) then return end 80 | 81 | local playerEsp = Script.Functions.ESP({ 82 | Type = "Player", 83 | Object = player.Character, 84 | Text = string.format("%s [%.1f]", player.Name, player.Character.Humanoid.Health), 85 | TextParent = player.Character.PrimaryPart, 86 | Player = player, 87 | Color = if Toggles.ESPTeamColor.Value then player.TeamColor.Color else Options.PlayerEspColor.Value 88 | }) 89 | 90 | Script.FeatureConnections.Player[player.Name .. "TeamColor"] = player:GetPropertyChangedSignal("TeamColor"):Connect(function() 91 | if Toggles.ESPTeamColor.Value then 92 | playerEsp.Update({ 93 | FillColor = player.TeamColor.Color, 94 | OutlineColor = player.TeamColor.Color, 95 | TextColor = player.TeamColor.Color, 96 | }) 97 | end 98 | end) 99 | 100 | Script.FeatureConnections.Player[player.Name .. "Health"] = player.Character.Humanoid.HealthChanged:Connect(function(newHealth) 101 | if newHealth > 0 then 102 | playerEsp.SetText(string.format("%s [%.1f]", player.Name, newHealth)) 103 | else 104 | if Script.FeatureConnections.Player[player.Name .. "Health"] then Script.FeatureConnections.Player[player.Name .. "Health"]:Disconnect() end 105 | playerEsp.Destroy() 106 | end 107 | end) 108 | end -------------------------------------------------------------------------------- /.lune/stdio.luau: -------------------------------------------------------------------------------- 1 | export type Color = 2 | "reset" 3 | | "black" 4 | | "red" 5 | | "green" 6 | | "yellow" 7 | | "blue" 8 | | "purple" 9 | | "cyan" 10 | | "white" 11 | export type Style = "reset" | "bold" | "dim" 12 | 13 | type PromptFn = ( 14 | (() -> string) 15 | & ((kind: "text", message: string?, defaultOrOptions: string?) -> string) 16 | & ((kind: "confirm", message: string, defaultOrOptions: boolean?) -> boolean) 17 | & ((kind: "select", message: string?, defaultOrOptions: { string }) -> number?) 18 | & ((kind: "multiselect", message: string?, defaultOrOptions: { string }) -> { number }?) 19 | ) 20 | 21 | --[=[ 22 | @within Stdio 23 | @function prompt 24 | @tag must_use 25 | 26 | Prompts for user input using the wanted kind of prompt: 27 | 28 | * `"text"` - Prompts for a plain text string from the user 29 | * `"confirm"` - Prompts the user to confirm with y / n (yes / no) 30 | * `"select"` - Prompts the user to select *one* value from a list 31 | * `"multiselect"` - Prompts the user to select *one or more* values from a list 32 | * `nil` - Equivalent to `"text"` with no extra arguments 33 | 34 | @param kind The kind of prompt to use 35 | @param message The message to show the user 36 | @param defaultOrOptions The default value for the prompt, or options to choose from for selection prompts 37 | ]=] 38 | local prompt: PromptFn = function(kind: any, message: any, defaultOrOptions: any) 39 | return nil :: any 40 | end 41 | 42 | --[=[ 43 | @class Stdio 44 | 45 | Built-in standard input / output & utility functions 46 | 47 | ### Example usage 48 | 49 | ```lua 50 | local stdio = require("@lune/stdio") 51 | 52 | -- Prompting the user for basic input 53 | local text: string = stdio.prompt("text", "Please write some text") 54 | local confirmed: boolean = stdio.prompt("confirm", "Please confirm this action") 55 | 56 | -- Writing directly to stdout or stderr, without the auto-formatting of print/warn/error 57 | stdio.write("Hello, ") 58 | stdio.write("World! ") 59 | stdio.write("All on the same line") 60 | stdio.ewrite("\nAnd some error text, too") 61 | 62 | -- Reading the entire input from stdin 63 | local input = stdio.readToEnd() 64 | ``` 65 | ]=] 66 | local stdio = {} 67 | 68 | stdio.prompt = prompt 69 | 70 | --[=[ 71 | @within Stdio 72 | @tag must_use 73 | 74 | Return an ANSI string that can be used to modify the persistent output color. 75 | 76 | Pass `"reset"` to get a string that can reset the persistent output color. 77 | 78 | ### Example usage 79 | 80 | ```lua 81 | stdio.write(stdio.color("red")) 82 | print("This text will be red") 83 | stdio.write(stdio.color("reset")) 84 | print("This text will be normal") 85 | ``` 86 | 87 | @param color The color to use 88 | @return A printable ANSI string 89 | ]=] 90 | function stdio.color(color: Color): string 91 | return nil :: any 92 | end 93 | 94 | --[=[ 95 | @within Stdio 96 | @tag must_use 97 | 98 | Return an ANSI string that can be used to modify the persistent output style. 99 | 100 | Pass `"reset"` to get a string that can reset the persistent output style. 101 | 102 | ### Example usage 103 | 104 | ```lua 105 | stdio.write(stdio.style("bold")) 106 | print("This text will be bold") 107 | stdio.write(stdio.style("reset")) 108 | print("This text will be normal") 109 | ``` 110 | 111 | @param style The style to use 112 | @return A printable ANSI string 113 | ]=] 114 | function stdio.style(style: Style): string 115 | return nil :: any 116 | end 117 | 118 | --[=[ 119 | @within Stdio 120 | @tag must_use 121 | 122 | Formats arguments into a human-readable string with syntax highlighting for tables. 123 | 124 | @param ... The values to format 125 | @return The formatted string 126 | ]=] 127 | function stdio.format(...: any): string 128 | return nil :: any 129 | end 130 | 131 | --[=[ 132 | @within Stdio 133 | 134 | Writes a string directly to stdout, without any newline. 135 | 136 | @param s The string to write to stdout 137 | ]=] 138 | function stdio.write(s: string) end 139 | 140 | --[=[ 141 | @within Stdio 142 | 143 | Writes a string directly to stderr, without any newline. 144 | 145 | @param s The string to write to stderr 146 | ]=] 147 | function stdio.ewrite(s: string) end 148 | 149 | --[=[ 150 | @within Stdio 151 | @tag must_use 152 | 153 | Reads the entire input from stdin. 154 | 155 | @return The input from stdin 156 | ]=] 157 | function stdio.readToEnd(): string 158 | return nil :: any 159 | end 160 | 161 | return stdio 162 | -------------------------------------------------------------------------------- /Src/Places/Tabs/Babft/Main.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | Script.LastVoidValue = workspace.FallenPartsDestroyHeight 10 | Script.LastSpeed = if shared.Humanoid then shared.Humanoid.WalkSpeed else 16 11 | 12 | --// Main \\-- 13 | local PlayerGroupBox = Tabs.Main:AddLeftGroupbox("Player") do 14 | PlayerGroupBox:AddToggle("SpeedHack", { 15 | Text = "Speed Hack", 16 | Default = false 17 | }) 18 | 19 | PlayerGroupBox:AddSlider("WalkSpeed", { 20 | Text = "Walk Speed", 21 | Default = 16, 22 | Min = 0, 23 | Max = 100, 24 | Rounding = 0, 25 | Compact = true 26 | }) 27 | 28 | PlayerGroupBox:AddToggle("JumpPowerHack", { 29 | Text = "Jump Power Hack", 30 | Default = false 31 | }) 32 | 33 | PlayerGroupBox:AddSlider("JumpPower", { 34 | Text = "Jump Power", 35 | Default = 50, 36 | Min = 0, 37 | Max = 200, 38 | Rounding = 0, 39 | Compact = true 40 | }) 41 | 42 | PlayerGroupBox:AddDivider() 43 | 44 | PlayerGroupBox:AddToggle("Noclip", { 45 | Text = "Noclip", 46 | Default = false 47 | }):AddKeyPicker("NoclipKey", { 48 | Mode = "Toggle", 49 | Default = "N", 50 | Text = "Noclip", 51 | SyncToggleState = true 52 | }) 53 | 54 | PlayerGroupBox:AddToggle("Fly", { 55 | Text = "Fly", 56 | Default = false 57 | }):AddKeyPicker("FlyKey", { 58 | Mode = "Toggle", 59 | Default = "F", 60 | Text = "Fly", 61 | SyncToggleState = true 62 | }) 63 | 64 | PlayerGroupBox:AddSlider("FlySpeed", { 65 | Text = "Fly Speed", 66 | Default = 16, 67 | Min = 0, 68 | Max = 100, 69 | Rounding = 0, 70 | Compact = true 71 | }) 72 | 73 | PlayerGroupBox:AddToggle("Twerk", { 74 | Text = "Twerk", 75 | Default = false 76 | }) 77 | end 78 | 79 | local AutomationGroupBox = Tabs.Main:AddRightGroupbox("Automation") do 80 | AutomationGroupBox:AddToggle("AutoFarm", { 81 | Text = "Auto Farm", 82 | Default = false 83 | }) 84 | 85 | AutomationGroupBox:AddSlider("AutoFarmSpeed", { 86 | Text = "Auto Farm Speed", 87 | Default = 5, 88 | Min = 1, 89 | Max = 6, 90 | Rounding = 1, 91 | Compact = true 92 | }) 93 | 94 | AutomationGroupBox:AddDropdown("AutoFarmPriority", { 95 | Text = "Auto Farm Priority", 96 | AllowNull = false, 97 | Values = {"Gold Blocks", "Gold"}, 98 | Default = "Gold Blocks", 99 | Multi = false, 100 | }) 101 | end 102 | 103 | --// Player \\-- 104 | Toggles.SpeedHack:OnChanged(function(value) 105 | if not shared.Humanoid then return end 106 | 107 | if value then 108 | Script.LastSpeed = shared.Humanoid.WalkSpeed 109 | end 110 | 111 | shared.Humanoid.WalkSpeed = if value then Options.WalkSpeed.Value else Script.LastSpeed 112 | end) 113 | 114 | Toggles.JumpPowerHack:OnChanged(function(value) 115 | if not shared.Humanoid then return end 116 | 117 | if value then 118 | Script.LastJumpPower = if shared.Humanoid.UseJumpPower then shared.Humanoid.JumpPower else shared.Humanoid.JumpHeight 119 | end 120 | 121 | if shared.Humanoid.UseJumpPower then 122 | shared.Humanoid.JumpPower = if value then Options.JumpPower.Value else Script.LastJumpPower 123 | else 124 | shared.Humanoid.JumpHeight = if value then Options.JumpPower.Value else Script.LastJumpPower 125 | end 126 | end) 127 | 128 | Toggles.Noclip:OnChanged(function(value) 129 | if not shared.Character then return end 130 | 131 | for _, part in pairs(shared.Character:GetDescendants()) do 132 | if not part:IsA("BasePart") then continue end 133 | part.CanCollide = value 134 | end 135 | end) 136 | 137 | Toggles.Fly:OnChanged(function(value) 138 | if not shared.Fly.FlyBody then shared.Fly:Setup() end 139 | 140 | shared.Fly:Set(value) 141 | end) 142 | 143 | Options.FlySpeed:OnChanged(function(value) 144 | shared.Fly:SetSpeed(value) 145 | end) 146 | 147 | Toggles.Twerk:OnChanged(function(value) 148 | shared.Twerk:Set(value) 149 | end) 150 | 151 | --// Automation \\-- 152 | Toggles.AutoFarm:OnChanged(function(value) 153 | if value then 154 | Script.Functions.AutoFarm() 155 | end 156 | end) -------------------------------------------------------------------------------- /Src/init.client.luau: -------------------------------------------------------------------------------- 1 | if getgenv().mspaint_loading then print("[mspaint] Loading stopped. (ERROR: Loading)"); return end 2 | if getgenv().mspaint_loaded then print("[mspaint] Loading stopped. (ERROR: Already loaded)"); return end 3 | 4 | getgenv().mspaint_loading = true 5 | 6 | --// Loading Wait \\-- 7 | if not game:IsLoaded() then game.Loaded:Wait() end 8 | 9 | --// Services \\-- 10 | local Services = require("Utils/Services") 11 | Services:GetServices({ 12 | "Players", 13 | "UserInputService", 14 | "TextChatService", 15 | "ProximityPromptService", 16 | "PathfindingService", 17 | 18 | "CoreGui", 19 | "StarterGui", 20 | 21 | "Workspace", 22 | "Lighting", 23 | "ReplicatedStorage", 24 | 25 | "HttpService", 26 | "RunService", 27 | "SoundService", 28 | "TeleportService", 29 | "TweenService", 30 | "MarketplaceService" 31 | }) 32 | 33 | --// Utils \\-- 34 | if not wax.shared.ExecutorSupport then 35 | wax.shared.ExecutorSupport = require("Utils/ExecutorSupport") 36 | end 37 | 38 | if not wax.shared.BloxstrapRPC then 39 | wax.shared.BloxstrapRPC = require("Utils/BloxstrapRPC") 40 | end 41 | 42 | if not wax.shared.FileHelper then 43 | wax.shared.FileHelper = require("Utils/FileHelper") 44 | end 45 | 46 | --// mspaint Loader \\-- 47 | if not wax.shared.GotPlace then 48 | wax.shared.GotPlace = true 49 | 50 | shared.ScriptName = "Universal" 51 | shared.ScriptLoader = "Universal" 52 | 53 | local Mappings = require("Mappings") 54 | 55 | local MappingID = Mappings[game.GameId] 56 | if MappingID then 57 | local Folder = MappingID["Folder"] 58 | local Name = MappingID["Name"] or Folder 59 | local GameExclusions = MappingID["Exclusions"] or {} 60 | local Exclusion = GameExclusions[game.PlaceId] 61 | 62 | shared.ScriptName = Name 63 | shared.ScriptLoader = Folder .. "/" .. MappingID["Main"] 64 | 65 | shared.Mapping = MappingID 66 | shared.ScriptFolder = Folder 67 | shared.ScriptExclusion = Exclusion 68 | 69 | if Exclusion then 70 | shared.ScriptName = Name .. " (" .. Exclusion .. ")" 71 | shared.ScriptLoader = Folder .. "/" .. Exclusion 72 | end 73 | end 74 | end 75 | 76 | --// Global functions \\-- 77 | shared.Script = { 78 | Functions = {} 79 | } 80 | shared.Hooks = {} 81 | 82 | shared.Script.Functions.EnforceTypes = function(args, template) 83 | args = if typeof(args) == "table" then args else {} 84 | 85 | for key, value in pairs(template) do 86 | local argValue = args[key] 87 | 88 | if argValue == nil or (value ~= nil and typeof(argValue) ~= typeof(value)) then 89 | args[key] = value 90 | elseif typeof(value) == "table" then 91 | args[key] = shared.Script.Functions.EnforceTypes(argValue, value) 92 | end 93 | end 94 | 95 | return args 96 | end 97 | 98 | shared.Load = require("Utils/Loader") 99 | shared.Logs = require("Utils/Logs") 100 | shared.Connect = require("Utils/Connections") 101 | 102 | --// Player Variables \\-- 103 | shared.Camera = workspace.CurrentCamera 104 | 105 | shared.LocalPlayer = shared.Players.LocalPlayer 106 | shared.PlayerGui = shared.LocalPlayer.PlayerGui 107 | shared.PlayerScripts = shared.LocalPlayer.PlayerScripts 108 | 109 | shared.Fly = require("Utils/Universal/Fly") 110 | shared.Twerk = require("Utils/Universal/Twerk") 111 | shared.ControlModule = require("Utils/Universal/ControlModule") 112 | 113 | local TextChannels = shared.TextChatService:FindFirstChild("TextChannels") 114 | if TextChannels and TextChannels:FindFirstChild("RBXGeneral") then 115 | shared.RBXGeneral = TextChannels.RBXGeneral 116 | end 117 | 118 | --// Load \\-- 119 | local UICreator = require("Utils/GUI/Creator") 120 | shared.Window = UICreator:CreateWindow() 121 | 122 | local FinishedLoading = false 123 | local StartTime = tick() 124 | task.spawn(function() 125 | require("Places/Loaders/" .. shared.ScriptLoader) 126 | FinishedLoading = true 127 | end) 128 | 129 | repeat task.wait() until FinishedLoading or (tick() - StartTime) >= 2.5 130 | 131 | if not FinishedLoading then 132 | UICreator:CreateTimeoutInfoTab() 133 | end 134 | 135 | UICreator:CreateSettingsTab() 136 | require("Utils/GUI/Addons") 137 | 138 | shared.Notify:Alert({ 139 | Title = "OUTDATED", 140 | Description = "You are using a old version of mspaint that is no longer maintained.\nTo get the new loadstring join the discord!\n -> discord.gg/mspaint <-", 141 | Time = 30, 142 | ForceLinoria = true 143 | }) 144 | 145 | getgenv().mspaint_loading = false 146 | -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Doors/Entities.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.CalculateHideTime(room: number) 10 | for _, range in ipairs(Script.HideTimeValues) do 11 | if room >= range.min and room <= range.max then 12 | return math.round(range.a * (room - range.b) + range.c) 13 | end 14 | end 15 | 16 | return nil 17 | end 18 | 19 | function Script.Functions.GetShortName(entityName: string) 20 | if Script.EntityTable.ShortNames[entityName] then 21 | return Script.EntityTable.ShortNames[entityName] 22 | end 23 | 24 | for suffix, fix in pairs(Script.SuffixPrefixes) do 25 | entityName = entityName:gsub(suffix, fix) 26 | end 27 | 28 | return entityName 29 | end 30 | 31 | function Script.Functions.DisableDupe(dupeRoom, value, isSpaceRoom) 32 | if isSpaceRoom then 33 | local collision = dupeRoom:WaitForChild("Collision", 5) 34 | 35 | if collision then 36 | collision.CanCollide = value 37 | collision.CanTouch = not value 38 | end 39 | else 40 | local doorFake = dupeRoom:WaitForChild("DoorFake", 5) 41 | 42 | if doorFake then 43 | doorFake:WaitForChild("Hidden", 5).CanTouch = not value 44 | 45 | local lock = doorFake:WaitForChild("Lock", 5) 46 | if lock and lock:FindFirstChild("UnlockPrompt") then 47 | lock.UnlockPrompt.Enabled = not value 48 | end 49 | end 50 | end 51 | end 52 | 53 | function Script.Functions.DeleteSeek(collision: BasePart) 54 | if not shared.RootPart then return end 55 | 56 | task.spawn(function() 57 | local attemps = 0 58 | repeat task.wait() attemps += 1 until collision.Parent or attemps > 200 59 | 60 | if collision:IsDescendantOf(workspace) and (collision.Parent and collision.Parent.Name == "TriggerEventCollision") then 61 | shared.Notify:Alert({ 62 | Title = "Delete Seek FE", 63 | Description = "Deleting Seek trigger...", 64 | Reason = "", 65 | }) 66 | 67 | task.delay(4, function() 68 | if collision:IsDescendantOf(workspace) then 69 | shared.Notify:Alert({ 70 | Title = "Delete Seek FE", 71 | Description = "Failed to delete Seek trigger!", 72 | Reason = "", 73 | }) 74 | end 75 | end) 76 | 77 | if shared.firetouch then 78 | shared.RootPart.Anchored = true 79 | task.delay(0.25, function() shared.RootPart.Anchored = false end) 80 | 81 | repeat 82 | if collision:IsDescendantOf(workspace) then shared.firetouch(collision, shared.RootPart, 1) end 83 | task.wait() 84 | if collision:IsDescendantOf(workspace) then shared.firetouch(collision, shared.RootPart, 0) end 85 | task.wait() 86 | until not collision:IsDescendantOf(workspace) or not Toggles.DeleteSeek.Value 87 | else 88 | collision:PivotTo(CFrame.new(shared.RootPart.Position)) 89 | shared.RootPart.Anchored = true 90 | repeat task.wait() until not collision:IsDescendantOf(workspace) or not Toggles.DeleteSeek.Value 91 | shared.RootPart.Anchored = false 92 | end 93 | 94 | if not collision:IsDescendantOf(workspace) then 95 | shared.Notify:Log({ 96 | Title = "Delete Seek FE", 97 | Description = "Deleted Seek trigger successfully!", 98 | }) 99 | end 100 | end 101 | end) 102 | end 103 | 104 | function Script.Functions.AvoidEntity(value: boolean, oldNoclip: boolean) 105 | if not shared.RootPart or not Script.Collision then return end 106 | 107 | local lastCFrame = shared.RootPart.CFrame 108 | task.wait() 109 | if value then 110 | Toggles.Noclip:SetValue(true) 111 | Script.Collision.Position += Vector3.new(0, 24, 0) 112 | task.wait() 113 | Script.Collision:PivotTo(lastCFrame) 114 | else 115 | Script.Collision.Position -= Vector3.new(0, 24, 0) 116 | task.wait() 117 | Script.Collision:PivotTo(lastCFrame) 118 | Toggles.Noclip:SetValue(oldNoclip or false) 119 | end 120 | end -------------------------------------------------------------------------------- /Src/Places/Utils/3008/ESP.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local ESPLibrary = loadstring(game:HttpGet("https://raw.githubusercontent.com/deividcomsono/MS-ESP/refs/heads/main/source.lua"))() 8 | shared.ESPLibrary = ESPLibrary 9 | 10 | type ESP = { 11 | Color: Color3, 12 | IsEntity: boolean, 13 | IsDoubleDoor: boolean, 14 | Object: Instance, 15 | Offset: Vector3, 16 | Text: string, 17 | TextParent: Instance, 18 | Type: string 19 | } 20 | 21 | function Script.Functions.ESP(args: ESP) 22 | if not args.Object then return Script.Functions.Warn("ESP Object is nil") end 23 | 24 | local ESPManager = { 25 | Object = args.Object, 26 | Text = args.Text or "No Text", 27 | Color = args.Color or Color3.new(), 28 | MaxDistance = args.MaxDistance or 5000, 29 | Offset = args.Offset or Vector3.zero, 30 | IsEntity = args.IsEntity or false, 31 | IsDoubleDoor = args.IsDoubleDoor or false, 32 | Type = args.Type or "None", 33 | OnDestroy = args.OnDestroy or nil, 34 | 35 | Invisible = false, 36 | Humanoid = nil 37 | } 38 | 39 | if ESPManager.IsEntity and ESPManager.Object.PrimaryPart then 40 | if ESPManager.Object.PrimaryPart.Transparency == 1 then 41 | ESPManager.Invisible = true 42 | ESPManager.Object.PrimaryPart.Transparency = 0.99 43 | end 44 | 45 | local humanoid = ESPManager.Object:FindFirstChildOfClass("Humanoid") 46 | if not humanoid then humanoid = Instance.new("Humanoid", ESPManager.Object) end 47 | ESPManager.Humanoid = humanoid 48 | end 49 | 50 | local ESPInstance = ESPLibrary.ESP.Highlight({ 51 | Name = ESPManager.Text, 52 | Model = ESPManager.Object, 53 | MaxDistance = ESPManager.MaxDistance, 54 | StudsOffset = ESPManager.Offset, 55 | 56 | FillColor = ESPManager.Color, 57 | OutlineColor = ESPManager.Color, 58 | TextColor = ESPManager.Color, 59 | TextSize = Options.ESPTextSize.Value or 16, 60 | 61 | FillTransparency = Options.ESPFillTransparency.Value, 62 | OutlineTransparency = Options.ESPOutlineTransparency.Value, 63 | 64 | Tracer = { 65 | Enabled = Toggles.ESPTracer.Value, 66 | From = Options.ESPTracerStart.Value, 67 | Color = ESPManager.Color 68 | }, 69 | 70 | Arrow = { 71 | Enabled = Toggles.ESPArrow.Value, 72 | CenterOffset = Options.ESPArrowCenterOffset.Value, 73 | Color = ESPManager.Color 74 | }, 75 | 76 | OnDestroy = ESPManager.OnDestroy or function() 77 | if ESPManager.Object.PrimaryPart and ESPManager.Invisible then ESPManager.Object.PrimaryPart.Transparency = 1 end 78 | if ESPManager.Humanoid then ESPManager.Humanoid:Destroy() end 79 | end 80 | }) 81 | 82 | table.insert(Script.ESPTable[args.Type], ESPInstance) 83 | 84 | return ESPInstance 85 | end 86 | 87 | function Script.Functions.PlayerESP(character: Model) 88 | if not (character and character.PrimaryPart and character:FindFirstChild("Humanoid") and character.Humanoid.Health > 0) then return end 89 | 90 | local playerEsp = Script.Functions.ESP({ 91 | Type = "Player", 92 | Object = character, 93 | Text = string.format("%s [%.1f]", character.Name, character.Humanoid.Health), 94 | TextParent = character.PrimaryPart, 95 | Color = Options.PlayerEspColor.Value 96 | }) 97 | 98 | Script.FeatureConnections.Player[character.Name] = character.Humanoid.HealthChanged:Connect(function(newHealth) 99 | if newHealth > 0 then 100 | playerEsp.SetText(string.format("%s [%.1f]", character.Name, newHealth)) 101 | else 102 | if Script.FeatureConnections.Player[character.Name] then Script.FeatureConnections.Player[character.Name]:Disconnect() end 103 | playerEsp.Destroy() 104 | end 105 | end) 106 | 107 | return playerEsp 108 | end 109 | 110 | function Script.Functions.EmployeeESP(employee: Model) 111 | if not (employee and employee.PrimaryPart and employee:FindFirstChild("Enemy")) then return end 112 | 113 | return Script.Functions.ESP({ 114 | Type = "Employee", 115 | Object = employee, 116 | Text = employee.Name, 117 | TextParent = employee.PrimaryPart, 118 | Color = Options.EmployeeEspColor.Value 119 | }) 120 | end 121 | 122 | function Script.Functions.ItemESP(item: Model) 123 | if not (item and item.PrimaryPart) then return end 124 | 125 | return Script.Functions.ESP({ 126 | Type = "Item", 127 | Object = item, 128 | Text = item.Name, 129 | TextParent = item.PrimaryPart, 130 | Color = Options.ItemEspColor.Value 131 | }) 132 | end -------------------------------------------------------------------------------- /.lune/regex.luau: -------------------------------------------------------------------------------- 1 | --[=[ 2 | @class RegexMatch 3 | 4 | A match from a regular expression. 5 | 6 | Contains the following values: 7 | 8 | - `start` -- The start index of the match in the original string. 9 | - `finish` -- The end index of the match in the original string. 10 | - `text` -- The text that was matched. 11 | - `len` -- The length of the text that was matched. 12 | ]=] 13 | local RegexMatch = { 14 | start = 0, 15 | finish = 0, 16 | text = "", 17 | len = 0, 18 | } 19 | 20 | type RegexMatch = typeof(RegexMatch) 21 | 22 | --[=[ 23 | @class RegexCaptures 24 | 25 | Captures from a regular expression. 26 | ]=] 27 | local RegexCaptures = {} 28 | 29 | --[=[ 30 | @within RegexCaptures 31 | @tag Method 32 | 33 | Returns the match at the given index, if one exists. 34 | 35 | @param index -- The index of the match to get 36 | @return RegexMatch -- The match, if one exists 37 | ]=] 38 | function RegexCaptures.get(self: RegexCaptures, index: number): RegexMatch? 39 | return nil :: any 40 | end 41 | 42 | --[=[ 43 | @within RegexCaptures 44 | @tag Method 45 | 46 | Returns the match for the given named match group, if one exists. 47 | 48 | @param group -- The name of the group to get 49 | @return RegexMatch -- The match, if one exists 50 | ]=] 51 | function RegexCaptures.group(self: RegexCaptures, group: string): RegexMatch? 52 | return nil :: any 53 | end 54 | 55 | --[=[ 56 | @within RegexCaptures 57 | @tag Method 58 | 59 | Formats the captures using the given format string. 60 | 61 | ### Example usage 62 | 63 | ```lua 64 | local regex = require("@lune/regex") 65 | 66 | local re = regex.new("(?[0-9]{2})-(?[0-9]{2})-(?[0-9]{4})") 67 | 68 | local caps = re:captures("On 14-03-2010, I became a Tenneessee lamb."); 69 | assert(caps ~= nil, "Example pattern should match example text") 70 | 71 | local formatted = caps:format("year=$year, month=$month, day=$day") 72 | print(formatted) -- "year=2010, month=03, day=14" 73 | ``` 74 | 75 | @param format -- The format string to use 76 | @return string -- The formatted string 77 | ]=] 78 | function RegexCaptures.format(self: RegexCaptures, format: string): string 79 | return nil :: any 80 | end 81 | 82 | export type RegexCaptures = typeof(RegexCaptures) 83 | 84 | local Regex = {} 85 | 86 | --[=[ 87 | @within Regex 88 | @tag Method 89 | 90 | Check if the given text matches the regular expression. 91 | 92 | This method may be slightly more efficient than calling `find` 93 | if you only need to know if the text matches the pattern. 94 | 95 | @param text -- The text to search 96 | @return boolean -- Whether the text matches the pattern 97 | ]=] 98 | function Regex.isMatch(self: Regex, text: string): boolean 99 | return nil :: any 100 | end 101 | 102 | --[=[ 103 | @within Regex 104 | @tag Method 105 | 106 | Finds the first match in the given text. 107 | 108 | Returns `nil` if no match was found. 109 | 110 | @param text -- The text to search 111 | @return RegexMatch? -- The match object 112 | ]=] 113 | function Regex.find(self: Regex, text: string): RegexMatch? 114 | return nil :: any 115 | end 116 | 117 | --[=[ 118 | @within Regex 119 | @tag Method 120 | 121 | Finds all matches in the given text as a `RegexCaptures` object. 122 | 123 | Returns `nil` if no matches are found. 124 | 125 | @param text -- The text to search 126 | @return RegexCaptures? -- The captures object 127 | ]=] 128 | function Regex.captures(self: Regex, text: string): RegexCaptures? 129 | return nil :: any 130 | end 131 | 132 | --[=[ 133 | @within Regex 134 | @tag Method 135 | 136 | Splits the given text using the regular expression. 137 | 138 | @param text -- The text to split 139 | @return { string } -- The split text 140 | ]=] 141 | function Regex.split(self: Regex, text: string): { string } 142 | return nil :: any 143 | end 144 | 145 | --[=[ 146 | @within Regex 147 | @tag Method 148 | 149 | Replaces the first match in the given text with the given replacer string. 150 | 151 | @param haystack -- The text to search 152 | @param replacer -- The string to replace matches with 153 | @return string -- The text with the first match replaced 154 | ]=] 155 | function Regex.replace(self: Regex, haystack: string, replacer: string): string 156 | return nil :: any 157 | end 158 | 159 | --[=[ 160 | @within Regex 161 | @tag Method 162 | 163 | Replaces all matches in the given text with the given replacer string. 164 | 165 | @param haystack -- The text to search 166 | @param replacer -- The string to replace matches with 167 | @return string -- The text with all matches replaced 168 | ]=] 169 | function Regex.replaceAll(self: Regex, haystack: string, replacer: string): string 170 | return nil :: any 171 | end 172 | 173 | export type Regex = typeof(Regex) 174 | 175 | --[=[ 176 | @class Regex 177 | 178 | Built-in library for regular expressions 179 | 180 | ### Example usage 181 | 182 | ```lua 183 | local Regex = require("@lune/regex") 184 | 185 | local re = Regex.new("hello") 186 | 187 | if re:isMatch("hello, world!") then 188 | print("Matched!") 189 | end 190 | 191 | local caps = re:captures("hello, world! hello, again!") 192 | 193 | print(#caps) -- 2 194 | print(caps:get(1)) -- "hello" 195 | print(caps:get(2)) -- "hello" 196 | print(caps:get(3)) -- nil 197 | ``` 198 | ]=] 199 | local regex = {} 200 | 201 | --[=[ 202 | @within Regex 203 | @tag Constructor 204 | 205 | Creates a new `Regex` from a given string pattern. 206 | 207 | ### Errors 208 | 209 | This constructor throws an error if the given pattern is invalid. 210 | 211 | @param pattern -- The string pattern to use 212 | @return Regex -- The new Regex object 213 | ]=] 214 | function regex.new(pattern: string): Regex 215 | return nil :: any 216 | end 217 | 218 | return regex 219 | -------------------------------------------------------------------------------- /.lune/process.luau: -------------------------------------------------------------------------------- 1 | export type OS = "linux" | "macos" | "windows" 2 | export type Arch = "x86_64" | "aarch64" 3 | 4 | export type SpawnOptionsStdioKind = "default" | "inherit" | "forward" | "none" 5 | export type SpawnOptionsStdio = { 6 | stdout: SpawnOptionsStdioKind?, 7 | stderr: SpawnOptionsStdioKind?, 8 | stdin: string?, 9 | } 10 | 11 | --[=[ 12 | @interface SpawnOptions 13 | @within Process 14 | 15 | A dictionary of options for `process.spawn`, with the following available values: 16 | 17 | * `cwd` - The current working directory for the process 18 | * `env` - Extra environment variables to give to the process 19 | * `shell` - Whether to run in a shell or not - set to `true` to run using the default shell, or a string to run using a specific shell 20 | * `stdio` - How to treat output and error streams from the child process - see `SpawnOptionsStdioKind` and `SpawnOptionsStdio` for more info 21 | * `stdin` - Optional standard input to pass to spawned child process 22 | ]=] 23 | export type SpawnOptions = { 24 | cwd: string?, 25 | env: { [string]: string }?, 26 | shell: (boolean | string)?, 27 | stdio: (SpawnOptionsStdioKind | SpawnOptionsStdio)?, 28 | stdin: string?, -- TODO: Remove this since it is now available in stdio above, breaking change 29 | } 30 | 31 | --[=[ 32 | @interface SpawnResult 33 | @within Process 34 | 35 | Result type for child processes in `process.spawn`. 36 | 37 | This is a dictionary containing the following values: 38 | 39 | * `ok` - If the child process exited successfully or not, meaning the exit code was zero or not set 40 | * `code` - The exit code set by the child process, or 0 if one was not set 41 | * `stdout` - The full contents written to stdout by the child process, or an empty string if nothing was written 42 | * `stderr` - The full contents written to stderr by the child process, or an empty string if nothing was written 43 | ]=] 44 | export type SpawnResult = { 45 | ok: boolean, 46 | code: number, 47 | stdout: string, 48 | stderr: string, 49 | } 50 | 51 | --[=[ 52 | @class Process 53 | 54 | Built-in functions for the current process & child processes 55 | 56 | ### Example usage 57 | 58 | ```lua 59 | local process = require("@lune/process") 60 | 61 | -- Getting the arguments passed to the Lune script 62 | for index, arg in process.args do 63 | print("Process argument #" .. tostring(index) .. ": " .. arg) 64 | end 65 | 66 | -- Getting the currently available environment variables 67 | local PORT: string? = process.env.PORT 68 | local HOME: string? = process.env.HOME 69 | for name, value in process.env do 70 | print("Environment variable " .. name .. " is set to " .. value) 71 | end 72 | 73 | -- Getting the current os and processor architecture 74 | print("Running " .. process.os .. " on " .. process.arch .. "!") 75 | 76 | -- Spawning a child process 77 | local result = process.spawn("program", { 78 | "cli argument", 79 | "other cli argument" 80 | }) 81 | if result.ok then 82 | print(result.stdout) 83 | else 84 | print(result.stderr) 85 | end 86 | ``` 87 | ]=] 88 | local process = {} 89 | 90 | --[=[ 91 | @within Process 92 | @prop os OS 93 | @tag read_only 94 | 95 | The current operating system being used. 96 | 97 | Possible values: 98 | 99 | * `"linux"` 100 | * `"macos"` 101 | * `"windows"` 102 | ]=] 103 | process.os = (nil :: any) :: OS 104 | 105 | --[=[ 106 | @within Process 107 | @prop arch Arch 108 | @tag read_only 109 | 110 | The architecture of the processor currently being used. 111 | 112 | Possible values: 113 | 114 | * `"x86_64"` 115 | * `"aarch64"` 116 | ]=] 117 | process.arch = (nil :: any) :: Arch 118 | 119 | --[=[ 120 | @within Process 121 | @prop args { string } 122 | @tag read_only 123 | 124 | The arguments given when running the Lune script. 125 | ]=] 126 | process.args = (nil :: any) :: { string } 127 | 128 | --[=[ 129 | @within Process 130 | @prop cwd string 131 | @tag read_only 132 | 133 | The current working directory in which the Lune script is running. 134 | ]=] 135 | process.cwd = (nil :: any) :: string 136 | 137 | --[=[ 138 | @within Process 139 | @prop env { [string]: string? } 140 | @tag read_write 141 | 142 | Current environment variables for this process. 143 | 144 | Setting a value on this table will set the corresponding environment variable. 145 | ]=] 146 | process.env = (nil :: any) :: { [string]: string? } 147 | 148 | --[=[ 149 | @within Process 150 | 151 | Exits the currently running script as soon as possible with the given exit code. 152 | 153 | Exit code 0 is treated as a successful exit, any other value is treated as an error. 154 | 155 | Setting the exit code using this function will override any otherwise automatic exit code. 156 | 157 | @param code The exit code to set 158 | ]=] 159 | function process.exit(code: number?): never 160 | return nil :: any 161 | end 162 | 163 | --[=[ 164 | @within Process 165 | 166 | Spawns a child process that will run the program `program`, and returns a dictionary that describes the final status and ouput of the child process. 167 | 168 | The second argument, `params`, can be passed as a list of string parameters to give to the program. 169 | 170 | The third argument, `options`, can be passed as a dictionary of options to give to the child process. 171 | Refer to the documentation for `SpawnOptions` for specific option keys and their values. 172 | 173 | @param program The program to spawn as a child process 174 | @param params Additional parameters to pass to the program 175 | @param options A dictionary of options for the child process 176 | @return A dictionary representing the result of the child process 177 | ]=] 178 | function process.spawn(program: string, params: { string }?, options: SpawnOptions?): SpawnResult 179 | return nil :: any 180 | end 181 | 182 | return process 183 | -------------------------------------------------------------------------------- /Src/Places/Loaders/Doors/Lobby.luau: -------------------------------------------------------------------------------- 1 | --// Loading Wait \\-- 2 | if shared.LocalPlayer.PlayerGui:FindFirstChild("LoadingUI") and shared.LocalPlayer.PlayerGui.LoadingUI.Enabled then 3 | repeat task.wait() until not shared.LocalPlayer.PlayerGui.LoadingUI.Enabled 4 | end 5 | 6 | shared.Character = shared.LocalPlayer.Character or shared.LocalPlayer.CharacterAdded:Wait() 7 | 8 | --// Linoria \\-- 9 | local Toggles = shared.Toggles 10 | local Options = shared.Options 11 | 12 | --// Variables \\-- 13 | local Script = shared.Script 14 | Script.CurrentBadge = 0 15 | Script.Achievements = { 16 | "SurviveWithoutHiding", 17 | "SurviveGloombats", 18 | "SurviveSeekMinesSecond", 19 | "TowerHeroesGoblino", 20 | "EscapeBackdoor", 21 | "SurviveFiredamp", 22 | "CrucifixDread", 23 | "EnterRooms", 24 | "EncounterVoid", 25 | "Join", 26 | "DeathAmt100", 27 | "UseCrucifix", 28 | "EncounterSpider", 29 | "SurviveHalt", 30 | "SurviveRush", 31 | "DeathAmt10", 32 | "Revive", 33 | "PlayFriend", 34 | "SurviveNest", 35 | "CrucifixFigure", 36 | "CrucifixAmbush", 37 | "PlayerBetrayal", 38 | "SurviveEyes", 39 | "KickGiggle", 40 | "EscapeMines", 41 | "GlowstickGiggle", 42 | "DeathAmt1", 43 | "SurviveSeek", 44 | "UseRiftMutate", 45 | "CrucifixGloombatSwarm", 46 | "SurviveScreech", 47 | "SurviveDread", 48 | "SurviveSeekMinesFirst", 49 | "CrucifixHalt", 50 | "TowerHeroesVoid", 51 | "JoinLSplash", 52 | "CrucifixDupe", 53 | "EncounterGlitch", 54 | "JeffShop", 55 | "CrucifixScreech", 56 | "SurviveGiggle", 57 | "EscapeHotelMod1", 58 | "SurviveDupe", 59 | "CrucifixRush", 60 | "EscapeBackdoorHunt", 61 | "EscapeHotel", 62 | "CrucifixGiggle", 63 | "EscapeFools", 64 | "UseRift", 65 | "SpecialQATester", 66 | "EscapeRetro", 67 | "TowerHeroesHard", 68 | "EnterBackdoor", 69 | "EscapeRooms1000", 70 | "EscapeRooms", 71 | "EscapeHotelMod2", 72 | "EncounterMobble", 73 | "CrucifixGrumble", 74 | "UseHerbGreen", 75 | "CrucifixSeek", 76 | "JeffTipFull", 77 | "SurviveFigureLibrary", 78 | "TowerHeroesHotel", 79 | "CrucifixEyes", 80 | "BreakerSpeedrun", 81 | "SurviveAmbush", 82 | "SurviveHide", 83 | "JoinAgain" 84 | } 85 | 86 | Script.RemotesFolder = shared.ReplicatedStorage:WaitForChild("RemotesFolder") 87 | Script.CreateElevator = Script.RemotesFolder:WaitForChild("CreateElevator") 88 | 89 | Script.MainUI = shared.PlayerGui:WaitForChild("MainUI") 90 | Script.LobbyFrame = Script.MainUI:WaitForChild("LobbyFrame") 91 | Script.AchievementsFrame = Script.LobbyFrame:WaitForChild("Achievements") 92 | Script.CreateElevatorFrame = Script.LobbyFrame:WaitForChild("CreateElevator") 93 | 94 | Script.LobbyElevators = workspace:WaitForChild("Lobby"):WaitForChild("LobbyElevators") 95 | 96 | --// Functions \\-- 97 | function Script.Functions.SetupVariables() 98 | if wax.shared.ExecutorSupport["require"] then 99 | for achievementName, _ in pairs(wax.require(shared.ReplicatedStorage.Achievements)) do 100 | if table.find(Script.Achievements, achievementName) then continue end 101 | 102 | table.insert(Script.Achievements, achievementName) 103 | end 104 | else 105 | local badgeList = Script.AchievementsFrame:WaitForChild("List", math.huge) 106 | 107 | if badgeList then 108 | repeat task.wait(0.5) until #badgeList:GetChildren() ~= 0 109 | 110 | shared.Connect:GiveSignal(badgeList.ChildAdded:Connect(function(badge) 111 | if not badge:IsA("ImageButton") then return end 112 | if table.find(Script.Achievements, badge.Name) then return end 113 | table.insert(Script.Achievements, badge.Name) 114 | end)) 115 | 116 | for _, badge in pairs(badgeList:GetChildren()) do 117 | if not badge:IsA("ImageButton") then continue end 118 | if table.find(Script.Achievements, badge.Name) then continue end 119 | 120 | table.insert(Script.Achievements, badge.Name) 121 | end 122 | end 123 | end 124 | end 125 | 126 | function Script.Functions.LoopAchievements() 127 | task.spawn(function() 128 | while Toggles.LoopAchievements.Value and not shared.Library.Unloaded do 129 | if Script.CurrentBadge >= #Script.Achievements then Script.CurrentBadge = 0 end 130 | Script.CurrentBadge += 1 131 | 132 | local random = Script.Achievements[Script.CurrentBadge] 133 | Script.RemotesFolder.FlexAchievement:FireServer(random) 134 | 135 | task.wait(Options.LoopAchievementsSpeed.Value) 136 | end 137 | end) 138 | end 139 | 140 | function Script.Functions.SetupCharacterConnection(newCharacter) 141 | shared.Character = newCharacter 142 | shared.Humanoid = shared.Character:FindFirstChildWhichIsA("Humanoid") 143 | shared.RootPart = shared.Character:FindFirstChild("HumanoidRootPart") or shared.Character.PrimaryPart 144 | 145 | if shared.Humanoid then 146 | shared.Twerk:Setup() 147 | if Toggles.Twerk.Value then 148 | shared.Twerk:Enable() 149 | end 150 | end 151 | end 152 | 153 | shared.Load("Utils", "Preset") 154 | 155 | --// Tabs \\-- 156 | Script.Tabs = { 157 | Main = shared.Window:AddTab("Main") 158 | } 159 | 160 | shared.Load("Tabs", "Main") 161 | 162 | --// Code \\-- 163 | task.spawn(Script.Functions.SetupVariables) 164 | task.spawn(Script.Functions.LoadPresets) 165 | 166 | task.spawn(Script.Functions.SetupCharacterConnection, shared.Character) 167 | shared.Connect:GiveSignal(shared.LocalPlayer.CharacterAdded:Connect(function(newCharacter) 168 | task.delay(1, Script.Functions.SetupCharacterConnection, newCharacter) 169 | end)) 170 | 171 | getgenv().mspaint_loaded = true -------------------------------------------------------------------------------- /Src/Places/Loaders/Babft/Babft.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | Script.FeatureConnections = { 8 | Character = {}, 9 | Humanoid = {}, 10 | Player = {}, 11 | RootPart = {}, 12 | } 13 | 14 | Script.AutoFarmStagePositions = {} 15 | 16 | Script.BoatStages = workspace:WaitForChild("BoatStages") 17 | Script.NormalStages = Script.BoatStages:WaitForChild("NormalStages") 18 | Script.ClaimGold = workspace:WaitForChild("ClaimRiverResultsGold") 19 | 20 | Script.DisableAutoFarm = false 21 | 22 | Script.AutoFarmPart = Instance.new("Part"); do 23 | Script.AutoFarmPart.CanCollide = false 24 | Script.AutoFarmPart.Anchored = true 25 | Script.AutoFarmPart.Transparency = 1 26 | end 27 | 28 | shared.Character = shared.LocalPlayer.Character or shared.LocalPlayer.CharacterAdded:Wait() 29 | 30 | --// Functions \\-- 31 | function Script.Functions.UpdateBloxstrapRPC() 32 | if not wax.shared.BloxstrapRPC then return end 33 | 34 | wax.shared.BloxstrapRPC.SetRichPresence({ 35 | details = "Playing BABFT [ mspaint v2 - DISCONTINUED ]", 36 | state = #shared.Players:GetPlayers() .. " players in the server", 37 | largeImage = { 38 | hoverText = "Using mspaint v2 - DISCONTINUED" 39 | }, 40 | smallImage = { 41 | assetId = 6925817108, 42 | hoverText = shared.LocalPlayer.Name 43 | } 44 | }) 45 | end 46 | 47 | function Script.Functions.SetupAutoFarmVariables() 48 | for i = 1, 10 do 49 | table.insert(Script.AutoFarmStagePositions, Script.NormalStages:FindFirstChild("CaveStage" .. tostring(i)).DarknessPart.Position) 50 | end 51 | 52 | table.insert(Script.AutoFarmStagePositions, Script.NormalStages.TheEnd.GoldenChest.Trigger.Position + Vector3.new(0, 350, 0)) 53 | table.insert(Script.AutoFarmStagePositions, Script.NormalStages.TheEnd.GoldenChest.Trigger.Position) 54 | end 55 | 56 | function Script.Functions.AutoFarm() 57 | if not shared.Character then return end 58 | if not Toggles.AutoFarm.Value then return end 59 | 60 | for idx, stagePosition in pairs(Script.AutoFarmStagePositions) do 61 | if not Toggles.AutoFarm.Value or shared.Library.Unloaded then break end 62 | 63 | if idx >= 11 and Options.AutoFarmPriority.Value == "Gold" then 64 | Script.ClaimGold:FireServer() 65 | Script.DisableAutoFarm = true 66 | 67 | shared.Humanoid.Health = 0 68 | break 69 | end 70 | 71 | Script.DisableAutoFarm = false 72 | Script.AutoFarmPart.Position = shared.Character:GetPivot().Position 73 | 74 | -- TODO: move from tween to lerping 75 | local partTween = shared.TweenService:Create(Script.AutoFarmPart, TweenInfo.new((shared.Character:GetPivot().Position - stagePosition).Magnitude / (Options.AutoFarmSpeed.Value * 100), Enum.EasingStyle.Linear), { 76 | Position = stagePosition 77 | }) 78 | 79 | partTween:Play() 80 | partTween.Completed:Wait() 81 | 82 | if Options.AutoFarmPriority.Value == "Gold" then 83 | Script.ClaimGold:FireServer() 84 | end 85 | 86 | if idx == 12 then 87 | Script.DisableAutoFarm = true 88 | 89 | local newCharacter = shared.LocalPlayer.CharacterAdded:Wait() 90 | Script.AutoFarmPart.Position = newCharacter:GetPivot().Position 91 | 92 | task.wait(0.25) 93 | end 94 | end 95 | end 96 | 97 | shared.Load("Utils", "ConnectionsFuncs") 98 | 99 | --// Tabs \\-- 100 | Script.Tabs = { 101 | Main = shared.Window:AddTab("Main"), 102 | } 103 | 104 | shared.Load("Tabs", "Main") 105 | 106 | --// Local Player Connection \\-- 107 | shared.Connect:GiveSignal(shared.LocalPlayer.CharacterAdded:Connect(function(newCharacter) 108 | task.delay(1, Script.Functions.SetupCharacterConnection, newCharacter) 109 | end)) 110 | 111 | --// Run Service \\-- 112 | shared.Connect:GiveSignal(shared.RunService.RenderStepped:Connect(function() 113 | if shared.Character then 114 | if shared.Humanoid then 115 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = Options.WalkSpeed.Value end 116 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpPower = Options.JumpPower.Value end 117 | end 118 | 119 | if Toggles.Noclip.Value then 120 | for _, part in pairs(shared.Character:GetDescendants()) do 121 | if not part:IsA("BasePart") then continue end 122 | part.CanCollide = false 123 | end 124 | end 125 | 126 | if Toggles.AutoFarm.Value and Script.AutoFarmPart and not Script.DisableAutoFarm then 127 | if shared.Character.PrimaryPart then 128 | shared.Character.PrimaryPart.Velocity = Vector3.zero 129 | end 130 | 131 | shared.Character:PivotTo(Script.AutoFarmPart.CFrame) 132 | end 133 | end 134 | end)) 135 | 136 | --// Load \\-- 137 | Script.Functions.UpdateBloxstrapRPC() 138 | 139 | task.spawn(Script.Functions.SetupAutoFarmVariables) 140 | task.spawn(Script.Functions.SetupCharacterConnection, shared.Character) 141 | task.spawn(Script.Functions.SetupBloxstrapRPCConnection) 142 | 143 | --// Unload \\-- 144 | shared.Library:OnUnload(function() 145 | if wax.shared.BloxstrapRPC then 146 | wax.shared.BloxstrapRPC.SetRichPresence({ 147 | details = "", 148 | state = "", 149 | largeImage = { 150 | reset = true 151 | }, 152 | smallImage = { 153 | reset = true 154 | } 155 | }) 156 | end 157 | 158 | for _, category in pairs(Script.FeatureConnections) do 159 | for _, connection in pairs(category) do 160 | connection:Disconnect() 161 | end 162 | end 163 | 164 | Script.AutoFarmPart:Destroy() 165 | 166 | shared.Twerk:Disable() 167 | end) 168 | 169 | getgenv().mspaint_loaded = true -------------------------------------------------------------------------------- /.lune/serde.luau: -------------------------------------------------------------------------------- 1 | --[=[ 2 | @within Serde 3 | @interface EncodeDecodeFormat 4 | 5 | A serialization/deserialization format supported by the Serde library. 6 | 7 | Currently supported formats: 8 | 9 | | Name | Learn More | 10 | |:-------|:---------------------| 11 | | `json` | https://www.json.org | 12 | | `yaml` | https://yaml.org | 13 | | `toml` | https://toml.io | 14 | ]=] 15 | export type EncodeDecodeFormat = "json" | "yaml" | "toml" 16 | 17 | --[=[ 18 | @within Serde 19 | @interface CompressDecompressFormat 20 | 21 | A compression/decompression format supported by the Serde library. 22 | 23 | Currently supported formats: 24 | 25 | | Name | Learn More | 26 | |:---------|:----------------------------------| 27 | | `brotli` | https://github.com/google/brotli | 28 | | `gzip` | https://www.gnu.org/software/gzip | 29 | | `lz4` | https://github.com/lz4/lz4 | 30 | | `zlib` | https://www.zlib.net | 31 | ]=] 32 | export type CompressDecompressFormat = "brotli" | "gzip" | "lz4" | "zlib" 33 | 34 | --[=[ 35 | @within Serde 36 | @interface HashAlgorithm 37 | 38 | A hash algorithm supported by the Serde library. 39 | 40 | Currently supported algorithms: 41 | 42 | | Name | Learn More | 43 | |:-----------|:-------------------------------------| 44 | | `md5` | https://en.wikipedia.org/wiki/MD5 | 45 | | `sha1` | https://en.wikipedia.org/wiki/SHA-1 | 46 | | `sha224` | https://en.wikipedia.org/wiki/SHA-2 | 47 | | `sha256` | https://en.wikipedia.org/wiki/SHA-2 | 48 | | `sha384` | https://en.wikipedia.org/wiki/SHA-2 | 49 | | `sha512` | https://en.wikipedia.org/wiki/SHA-2 | 50 | | `sha3-224` | https://en.wikipedia.org/wiki/SHA-3 | 51 | | `sha3-256` | https://en.wikipedia.org/wiki/SHA-3 | 52 | | `sha3-384` | https://en.wikipedia.org/wiki/SHA-3 | 53 | | `sha3-512` | https://en.wikipedia.org/wiki/SHA-3 | 54 | | `blake3` | https://en.wikipedia.org/wiki/BLAKE3 | 55 | ]=] 56 | export type HashAlgorithm = 57 | "md5" 58 | | "sha1" 59 | | "sha224" 60 | | "sha256" 61 | | "sha384" 62 | | "sha512" 63 | | "sha3-224" 64 | | "sha3-256" 65 | | "sha3-384" 66 | | "sha3-512" 67 | | "blake3" 68 | 69 | --[=[ 70 | @class Serde 71 | 72 | Built-in library for: 73 | - serialization & deserialization 74 | - encoding & decoding 75 | - compression 76 | 77 | ### Example usage 78 | 79 | ```lua 80 | local fs = require("@lune/fs") 81 | local serde = require("@lune/serde") 82 | 83 | -- Parse different file formats into lua tables 84 | local someJson = serde.decode("json", fs.readFile("myFile.json")) 85 | local someToml = serde.decode("toml", fs.readFile("myFile.toml")) 86 | local someYaml = serde.decode("yaml", fs.readFile("myFile.yaml")) 87 | 88 | -- Write lua tables to files in different formats 89 | fs.writeFile("myFile.json", serde.encode("json", someJson)) 90 | fs.writeFile("myFile.toml", serde.encode("toml", someToml)) 91 | fs.writeFile("myFile.yaml", serde.encode("yaml", someYaml)) 92 | ``` 93 | ]=] 94 | local serde = {} 95 | 96 | --[=[ 97 | @within Serde 98 | @tag must_use 99 | 100 | Encodes the given value using the given format. 101 | 102 | See [`EncodeDecodeFormat`] for a list of supported formats. 103 | 104 | @param format The format to use 105 | @param value The value to encode 106 | @param pretty If the encoded string should be human-readable, including things such as newlines and spaces. Only supported for json and toml formats, and defaults to false 107 | @return The encoded string 108 | ]=] 109 | function serde.encode(format: EncodeDecodeFormat, value: any, pretty: boolean?): string 110 | return nil :: any 111 | end 112 | 113 | --[=[ 114 | @within Serde 115 | @tag must_use 116 | 117 | Decodes the given string using the given format into a lua value. 118 | 119 | See [`EncodeDecodeFormat`] for a list of supported formats. 120 | 121 | @param format The format to use 122 | @param encoded The string to decode 123 | @return The decoded lua value 124 | ]=] 125 | function serde.decode(format: EncodeDecodeFormat, encoded: buffer | string): any 126 | return nil :: any 127 | end 128 | 129 | --[=[ 130 | @within Serde 131 | @tag must_use 132 | 133 | Compresses the given string using the given format. 134 | 135 | See [`CompressDecompressFormat`] for a list of supported formats. 136 | 137 | @param format The format to use 138 | @param s The string to compress 139 | @return The compressed string 140 | ]=] 141 | function serde.compress(format: CompressDecompressFormat, s: buffer | string): string 142 | return nil :: any 143 | end 144 | 145 | --[=[ 146 | @within Serde 147 | @tag must_use 148 | 149 | Decompresses the given string using the given format. 150 | 151 | See [`CompressDecompressFormat`] for a list of supported formats. 152 | 153 | @param format The format to use 154 | @param s The string to decompress 155 | @return The decompressed string 156 | ]=] 157 | function serde.decompress(format: CompressDecompressFormat, s: buffer | string): string 158 | return nil :: any 159 | end 160 | 161 | --[=[ 162 | @within Serde 163 | @tag must_use 164 | 165 | Hashes the given message using the given algorithm 166 | and returns the hash as a hex string. 167 | 168 | See [`HashAlgorithm`] for a list of supported algorithms. 169 | 170 | @param algorithm The algorithm to use 171 | @param message The message to hash 172 | @return The hash as a hex string 173 | ]=] 174 | function serde.hash(algorithm: HashAlgorithm, message: string | buffer): string 175 | return nil :: any 176 | end 177 | 178 | --[=[ 179 | @within Serde 180 | @tag must_use 181 | 182 | Hashes the given message using HMAC with the given secret 183 | and algorithm, returning the hash as a base64 string. 184 | 185 | See [`HashAlgorithm`] for a list of supported algorithms. 186 | 187 | @param algorithm The algorithm to use 188 | @param message The message to hash 189 | @return The hash as a base64 string 190 | ]=] 191 | function serde.hmac( 192 | algorithm: HashAlgorithm, 193 | message: string | buffer, 194 | secret: string | buffer 195 | ): string 196 | return nil :: any 197 | end 198 | 199 | return serde 200 | -------------------------------------------------------------------------------- /Src/Places/Tabs/3008/Exploits.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | --// Exploits \\-- 10 | local TrollingGroupBox = Tabs.Exploits:AddLeftGroupbox("Trolling") do 11 | TrollingGroupBox:AddToggle("ThrowPowerBoost",{ 12 | Text = "Throw Power Boost", 13 | Default = false, 14 | Visible = wax.shared.ExecutorSupport["hookmetamethod"] and wax.shared.ExecutorSupport["getnamecallmethod"], 15 | }) 16 | 17 | TrollingGroupBox:AddSlider("ThrowPower", { 18 | Text = "Throw Power", 19 | Default = 10, 20 | Min = 1, 21 | Max = 100, 22 | Rounding = 1, 23 | Compact = true, 24 | Visible = wax.shared.ExecutorSupport["hookmetamethod"] and wax.shared.ExecutorSupport["getnamecallmethod"], 25 | }) 26 | 27 | TrollingGroupBox:AddToggle("DeleteObject", { 28 | Text = "FE Delete Object", 29 | Default = false, 30 | Visible = wax.shared.ExecutorSupport["hookmetamethod"] and wax.shared.ExecutorSupport["getnamecallmethod"], 31 | }) 32 | 33 | TrollingGroupBox:AddToggle("Twerk",{ 34 | Text = "Twerk", 35 | Default = false, 36 | }) 37 | 38 | TrollingGroupBox:AddDivider() 39 | 40 | TrollingGroupBox:AddToggle("DeleteAura", { 41 | Text = "FE Delete Aura", 42 | Default = false, 43 | Risky = true, 44 | Tooltip = "Delete objects within a certain range of your character, this can kick you from the game and i'm too lazy to fix it." 45 | }) 46 | 47 | TrollingGroupBox:AddSlider("DeleteAuraRange", { 48 | Text = "Delete Aura Range", 49 | Default = 15, 50 | Min = 1, 51 | Max = 30, 52 | Rounding = 1, 53 | Compact = true 54 | }) 55 | end 56 | 57 | local BypassGroupBox = Tabs.Exploits:AddRightGroupbox("Bypass") do 58 | BypassGroupBox:AddToggle("Godmode", { 59 | Text = "Godmode", 60 | Default = false 61 | }) 62 | 63 | BypassGroupBox:AddToggle("InfiniteHunger", { 64 | Text = "Disable Hunger", 65 | Default = false, 66 | Tooltip = "You will never get hungry, incompatible with Godmode." 67 | }) 68 | 69 | BypassGroupBox:AddToggle("InfiniteEnergy", { 70 | Text = "Infinite Energy", 71 | Default = false, 72 | Tooltip = "You will never get tired, incompatible with Godmode." 73 | }) 74 | 75 | BypassGroupBox:AddToggle("InfiniteInventory", { 76 | Text = "Infinite Inventory", 77 | Default = false, 78 | Visible = wax.shared.ExecutorSupport["require"] and wax.shared.ExecutorSupport["hookmetamethod"] and wax.shared.ExecutorSupport["getnamecallmethod"], 79 | }) 80 | end 81 | 82 | Toggles.Godmode:OnChanged(function(value) 83 | if value then 84 | Script.DidGodmode = true 85 | 86 | repeat task.wait() until #Script.Map.Floor:GetChildren() > 0 87 | 88 | Script.Event:FireServer("FallDamage", { 89 | Sliding = false, 90 | OriginalDamage = (0/0), 91 | Sound = "LR^SS", 92 | Softened = true, 93 | Broken = false, 94 | Model = Script.Map.Floor:FindFirstChildOfClass("Model"), 95 | Range = 19, 96 | Damage = (0/0) 97 | }) 98 | 99 | else 100 | if not Script.DidGodmode then return end 101 | Script.DidGodmode = false 102 | 103 | Script.Functions.Respawn() 104 | end 105 | end) 106 | 107 | Toggles.InfiniteHunger:OnChanged(function(value) 108 | if value and not Toggles.Godmode.Value then 109 | Script.Event:FireServer("DecreaseStat", { 110 | Stats = { 111 | Hunger = -100 112 | } 113 | }) 114 | end 115 | end) 116 | 117 | Toggles.InfiniteEnergy:OnChanged(function(value) 118 | if value and not Toggles.Godmode.Value then 119 | Script.Event:FireServer("DecreaseStat", { 120 | Stats = { 121 | Energy = -100 122 | } 123 | }) 124 | end 125 | end) 126 | 127 | local DeleteAuraParams = OverlapParams.new() 128 | DeleteAuraParams.FilterType = Enum.RaycastFilterType.Exclude 129 | DeleteAuraParams.FilterDescendantsInstances = {shared.Character, shared.Camera} 130 | 131 | Toggles.DeleteAura:OnChanged(function(value) 132 | if value then 133 | repeat task.wait(0.15) 134 | local CloseParts = workspace:GetPartBoundsInBox(shared.RootPart.CFrame, Vector3.new(Options.DeleteAuraRange.Value, Options.DeleteAuraRange.Value, Options.DeleteAuraRange.Value), DeleteAuraParams) 135 | 136 | for _, part in pairs(CloseParts) do 137 | local targetFurniture = part:FindFirstAncestorOfClass("Model") or part.Parent 138 | if shared.Players:GetPlayerFromCharacter(targetFurniture) then continue end 139 | 140 | if targetFurniture and targetFurniture:IsA("Model") and targetFurniture.PrimaryPart then 141 | local isClose = shared.Character and Script.Functions.DistanceFromCharacter(part) <= 9 142 | local isAbleToPickup = not targetFurniture:GetAttribute("Busy") 143 | 144 | if not isClose or not isAbleToPickup then continue end 145 | 146 | Script.Action:InvokeServer("Pickup", {["Model"] = targetFurniture}) 147 | 148 | Script.Action:InvokeServer("Drop", { 149 | EndCFrame = CFrame.new(shared.RootPart.Position + Vector3.new( 150 | math.random(1, 5), 151 | math.random(5, 8), 152 | math.random(1, 5) 153 | )), 154 | 155 | CameraCFrame = Vector3.new(0.9865860342979431, 0.16270768642425537, -0.013206666335463524) * 250, 156 | ThrowPower = 555, 157 | Throw = true 158 | }) 159 | end 160 | end 161 | until not Toggles.DeleteAura.Value or shared.Library.Unloaded 162 | end 163 | end) 164 | 165 | Toggles.Twerk:OnChanged(function(value) 166 | shared.Twerk:Set(value) 167 | end) -------------------------------------------------------------------------------- /Src/Places/Loaders/Universal.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | Script.FeatureConnections = { 8 | Character = {}, 9 | Humanoid = {}, 10 | Player = {}, 11 | RootPart = {}, 12 | } 13 | Script.ESPTable = { 14 | Player = {}, 15 | None = {} 16 | } 17 | Script.AimbotTween = nil 18 | 19 | shared.Character = shared.LocalPlayer.Character or shared.LocalPlayer.CharacterAdded:Wait() 20 | Script.GameName = "a roblox experience" 21 | 22 | --// Functions \\-- 23 | function Script.Functions.UpdateBloxstrapRPC() 24 | if not wax.shared.BloxstrapRPC then return end 25 | 26 | wax.shared.BloxstrapRPC.SetRichPresence({ 27 | details = "Playing " .. Script.GameName .. " [ mspaint v2 - DISCONTINUED ]", 28 | state = #shared.Players:GetPlayers() .. " players in the server", 29 | largeImage = { 30 | hoverText = "Using mspaint v2 - DISCONTINUED" 31 | }, 32 | smallImage = { 33 | assetId = 6925817108, 34 | hoverText = shared.LocalPlayer.Name 35 | } 36 | }) 37 | end 38 | 39 | 40 | shared.Load("Utils", "Player") 41 | shared.Load("Utils", "Assets") 42 | shared.Load("Utils", "Aimbot") 43 | shared.Load("Utils", "ESP") 44 | 45 | shared.Load("Utils", "ConnectionsFuncs") 46 | 47 | --// Tabs \\-- 48 | Script.Tabs = { 49 | Main = shared.Window:AddTab("Main"), 50 | Exploits = shared.Window:AddTab("Exploits"), 51 | Visuals = shared.Window:AddTab("Visuals") 52 | } 53 | 54 | shared.Load("Tabs", "Main") 55 | shared.Load("Tabs", "Exploits") 56 | shared.Load("Tabs", "Visuals") 57 | 58 | --// Code \\-- 59 | 60 | --// Players Connection \\-- 61 | for _, player in pairs(shared.Players:GetPlayers()) do 62 | if player == shared.LocalPlayer then continue end 63 | Script.Functions.SetupOtherPlayerConnection(player) 64 | end 65 | shared.Connect:GiveSignal(shared.Players.PlayerAdded:Connect(Script.Functions.SetupOtherPlayerConnection)) 66 | 67 | --// Local Player Connection \\-- 68 | shared.Connect:GiveSignal(shared.LocalPlayer.CharacterAdded:Connect(function(newCharacter) 69 | task.delay(1, Script.Functions.SetupCharacterConnection, newCharacter) 70 | end)) 71 | 72 | shared.Connect:GiveSignal(shared.ProximityPromptService.PromptButtonHoldBegan:Connect(function(prompt) 73 | if Toggles.InstaInteract.Value then 74 | shared.fireproximityprompt(prompt) 75 | end 76 | end)) 77 | 78 | --// Run Service \\-- 79 | shared.Connect:GiveSignal(shared.RunService.RenderStepped:Connect(function() 80 | if shared.Character then 81 | if shared.Humanoid then 82 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = Options.WalkSpeed.Value end 83 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpPower = Options.JumpPower.Value end 84 | end 85 | 86 | if Toggles.Noclip.Value then 87 | for _, part in pairs(shared.Character:GetDescendants()) do 88 | if not part:IsA("BasePart") then continue end 89 | part.CanCollide = false 90 | end 91 | end 92 | 93 | if Toggles.EnableAimbot.Value and (shared.Library.IsMobile or Options.EnableAimbotKey:GetState()) then 94 | local closest = nil 95 | if Options.AimbotClosestMethod.Value == "Mouse" then 96 | closest = Script.Functions.GetClosestFromMouse() 97 | elseif Options.AimbotClosestMethod.Value == "Character" then 98 | closest = Script.Functions.GetClosestFromCharacter() 99 | end 100 | 101 | if closest then 102 | if Toggles.AimbotSmooth.Value then 103 | Script.AimbotTween = shared.TweenService:Create(shared.Camera, TweenInfo.new(Options.AimbotSmoothness.Value / 100, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut), { 104 | CFrame = CFrame.new(shared.Camera.CFrame.Position, closest[Options.AimbotTargetPart.Value].Position) 105 | }) 106 | Script.AimbotTween:Play() 107 | else 108 | shared.Camera.CFrame = CFrame.new(shared.Camera.CFrame.Position, closest[Options.AimbotTargetPart.Value].Position) 109 | end 110 | end 111 | elseif Script.AimbotTween then 112 | Script.AimbotTween:Cancel() 113 | Script.AimbotTween = nil 114 | end 115 | end 116 | end)) 117 | 118 | --// Load \\-- 119 | local success, gameName = pcall(function() 120 | return shared.MarketplaceService:GetProductInfo(game.PlaceId).Name 121 | end) 122 | 123 | if success then Script.GameName = gameName end 124 | Script.Functions.UpdateBloxstrapRPC() 125 | 126 | task.spawn(Script.Functions.SetupCharacterConnection, shared.Character) 127 | task.spawn(Script.Functions.SetupChildConnection) 128 | task.spawn(Script.Functions.SetupBloxstrapRPCConnection) 129 | 130 | --// Unload \\-- 131 | shared.Library:OnUnload(function() 132 | if wax.shared.BloxstrapRPC then 133 | wax.shared.BloxstrapRPC.SetRichPresence({ 134 | details = "", 135 | state = "", 136 | largeImage = { 137 | reset = true 138 | }, 139 | smallImage = { 140 | reset = true 141 | } 142 | }) 143 | end 144 | 145 | for _, espType in pairs(Script.ESPTable) do 146 | for _, esp in pairs(espType) do 147 | esp.Destroy() 148 | end 149 | end 150 | 151 | for _, object in pairs(workspace:GetDescendants()) do 152 | if object:IsA("BasePart") then 153 | if not object:GetAttribute("Material") then object:SetAttribute("Material", object.Material) end 154 | if not object:GetAttribute("Reflectance") then object:SetAttribute("Reflectance", object.Reflectance) end 155 | 156 | object.Material = object:GetAttribute("Material") 157 | object.Reflectance = object:GetAttribute("Reflectance") 158 | elseif object:IsA("Decal") then 159 | if not object:GetAttribute("Transparency") then object:SetAttribute("Transparency", object.Transparency) end 160 | 161 | object.Transparency = object:GetAttribute("Transparency") 162 | end 163 | end 164 | 165 | workspace.Terrain.WaterReflectance = 1 166 | workspace.Terrain.WaterTransparency = 1 167 | workspace.Terrain.WaterWaveSize = 0.05 168 | workspace.Terrain.WaterWaveSpeed = 8 169 | shared.Lighting.GlobalShadows = true 170 | 171 | shared.Twerk:Disable() 172 | end) 173 | 174 | getgenv().mspaint_loaded = true -------------------------------------------------------------------------------- /Src/Places/Utils/R&D/ESP.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local ESPLibrary = loadstring(game:HttpGet("https://raw.githubusercontent.com/deividcomsono/MS-ESP/refs/heads/main/source.lua"))() 8 | shared.ESPLibrary = ESPLibrary 9 | 10 | type ESP = { 11 | Color: Color3, 12 | IsInvisible: boolean, 13 | Object: Instance, 14 | Offset: Vector3, 15 | MaxDistance: number, 16 | Text: string, 17 | TextParent: Instance, 18 | Type: string, 19 | OnDestroy: () -> (), 20 | } 21 | 22 | function Script.Functions.ESP(args: ESP) 23 | if not args.Object then return Script.Functions.Warn("ESP Object is nil") end 24 | 25 | local ESPManager = { 26 | Object = args.Object, 27 | Text = args.Text or "No Text", 28 | Color = args.Color or Color3.new(), 29 | MaxDistance = args.MaxDistance or 5000, 30 | Offset = args.Offset or Vector3.zero, 31 | IsInvisible = args.IsInvisible or false, 32 | Type = args.Type or "None", 33 | OnDestroy = args.OnDestroy or nil, 34 | 35 | Humanoid = nil 36 | } 37 | 38 | if ESPManager.IsInvisible and ESPManager.Object.PrimaryPart then 39 | if ESPManager.Object.PrimaryPart.Transparency == 1 then 40 | ESPManager.Object.PrimaryPart.Transparency = 0.99 41 | end 42 | 43 | local humanoid = ESPManager.Object:FindFirstChildOfClass("Humanoid") 44 | if not humanoid then humanoid = Instance.new("Humanoid", ESPManager.Object) end 45 | ESPManager.Humanoid = humanoid 46 | end 47 | 48 | local ESPInstance = ESPLibrary.ESP.Highlight({ 49 | Name = ESPManager.Text, 50 | Model = ESPManager.Object, 51 | MaxDistance = ESPManager.MaxDistance, 52 | StudsOffset = ESPManager.Offset, 53 | 54 | FillColor = ESPManager.Color, 55 | OutlineColor = ESPManager.Color, 56 | TextColor = ESPManager.Color, 57 | TextSize = Options.ESPTextSize.Value or 16, 58 | 59 | FillTransparency = Options.ESPFillTransparency.Value, 60 | OutlineTransparency = Options.ESPOutlineTransparency.Value, 61 | 62 | Tracer = { 63 | Enabled = true, 64 | From = Options.ESPTracerStart.Value, 65 | Color = ESPManager.Color 66 | }, 67 | 68 | Arrow = { 69 | Enabled = true, 70 | CenterOffset = Options.ESPArrowCenterOffset.Value, 71 | Color = ESPManager.Color 72 | }, 73 | 74 | OnDestroy = ESPManager.OnDestroy or function() 75 | if ESPManager.Object.PrimaryPart and ESPManager.IsInvisible then ESPManager.Object.PrimaryPart.Transparency = 1 end 76 | if ESPManager.Humanoid then ESPManager.Humanoid:Destroy() end 77 | end 78 | }) 79 | 80 | table.insert(Script.ESPTable[args.Type], ESPInstance) 81 | 82 | return ESPInstance 83 | end 84 | 85 | function Script.Functions.DoorESP(room) 86 | local door = room:WaitForChild("door", 5) 87 | 88 | if door then 89 | local clickDetector = door:FindFirstChild("ClickDetector") 90 | if not clickDetector then return end 91 | 92 | local roomNumber = if tonumber(room.Name) then room.Name else tostring(workspace.roomnumber.Value + 1) 93 | 94 | local doorEsp = Script.Functions.ESP({ 95 | Type = "Door", 96 | Object = door, 97 | Text = string.format("Door %s", roomNumber), 98 | Color = Options.DoorEspColor.Value, 99 | 100 | OnDestroy = function() 101 | if Script.FeatureConnections.Door[door] then Script.FeatureConnections.Door[door]:Disconnect() end 102 | end 103 | }) 104 | 105 | Script.FeatureConnections.Door[door] = clickDetector.AncestryChanged:Connect(function(_, parent) 106 | if parent then return end 107 | 108 | if doorEsp then doorEsp.Destroy() end 109 | if Script.FeatureConnections.Door[door] then Script.FeatureConnections.Door[door]:Disconnect() end 110 | end) 111 | end 112 | end 113 | 114 | function Script.Functions.EntityESP(entity, entityName) 115 | local isInvisible = entity:IsA("BasePart") and entity.Transparency == 1 116 | local entityModel = if isInvisible then Instance.new("Model") else entity 117 | 118 | if isInvisible then 119 | local entityClone = entity:Clone() 120 | 121 | entityClone.Parent = entityModel 122 | entityModel.Parent = shared.Workspace 123 | 124 | entityModel.PrimaryPart = entityClone 125 | entityClone:ClearAllChildren() 126 | Instance.new("SpecialMesh", entityClone) 127 | 128 | shared.Connections[entity] = shared.RunService.Heartbeat:Connect(function() 129 | if entity:IsDescendantOf(workspace) then 130 | entityModel:PivotTo(entity:GetPivot()) 131 | else 132 | entityModel:Destroy() 133 | shared.Connect:DisconnectSignal(shared.Connections[entity]) 134 | end 135 | end) 136 | end 137 | 138 | Script.Functions.ESP({ 139 | Type = "Entity", 140 | Object = entityModel, 141 | Text = entityName, 142 | Color = Options.EntityEspColor.Value, 143 | IsInvisible = isInvisible, 144 | }) 145 | end 146 | 147 | function Script.Functions.BatteryESP(battery) 148 | Script.Functions.ESP({ 149 | Type = "Battery", 150 | Object = battery, 151 | Text = "Battery", 152 | Color = Options.BatteryEspColor.Value, 153 | MaxDistance = 300 154 | }) 155 | end 156 | 157 | function Script.Functions.LockerESP(hideLocker) 158 | local jack = hideLocker:FindFirstChild("jack") 159 | local extra = if jack then " [Shell]" else "" 160 | 161 | local lockerEsp = Script.Functions.ESP({ 162 | Type = "Locker", 163 | Object = hideLocker, 164 | Text = string.format("Locker%s", extra), 165 | Color = Options.LockerEspColor.Value, 166 | MaxDistance = 200, 167 | 168 | OnDestroy = function() 169 | if Script.FeatureConnections.Shell[jack] then Script.FeatureConnections.Shell[jack]:Disconnect() end 170 | end 171 | }) 172 | 173 | if jack then 174 | Script.FeatureConnections.Shell[jack] = jack.AncestryChanged:Connect(function(_, parent) 175 | if parent then return end 176 | 177 | if lockerEsp then lockerEsp.Destroy() end 178 | if Script.FeatureConnections.Shell[jack] then Script.FeatureConnections.Shell[jack]:Disconnect() end 179 | end) 180 | end 181 | end 182 | 183 | function Script.Functions.TableESP(hideTable) 184 | Script.Functions.ESP({ 185 | Type = "Table", 186 | Object = hideTable:FindFirstChild("spot"), 187 | Text = "Table", 188 | Color = Options.TableEspColor.Value, 189 | IsInvisible = true, 190 | MaxDistance = 250 191 | }) 192 | end -------------------------------------------------------------------------------- /Src/Utils/ExecutorSupport.luau: -------------------------------------------------------------------------------- 1 | local ExecutorSupport = {} 2 | local ExecutorSupportInfo = {} 3 | 4 | local executorName = string.split(identifyexecutor() or "None", " ")[1] 5 | local brokenFeatures = { 6 | ["Arceus"] = { "require" }, 7 | ["Codex"] = { "require" }, 8 | ["VegaX"] = { "require" }, 9 | } 10 | 11 | function test(name: string, func: () -> (), shouldCallback: boolean) 12 | if typeof(brokenFeatures[executorName]) == "table" and table.find(brokenFeatures[executorName], name) then return false end -- garbage executor 🤯 13 | 14 | local success, errorMessage = false, nil 15 | if shouldCallback ~= false then 16 | success, errorMessage = pcall(func) 17 | else 18 | success = typeof(func) == "function" 19 | end 20 | 21 | ExecutorSupportInfo[name] = string.format("%s [%s]%s", (if success then "✅" else "❌"), name, (if errorMessage then (": " .. tostring(errorMessage)) else "")) 22 | ExecutorSupport[name] = success 23 | return success 24 | end 25 | 26 | test("readfile", readfile, false) 27 | test("listfiles", listfiles, false) 28 | test("writefile", writefile, false) 29 | test("makefolder", makefolder, false) 30 | test("appendfile", appendfile, false) 31 | test("isfile", isfile, false) 32 | test("isfolder", isfolder, false) 33 | test("delfile", delfile, false) 34 | test("delfolder", delfolder, false) 35 | test("loadfile", loadfile, false) 36 | 37 | test("getrenv", getrenv, false) 38 | 39 | test("queue_on_teleport", queue_on_teleport, false) 40 | test("getcallingscript", getcallingscript, false) 41 | 42 | test("require", function() 43 | --wax.require(shared.Players.LocalPlayer:WaitForChild("PlayerScripts"):FindFirstChildWhichIsA("ModuleScript", true)) 44 | wax.require(shared.Players.LocalPlayer:WaitForChild("PlayerScripts", math.huge):WaitForChild("PlayerModule", 5)) 45 | end) 46 | test("hookmetamethod", function() 47 | local object = setmetatable({}, { __index = newcclosure(function() return false end), __metatable = "Locked!" }) 48 | local ref = hookmetamethod(object, "__index", function() return true end) 49 | assert(object.test == true, "Failed to hook a metamethod and change the return value") 50 | assert(ref() == false, "Did not return the original function") 51 | end) 52 | test("getnamecallmethod", function() 53 | pcall(function() 54 | game:NAMECALL_METHODS_ARE_IMPORTANT() 55 | end) 56 | 57 | assert(getnamecallmethod() == "NAMECALL_METHODS_ARE_IMPORTANT", "getnamecallmethod did not return the real namecall method") 58 | end) 59 | test("hookfunction", function() 60 | local function test() 61 | return true 62 | end 63 | local ref = hookfunction(test, function() 64 | return false 65 | end) 66 | assert(test() == false, "Function should return false") 67 | assert(ref() == true, "Original function should return true") 68 | assert(test ~= ref, "Original function should not be same as the reference") 69 | end) 70 | test("firesignal", function() 71 | local event = Instance.new("BindableEvent") 72 | local fired = false 73 | 74 | event.Event:Once(function(value) fired = value end) 75 | 76 | firesignal(event.Event, true) 77 | task.wait(0.1) 78 | event:Destroy() 79 | 80 | assert(fired, "Failed to fire a BindableEvent") 81 | end) 82 | local canFirePrompt = test("fireproximityprompt", function() 83 | local prompt = Instance.new("ProximityPrompt", Instance.new("Part", shared.Workspace)) 84 | local triggered = false 85 | 86 | prompt.Triggered:Once(function() triggered = true end) 87 | 88 | fireproximityprompt(prompt) 89 | task.wait(0.1) 90 | 91 | prompt.Parent:Destroy() 92 | assert(triggered, "Failed to fire proximity prompt") 93 | end) 94 | 95 | --// Fixes \\-- 96 | if not canFirePrompt then 97 | local function fireProximityPrompt(prompt: ProximityPrompt, lookToPrompt, doNotDoInstant) 98 | if not prompt:IsA("ProximityPrompt") then 99 | return error("ProximityPrompt expected, got " .. typeof(prompt)) 100 | end 101 | 102 | local connection 103 | local promptPosition = prompt.Parent:GetPivot().Position 104 | 105 | local originalEnabled = prompt.Enabled 106 | local originalHold = prompt.HoldDuration 107 | local originalLineOfSight = prompt.RequiresLineOfSight 108 | local originalCamCFrame = workspace.CurrentCamera.CFrame 109 | 110 | prompt.Enabled = true 111 | prompt.RequiresLineOfSight = false 112 | if doNotDoInstant ~= true then 113 | prompt.HoldDuration = 0 114 | end 115 | 116 | if lookToPrompt == true then 117 | workspace.CurrentCamera.CFrame = CFrame.new(workspace.CurrentCamera.CFrame.Position, promptPosition) 118 | connection = workspace.CurrentCamera:GetPropertyChangedSignal("CFrame"):Connect(function() 119 | workspace.CurrentCamera.CFrame = CFrame.new(workspace.CurrentCamera.CFrame.Position, promptPosition) 120 | end) 121 | 122 | task.wait() 123 | end 124 | 125 | prompt:InputHoldEnd() 126 | prompt:InputHoldBegin() 127 | task.wait(prompt.HoldDuration + 0.05) 128 | prompt:InputHoldEnd() 129 | 130 | if connection then connection:Disconnect() end 131 | 132 | prompt.Enabled = originalEnabled 133 | prompt.HoldDuration = originalHold 134 | prompt.RequiresLineOfSight = originalLineOfSight 135 | if lookToPrompt == true then workspace.CurrentCamera.CFrame = originalCamCFrame end 136 | end 137 | 138 | shared.fireproximityprompt = function(...) 139 | return fireProximityPrompt(...) 140 | end 141 | 142 | shared.forcefireproximityprompt = function(prompt) 143 | return fireProximityPrompt(prompt, true) 144 | end 145 | else 146 | shared.fireproximityprompt = fireproximityprompt 147 | shared.forcefireproximityprompt = fireproximityprompt 148 | end 149 | 150 | if not isnetworkowner then 151 | function isnetowner(part: BasePart) 152 | if not part:IsA("BasePart") then 153 | return error("BasePart expected, got " .. typeof(part)) 154 | end 155 | 156 | return part.ReceiveAge == 0 157 | end 158 | 159 | shared.isnetworkowner = isnetowner 160 | else 161 | shared.isnetworkowner = isnetworkowner 162 | end 163 | 164 | shared.firetouch = firetouchinterest or firetouchtransmitter 165 | 166 | --// Load \\-- 167 | ExecutorSupport["_ExecutorName"] = executorName 168 | ExecutorSupport["_SupportsFileSystem"] = (ExecutorSupport["isfile"] and ExecutorSupport["delfile"] and ExecutorSupport["listfiles"] and ExecutorSupport["writefile"] and ExecutorSupport["makefolder"] and ExecutorSupport["isfolder"]) 169 | 170 | for name, result in pairs(ExecutorSupport) do 171 | if ExecutorSupportInfo[name] then 172 | print(ExecutorSupportInfo[name]) 173 | elseif name:gsub("_", "") ~= name then 174 | print("🛠️ [" .. tostring(name) .. "]", tostring(result)) 175 | else 176 | print("❓ [" .. tostring(name) .. "]", tostring(result)) 177 | end 178 | end 179 | 180 | return ExecutorSupport -------------------------------------------------------------------------------- /Src/Utils/GUI/Creator.luau: -------------------------------------------------------------------------------- 1 | local UICreator = {} 2 | 3 | local repo = "https://raw.githubusercontent.com/mstudio45/LinoriaLib/refs/heads/main/" 4 | 5 | shared.Library = loadstring(game:HttpGet(repo .. "Library.lua"))() 6 | local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))() 7 | shared.SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))() 8 | 9 | shared.Toggles = getgenv().Linoria.Toggles 10 | shared.Options = getgenv().Linoria.Options 11 | 12 | getgenv()._internal_unload_mspaint = function() 13 | getgenv().mspaint_loading = false 14 | getgenv().mspaint_loaded = false 15 | task.spawn(shared.Library.Unload) 16 | end 17 | 18 | function UICreator:CreateWindow() 19 | local Window = shared.Library:CreateWindow({ 20 | Title = "mspaint v2 - OUTDATED! | " .. shared.ScriptName, 21 | Center = true, 22 | AutoShow = true, 23 | Resizable = true, 24 | NotifySide = "Right", 25 | ShowCustomCursor = true, 26 | TabPadding = 2, 27 | MenuFadeTime = 0 28 | }) 29 | 30 | --// Notificatins \\-- 31 | shared.NotifyStyle = "Linoria" 32 | shared.NotifyVolume = 2 33 | shared.Notify = require("Notify") 34 | 35 | --// Checker \\-- 36 | shared.CheckToggle = function(toggleName: string, value: boolean) 37 | return shared.Toggles[toggleName] and shared.Toggles[toggleName].Value == value 38 | end 39 | shared.CheckOption = function(optionName: string, value: any) 40 | return shared.Options[optionName] and (typeof(shared.Options[optionName].Value) == "table" and shared.Options[optionName].Value[value] or shared.Options[optionName].Value == value) 41 | end 42 | 43 | --// Unload Handler \\-- 44 | shared.Library:OnUnload(function() 45 | print("Unloading...") 46 | 47 | shared.Fly:Stop() 48 | 49 | for _, connection in pairs(shared.Connections) do 50 | connection:Disconnect() 51 | end 52 | 53 | getgenv().mspaint_loading = false 54 | getgenv().mspaint_loaded = false 55 | shared.Library.Unloaded = true 56 | print("Unloaded!") 57 | end) 58 | 59 | return Window 60 | end 61 | 62 | function UICreator:CreateTimeoutInfoTab() 63 | local ErrorTab = shared.Window:AddTab("Error") 64 | ErrorTab:UpdateWarningBox({ 65 | Visible = true, 66 | Title = "mspaint - RUNTIME ERROR", 67 | Text = "mspaint was unable to load in time (ERROR: timeout)\n\nkeep in mind that this is an outdated version and it is more likely that the fix is inside of the updated version." 68 | }) 69 | 70 | local ResourcesGroup = ErrorTab:AddLeftGroupbox("Resources") 71 | local ErrorInfoGroup = ErrorTab:AddRightGroupbox("Error Info") 72 | ResourcesGroup:AddLabel("Discord Server: https://discord.gg/mspaint") 73 | ResourcesGroup:AddDivider() 74 | ResourcesGroup:AddButton("Join Discord", function() 75 | local Inviter = loadstring(game:HttpGet("https://raw.githubusercontent.com/RegularVynixu/Utilities/main/Discord%20Inviter/Source.lua"))() 76 | Inviter.Join("https://discord.com/invite/cfyMptntHr") 77 | Inviter.Prompt({ 78 | name = "mspaint", 79 | invite = "https://discord.com/invite/cfyMptntHr", 80 | }) 81 | end):AddButton("Copy Link", function() 82 | if setclipboard then 83 | setclipboard("https://discord.com/invite/cfyMptntHr") 84 | shared.Library:Notify("Copied discord link to clipboard!") 85 | else 86 | shared.Library:Notify("Discord link: https://discord.com/invite/cfyMptntHr", 10) 87 | end 88 | end) 89 | 90 | ErrorInfoGroup:AddLabel("Timeout error usually means the game's owner has moved something to a different location which breaks the code that has already been written.\n\nDue to the fact that this open source version is discontinued, we will not be adding fixes.", true) 91 | end 92 | 93 | function UICreator:CreateSettingsTab() 94 | local SettingsTab = shared.Window:AddTab("UI Settings") 95 | SettingsTab:UpdateWarningBox({ 96 | Visible = true, 97 | Title = "WARNING", 98 | Text = "You are using a deprecated version of mspaint, to get the new version please join our discord server via .gg/mspaint" 99 | }) 100 | 101 | local MenuGroup = SettingsTab:AddLeftGroupbox("Menu") 102 | local CreditsGroup = SettingsTab:AddRightGroupbox("Credits") 103 | 104 | MenuGroup:AddToggle("ExecuteOnTeleport", { Default = false, Text = "Execute On Teleport" }) 105 | MenuGroup:AddToggle("KeybindMenuOpen", { Default = false, Text = "Open Keybind Menu", Callback = function(value) shared.Library.KeybindFrame.Visible = value end}) 106 | MenuGroup:AddToggle("ShowCustomCursor", {Text = "Custom Cursor", Default = true, Callback = function(Value) shared.Library.ShowCustomCursor = Value end}) 107 | MenuGroup:AddDivider() 108 | MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" }) 109 | MenuGroup:AddButton("Join Discord", function() 110 | local Inviter = loadstring(game:HttpGet("https://raw.githubusercontent.com/RegularVynixu/Utilities/main/Discord%20Inviter/Source.lua"))() 111 | Inviter.Join("https://discord.com/invite/cfyMptntHr") 112 | Inviter.Prompt({ 113 | name = "mspaint", 114 | invite = "https://discord.com/invite/cfyMptntHr", 115 | }) 116 | end):AddButton("Copy Link", function() 117 | if setclipboard then 118 | setclipboard("https://discord.com/invite/cfyMptntHr") 119 | shared.Library:Notify("Copied discord link to clipboard!") 120 | else 121 | shared.Library:Notify("Discord link: https://discord.com/invite/cfyMptntHr", 10) 122 | end 123 | end) 124 | MenuGroup:AddButton("Unload", function() shared.Library:Unload() end) 125 | 126 | CreditsGroup:AddLabel("Developers:") 127 | CreditsGroup:AddLabel("upio - owner") 128 | CreditsGroup:AddLabel("deividcomsono - main script dev") 129 | CreditsGroup:AddLabel("mstudio45") 130 | CreditsGroup:AddLabel("bacalhauz") 131 | 132 | shared.Library.ToggleKeybind = shared.Options.MenuKeybind 133 | 134 | ThemeManager:SetLibrary(shared.Library) 135 | shared.SaveManager:SetLibrary(shared.Library) 136 | 137 | shared.SaveManager:IgnoreThemeSettings() 138 | 139 | shared.SaveManager:SetFolder("mspaint/" .. string.lower(shared.ScriptLoader)) 140 | if shared.SubFolder then 141 | shared.SaveManager:SetSubFolder(shared.SubFolder) 142 | end 143 | 144 | shared.SaveManager:BuildConfigSection(SettingsTab) 145 | ThemeManager:ApplyToTab(SettingsTab) 146 | 147 | shared.SaveManager:LoadAutoloadConfig() 148 | 149 | shared.Connect:GiveSignal(shared.LocalPlayer.OnTeleport:Connect(function() 150 | if not shared.Toggles.ExecuteOnTeleport.Value or getgenv().queued_to_teleport then return end 151 | 152 | getgenv().queued_to_teleport = true 153 | queue_on_teleport([[ loadstring(game:HttpGet("https://github.com/notpoiu/mspaint/releases/latest/download/Script.luau"))() ]]) 154 | end)) 155 | 156 | return SettingsTab 157 | end 158 | 159 | return UICreator 160 | -------------------------------------------------------------------------------- /Src/Places/Tabs/3008/Main.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | Script.LastSpeed = if shared.Humanoid then shared.Humanoid.WalkSpeed else 16 10 | 11 | --// Main \\-- 12 | local PlayerGroupBox = Tabs.Main:AddLeftGroupbox("Player") do 13 | PlayerGroupBox:AddToggle("SpeedHack", { 14 | Text = "Speed Hack", 15 | Default = false 16 | }) 17 | 18 | PlayerGroupBox:AddSlider("WalkSpeed", { 19 | Text = "Walk Speed", 20 | Default = 16, 21 | Min = 0, 22 | Max = 100, 23 | Rounding = 0, 24 | Compact = true 25 | }) 26 | 27 | PlayerGroupBox:AddToggle("JumpPowerHack", { 28 | Text = "Jump Power Hack", 29 | Default = false 30 | }) 31 | 32 | PlayerGroupBox:AddSlider("JumpPower", { 33 | Text = "Jump Power", 34 | Default = 50, 35 | Min = 0, 36 | Max = 200, 37 | Rounding = 0, 38 | Compact = true 39 | }) 40 | 41 | PlayerGroupBox:AddDivider() 42 | 43 | PlayerGroupBox:AddToggle("InstantInteract", { 44 | Text = "Instant Interact", 45 | Default = false, 46 | Visible = wax.shared.ExecutorSupport["hookfunction"] and wax.shared.ExecutorSupport["getcallingscript"] 47 | }) 48 | 49 | PlayerGroupBox:AddToggle("NoFall", { 50 | Text = "No Fall", 51 | Default = false 52 | }) 53 | 54 | PlayerGroupBox:AddDivider() 55 | 56 | PlayerGroupBox:AddToggle("Noclip", { 57 | Text = "Noclip", 58 | Default = false 59 | }):AddKeyPicker("NoclipKey", { 60 | Mode = "Toggle", 61 | Default = "N", 62 | Text = "Noclip", 63 | SyncToggleState = true 64 | }) 65 | 66 | PlayerGroupBox:AddToggle("Fly", { 67 | Text = "Fly", 68 | Default = false 69 | }):AddKeyPicker("FlyKey", { 70 | Mode = "Toggle", 71 | Default = "F", 72 | Text = "Fly", 73 | SyncToggleState = true 74 | }) 75 | 76 | PlayerGroupBox:AddSlider("FlySpeed", { 77 | Text = "Fly Speed", 78 | Default = 16, 79 | Min = 0, 80 | Max = 100, 81 | Rounding = 0, 82 | Compact = true 83 | }) 84 | end 85 | 86 | local AutomationGroupBox = Tabs.Main:AddRightGroupbox("Automation") do 87 | AutomationGroupBox:AddToggle("AutoRespawn", { 88 | Text = "Auto Respawn", 89 | Default = false 90 | }) 91 | 92 | AutomationGroupBox:AddToggle("AutoPush", { 93 | Text = "Auto Push Employees", 94 | Default = false 95 | }) 96 | 97 | AutomationGroupBox:AddDivider() 98 | 99 | AutomationGroupBox:AddToggle("AutoTPWhistle", { 100 | Text = "Enable player whistle teleport", 101 | Default = false 102 | }) 103 | 104 | AutomationGroupBox:AddDropdown("AutoTPWhistlePlayers", { 105 | SpecialType = "Player", 106 | Multi = true, 107 | Text = "Go to player(s)'s whistle." 108 | }) 109 | end 110 | 111 | local MiscGroupBox = Tabs.Main:AddRightGroupbox("Misc") do 112 | MiscGroupBox:AddButton({ 113 | Text = "Respawn", 114 | Func = function() 115 | Script.Functions.Respawn() 116 | end, 117 | DoubleClick = true 118 | }) 119 | 120 | MiscGroupBox:AddButton({ 121 | Text = "Rejoin", 122 | Func = function() 123 | if #shared.Players:GetPlayers() <= 1 then 124 | shared.TeleportService:Teleport(game.PlaceId, shared.LocalPlayer) 125 | return 126 | end 127 | 128 | shared.TeleportService:TeleportToPlaceInstance(game.PlaceId, game.JobId, shared.LocalPlayer) 129 | end, 130 | DoubleClick = true 131 | }) 132 | 133 | MiscGroupBox:AddButton({ 134 | Text = "Instant Leave", 135 | Func = function() 136 | task.delay(0.1, function() game:Shutdown() end) 137 | shared.LocalPlayer:Kick("Bye bye! :Content:") 138 | end, 139 | DoubleClick = true 140 | }) 141 | end 142 | 143 | --// Player \\-- 144 | Toggles.SpeedHack:OnChanged(function(value) 145 | if not shared.Humanoid then return end 146 | 147 | if value then 148 | Script.LastSpeed = shared.Humanoid.WalkSpeed 149 | end 150 | 151 | shared.Humanoid.WalkSpeed = if value then Options.WalkSpeed.Value else Script.LastSpeed 152 | end) 153 | 154 | Options.WalkSpeed:OnChanged(function(value) 155 | if not shared.Humanoid then return end 156 | 157 | if shared.Humanoid.WalkSpeed ~= value then 158 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = value end 159 | end 160 | end) 161 | 162 | Toggles.JumpPowerHack:OnChanged(function(value) 163 | if not shared.Humanoid then return end 164 | 165 | if value then 166 | Script.LastJumpPower = if shared.Humanoid.UseJumpPower then shared.Humanoid.JumpPower else shared.Humanoid.JumpHeight 167 | end 168 | 169 | if shared.Humanoid.UseJumpPower then 170 | shared.Humanoid.JumpPower = if value then Options.JumpPower.Value else Script.LastJumpPower 171 | else 172 | shared.Humanoid.JumpHeight = if value then Options.JumpPower.Value else Script.LastJumpPower 173 | end 174 | end) 175 | 176 | Options.JumpPower:OnChanged(function(value) 177 | if not shared.Humanoid then return end 178 | 179 | if shared.Humanoid.UseJumpPower then 180 | if shared.Humanoid.JumpPower ~= value then 181 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpPower = value end 182 | end 183 | else 184 | if shared.Humanoid.JumpHeight ~= value then 185 | if Toggles.JumpPowerHack.Value then shared.Humanoid.JumpHeight = value end 186 | end 187 | end 188 | end) 189 | 190 | Toggles.NoFall:OnChanged(function(value) 191 | local fallDamage = shared.Character and shared.Character:FindFirstChild("FallDamage") 192 | 193 | if fallDamage then 194 | fallDamage.Enabled = not value 195 | end 196 | end) 197 | 198 | Toggles.Noclip:OnChanged(function(value) 199 | if not shared.Character then return end 200 | 201 | for _, part in pairs(shared.Character:GetDescendants()) do 202 | if not part:IsA("BasePart") then continue end 203 | part.CanCollide = not value 204 | 205 | shared.Connect:GiveSignal(part:GetPropertyChangedSignal("CanCollide"):Connect(function() 206 | part.CanCollide = not Toggles.Noclip.Value 207 | end)) 208 | end 209 | end) 210 | 211 | Toggles.Fly:OnChanged(function(value) 212 | if not shared.Fly.FlyBody then shared.Fly:Setup() end 213 | 214 | shared.Fly:Set(value) 215 | end) 216 | 217 | Options.FlySpeed:OnChanged(function(value) 218 | shared.Fly:SetSpeed(value) 219 | end) 220 | 221 | Toggles.AutoPush:OnChanged(function(value) 222 | if value then 223 | task.spawn(function() 224 | repeat task.wait(0.1) 225 | for _, employee in pairs(Script.Employees:GetChildren()) do 226 | if Script.Functions.DistanceFromCharacter(employee) <= 20 and employee:FindFirstChild("Enemy") then 227 | Script.Action:InvokeServer("ShoveEmployee", { 228 | Humanoid = employee.Enemy 229 | }) 230 | end 231 | end 232 | until not Toggles.AutoPush.Value or shared.Library.Unloaded 233 | end) 234 | end 235 | end) -------------------------------------------------------------------------------- /Src/Places/Loaders/R&D/R&D.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | Script.LoadedRooms = {} 8 | Script.FeatureConnections = { 9 | Door = {}, 10 | Shell = {}, 11 | Room = {} 12 | } 13 | Script.ESPTable = { 14 | Door = {}, 15 | Entity = {}, 16 | Battery = {}, 17 | Locker = {}, 18 | Player = {}, 19 | Table = {}, 20 | None = {} 21 | } 22 | 23 | Script.EntityNames = { 24 | ["monster"] = "A-60", 25 | ["monster2"] = "A-120", 26 | ["Spirit"] = "Pnevma" 27 | } 28 | 29 | Script.CurrentAmbient = shared.Lighting.Ambient 30 | 31 | Script._mspaint_custom_captions = Instance.new("ScreenGui") do 32 | local Frame = Instance.new("Frame", Script._mspaint_custom_captions) 33 | local TextLabel = Instance.new("TextLabel", Frame) 34 | local UITextSizeConstraint = Instance.new("UITextSizeConstraint", TextLabel) 35 | 36 | Script._mspaint_custom_captions.Parent = shared.ReplicatedStorage 37 | Script._mspaint_custom_captions.ZIndexBehavior = Enum.ZIndexBehavior.Sibling 38 | 39 | Frame.AnchorPoint = Vector2.new(0.5, 0.5) 40 | Frame.BackgroundColor3 = shared.Library.MainColor 41 | Frame.BorderColor3 = shared.Library.AccentColor 42 | Frame.BorderSizePixel = 2 43 | Frame.Position = UDim2.new(0.5, 0, 0.8, 0) 44 | Frame.Size = UDim2.new(0, 200, 0, 75) 45 | shared.Library:AddToRegistry(Frame, { 46 | BackgroundColor3 = "MainColor", 47 | BorderColor3 = "AccentColor" 48 | }) 49 | 50 | TextLabel.BackgroundColor3 = Color3.fromRGB(255, 255, 255) 51 | TextLabel.BackgroundTransparency = 1.000 52 | TextLabel.BorderColor3 = Color3.fromRGB(0, 0, 0) 53 | TextLabel.BorderSizePixel = 0 54 | TextLabel.Size = UDim2.new(1, 0, 1, 0) 55 | TextLabel.Font = Enum.Font.Code 56 | TextLabel.Text = "" 57 | TextLabel.TextColor3 = shared.Library.FontColor 58 | TextLabel.TextScaled = true 59 | TextLabel.TextSize = 14 60 | TextLabel.TextWrapped = true 61 | shared.Library:AddToRegistry(TextLabel, { 62 | TextColor3 = "FontColor" 63 | }) 64 | 65 | UITextSizeConstraint.MaxTextSize = 35 66 | 67 | function Script.Functions.HideCaptions() 68 | Script._mspaint_custom_captions.Parent = shared.ReplicatedStorage 69 | end 70 | 71 | local CaptionsLastUsed = os.time() 72 | function Script.Functions.Captions(caption: string) 73 | CaptionsLastUsed = os.time() 74 | 75 | if Script._mspaint_custom_captions.Parent == shared.ReplicatedStorage then 76 | local success = pcall(function() 77 | Script._mspaint_custom_captions.Parent = if gethui then gethui() else shared.CoreGui 78 | end) 79 | 80 | if not success then 81 | Script._mspaint_custom_captions.Parent = shared.PlayerGui 82 | end 83 | end 84 | 85 | TextLabel.Text = caption 86 | 87 | task.spawn(function() 88 | task.wait(5) 89 | if os.time() - CaptionsLastUsed >= 5 then 90 | Script.Functions.HideCaptions() 91 | end 92 | end) 93 | end 94 | end 95 | 96 | --// Player Variables \\-- 97 | shared.Character = shared.LocalPlayer.Character or shared.LocalPlayer.CharacterAdded:Wait() 98 | shared.Humanoid = nil 99 | 100 | Script.MainUI = shared.PlayerGui:WaitForChild("MainGui") 101 | 102 | --// Functions \-- 103 | function Script.Functions.RandomString() 104 | local length = math.random(10,20) 105 | local array = {} 106 | for i = 1, length do 107 | array[i] = string.char(math.random(32, 126)) 108 | end 109 | return table.concat(array) 110 | end 111 | 112 | shared.Load("Utils", "Assets") 113 | shared.Load("Utils", "Chat") 114 | shared.Load("Utils", "ESP") 115 | 116 | shared.Load("Utils", "ConnectionsFuncs") 117 | 118 | --// Tabs \\-- 119 | Script.Tabs = { 120 | Main = shared.Window:AddTab("Main"), 121 | Visuals = shared.Window:AddTab("Visuals") 122 | } 123 | 124 | shared.Load("Tabs", "Main") 125 | shared.Load("Tabs", "Visuals") 126 | 127 | --// Metamethod hooks \\-- 128 | if wax.shared.ExecutorSupport["hookmetamethod"] and wax.shared.ExecutorSupport["getnamecallmethod"] then 129 | shared.Hooks.mtHook = hookmetamethod(game, "__namecall", function(self, ...) 130 | local args = {...} 131 | local namecall = getnamecallmethod() 132 | 133 | if getcallingscript() and namecall == "SetCore" and args[1] == "DevConsoleVisible" and args[2] == false then 134 | args[2] = game:GetService("StarterGui"):GetCore("DevConsoleVisible") 135 | return shared.Hooks.mtHook(self, table.unpack(args)) 136 | end 137 | 138 | return shared.Hooks.mtHook(self, ...) 139 | end) 140 | end 141 | 142 | --// Connections \\-- 143 | shared.Connect:GiveSignal(shared.LocalPlayer.CharacterAdded:Connect(function(newCharacter) 144 | task.delay(1, Script.Functions.SetupCharacterConnection, newCharacter) 145 | end)) 146 | 147 | shared.Connect:GiveSignal(shared.PlayerGui.ChildAdded:Connect(function(child) 148 | if child.Name == "MainGui" then 149 | task.delay(1, Script.Functions.SetupUIConnection, child) 150 | end 151 | end)) 152 | 153 | shared.Connect:GiveSignal(workspace.rooms.ChildAdded:Connect(function(room) 154 | Script.Functions.SetupRoomConnection(room) 155 | end)) 156 | shared.Connect:GiveSignal(workspace.next.ChildAdded:Connect(function(room) 157 | Script.Functions.SetupRoomConnection(room) 158 | end)) 159 | 160 | --// Entity Handler 161 | shared.Connect:GiveSignal(workspace.ChildAdded:Connect(function(child) 162 | local entityName = Script.EntityNames[child.Name] 163 | if not entityName then return end 164 | 165 | if child:FindFirstChild("wind") then 166 | entityName = "A-200" 167 | end 168 | 169 | if Toggles.EntityESP.Value then 170 | Script.Functions.EntityESP(child, entityName) 171 | end 172 | 173 | if Toggles.NotifyEntity.Value then 174 | shared.Notify:Alert({ 175 | Title = "ENTITIES", 176 | Description = entityName .. " has spawned!" 177 | }) 178 | 179 | if Toggles.NotifyChat.Value then 180 | Script.Functions.Chat(string.format("%s %s", entityName, Options.NotifyEntityMessage.Value)) 181 | end 182 | end 183 | end)) 184 | 185 | shared.Connect:GiveSignal(shared.RunService.RenderStepped:Connect(function() 186 | if shared.Character then 187 | if shared.Humanoid then 188 | if Toggles.SpeedHack.Value then shared.Humanoid.WalkSpeed = Options.WalkSpeed.Value end 189 | end 190 | end 191 | 192 | if wax.shared.ExecutorSupport["getrenv"] then 193 | if Toggles.InfStamina.Value then 194 | getrenv()._G.stamina = 100 195 | end 196 | 197 | if Toggles.InfFlashlight.Value then 198 | getrenv()._G.flashlightcharge = 100 199 | end 200 | end 201 | end)) 202 | 203 | --// Load \\-- 204 | Instance.new("BoolValue", shared.LocalPlayer).Name = "cheats" 205 | task.spawn(Script.Functions.SetupCharacterConnection, shared.Character) 206 | task.spawn(Script.Functions.SetupLightingConnection) 207 | task.spawn(Script.Functions.SetupUIConnection) 208 | 209 | --// Unload \\-- 210 | shared.Library:OnUnload(function() 211 | if shared.Hooks.mtHook then hookmetamethod(game, "__namecall", shared.Hooks.mtHook) end 212 | 213 | local slender = Script.MainUI and Script.MainUI:FindFirstChild("slender") 214 | if slender then 215 | slender.ImageTransparency = 0 216 | for _, bar in pairs(slender:GetChildren()) do 217 | bar.Visible = true 218 | end 219 | end 220 | 221 | for _, espType in pairs(Script.ESPTable) do 222 | for _, esp in pairs(espType) do 223 | esp.Destroy() 224 | end 225 | end 226 | 227 | for _, category in pairs(Script.FeatureConnections) do 228 | for _, connection in pairs(category) do 229 | connection:Disconnect() 230 | end 231 | end 232 | 233 | print("Unloading " .. shared.ScriptName .. "...") 234 | end) 235 | 236 | getgenv().mspaint_loaded = true -------------------------------------------------------------------------------- /Src/Utils/GUI/Addons.luau: -------------------------------------------------------------------------------- 1 | -- Addons 2 | if getgenv().mspaint_disable_addons or getgenv().mspaint_addons_activated then 3 | return {} 4 | end 5 | 6 | task.spawn(function() 7 | if not wax.shared.ExecutorSupport["_SupportsFileSystem"] then 8 | warn("[mspaint] Your executor doesn't support the FileSystem API. Addons will not work.") 9 | return 10 | end 11 | 12 | getgenv().mspaint_addons_activated = true 13 | 14 | if not isfolder("mspaint/addons") then 15 | print("[mspaint] Addons folder doesn't exist. Creating...") 16 | makefolder("mspaint/addons") 17 | return 18 | end 19 | 20 | repeat task.wait() until getgenv().mspaint_loaded == true 21 | print("[mspaint] Loading addons...") 22 | 23 | local function AddAddonElement(LinoriaElement, AddonName, Element) 24 | if not LinoriaElement then 25 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid Linoria element.") 26 | return 27 | end 28 | 29 | if typeof(Element) ~= "table" then 30 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid data.") 31 | return 32 | end 33 | 34 | if typeof(Element.Type) ~= "string" then 35 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid name.") 36 | return 37 | end 38 | 39 | if typeof(AddonName) ~= "string" then 40 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid addon name.") 41 | return 42 | end 43 | 44 | 45 | if Element.Type:sub(1, 3) == "Add" then Element.Type = Element.Type:sub(4) end 46 | 47 | -- Elements with no Arguments 48 | if Element.Type == "Divider" then 49 | return LinoriaElement:AddDivider() 50 | end 51 | 52 | if Element.Type == "DependencyBox" then 53 | return LinoriaElement:AddDependencyBox() 54 | end 55 | 56 | if typeof(Element.Name) ~= "string" then 57 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid name.") 58 | return 59 | end 60 | 61 | -- Elements with Arguments 62 | if typeof(Element.Arguments) == "table" then 63 | if Element.Type == "Label" then 64 | return LinoriaElement:AddLabel(table.unpack(Element.Arguments)) 65 | end 66 | 67 | if Element.Type == "Toggle" then 68 | return LinoriaElement:AddToggle(AddonName .. "_" .. Element.Name, Element.Arguments) 69 | end 70 | 71 | if Element.Type == "Button" then 72 | return LinoriaElement:AddButton(Element.Arguments) 73 | end 74 | 75 | if Element.Type == "Slider" then 76 | return LinoriaElement:AddSlider(AddonName .. "_" .. Element.Name, Element.Arguments) 77 | end 78 | 79 | if Element.Type == "Input" then 80 | return LinoriaElement:AddInput(AddonName .. "_" .. Element.Name, Element.Arguments) 81 | end 82 | 83 | if Element.Type == "Dropdown" then 84 | return LinoriaElement:AddInput(AddonName .. "_" .. Element.Name, Element.Arguments) 85 | end 86 | 87 | if Element.Type == "ColorPicker" then 88 | return LinoriaElement:AddColorPicker(AddonName .. "_" .. Element.Name, Element.Arguments) 89 | end 90 | 91 | if Element.Type == "KeyPicker" then 92 | return LinoriaElement:AddKeyPicker(AddonName .. "_" .. Element.Name, Element.Arguments) 93 | end 94 | end 95 | 96 | warn("[mspaint] Element '" .. tostring(Element.Name) .. " (" .. tostring(Element.Type) .. ")' didn't load: Invalid element type.") 97 | return 98 | end 99 | 100 | local AddonTab, LastGroupbox = nil, "Right" 101 | 102 | local function createAddonTab(hasAddons: boolean) 103 | if not AddonTab then 104 | AddonTab = shared.Window:AddTab("Addons [BETA]") 105 | end 106 | 107 | AddonTab:UpdateWarningBox({ 108 | Visible = true, 109 | Title = "WARNING", 110 | Text = (if not hasAddons then "Your addons FOLDER is empty!" else "This tab is for UN-OFFICIAL addons made for mspaint. We are not responsible for what addons you will use. You are putting yourself AT RISK since you are executing third-party scripts.") 111 | }) 112 | end 113 | 114 | local containAddonsLoaded = false 115 | createAddonTab(false) 116 | 117 | for _, file in pairs(listfiles("mspaint/addons")) do 118 | print("[mspaint] Loading addon '" .. string.gsub(file, "mspaint/addons/", "") .. "'...") 119 | if file:sub(#file - 3) ~= ".lua" and file:sub(#file - 4) ~= ".luau" and file:sub(#file - 7) ~= ".lua.txt" then continue end 120 | 121 | local success, errorMessage = pcall(function() 122 | local fileContent = readfile(file) 123 | local addon = loadstring(fileContent)() 124 | 125 | if typeof(addon.Name) ~= "string" or typeof(addon.Elements) ~= "table" then 126 | warn("Addon '" .. string.gsub(file, "mspaint/addons/", "") .. "' didn't load: Invalid Name/Elements.") 127 | return 128 | end 129 | 130 | if typeof(addon.Game) == "string" then 131 | if string.lower(addon.Game) ~= string.lower(shared.ScriptLoader) and addon.Game ~= "*" then 132 | warn("Addon '" .. string.gsub(file, "mspaint/addons/", "") .. "' didn't load: Wrong game.") 133 | return 134 | end 135 | elseif typeof(addon.Game) == "table" then 136 | for i, addonGame in pairs(addon.Game) do 137 | addon.Game[i] = string.lower(addonGame) 138 | end 139 | 140 | if not table.find(addon.Game, string.lower(shared.ScriptLoader)) then 141 | warn("Addon '" .. string.gsub(file, "mspaint/addons/", "") .. "' didn't load: Wrong game.") 142 | return 143 | end 144 | else 145 | warn("Addon '" .. string.gsub(file, "mspaint/addons/", "") .. "' didn't load: Invalid GameId.") 146 | return 147 | end 148 | 149 | addon.Name = addon.Name:gsub("%s+", "") 150 | if typeof(addon.Title) ~= "string" then 151 | addon.Title = addon.Name 152 | end 153 | 154 | if not AddonTab then createAddonTab(true) end 155 | 156 | local AddonGroupbox = if LastGroupbox == "Right" then AddonTab:AddLeftGroupbox(addon.Title) else AddonTab:AddRightGroupbox(addon.Title) 157 | LastGroupbox = if LastGroupbox == "Right" then "Left" else "Right" 158 | if typeof(addon.Description) == "string" then 159 | AddonGroupbox:AddLabel(addon.Description, true) 160 | end 161 | 162 | local function loadElements(linoriaMainElement, elements) 163 | if not elements or typeof(elements) ~= "table" then return end 164 | 165 | for _, element in pairs(elements) do 166 | local linoriaElement = AddAddonElement(linoriaMainElement, addon.Name, element) 167 | 168 | loadElements(linoriaElement, element.Elements) 169 | end 170 | end 171 | 172 | loadElements(AddonGroupbox, addon.Elements) 173 | end) 174 | 175 | if not success then 176 | warn("[mspaint] Failed to load addon '" .. string.gsub(file, "mspaint/addons/", "") .. "':", errorMessage) 177 | else 178 | containAddonsLoaded = true 179 | end 180 | end 181 | 182 | createAddonTab(containAddonsLoaded) 183 | end) 184 | 185 | return {} -------------------------------------------------------------------------------- /.lune/fs.luau: -------------------------------------------------------------------------------- 1 | local DateTime = require("./datetime") 2 | type DateTime = DateTime.DateTime 3 | 4 | export type MetadataKind = "file" | "dir" | "symlink" 5 | 6 | --[=[ 7 | @interface MetadataPermissions 8 | @within FS 9 | 10 | Permissions for the given file or directory. 11 | 12 | This is a dictionary that will contain the following values: 13 | 14 | * `readOnly` - If the target path is read-only or not 15 | ]=] 16 | export type MetadataPermissions = { 17 | readOnly: boolean, 18 | } 19 | 20 | -- FIXME: We lose doc comments here below in Metadata because of the union type 21 | 22 | --[=[ 23 | @interface Metadata 24 | @within FS 25 | 26 | Metadata for the given file or directory. 27 | 28 | This is a dictionary that will contain the following values: 29 | 30 | * `kind` - If the target path is a `file`, `dir` or `symlink` 31 | * `exists` - If the target path exists 32 | * `createdAt` - The timestamp represented as a `DateTime` object at which the file or directory was created 33 | * `modifiedAt` - The timestamp represented as a `DateTime` object at which the file or directory was last modified 34 | * `accessedAt` - The timestamp represented as a `DateTime` object at which the file or directory was last accessed 35 | * `permissions` - Current permissions for the file or directory 36 | 37 | Note that timestamps are relative to the unix epoch, and 38 | may not be accurate if the system clock is not accurate. 39 | ]=] 40 | export type Metadata = { 41 | kind: MetadataKind, 42 | exists: true, 43 | createdAt: DateTime, 44 | modifiedAt: DateTime, 45 | accessedAt: DateTime, 46 | permissions: MetadataPermissions, 47 | } | { 48 | kind: nil, 49 | exists: false, 50 | createdAt: nil, 51 | modifiedAt: nil, 52 | accessedAt: nil, 53 | permissions: nil, 54 | } 55 | 56 | --[=[ 57 | @interface WriteOptions 58 | @within FS 59 | 60 | Options for filesystem APIs what write to files and/or directories. 61 | 62 | This is a dictionary that may contain one or more of the following values: 63 | 64 | * `overwrite` - If the target path should be overwritten or not, in the case that it already exists 65 | ]=] 66 | export type WriteOptions = { 67 | overwrite: boolean?, 68 | } 69 | 70 | --[=[ 71 | @class FS 72 | 73 | Built-in library for filesystem access 74 | 75 | ### Example usage 76 | 77 | ```lua 78 | local fs = require("@lune/fs") 79 | 80 | -- Reading a file 81 | local myTextFile: string = fs.readFile("myFileName.txt") 82 | 83 | -- Reading entries (files & dirs) in a directory 84 | for _, entryName in fs.readDir("myDirName") do 85 | if fs.isFile("myDirName/" .. entryName) then 86 | print("Found file " .. entryName) 87 | elseif fs.isDir("myDirName/" .. entryName) then 88 | print("Found subdirectory " .. entryName) 89 | end 90 | end 91 | ``` 92 | ]=] 93 | local fs = {} 94 | 95 | --[=[ 96 | @within FS 97 | @tag must_use 98 | 99 | Reads a file at `path`. 100 | 101 | An error will be thrown in the following situations: 102 | 103 | * `path` does not point to an existing file. 104 | * The current process lacks permissions to read the file. 105 | * Some other I/O error occurred. 106 | 107 | @param path The path to the file to read 108 | @return The contents of the file 109 | ]=] 110 | function fs.readFile(path: string): string 111 | return nil :: any 112 | end 113 | 114 | --[=[ 115 | @within FS 116 | @tag must_use 117 | 118 | Reads entries in a directory at `path`. 119 | 120 | An error will be thrown in the following situations: 121 | 122 | * `path` does not point to an existing directory. 123 | * The current process lacks permissions to read the contents of the directory. 124 | * Some other I/O error occurred. 125 | 126 | @param path The directory path to search in 127 | @return A list of files & directories found 128 | ]=] 129 | function fs.readDir(path: string): { string } 130 | return {} 131 | end 132 | 133 | --[=[ 134 | @within FS 135 | 136 | Writes to a file at `path`. 137 | 138 | An error will be thrown in the following situations: 139 | 140 | * The file's parent directory does not exist. 141 | * The current process lacks permissions to write to the file. 142 | * Some other I/O error occurred. 143 | 144 | @param path The path of the file 145 | @param contents The contents of the file 146 | ]=] 147 | function fs.writeFile(path: string, contents: buffer | string) end 148 | 149 | --[=[ 150 | @within FS 151 | 152 | Creates a directory and its parent directories if they are missing. 153 | 154 | An error will be thrown in the following situations: 155 | 156 | * `path` already points to an existing file or directory. 157 | * The current process lacks permissions to create the directory or its missing parents. 158 | * Some other I/O error occurred. 159 | 160 | @param path The directory to create 161 | ]=] 162 | function fs.writeDir(path: string) end 163 | 164 | --[=[ 165 | @within FS 166 | 167 | Removes a file. 168 | 169 | An error will be thrown in the following situations: 170 | 171 | * `path` does not point to an existing file. 172 | * The current process lacks permissions to remove the file. 173 | * Some other I/O error occurred. 174 | 175 | @param path The file to remove 176 | ]=] 177 | function fs.removeFile(path: string) end 178 | 179 | --[=[ 180 | @within FS 181 | 182 | Removes a directory and all of its contents. 183 | 184 | An error will be thrown in the following situations: 185 | 186 | * `path` is not an existing and empty directory. 187 | * The current process lacks permissions to remove the directory. 188 | * Some other I/O error occurred. 189 | 190 | @param path The directory to remove 191 | ]=] 192 | function fs.removeDir(path: string) end 193 | 194 | --[=[ 195 | @within FS 196 | @tag must_use 197 | 198 | Gets metadata for the given path. 199 | 200 | An error will be thrown in the following situations: 201 | 202 | * The current process lacks permissions to read at `path`. 203 | * Some other I/O error occurred. 204 | 205 | @param path The path to get metadata for 206 | @return Metadata for the path 207 | ]=] 208 | function fs.metadata(path: string): Metadata 209 | return nil :: any 210 | end 211 | 212 | --[=[ 213 | @within FS 214 | @tag must_use 215 | 216 | Checks if a given path is a file. 217 | 218 | An error will be thrown in the following situations: 219 | 220 | * The current process lacks permissions to read at `path`. 221 | * Some other I/O error occurred. 222 | 223 | @param path The file path to check 224 | @return If the path is a file or not 225 | ]=] 226 | function fs.isFile(path: string): boolean 227 | return nil :: any 228 | end 229 | 230 | --[=[ 231 | @within FS 232 | @tag must_use 233 | 234 | Checks if a given path is a directory. 235 | 236 | An error will be thrown in the following situations: 237 | 238 | * The current process lacks permissions to read at `path`. 239 | * Some other I/O error occurred. 240 | 241 | @param path The directory path to check 242 | @return If the path is a directory or not 243 | ]=] 244 | function fs.isDir(path: string): boolean 245 | return nil :: any 246 | end 247 | 248 | --[=[ 249 | @within FS 250 | 251 | Moves a file or directory to a new path. 252 | 253 | Throws an error if a file or directory already exists at the target path. 254 | This can be bypassed by passing `true` as the third argument, or a dictionary of options. 255 | Refer to the documentation for `WriteOptions` for specific option keys and their values. 256 | 257 | An error will be thrown in the following situations: 258 | 259 | * The current process lacks permissions to read at `from` or write at `to`. 260 | * The new path exists on a different mount point. 261 | * Some other I/O error occurred. 262 | 263 | @param from The path to move from 264 | @param to The path to move to 265 | @param overwriteOrOptions Options for the target path, such as if should be overwritten if it already exists 266 | ]=] 267 | function fs.move(from: string, to: string, overwriteOrOptions: (boolean | WriteOptions)?) end 268 | 269 | --[=[ 270 | @within FS 271 | 272 | Copies a file or directory recursively to a new path. 273 | 274 | Throws an error if a file or directory already exists at the target path. 275 | This can be bypassed by passing `true` as the third argument, or a dictionary of options. 276 | Refer to the documentation for `WriteOptions` for specific option keys and their values. 277 | 278 | An error will be thrown in the following situations: 279 | 280 | * The current process lacks permissions to read at `from` or write at `to`. 281 | * Some other I/O error occurred. 282 | 283 | @param from The path to copy from 284 | @param to The path to copy to 285 | @param overwriteOrOptions Options for the target path, such as if should be overwritten if it already exists 286 | ]=] 287 | function fs.copy(from: string, to: string, overwriteOrOptions: (boolean | WriteOptions)?) end 288 | 289 | return fs 290 | -------------------------------------------------------------------------------- /Src/Places/Tabs/Doors/Lobby/Main.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | ---// Main \\-- 10 | local SniperGroupbox = Tabs.Main:AddLeftGroupbox("Sniper") do 11 | SniperGroupbox:AddToggle("ElevatorSniper", { 12 | Text = "Elevator Sniper", 13 | Default = false 14 | }) 15 | 16 | SniperGroupbox:AddDropdown("ElevatorSniperTarget", { 17 | SpecialType = "Player", 18 | Multi = false, 19 | 20 | Text = "Target" 21 | }) 22 | end 23 | 24 | local OtherGroupbox = Tabs.Main:AddRightGroupbox("Other") do 25 | OtherGroupbox:AddToggle("Twerk", { 26 | Text = "Twerk", 27 | Default = false 28 | }) 29 | 30 | OtherGroupbox:AddToggle("LoopAchievements", { 31 | Text = "Loop Achievements", 32 | Default = false 33 | }) 34 | 35 | OtherGroupbox:AddSlider("LoopAchievementsSpeed", { 36 | Text = "Speed", 37 | Default = 0.05, 38 | Min = 0.05, 39 | Max = 1, 40 | Rounding = 2, 41 | Compact = true 42 | }) 43 | 44 | OtherGroupbox:AddDivider() 45 | 46 | OtherGroupbox:AddButton("Create Retro Elevator", function() 47 | local data = { 48 | ["FriendsOnly"] = Script.CreateElevatorFrame.Settings.FriendsOnly:GetAttribute("Setting"), 49 | ["Destination"] = "Hotel", 50 | ["Mods"] = { 51 | "RetroMode" 52 | }, 53 | ["MaxPlayers"] = Script.CreateElevatorFrame.Settings.MaxPlayers.Toggle.Text 54 | } 55 | 56 | Script.CreateElevator:FireServer(data) 57 | end) 58 | end 59 | 60 | if wax.shared.ExecutorSupport["_SupportsFileSystem"] then 61 | local PresetGroupbox = Tabs.Main:AddLeftGroupbox("Presets") do 62 | PresetGroupbox:AddInput('Elevator_PresetName', { Text = 'Preset name' }) 63 | PresetGroupbox:AddButton({ 64 | Text = "Create Preset", 65 | Func = function() 66 | if Script.PresetHelper.IsFile(Options.Elevator_PresetName.Value .. ".json") then 67 | shared.Notify:Alert({ 68 | Description = "Preset already exists!" 69 | }) 70 | return 71 | end 72 | 73 | local presetData = { 74 | Floor = "Hotel", 75 | MaxPlayers = 1, 76 | Modifiers = {}, 77 | FriendsOnly = true 78 | } 79 | 80 | for _, floor in pairs(Script.CreateElevatorFrame.Floors:GetChildren()) do 81 | if floor:IsA("TextLabel") and floor.Visible then 82 | presetData.Floor = floor.Name 83 | break 84 | end 85 | end 86 | 87 | for _, modifier in pairs(Script.CreateElevatorFrame.Modifiers:GetChildren()) do 88 | if modifier:GetAttribute("Enabled") then 89 | table.insert(presetData.Modifiers, modifier.Name) 90 | end 91 | end 92 | 93 | presetData.MaxPlayers = tonumber(Script.CreateElevatorFrame.Settings.MaxPlayers.Toggle.Text) 94 | presetData.FriendsOnly = Script.CreateElevatorFrame.Settings.FriendsOnly:GetAttribute("Setting") 95 | 96 | Script.Functions.CreatePreset(Options.Elevator_PresetName.Value, presetData) 97 | shared.Notify:Alert({ 98 | Description = 'Created elevator preset "' .. Options.Elevator_PresetName.Value .. '" with ' .. #presetData.Modifiers .. " modifiers" 99 | }) 100 | 101 | Script.Functions.LoadPresets() 102 | Options.Elevator_PresetList:SetValues(Script.ElevatorPresets) 103 | Options.Elevator_PresetList:SetValue(nil) 104 | end 105 | }) 106 | 107 | PresetGroupbox:AddDivider() 108 | 109 | PresetGroupbox:AddDropdown('Elevator_PresetList', { Text = 'Preset list', Values = Script.ElevatorPresets, AllowNull = true }) 110 | PresetGroupbox:AddButton('Load Preset', function() 111 | Script.Functions.LoadPreset(Options.Elevator_PresetList.Value) 112 | end) 113 | 114 | PresetGroupbox:AddButton('Override Preset', function() 115 | local presetData = { 116 | Floor = "Hotel", 117 | MaxPlayers = 1, 118 | Modifiers = {}, 119 | FriendsOnly = true 120 | } 121 | 122 | for _, floor in pairs(Script.CreateElevatorFrame.Floors:GetChildren()) do 123 | if floor:IsA("TextLabel") and floor.Visible then 124 | presetData.Floor = floor.Name 125 | break 126 | end 127 | end 128 | 129 | for _, modifier in pairs(Script.CreateElevatorFrame.Modifiers:GetChildren()) do 130 | if modifier:GetAttribute("Enabled") then 131 | table.insert(presetData.Modifiers, modifier.Name) 132 | end 133 | end 134 | 135 | presetData.MaxPlayers = tonumber(Script.CreateElevatorFrame.Settings.MaxPlayers.Toggle.Text) 136 | presetData.FriendsOnly = Script.CreateElevatorFrame.Settings.FriendsOnly:GetAttribute("Setting") 137 | 138 | shared.Notify:Alert({ 139 | Description = "Overrided preset: " .. Options.Elevator_PresetList.Value 140 | }) 141 | 142 | Script.Functions.CreatePreset(Options.Elevator_PresetList.Value, presetData) 143 | 144 | Script.Functions.LoadPresets() 145 | Options.Elevator_PresetList:SetValues(Script.ElevatorPresets) 146 | Options.Elevator_PresetList:SetValue(nil) 147 | end) 148 | 149 | PresetGroupbox:AddButton('Delete Preset', function() 150 | if not Script.PresetHelper.IsFile(Options.Elevator_PresetList.Value .. ".json") then 151 | shared.Notify:Alert({ 152 | Description = "Preset does not exist!" 153 | }) 154 | return 155 | end 156 | 157 | local success, err = pcall(function() 158 | Script.PresetHelper.DeleteFile(Options.Elevator_PresetList.Value .. ".json") 159 | end) 160 | 161 | if not success then 162 | shared.Notify:Alert({ 163 | Description = "Failed to delete preset: " .. Options.Elevator_PresetList.Value 164 | }) 165 | return 166 | end 167 | 168 | shared.Notify:Alert({ 169 | Description = "Deleted preset: " .. Options.Elevator_PresetList.Value 170 | }) 171 | 172 | Script.Functions.LoadPresets() 173 | Options.Elevator_PresetList:SetValues(Script.ElevatorPresets) 174 | Options.Elevator_PresetList:SetValue(nil) 175 | end) 176 | 177 | PresetGroupbox:AddButton('Refresh Presets', function() 178 | Script.Functions.LoadPresets() 179 | Options.Elevator_PresetList:SetValues(Script.ElevatorPresets) 180 | Options.Elevator_PresetList:SetValue(nil) 181 | end) 182 | 183 | end 184 | end 185 | 186 | --// Sniper \\-- 187 | shared.Connect:GiveSignal(shared.RunService.RenderStepped:Connect(function() 188 | if Toggles.ElevatorSniper.Value and Options.ElevatorSniperTarget.Value then 189 | local targetCharacter = workspace:FindFirstChild(Options.ElevatorSniperTarget.Value) 190 | if not targetCharacter then return end 191 | 192 | local targetElevatorID = targetCharacter:GetAttribute("InGameElevator") 193 | local currentElevatorID = shared.Character:GetAttribute("InGameElevator") 194 | if currentElevatorID == targetElevatorID then return end 195 | 196 | if targetElevatorID ~= nil then 197 | local targetElevator = Script.LobbyElevators:FindFirstChild("LobbyElevator-" .. targetElevatorID) 198 | 199 | if not targetElevator then 200 | for _, elevator in pairs(Script.LobbyElevators:GetChildren()) do 201 | if elevator.Name:match(Options.ElevatorSniperTarget.Value) then 202 | targetElevator = elevator 203 | end 204 | end 205 | end 206 | 207 | if targetElevator then 208 | Script.RemotesFolder.ElevatorJoin:FireServer(targetElevator) 209 | end 210 | elseif currentElevatorID ~= nil then 211 | Script.RemotesFolder.ElevatorExit:FireServer() 212 | end 213 | end 214 | end)) 215 | 216 | --// Other \\-- 217 | Toggles.LoopAchievements:OnChanged(function(value) 218 | if value then 219 | Script.Functions.LoopAchievements() 220 | end 221 | end) 222 | 223 | Toggles.Twerk:OnChanged(function(value) 224 | shared.Twerk:Set(value) 225 | end) -------------------------------------------------------------------------------- /Src/Places/Tabs/Universal/Visuals.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | local Tabs = Script.Tabs 8 | 9 | --// Visuals \\-- 10 | local ESPTabBox = Tabs.Visuals:AddLeftTabbox() do 11 | local ESPTab = ESPTabBox:AddTab("ESP") do 12 | ESPTab:AddToggle("PlayerESP", { 13 | Text = "Player", 14 | Default = false, 15 | }):AddColorPicker("PlayerEspColor", { 16 | Default = Color3.new(1, 1, 1), 17 | }) 18 | end 19 | 20 | local ESPSettingsTab = ESPTabBox:AddTab("Settings") do 21 | ESPSettingsTab:AddToggle("ESPTeamColor", { 22 | Text = "Team Color", 23 | Default = false, 24 | }) 25 | 26 | ESPSettingsTab:AddToggle("ESPRainbow", { 27 | Text = "Rainbow ESP", 28 | Default = false, 29 | }) 30 | 31 | ESPSettingsTab:AddDivider() 32 | 33 | ESPSettingsTab:AddToggle("ESPHighlight", { 34 | Text = "Enable Highlight", 35 | Default = true 36 | }) 37 | 38 | ESPSettingsTab:AddSlider("ESPFillTransparency", { 39 | Text = "Fill Transparency", 40 | Default = 0.75, 41 | Min = 0, 42 | Max = 1, 43 | Rounding = 2 44 | }) 45 | 46 | ESPSettingsTab:AddSlider("ESPOutlineTransparency", { 47 | Text = "Outline Transparency", 48 | Default = 0, 49 | Min = 0, 50 | Max = 1, 51 | Rounding = 2 52 | }) 53 | 54 | ESPSettingsTab:AddDivider() 55 | 56 | ESPSettingsTab:AddToggle("ESPDistance", { 57 | Text = "Show Distance", 58 | Default = true 59 | }) 60 | 61 | ESPSettingsTab:AddSlider("ESPTextSize", { 62 | Text = "Text Size", 63 | Default = 22, 64 | Min = 16, 65 | Max = 26, 66 | Rounding = 0 67 | }) 68 | 69 | ESPSettingsTab:AddDivider() 70 | 71 | ESPSettingsTab:AddToggle("ESPTracer", { 72 | Text = "Enable Tracer", 73 | Default = false 74 | }) 75 | 76 | ESPSettingsTab:AddDropdown("ESPTracerStart", { 77 | AllowNull = false, 78 | Values = {"Bottom", "Center", "Top", "Mouse"}, 79 | Default = "Bottom", 80 | Multi = false, 81 | 82 | Text = "Tracer Start Position" 83 | }) 84 | 85 | ESPSettingsTab:AddDivider() 86 | 87 | ESPSettingsTab:AddToggle("ESPArrow", { 88 | Text = "Enable Arrow", 89 | Default = false 90 | }) 91 | 92 | ESPSettingsTab:AddSlider("ESPArrowCenterOffset", { 93 | Text = "Arrow Center Offset", 94 | Default = 300, 95 | Min = 0, 96 | Max = 500, 97 | Rounding = 0 98 | }) 99 | end 100 | end 101 | 102 | local AmbientGroupBox = Tabs.Visuals:AddRightGroupbox("Ambient") do 103 | AmbientGroupBox:AddToggle("Fullbright", { 104 | Text = "Fullbright", 105 | Default = false, 106 | }) 107 | 108 | AmbientGroupBox:AddToggle("NoFog", { 109 | Text = "No Fog", 110 | Default = false, 111 | }) 112 | 113 | AmbientGroupBox:AddToggle("AntiLag", { 114 | Text = "Anti-Lag", 115 | Default = false, 116 | }) 117 | end 118 | 119 | --// ESP \\-- 120 | Toggles.PlayerESP:OnChanged(function(value) 121 | if value then 122 | for _, player in pairs(shared.Players:GetPlayers()) do 123 | if not (player ~= shared.LocalPlayer and player.Character) then continue end 124 | 125 | Script.Functions.PlayerESP(player) 126 | end 127 | else 128 | for _, connection in pairs(Script.FeatureConnections.Player) do 129 | connection:Disconnect() 130 | end 131 | for _, esp in pairs(Script.ESPTable.Player) do 132 | esp.Destroy() 133 | end 134 | end 135 | end) 136 | 137 | Options.PlayerEspColor:OnChanged(function(value) 138 | if Toggles.ESPTeamColor then return end 139 | for _, esp in pairs(Script.ESPTable.Player) do 140 | esp.Update({ 141 | FillColor = value, 142 | OutlineColor = value, 143 | TextColor = value, 144 | }) 145 | end 146 | end) 147 | 148 | --// ESP Settings \\-- 149 | Toggles.ESPTeamColor:OnChanged(function(value) 150 | for player, esp in pairs(Script.ESPTable.Player) do 151 | local color = if value then player.TeamColor.Color else Options.PlayerEspColor.Value 152 | esp.Update({ 153 | FillColor = color, 154 | OutlineColor = color, 155 | TextColor = color, 156 | }) 157 | end 158 | end) 159 | 160 | Toggles.ESPRainbow:OnChanged(function(value) 161 | shared.ESPLibrary.Rainbow.Set(value) 162 | end) 163 | 164 | Toggles.ESPHighlight:OnChanged(function(value) 165 | for _, espType in pairs(Script.ESPTable) do 166 | for _, esp in pairs(espType) do 167 | esp.SetVisible(value, false) 168 | end 169 | end 170 | end) 171 | 172 | Options.ESPFillTransparency:OnChanged(function(value) 173 | for _, espType in pairs(Script.ESPTable) do 174 | for _, esp in pairs(espType) do 175 | esp.Update({ FillTransparency = value }) 176 | end 177 | end 178 | end) 179 | 180 | Options.ESPOutlineTransparency:OnChanged(function(value) 181 | for _, espType in pairs(Script.ESPTable) do 182 | for _, esp in pairs(espType) do 183 | esp.Update({ OutlineTransparency = value }) 184 | end 185 | end 186 | end) 187 | 188 | Toggles.ESPDistance:OnChanged(function(value) 189 | shared.ESPLibrary.Distance.Set(value) 190 | end) 191 | 192 | Options.ESPTextSize:OnChanged(function(value) 193 | for _, espType in pairs(Script.ESPTable) do 194 | for _, esp in pairs(espType) do 195 | esp.Update({ TextSize = value }) 196 | end 197 | end 198 | end) 199 | 200 | Toggles.ESPTracer:OnChanged(function(value) 201 | shared.ESPLibrary.Tracers.Set(value) 202 | end) 203 | 204 | Options.ESPTracerStart:OnChanged(function(value) 205 | for _, espType in pairs(Script.ESPTable) do 206 | for _, esp in pairs(espType) do 207 | esp.Update({ Tracer = { From = value } }) 208 | end 209 | end 210 | end) 211 | 212 | Toggles.ESPArrow:OnChanged(function(value) 213 | shared.ESPLibrary.Arrows.Set(value) 214 | end) 215 | 216 | Options.ESPArrowCenterOffset:OnChanged(function(value) 217 | for _, espType in pairs(Script.ESPTable) do 218 | for _, esp in pairs(espType) do 219 | esp.Update({ Arrow = { CenterOffset = value } }) 220 | end 221 | end 222 | end) 223 | 224 | --// Ambient \\-- 225 | Toggles.Fullbright:OnChanged(function(value) 226 | if not value then Script.LastBright = shared.Lighting.Brightness end 227 | 228 | shared.Lighting.Brightness = if value then 2 else shared.Lighting.Brightness 229 | shared.Lighting.GlobalShadows = value 230 | end) 231 | 232 | Toggles.NoFog:OnChanged(function(value) 233 | if not shared.Lighting:GetAttribute("FogStart") then shared.Lighting:SetAttribute("FogStart", shared.Lighting.FogStart) end 234 | if not shared.Lighting:GetAttribute("FogEnd") then shared.Lighting:SetAttribute("FogEnd", shared.Lighting.FogEnd) end 235 | 236 | shared.Lighting.FogStart = value and 0 or shared.Lighting:GetAttribute("FogStart") 237 | shared.Lighting.FogEnd = value and math.huge or shared.Lighting:GetAttribute("FogEnd") 238 | 239 | local fog = shared.Lighting:FindFirstChildOfClass("Atmosphere") 240 | if fog then 241 | if not fog:GetAttribute("Density") then fog:SetAttribute("Density", fog.Density) end 242 | 243 | fog.Density = value and 0 or fog:GetAttribute("Density") 244 | end 245 | end) 246 | 247 | shared.Connect:GiveSignal(shared.Lighting:GetPropertyChangedSignal("Brightness"):Connect(function() 248 | if Toggles.Fullbright.Value then 249 | shared.Lighting.Brightness = 2 250 | end 251 | end)) 252 | 253 | shared.Connect:GiveSignal(shared.Lighting:GetPropertyChangedSignal("FogStart"):Connect(function() 254 | if Toggles.NoFog.Value then 255 | shared.Lighting.FogStart = 0 256 | end 257 | end)) 258 | 259 | shared.Connect:GiveSignal(shared.Lighting:GetPropertyChangedSignal("FogEnd"):Connect(function() 260 | if Toggles.NoFog.Value then 261 | shared.Lighting.FogEnd = math.huge 262 | end 263 | end)) 264 | 265 | shared.Connect:GiveSignal(shared.Lighting:GetPropertyChangedSignal("GlobalShadows"):Connect(function() 266 | if Toggles.Fullbright.Value then 267 | shared.Lighting.GlobalShadows = Toggles.Fullbright.Value 268 | end 269 | end)) 270 | 271 | Toggles.AntiLag:OnChanged(function(value) 272 | for _, object in pairs(workspace:GetDescendants()) do 273 | if object:IsA("BasePart") then 274 | if not object:GetAttribute("Material") then object:SetAttribute("Material", object.Material) end 275 | if not object:GetAttribute("Reflectance") then object:SetAttribute("Reflectance", object.Reflectance) end 276 | 277 | object.Material = value and Enum.Material.Plastic or object:GetAttribute("Material") 278 | object.Reflectance = value and 0 or object:GetAttribute("Reflectance") 279 | elseif object:IsA("Decal") then 280 | if not object:GetAttribute("Transparency") then object:SetAttribute("Transparency", object.Transparency) end 281 | object.Transparency = value and 1 or object:GetAttribute("Transparency") 282 | end 283 | end 284 | 285 | workspace.Terrain.WaterReflectance = if value then 0 else 1 286 | workspace.Terrain.WaterTransparency = if value then 0 else 1 287 | workspace.Terrain.WaterWaveSize = if value then 0 else 0.05 288 | workspace.Terrain.WaterWaveSpeed = if value then 0 else 8 289 | shared.Lighting.GlobalShadows = not value 290 | end) -------------------------------------------------------------------------------- /Src/Places/Utils/Doors/Doors/Assets.luau: -------------------------------------------------------------------------------- 1 | --// Linoria \\-- 2 | local Toggles = shared.Toggles 3 | local Options = shared.Options 4 | 5 | --// Variables \\-- 6 | local Script = shared.Script 7 | 8 | --// Functions \\-- 9 | function Script.Functions.PromptCondition(prompt) 10 | local modelAncestor = prompt:FindFirstAncestorOfClass("Model") 11 | return 12 | prompt:IsA("ProximityPrompt") and ( 13 | not table.find(Script.PromptTable.Excluded.Prompt, prompt.Name) 14 | and not table.find(Script.PromptTable.Excluded.Parent, prompt.Parent and prompt.Parent.Name or "") 15 | and not (table.find(Script.PromptTable.Excluded.ModelAncestor, modelAncestor and modelAncestor.Name or "")) 16 | ) 17 | end 18 | 19 | function Script.Functions.ItemCondition(item) 20 | return item:IsA("Model") and (item:GetAttribute("Pickup") or item:GetAttribute("PropType")) and not item:GetAttribute("FuseID") 21 | end 22 | 23 | function Script.Functions.VoiceCondition(sound: Sound) 24 | return sound:IsA("Sound") and table.find(Script.Voicelines, sound.SoundId) 25 | end 26 | 27 | function Script.Functions.ChildCheck(child) 28 | -- optimization (ty lsplash) 29 | if (child.Name == "AnimSaves" or child.Name == "Keyframe" or child:IsA("KeyframeSequence")) then 30 | child:Destroy() 31 | return 32 | end 33 | 34 | -- skip 35 | if not (child:IsA("ProximityPrompt") or child:IsA("Model") or child:IsA("BasePart") or child:IsA("Decal") or child:IsA("Sound")) then 36 | return 37 | end 38 | 39 | if Script.Functions.PromptCondition(child) then 40 | task.defer(function() 41 | if not child:GetAttribute("Hold") then child:SetAttribute("Hold", child.HoldDuration) end 42 | if not child:GetAttribute("Distance") then child:SetAttribute("Distance", child.MaxActivationDistance) end 43 | if not child:GetAttribute("Clip") then child:SetAttribute("Clip", child.RequiresLineOfSight) end 44 | end) 45 | 46 | task.defer(function() 47 | child.MaxActivationDistance = child:GetAttribute("Distance") * Options.PromptReachMultiplier.Value 48 | 49 | if Toggles.InstaInteract.Value then 50 | child.HoldDuration = 0 51 | end 52 | 53 | if Toggles.PromptClip.Value then 54 | child.RequiresLineOfSight = false 55 | end 56 | end) 57 | 58 | table.insert(Script.PromptTable.GamePrompts, child) 59 | elseif child:IsA("Model") then 60 | if child.Name == "ElevatorBreaker" and Toggles.AutoBreakerSolver.Value then 61 | Script.Functions.SolveBreakerBox(child) 62 | end 63 | 64 | if Script.IsMines and Toggles.TheMinesAnticheatBypass.Value and child.Name == "Ladder" then 65 | Script.Functions.ESP({ 66 | Type = "None", 67 | Object = child, 68 | Text = "Ladder", 69 | Color = Color3.new(0, 0, 1) 70 | }) 71 | end 72 | 73 | if (child.Name == "GiggleCeiling" and Toggles.AntiGiggle.Value) or (child.Name == "Snare" and Toggles.AntiSnare.Value) then 74 | local hitbox = child:WaitForChild("Hitbox", 5) 75 | if hitbox then hitbox.CanTouch = false end 76 | elseif (child:GetAttribute("LoadModule") == "DupeRoom" or child:GetAttribute("LoadModule") == "SpaceSideroom") and Toggles.AntiDupe.Value then 77 | Script.Functions.DisableDupe(child, true, child:GetAttribute("LoadModule") == "SpaceSideroom") 78 | end 79 | 80 | if (Script.IsHotel or Script.IsFools) and (child.Name == "ChandelierObstruction" or child.Name == "Seek_Arm") and Toggles.AntiSeekObstructions.Value then 81 | for i,v in pairs(child:GetDescendants()) do 82 | if v:IsA("BasePart") then v.CanTouch = false end 83 | end 84 | end 85 | 86 | if Script.IsFools then 87 | if Toggles.FigureGodmodeFools.Value and child.Name == "FigureRagdoll" then 88 | for i, v in pairs(child:GetDescendants()) do 89 | if v:IsA("BasePart") then 90 | if not v:GetAttribute("Clip") then v:SetAttribute("Clip", v.CanCollide) end 91 | 92 | v.CanTouch = false 93 | 94 | -- woudn't want figure to just dip into the ground 95 | task.spawn(function() 96 | repeat task.wait() until (Script.LatestRoom.Value == 50 or Script.LatestRoom.Value == 100) 97 | task.wait(5) 98 | v.CanCollide = false 99 | end) 100 | end 101 | end 102 | end 103 | end 104 | elseif child:IsA("BasePart") then 105 | if child.Parent then 106 | if tonumber(child.Name) and child.Name == child.Parent.Name then 107 | child.Size *= Vector3.new(1, 100, 1) 108 | elseif child.Name == "Egg" and Toggles.AntiGloomEgg.Value then 109 | child.CanTouch = false 110 | end 111 | else 112 | if child.Name == "Egg" and Toggles.AntiGloomEgg.Value then 113 | child.CanTouch = false 114 | end 115 | end 116 | 117 | if Toggles.AntiLag.Value then 118 | if not child:GetAttribute("Material") then child:SetAttribute("Material", child.Material) end 119 | if not child:GetAttribute("Reflectance") then child:SetAttribute("Reflectance", child.Reflectance) end 120 | 121 | child.Material = Enum.Material.Plastic 122 | child.Reflectance = 0 123 | end 124 | 125 | if Script.IsMines then 126 | if Toggles.AntiBridgeFall.Value and child.Name == "PlayerBarrier" and child.Size.Y == 2.75 and (child.Rotation.X == 0 or child.Rotation.X == 180) then 127 | local clone = child:Clone() 128 | clone.CFrame = clone.CFrame * CFrame.new(0, 0, -5) 129 | clone.Color = Color3.new(1, 1, 1) 130 | clone.Name = "AntiBridge" 131 | clone.Size = Vector3.new(clone.Size.X, clone.Size.Y, 11) 132 | clone.Transparency = 0 133 | clone.Parent = child.Parent 134 | 135 | table.insert(Script.Temp.Bridges, clone) 136 | elseif Toggles.AntiPipeGap.Value and child.Name == "KillBrick" and child.Parent.Name == "Assets" then 137 | local clone = child:Clone() 138 | clone.Color = Color3.new(1, 1, 1) 139 | clone.Name = "AntiPipeGap" 140 | clone.Position += Vector3.new(0, 20, 0) 141 | clone.Size = Vector3.new(9, 4, clone.Size.Z) 142 | clone.Transparency = 0 143 | clone.Parent = child.Parent 144 | 145 | table.insert(Script.Temp.PipeBridges, clone) 146 | elseif Toggles.AntiSeekFlood.Value and child.Name == "SeekFloodline" then 147 | child.CanCollide = true 148 | end 149 | end 150 | elseif child:IsA("Decal") and Toggles.AntiLag.Value then 151 | if not child:GetAttribute("Transparency") then child:SetAttribute("Transparency", child.Transparency) end 152 | 153 | if not table.find(Script.SlotsName, child.Name) then 154 | child.Transparency = 1 155 | end 156 | elseif Script.Functions.VoiceCondition(child) and shared.CheckToggle("NoVoiceActing", true) then 157 | child:Destroy() 158 | end 159 | end 160 | 161 | function Script.Functions.IsPromptInRange(prompt: ProximityPrompt) 162 | return Script.Functions.DistanceFromCharacter(prompt:FindFirstAncestorWhichIsA("BasePart") or prompt:FindFirstAncestorWhichIsA("Model") or prompt.Parent) <= prompt.MaxActivationDistance 163 | end 164 | 165 | function Script.Functions.GetNearestAssetWithCondition(condition: () -> ()) 166 | local nearestDistance = math.huge 167 | local nearest 168 | for _, room in pairs(workspace.CurrentRooms:GetChildren()) do 169 | if not room:FindFirstChild("Assets") then continue end 170 | 171 | for _, asset in pairs(room.Assets:GetChildren()) do 172 | if condition(asset) and Script.Functions.DistanceFromCharacter(asset) < nearestDistance then 173 | nearestDistance = Script.Functions.DistanceFromCharacter(asset) 174 | nearest = asset 175 | end 176 | end 177 | end 178 | 179 | return nearest 180 | end 181 | 182 | function Script.Functions.GetAllPromptsWithCondition(condition) 183 | assert(typeof(condition) == "function", "Expected a function as condition argument but got " .. typeof(condition)) 184 | 185 | local validPrompts = {} 186 | for _, prompt in pairs(Script.PromptTable.GamePrompts) do 187 | if not prompt or not prompt:IsDescendantOf(workspace) then continue end 188 | 189 | local success, returnData = pcall(function() 190 | return condition(prompt) 191 | end) 192 | 193 | assert(success, "An error has occured while running condition function.\n" .. tostring(returnData)) 194 | assert(typeof(returnData) == "boolean", "Expected condition function to return a boolean") 195 | 196 | if returnData then 197 | table.insert(validPrompts, prompt) 198 | end 199 | end 200 | 201 | return validPrompts 202 | end 203 | 204 | function Script.Functions.GetNearestPromptWithCondition(condition) 205 | local prompts = Script.Functions.GetAllPromptsWithCondition(condition) 206 | 207 | local nearestPrompt = nil 208 | local oldHighestDistance = math.huge 209 | for _, prompt in pairs(prompts) do 210 | local promptParent = prompt:FindFirstAncestorWhichIsA("BasePart") or prompt:FindFirstAncestorWhichIsA("Model") 211 | 212 | if promptParent and Script.Functions.DistanceFromCharacter(promptParent) < oldHighestDistance then 213 | nearestPrompt = prompt 214 | oldHighestDistance = Script.Functions.DistanceFromCharacter(promptParent) 215 | end 216 | end 217 | 218 | return nearestPrompt 219 | end --------------------------------------------------------------------------------