Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if getgenv().SignalSpyExecuted and type(getgenv().SignalSpyShutdown) == "function" then
- getgenv().SignalSpyShutdown()
- task.wait(0.3)
- end
- if not game:IsLoaded() then game.Loaded:Wait() end
- local function missing(t, f, fallback)
- if type(f) == t then return f end
- return fallback
- end
- cloneref = missing("function", cloneref, function(...) return ... end)
- newcclosure = missing("function", newcclosure, function(f) return f end)
- checkcaller = missing("function", checkcaller, function() return false end)
- getconnections = missing("function", getconnections or get_signal_cons)
- firesignal = missing("function", firesignal or fire_signal)
- replicatesignal = missing("function", replicatesignal)
- getnilinstances = missing("function", getnilinstances or get_nil_instances, function() return {} end)
- gethui = missing("function", gethui or get_hidden_gui)
- protect_gui = missing("function", protect_gui or (syn and syn.protect_gui))
- gethiddenproperty = missing("function", gethiddenproperty or get_hidden_property)
- sethiddenproperty = missing("function", sethiddenproperty or set_hidden_property)
- isscriptable = missing("function", isscriptable or is_scriptable)
- setscriptable = missing("function", setscriptable or set_scriptable)
- getrawmetatable = missing("function", getrawmetatable)
- setreadonly = missing("function", setreadonly)
- isreadonly = missing("function", isreadonly)
- hookmetamethod = missing("function", hookmetamethod)
- hookfunction = missing("function", hookfunction or replaceclosure or hookfunc)
- getnamecallmethod = missing("function", getnamecallmethod)
- getcallingscript = missing("function", getcallingscript, function() return nil end)
- getinfo = missing("function", getinfo or debug.getinfo, function() return {} end)
- iscclosure = missing("function", iscclosure, function() return false end)
- islclosure = missing("function", islclosure or is_l_closure, function() return true end)
- getupvalues = missing("function", getupvalues or debug.getupvalues, function() return {} end)
- getconstants = missing("function", getconstants or debug.getconstants, function() return {} end)
- isfile = missing("function", isfile, function() return false end)
- readfile = missing("function", readfile, function() return "" end)
- writefile = missing("function", writefile)
- makefolder = missing("function", makefolder)
- local setclipboard = missing("function", setclipboard or toclipboard or set_clipboard, function() end)
- local lower = string.lower
- local byte = string.byte
- local running = coroutine.running
- local resume = coroutine.resume
- local status = coroutine.status
- local yield = coroutine.yield
- local create = coroutine.create
- local function Create(instance, properties, children)
- local obj = Instance.new(instance)
- for i, v in next, properties or {} do
- obj[i] = v
- end
- for _, child in next, children or {} do
- child.Parent = obj
- end
- return obj
- end
- local Services = setmetatable({}, {
- __index = function(self, name)
- local ok, svc = pcall(function()
- return cloneref(game:GetService(name))
- end)
- if ok and svc then
- rawset(self, name, svc)
- return svc
- end
- return nil
- end
- })
- local Players = Services.Players
- local HttpService = Services.HttpService
- local TweenService = Services.TweenService
- local UserInputService = Services.UserInputService
- local RunService = Services.RunService
- local CoreGui = Services.CoreGui
- local TextService = Services.TextService
- local GuiService = Services.GuiService
- local UGCValidationService = Services.UGCValidationService
- local LocalPlayer = Players and Players.LocalPlayer
- local GuiInset = GuiService:GetGuiInset()
- local function ugcGetProperty(instance, property)
- if not UGCValidationService then return false, nil end
- local ok, result = pcall(function()
- return UGCValidationService:GetPropertyValue(instance, property)
- end)
- return ok, result
- end
- getgenv().gethiddenpropertyy = newcclosure(function(inst, prop)
- if type(gethiddenproperty) == "function" then
- local ok, result = pcall(gethiddenproperty, inst, prop)
- if ok then return result end
- end
- if type(setscriptable) == "function" then
- local ok = pcall(function()
- local was = isscriptable and isscriptable(inst, prop)
- if not was then setscriptable(inst, prop, true) end
- end)
- if ok then
- local ok2, val = pcall(function() return inst[prop] end)
- if ok2 then return val end
- end
- end
- local ok, result = ugcGetProperty(inst, prop)
- if ok then return result end
- return nil
- end)
- local ExploitCapabilities = {
- setscriptable = type(setscriptable) == "function",
- isscriptable = type(isscriptable) == "function",
- gethiddenproperty = type(gethiddenproperty) == "function",
- sethiddenproperty = type(sethiddenproperty) == "function",
- ugcGetProperty = UGCValidationService ~= nil,
- getrawmetatable = type(getrawmetatable) == "function",
- setreadonly = type(setreadonly) == "function",
- replicatesignal = type(replicatesignal) == "function",
- firesignal = type(firesignal) == "function",
- getconnections = type(getconnections) == "function",
- hookmetamethod = type(hookmetamethod) == "function",
- hookfunction = type(hookfunction) == "function",
- checkcaller = type(checkcaller) == "function",
- getnamecallmethod = type(getnamecallmethod) == "function",
- }
- local Highlight
- pcall(function()
- Highlight = loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/SimpleSpyV3/highlight.lua"))()
- end)
- local LazyFix
- pcall(function()
- LazyFix = loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/SimpleSpyV3/DataToCode.lua"))()
- end)
- local SPAM_PROPERTIES = {
- Position = true,
- CFrame = true,
- Rotation = true,
- Orientation = true,
- Velocity = true,
- RotVelocity = true,
- AssemblyLinearVelocity = true,
- AssemblyAngularVelocity = true,
- AssemblyCenterOfMass = true,
- CenterOfMass = true,
- LocalTransparencyModifier = true,
- ReceiveAge = true,
- ExtentsCFrame = true,
- Focus = true,
- CoordinateFrame = true,
- MoveDirection = true,
- WalkToPoint = true,
- DistributedGameTime = true,
- FloorMaterial = true,
- TargetPoint = true,
- Origin = true,
- }
- local INTERESTING_HIDDEN = {
- "ReplicationPV",
- "NetworkOwnerV3",
- "PhysicsRepRootPart",
- "NetworkIsSleeping",
- "NetworkOwnershipRule",
- "LocalSimulationValidation",
- "Attributes",
- "AttributesReplicate",
- "RobloxLocked",
- "SourceAssetId",
- "UniqueId",
- }
- local selectedColor = Color3.fromRGB(92, 126, 229)
- local deselectedColor = Color3.fromRGB(0, 0, 0)
- local layoutOrderNum = 999999999
- local logs = {}
- local groupedLogs = {}
- local selected = nil
- local blacklist = {}
- local blocklist = {}
- local connections = {}
- local HookedSignals = {}
- local HookedProperties = {}
- local SpamHistory = {}
- local PropertySpamHistory = {}
- local FunctionSpamHistory = {}
- local CachedAPIEvents = {}
- local CachedAPIProperties = {}
- local CachedAPIFunctions = {}
- local TotalSignalHooks = 0
- local TotalPropertyHooks = 0
- local TotalFunctionCalls = 0
- local HiddenSignalHooks = 0
- local HiddenPropertyHooks = 0
- local closed = false
- local sideClosed = false
- local mainClosing = false
- local sideClosing = false
- local maximized = false
- local toggle = true
- local mouseInGui = false
- local currentTab = "Signals"
- local codebox
- local remotesFadeIn
- local rightFadeIn
- getgenv().CaptureClasses = getgenv().CaptureClasses or {"Humanoid", "Tool", "ClickDetector", "ProximityPrompt", "Player"}
- getgenv().CaptureHidden = getgenv().CaptureHidden or false
- getgenv().CaptureDeprecated = getgenv().CaptureDeprecated or false
- getgenv().CaptureProperties = getgenv().CaptureProperties or false
- getgenv().CaptureFunctions = getgenv().CaptureFunctions or false
- getgenv().PropertyClasses = getgenv().PropertyClasses or {"Humanoid", "Tool"}
- getgenv().FunctionClasses = getgenv().FunctionClasses or {"Humanoid", "Tool", "ClickDetector", "ProximityPrompt"}
- local CONFIG = {
- Enabled = true,
- FilterSpammy = true,
- SpamThreshold = 5,
- SpamTimeWindow = 1,
- MaxLogs = 500,
- ShowClassName = true,
- LogCheckcaller = false,
- FuncInfoEnabled = true,
- AutoBlock = false,
- }
- local function randomString()
- local arr = {}
- for i = 1, math.random(10, 20) do
- arr[i] = string.char(math.random(65, 90))
- end
- return table.concat(arr)
- end
- local SignalSpy = Create("ScreenGui", {
- ResetOnSpawn = false,
- Name = randomString(),
- ZIndexBehavior = Enum.ZIndexBehavior.Sibling
- })
- local Storage = Create("Folder", {})
- local Background = Create("Frame", {
- Parent = SignalSpy,
- BackgroundColor3 = Color3.new(1, 1, 1),
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 500, 0, 200),
- Size = UDim2.new(0, 520, 0, 320)
- })
- local TopBar = Create("Frame", {
- Parent = Background,
- BackgroundColor3 = Color3.fromRGB(37, 35, 38),
- BorderSizePixel = 0,
- Size = UDim2.new(0, 520, 0, 19),
- ZIndex = 2
- })
- local LeftPanel = Create("Frame", {
- Parent = Background,
- BackgroundColor3 = Color3.fromRGB(53, 52, 55),
- BorderSizePixel = 0,
- Position = UDim2.new(0, 0, 0, 19),
- Size = UDim2.new(0, 145, 0, 301),
- ClipsDescendants = true
- })
- local TabFrame = Create("Frame", {
- Parent = LeftPanel,
- BackgroundColor3 = Color3.fromRGB(37, 36, 38),
- BorderSizePixel = 0,
- Position = UDim2.new(0, 3, 0, 3),
- Size = UDim2.new(1, -6, 0, 22)
- })
- Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = TabFrame})
- local TabSignals = Create("TextButton", {
- Parent = TabFrame,
- BackgroundColor3 = Color3.fromRGB(255, 100, 150),
- BackgroundTransparency = 0.3,
- BorderSizePixel = 0,
- Position = UDim2.new(0, 2, 0, 2),
- Size = UDim2.new(0.33, -2, 0, 18),
- Font = Enum.Font.SourceSansBold,
- Text = "Signals",
- TextColor3 = Color3.new(1, 1, 1),
- TextSize = 10,
- AutoButtonColor = false
- })
- Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabSignals})
- local TabProperties = Create("TextButton", {
- Parent = TabFrame,
- BackgroundColor3 = Color3.fromRGB(100, 180, 255),
- BackgroundTransparency = 0.7,
- BorderSizePixel = 0,
- Position = UDim2.new(0.33, 1, 0, 2),
- Size = UDim2.new(0.33, -2, 0, 18),
- Font = Enum.Font.SourceSansBold,
- Text = "Props",
- TextColor3 = Color3.new(1, 1, 1),
- TextSize = 10,
- AutoButtonColor = false
- })
- Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabProperties})
- local TabFunctions = Create("TextButton", {
- Parent = TabFrame,
- BackgroundColor3 = Color3.fromRGB(255, 220, 100),
- BackgroundTransparency = 0.7,
- BorderSizePixel = 0,
- Position = UDim2.new(0.66, 1, 0, 2),
- Size = UDim2.new(0.34, -3, 0, 18),
- Font = Enum.Font.SourceSansBold,
- Text = "Funcs",
- TextColor3 = Color3.fromRGB(30, 30, 30),
- TextSize = 10,
- AutoButtonColor = false
- })
- Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabFunctions})
- local LogList = Create("ScrollingFrame", {
- Parent = LeftPanel,
- Active = true,
- BackgroundColor3 = Color3.new(1, 1, 1),
- BackgroundTransparency = 1,
- BorderSizePixel = 0,
- Position = UDim2.new(0, 0, 0, 28),
- Size = UDim2.new(1, 0, 1, -32),
- CanvasSize = UDim2.new(0, 0, 0, 0),
- ScrollBarThickness = 4,
- ScrollBarImageColor3 = Color3.fromRGB(255, 100, 150)
- })
- local UIListLayout = Create("UIListLayout", {
- Parent = LogList,
- HorizontalAlignment = Enum.HorizontalAlignment.Center,
- SortOrder = Enum.SortOrder.LayoutOrder,
- Padding = UDim.new(0, 1)
- })
- local RightPanel = Create("Frame", {
- Parent = Background,
- BackgroundColor3 = Color3.fromRGB(37, 36, 38),
- BorderSizePixel = 0,
- Position = UDim2.new(0, 145, 0, 19),
- Size = UDim2.new(0, 375, 0, 301),
- ClipsDescendants = true
- })
- local CodeBox = Create("Frame", {
- Parent = RightPanel,
- BackgroundColor3 = Color3.fromRGB(21, 19, 20),
- BorderSizePixel = 0,
- Size = UDim2.new(1, 0, 0.5, 0)
- })
- local ButtonsFrame = Create("ScrollingFrame", {
- Parent = RightPanel,
- Active = true,
- BackgroundColor3 = Color3.new(1, 1, 1),
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 0, 0.5, 0),
- Size = UDim2.new(1, 0, 0.5, -9),
- CanvasSize = UDim2.new(0, 0, 0, 0),
- ScrollBarThickness = 4,
- ScrollBarImageColor3 = Color3.fromRGB(255, 100, 150)
- })
- local UIGridLayout = Create("UIGridLayout", {
- Parent = ButtonsFrame,
- HorizontalAlignment = Enum.HorizontalAlignment.Center,
- SortOrder = Enum.SortOrder.LayoutOrder,
- CellPadding = UDim2.new(0, 0, 0, 0),
- CellSize = UDim2.new(0, 94, 0, 27)
- })
- local TitleButton = Create("TextButton", {
- Parent = TopBar,
- BackgroundColor3 = Color3.new(1, 1, 1),
- AutoButtonColor = false,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 5, 0, 0),
- Size = UDim2.new(0, 80, 0, 18),
- Font = Enum.Font.SourceSansBold,
- Text = "SignalSpy+",
- TextColor3 = Color3.fromRGB(100, 255, 100),
- TextSize = 13,
- TextXAlignment = Enum.TextXAlignment.Left,
- ZIndex = 2
- })
- local StatusLabel = Create("TextLabel", {
- Parent = TopBar,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 88, 0, 0),
- Size = UDim2.new(0, 250, 0, 18),
- Font = Enum.Font.SourceSans,
- Text = "[Loading...]",
- TextColor3 = Color3.fromRGB(150, 150, 150),
- TextSize = 10,
- TextXAlignment = Enum.TextXAlignment.Left,
- ZIndex = 2
- })
- local CloseButton = Create("TextButton", {
- Parent = TopBar,
- BackgroundColor3 = Color3.fromRGB(37, 36, 38),
- BorderSizePixel = 0,
- Position = UDim2.new(1, -19, 0, 0),
- Size = UDim2.new(0, 19, 0, 19),
- Font = Enum.Font.SourceSans,
- Text = "",
- TextColor3 = Color3.new(0, 0, 0),
- TextSize = 14,
- ZIndex = 2
- })
- Create("ImageLabel", {
- Parent = CloseButton,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 5, 0, 5),
- Size = UDim2.new(0, 9, 0, 9),
- Image = "rbxassetid://5597086202",
- ZIndex = 2
- })
- local MaximizeButton = Create("TextButton", {
- Parent = TopBar,
- BackgroundColor3 = Color3.fromRGB(37, 36, 38),
- BorderSizePixel = 0,
- Position = UDim2.new(1, -38, 0, 0),
- Size = UDim2.new(0, 19, 0, 19),
- Font = Enum.Font.SourceSans,
- Text = "",
- ZIndex = 2
- })
- Create("ImageLabel", {
- Parent = MaximizeButton,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 5, 0, 5),
- Size = UDim2.new(0, 9, 0, 9),
- Image = "rbxassetid://5597108117",
- ZIndex = 2
- })
- local MinimizeButton = Create("TextButton", {
- Parent = TopBar,
- BackgroundColor3 = Color3.fromRGB(37, 36, 38),
- BorderSizePixel = 0,
- Position = UDim2.new(1, -57, 0, 0),
- Size = UDim2.new(0, 19, 0, 19),
- Font = Enum.Font.SourceSans,
- Text = "",
- ZIndex = 2
- })
- Create("ImageLabel", {
- Parent = MinimizeButton,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 5, 0, 5),
- Size = UDim2.new(0, 9, 0, 9),
- Image = "rbxassetid://5597105827",
- ZIndex = 2
- })
- local ToolTip = Create("Frame", {
- Parent = SignalSpy,
- BackgroundColor3 = Color3.fromRGB(26, 26, 26),
- BackgroundTransparency = 0.1,
- BorderColor3 = Color3.new(1, 1, 1),
- Size = UDim2.new(0, 200, 0, 50),
- ZIndex = 100,
- Visible = false
- })
- local ToolTipText = Create("TextLabel", {
- Parent = ToolTip,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 4, 0, 4),
- Size = UDim2.new(1, -8, 1, -8),
- ZIndex = 100,
- Font = Enum.Font.SourceSans,
- Text = "",
- TextColor3 = Color3.new(1, 1, 1),
- TextSize = 12,
- TextWrapped = true,
- TextXAlignment = Enum.TextXAlignment.Left,
- TextYAlignment = Enum.TextYAlignment.Top
- })
- local function deepclone(args, copies)
- local copy = nil
- copies = copies or {}
- if type(args) == "table" then
- if copies[args] then
- copy = copies[args]
- else
- copy = {}
- copies[args] = copy
- for i, v in next, args do
- copy[deepclone(i, copies)] = deepclone(v, copies)
- end
- end
- elseif typeof(args) == "Instance" then
- local ok, c = pcall(cloneref, args)
- copy = ok and c or args
- else
- copy = args
- end
- return copy
- end
- local function getPlayerFromInstance(instance)
- for _, v in next, Players:GetPlayers() do
- if v.Character and (instance:IsDescendantOf(v.Character) or instance == v.Character) then
- return v
- end
- end
- return nil
- end
- local function instanceToPath(inst)
- if not inst then return "nil" end
- if inst == game then return "game" end
- if inst == workspace then return "workspace" end
- if inst == LocalPlayer then return 'game:GetService("Players").LocalPlayer' end
- local player = getPlayerFromInstance(inst)
- local parts = {}
- local current = inst
- if player then
- while current and current ~= player.Character do
- if current.Name:match("^[%a_][%w_]*$") then
- table.insert(parts, 1, "." .. current.Name)
- else
- table.insert(parts, 1, ':FindFirstChild("' .. current.Name .. '")')
- end
- current = current.Parent
- end
- if player == LocalPlayer then
- return 'game:GetService("Players").LocalPlayer.Character' .. table.concat(parts)
- else
- return 'game:GetService("Players"):FindFirstChild("' .. player.Name .. '").Character' .. table.concat(parts)
- end
- end
- local ok, result = pcall(function()
- while current and current.Parent ~= game do
- if not current.Parent then
- return 'getNil("' .. inst.Name .. '", "' .. inst.ClassName .. '")'
- end
- if current.Name:match("^[%a_][%w_]*$") then
- table.insert(parts, 1, "." .. current.Name)
- else
- table.insert(parts, 1, ':FindFirstChild("' .. current.Name .. '")')
- end
- current = current.Parent
- end
- if current and current.Parent == game then
- local svc = current.ClassName
- if pcall(function() return game:GetService(svc) end) then
- return 'game:GetService("' .. svc .. '")' .. table.concat(parts)
- end
- return "game." .. current.Name .. table.concat(parts)
- end
- return "game"
- end)
- return ok and result or tostring(inst)
- end
- local function deepSerialize(val, depth)
- depth = depth or 0
- if depth > 4 then return "..." end
- if LazyFix then
- local ok, result = pcall(function()
- return LazyFix.Convert(val, true)
- end)
- if ok and result then return result end
- end
- local t = typeof(val)
- local spacing = string.rep(" ", depth)
- local nextSpacing = string.rep(" ", depth + 1)
- if t == "nil" then
- return "nil"
- elseif t == "string" then
- local str = val
- if #str > 150 then str = str:sub(1, 150) .. "..." end
- return string.format("%q", str)
- elseif t == "number" then
- if val == math.huge then return "math.huge" end
- if val == -math.huge then return "-math.huge" end
- if val ~= val then return "0/0" end
- return tostring(val)
- elseif t == "boolean" then
- return tostring(val)
- elseif t == "Instance" then
- return instanceToPath(val)
- elseif t == "Vector3" then
- return string.format("Vector3.new(%s, %s, %s)", val.X, val.Y, val.Z)
- elseif t == "Vector2" then
- return string.format("Vector2.new(%s, %s)", val.X, val.Y)
- elseif t == "CFrame" then
- return string.format("CFrame.new(%s)", table.concat({val:GetComponents()}, ", "))
- elseif t == "Color3" then
- return string.format("Color3.new(%s, %s, %s)", val.R, val.G, val.B)
- elseif t == "BrickColor" then
- return string.format('BrickColor.new("%s")', tostring(val))
- elseif t == "UDim2" then
- return string.format("UDim2.new(%s, %s, %s, %s)", val.X.Scale, val.X.Offset, val.Y.Scale, val.Y.Offset)
- elseif t == "UDim" then
- return string.format("UDim.new(%s, %s)", val.Scale, val.Offset)
- elseif t == "EnumItem" then
- return tostring(val)
- elseif t == "Enum" then
- return tostring(val)
- elseif t == "Ray" then
- return string.format("Ray.new(Vector3.new(%s, %s, %s), Vector3.new(%s, %s, %s))", val.Origin.X, val.Origin.Y, val.Origin.Z, val.Direction.X, val.Direction.Y, val.Direction.Z)
- elseif t == "function" then
- return "function() end"
- elseif t == "table" then
- local parts = {}
- local count = 0
- for k, v in pairs(val) do
- count = count + 1
- if count > 15 then
- table.insert(parts, nextSpacing .. "...")
- break
- end
- local ks
- if type(k) == "string" and k:match("^[%a_][%w_]*$") then
- ks = k
- else
- ks = "[" .. deepSerialize(k, depth + 1) .. "]"
- end
- table.insert(parts, nextSpacing .. ks .. " = " .. deepSerialize(v, depth + 1))
- end
- if #parts == 0 then
- return "{}"
- end
- return "{\n" .. table.concat(parts, ",\n") .. "\n" .. spacing .. "}"
- else
- return "<" .. t .. ">"
- end
- end
- local function getPropertyValueSmart(instance, propName, isHidden)
- if not isHidden then
- local ok, val = pcall(function() return instance[propName] end)
- if ok then return true, val, "direct" end
- end
- if isHidden and ExploitCapabilities.setscriptable then
- local wasScriptable = nil
- pcall(function()
- wasScriptable = isscriptable and isscriptable(instance, propName)
- if not wasScriptable then
- setscriptable(instance, propName, true)
- end
- end)
- local ok, val = pcall(function() return instance[propName] end)
- if ok then return true, val, "setscriptable" end
- end
- if isHidden and ExploitCapabilities.gethiddenproperty then
- local ok, val = pcall(function() return gethiddenproperty(instance, propName) end)
- if ok then return true, val, "gethiddenproperty" end
- end
- if isHidden and ExploitCapabilities.ugcGetProperty then
- local ok, val = ugcGetProperty(instance, propName)
- if ok then return true, val, "UGCValidationService" end
- end
- if isHidden and ExploitCapabilities.getrawmetatable then
- local ok, mt = pcall(function() return getrawmetatable(instance) end)
- if ok and mt then
- local oldRO
- if setreadonly then
- pcall(function()
- oldRO = isreadonly and isreadonly(mt)
- setreadonly(mt, false)
- end)
- end
- local ok2, val = pcall(function()
- local idx = rawget(mt, "__index")
- if type(idx) == "function" then
- return idx(instance, propName)
- elseif type(idx) == "table" then
- return rawget(idx, propName)
- end
- end)
- if setreadonly and oldRO then
- pcall(function() setreadonly(mt, true) end)
- end
- if ok2 then return true, val, "rawmetatable" end
- end
- end
- local ok, val = pcall(function() return instance[propName] end)
- if ok then return true, val, "direct_fallback" end
- return false, nil, "failed"
- end
- local function getSignalFromInstance(instance, signalName, isHidden, isDeprecated)
- if (isHidden or isDeprecated) and ExploitCapabilities.setscriptable then
- local wasScriptable = nil
- pcall(function()
- wasScriptable = isscriptable and isscriptable(instance, signalName)
- if not wasScriptable then
- setscriptable(instance, signalName, true)
- end
- end)
- local ok, sig = pcall(function() return instance[signalName] end)
- if ok and sig and typeof(sig) == "RBXScriptSignal" then
- return sig, "setscriptable", wasScriptable == false
- end
- end
- local ok, result = pcall(function() return instance[signalName] end)
- if ok and result and typeof(result) == "RBXScriptSignal" then
- return result, "direct", false
- end
- if isHidden and ExploitCapabilities.gethiddenproperty then
- local ok2, result2 = pcall(function() return gethiddenproperty(instance, signalName) end)
- if ok2 and result2 and typeof(result2) == "RBXScriptSignal" then
- return result2, "gethiddenproperty", false
- end
- end
- return nil, "failed", false
- end
- local function FetchAPIData()
- local ok, response = pcall(function()
- return game:HttpGet("https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/refs/heads/roblox/Full-API-Dump.json")
- end)
- if not ok or not response then return {}, {}, {} end
- local success, apiData = pcall(function()
- return HttpService:JSONDecode(response)
- end)
- if not success or not apiData or not apiData.Classes then return {}, {}, {} end
- local events = {}
- local properties = {}
- local functions = {}
- for _, class in ipairs(apiData.Classes) do
- if type(class.Name) == "string" then
- events[class.Name] = {
- Superclass = class.Superclass,
- Events = {},
- HiddenEvents = {},
- DeprecatedEvents = {}
- }
- properties[class.Name] = {
- Superclass = class.Superclass,
- Properties = {},
- HiddenProperties = {},
- ReadOnlyProperties = {},
- DeprecatedProperties = {}
- }
- functions[class.Name] = {
- Superclass = class.Superclass,
- Functions = {},
- HiddenFunctions = {},
- DeprecatedFunctions = {}
- }
- if class.Members then
- for _, member in ipairs(class.Members) do
- local isHidden = false
- local isDeprecated = false
- local isNotScriptable = false
- local isReadOnly = false
- for _, tag in ipairs(member.Tags or {}) do
- if type(tag) == "string" then
- if tag == "Hidden" then isHidden = true end
- if tag == "Deprecated" then isDeprecated = true end
- if tag == "NotScriptable" then isNotScriptable = true end
- if tag == "ReadOnly" then isReadOnly = true end
- end
- end
- if member.MemberType == "Event" and type(member.Name) == "string" and not isNotScriptable then
- local params = {}
- for _, p in ipairs(member.Parameters or {}) do
- table.insert(params, {name = p.Name, type = p.Type and p.Type.Name or "any"})
- end
- local eventData = {name = member.Name, parameters = params}
- if isDeprecated then
- table.insert(events[class.Name].DeprecatedEvents, eventData)
- elseif isHidden then
- table.insert(events[class.Name].HiddenEvents, eventData)
- else
- table.insert(events[class.Name].Events, eventData)
- end
- elseif member.MemberType == "Property" and type(member.Name) == "string" then
- local valueType = member.ValueType and member.ValueType.Name or "unknown"
- local propData = {
- name = member.Name,
- valueType = valueType,
- hidden = isHidden,
- readOnly = isReadOnly,
- deprecated = isDeprecated,
- notScriptable = isNotScriptable
- }
- if not isNotScriptable then
- if isDeprecated then
- table.insert(properties[class.Name].DeprecatedProperties, propData)
- elseif isHidden then
- table.insert(properties[class.Name].HiddenProperties, propData)
- elseif isReadOnly then
- table.insert(properties[class.Name].ReadOnlyProperties, propData)
- else
- table.insert(properties[class.Name].Properties, propData)
- end
- end
- elseif member.MemberType == "Function" and type(member.Name) == "string" and not isNotScriptable then
- local params = {}
- for _, p in ipairs(member.Parameters or {}) do
- table.insert(params, {name = p.Name, type = p.Type and p.Type.Name or "any", default = p.Default})
- end
- local returnType = member.ReturnType and member.ReturnType.Name or "void"
- local funcData = {
- name = member.Name,
- parameters = params,
- returnType = returnType,
- hidden = isHidden,
- deprecated = isDeprecated
- }
- if isDeprecated then
- table.insert(functions[class.Name].DeprecatedFunctions, funcData)
- elseif isHidden then
- table.insert(functions[class.Name].HiddenFunctions, funcData)
- else
- table.insert(functions[class.Name].Functions, funcData)
- end
- end
- end
- end
- end
- end
- return events, properties, functions
- end
- local function GetClassEvents(className, includeHidden, includeDeprecated)
- if type(className) ~= "string" then return {} end
- local allEvents = {}
- local current = className
- local visited = {}
- while current and CachedAPIEvents[current] and not visited[current] do
- visited[current] = true
- local classData = CachedAPIEvents[current]
- for _, e in ipairs(classData.Events or {}) do
- allEvents[e.name] = {hidden = false, deprecated = false, parameters = e.parameters}
- end
- if includeHidden then
- for _, e in ipairs(classData.HiddenEvents or {}) do
- allEvents[e.name] = {hidden = true, deprecated = false, parameters = e.parameters}
- end
- end
- if includeDeprecated then
- for _, e in ipairs(classData.DeprecatedEvents or {}) do
- allEvents[e.name] = {hidden = false, deprecated = true, parameters = e.parameters}
- end
- end
- current = classData.Superclass
- end
- local result = {}
- for name, data in pairs(allEvents) do
- table.insert(result, {name = name, hidden = data.hidden, deprecated = data.deprecated, parameters = data.parameters})
- end
- table.sort(result, function(a, b) return a.name < b.name end)
- return result
- end
- local function GetClassProperties(className, includeHidden, includeDeprecated, excludeSpam)
- if type(className) ~= "string" then return {} end
- local allProps = {}
- local current = className
- local visited = {}
- while current and CachedAPIProperties[current] and not visited[current] do
- visited[current] = true
- local classData = CachedAPIProperties[current]
- for _, p in ipairs(classData.Properties or {}) do
- if not excludeSpam or not SPAM_PROPERTIES[p.name] then
- allProps[p.name] = {hidden = false, readOnly = false, deprecated = false, valueType = p.valueType}
- end
- end
- for _, p in ipairs(classData.ReadOnlyProperties or {}) do
- if not excludeSpam or not SPAM_PROPERTIES[p.name] then
- allProps[p.name] = {hidden = false, readOnly = true, deprecated = false, valueType = p.valueType}
- end
- end
- if includeHidden then
- for _, p in ipairs(classData.HiddenProperties or {}) do
- if not excludeSpam or not SPAM_PROPERTIES[p.name] then
- allProps[p.name] = {hidden = true, readOnly = p.readOnly, deprecated = false, valueType = p.valueType}
- end
- end
- end
- if includeDeprecated then
- for _, p in ipairs(classData.DeprecatedProperties or {}) do
- if not excludeSpam or not SPAM_PROPERTIES[p.name] then
- allProps[p.name] = {hidden = p.hidden, readOnly = p.readOnly, deprecated = true, valueType = p.valueType}
- end
- end
- end
- current = classData.Superclass
- end
- local result = {}
- for name, data in pairs(allProps) do
- table.insert(result, {name = name, hidden = data.hidden, readOnly = data.readOnly, deprecated = data.deprecated, valueType = data.valueType})
- end
- table.sort(result, function(a, b) return a.name < b.name end)
- return result
- end
- local function GetClassFunctions(className, includeHidden, includeDeprecated)
- if type(className) ~= "string" then return {} end
- local allFuncs = {}
- local current = className
- local visited = {}
- while current and CachedAPIFunctions[current] and not visited[current] do
- visited[current] = true
- local classData = CachedAPIFunctions[current]
- for _, f in ipairs(classData.Functions or {}) do
- allFuncs[f.name] = {hidden = false, deprecated = false, parameters = f.parameters, returnType = f.returnType}
- end
- if includeHidden then
- for _, f in ipairs(classData.HiddenFunctions or {}) do
- allFuncs[f.name] = {hidden = true, deprecated = false, parameters = f.parameters, returnType = f.returnType}
- end
- end
- if includeDeprecated then
- for _, f in ipairs(classData.DeprecatedFunctions or {}) do
- allFuncs[f.name] = {hidden = false, deprecated = true, parameters = f.parameters, returnType = f.returnType}
- end
- end
- current = classData.Superclass
- end
- local result = {}
- for name, data in pairs(allFuncs) do
- table.insert(result, {name = name, hidden = data.hidden, deprecated = data.deprecated, parameters = data.parameters, returnType = data.returnType})
- end
- table.sort(result, function(a, b) return a.name < b.name end)
- return result
- end
- local function generateScript(data)
- if data.Type == "PropertyChange" then
- local script = ""
- local path = instanceToPath(data.Instance)
- if path:find("getNil") then
- script = script .. 'local function getNil(n,c) for _,v in ipairs(getnilinstances()) do if v.ClassName==c and v.Name==n then return v end end end\n\n'
- end
- script = script .. "local instance = " .. path .. "\n\n"
- script = script .. "local oldValue = " .. deepSerialize(data.OldValue) .. "\n"
- script = script .. "local newValue = " .. deepSerialize(data.NewValue) .. "\n\n"
- if data.IsHidden then
- if ExploitCapabilities.setscriptable then
- script = script .. 'setscriptable(instance, "' .. data.PropertyName .. '", true)\n'
- script = script .. "local value = instance." .. data.PropertyName .. "\n\n"
- elseif ExploitCapabilities.gethiddenproperty then
- script = script .. 'local value = gethiddenproperty(instance, "' .. data.PropertyName .. '")\n\n'
- elseif ExploitCapabilities.ugcGetProperty then
- script = script .. 'local UGC = game:GetService("UGCValidationService")\n'
- script = script .. 'local value = UGC:GetPropertyValue(instance, "' .. data.PropertyName .. '")\n\n'
- end
- else
- script = script .. "local value = instance." .. data.PropertyName .. "\n\n"
- end
- if not data.IsReadOnly then
- if data.IsHidden and ExploitCapabilities.setscriptable then
- script = script .. 'setscriptable(instance, "' .. data.PropertyName .. '", true)\n'
- end
- script = script .. "instance." .. data.PropertyName .. " = newValue\n"
- end
- return script
- elseif data.Type == "Function" then
- local script = ""
- local path = instanceToPath(data.Instance)
- if path:find("getNil") then
- script = script .. 'local function getNil(n,c) for _,v in ipairs(getnilinstances()) do if v.ClassName==c and v.Name==n then return v end end end\n\n'
- end
- script = script .. "local instance = " .. path .. "\n\n"
- if data.Args and #data.Args > 0 then
- script = script .. "local args = " .. deepSerialize(data.Args) .. "\n\n"
- end
- if data.ReturnValue ~= nil then
- script = script .. "local result = instance:" .. data.FunctionName .. "(unpack(args or {}))\n"
- else
- script = script .. "instance:" .. data.FunctionName .. "(unpack(args or {}))\n"
- end
- return script
- else
- local script = ""
- local path = instanceToPath(data.Instance)
- if path:find("getNil") then
- script = script .. 'local function getNil(n,c) for _,v in ipairs(getnilinstances()) do if v.ClassName==c and v.Name==n then return v end end end\n\n'
- end
- if data.UsedSetScriptable then
- script = script .. 'setscriptable(' .. path .. ', "' .. data.SignalName .. '", true)\n\n'
- end
- if data.Args and #data.Args > 0 then
- script = script .. "local args = " .. deepSerialize(data.Args) .. "\n\n"
- end
- script = script .. "local signal = " .. path .. "." .. data.SignalName .. "\n\n"
- if ExploitCapabilities.replicatesignal then
- script = script .. "replicatesignal(signal, unpack(args or {}))\n"
- elseif ExploitCapabilities.firesignal then
- script = script .. "firesignal(signal, unpack(args or {}))\n"
- end
- return script
- end
- end
- local function isSpammy(key, history, threshold, window)
- if not CONFIG.FilterSpammy then return false end
- local now = tick()
- if not history[key] then
- history[key] = {count = 1, lastTime = now}
- return false
- end
- local h = history[key]
- if now - h.lastTime > window then
- h.count = 1
- else
- h.count = h.count + 1
- end
- h.lastTime = now
- return h.count > threshold
- end
- local function updateLogCanvas()
- task.defer(function()
- LogList.CanvasSize = UDim2.new(0, 0, 0, UIListLayout.AbsoluteContentSize.Y + 5)
- end)
- end
- local function updateButtonCanvas()
- ButtonsFrame.CanvasSize = UDim2.new(0, 0, 0, UIGridLayout.AbsoluteContentSize.Y)
- end
- local function setCode(text)
- if codebox then
- codebox:setRaw(text)
- end
- end
- local function getCode()
- return codebox and codebox:getString() or ""
- end
- local function scaleToolTip()
- local size = TextService:GetTextSize(ToolTipText.Text, ToolTipText.TextSize, ToolTipText.Font, Vector2.new(196, math.huge))
- ToolTipText.Size = UDim2.new(0, size.X, 0, size.Y)
- ToolTip.Size = UDim2.new(0, size.X + 8, 0, size.Y + 8)
- end
- local function makeToolTip(enable, text)
- if enable and text then
- if connections["ToolTip"] then
- connections["ToolTip"]:Disconnect()
- end
- connections["ToolTip"] = RunService.RenderStepped:Connect(function()
- local mousePos = UserInputService:GetMouseLocation()
- local x = mousePos.X + 15
- local y = mousePos.Y - 10 - GuiInset.Y
- local viewSize = workspace.CurrentCamera.ViewportSize
- if x + ToolTip.AbsoluteSize.X > viewSize.X then
- x = mousePos.X - ToolTip.AbsoluteSize.X - 10
- end
- if y + ToolTip.AbsoluteSize.Y > viewSize.Y - 50 then
- y = viewSize.Y - ToolTip.AbsoluteSize.Y - 50
- end
- ToolTip.Position = UDim2.new(0, x, 0, y)
- end)
- ToolTipText.Text = text
- scaleToolTip()
- ToolTip.Visible = true
- else
- ToolTip.Visible = false
- if connections["ToolTip"] then
- connections["ToolTip"]:Disconnect()
- end
- end
- end
- local function newButton(name, description, onClick)
- local FunctionTemplate = Create("Frame", {
- Name = "FunctionTemplate",
- Parent = ButtonsFrame,
- BackgroundColor3 = Color3.new(1, 1, 1),
- BackgroundTransparency = 1,
- Size = UDim2.new(0, 94, 0, 23)
- })
- local ColorBar = Create("Frame", {
- Name = "ColorBar",
- Parent = FunctionTemplate,
- BackgroundColor3 = Color3.fromRGB(255, 100, 150),
- BorderSizePixel = 0,
- Position = UDim2.new(0, 7, 0, 10),
- Size = UDim2.new(0, 5, 0, 16),
- ZIndex = 3
- })
- local Text = Create("TextLabel", {
- Name = "Text",
- Parent = FunctionTemplate,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 16, 0, 10),
- Size = UDim2.new(0, 72, 0, 16),
- Font = Enum.Font.SourceSans,
- Text = name,
- TextColor3 = Color3.new(1, 1, 1),
- TextSize = 12,
- TextXAlignment = Enum.TextXAlignment.Left,
- TextTruncate = Enum.TextTruncate.AtEnd
- })
- local Button = Create("TextButton", {
- Name = "Button",
- Parent = FunctionTemplate,
- BackgroundColor3 = Color3.new(0, 0, 0),
- BackgroundTransparency = 0.7,
- BorderSizePixel = 0,
- Position = UDim2.new(0, 7, 0, 10),
- Size = UDim2.new(0, 80, 0, 16),
- AutoButtonColor = false,
- Font = Enum.Font.SourceSans,
- Text = "",
- TextSize = 14
- })
- Button.MouseEnter:Connect(function()
- makeToolTip(true, type(description) == "function" and description() or description)
- end)
- Button.MouseLeave:Connect(function()
- makeToolTip(false)
- end)
- Button.MouseButton1Click:Connect(function()
- pcall(onClick, FunctionTemplate)
- end)
- updateButtonCanvas()
- end
- local function eventSelect(data)
- if selected and selected.Button then
- TweenService:Create(selected.Button, TweenInfo.new(0.3), {BackgroundColor3 = deselectedColor}):Play()
- end
- selected = data
- if selected and selected.Button then
- TweenService:Create(selected.Button, TweenInfo.new(0.3), {BackgroundColor3 = selectedColor}):Play()
- end
- if selected then
- selected.GenScript = selected.GenScript or generateScript(selected)
- setCode(selected.GenScript)
- end
- if sideClosed then
- sideClosed = false
- RightPanel.Visible = true
- TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.fromOffset(375, Background.AbsoluteSize.Y - 19)}):Play()
- TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(520, 19)}):Play()
- end
- end
- local function createGroupEntry(className, memberName, isHidden, isDeprecated, logType)
- local groupKey = className .. "." .. memberName .. "." .. logType
- if groupedLogs[groupKey] then return groupedLogs[groupKey] end
- if layoutOrderNum < 1 then layoutOrderNum = 999999999 end
- local group = {
- MemberName = memberName,
- ClassName = className,
- Logs = {},
- Expanded = false,
- CallCount = 0,
- IsHidden = isHidden,
- IsDeprecated = isDeprecated,
- LogType = logType
- }
- local color
- if logType == "Property" then
- color = isHidden and Color3.fromRGB(100, 200, 255) or Color3.fromRGB(100, 180, 255)
- elseif logType == "Function" then
- color = isHidden and Color3.fromRGB(255, 200, 100) or Color3.fromRGB(255, 220, 100)
- else
- color = isHidden and Color3.fromRGB(255, 150, 50) or (isDeprecated and Color3.fromRGB(180, 100, 255) or Color3.fromRGB(255, 100, 150))
- end
- local icon
- if logType == "Property" then
- icon = "◆"
- elseif logType == "Function" then
- icon = "ƒ"
- else
- icon = "⚡"
- end
- local GroupFrame = Create("Frame", {
- Parent = LogList,
- BackgroundTransparency = 1,
- Size = UDim2.new(1, -4, 0, 20),
- LayoutOrder = layoutOrderNum,
- ClipsDescendants = true
- })
- local GroupLayout = Create("UIListLayout", {
- Parent = GroupFrame,
- SortOrder = Enum.SortOrder.LayoutOrder,
- Padding = UDim.new(0, 1)
- })
- GroupLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
- GroupFrame.Size = UDim2.new(1, -4, 0, GroupLayout.AbsoluteContentSize.Y)
- task.defer(updateLogCanvas)
- end)
- local HeaderFrame = Create("Frame", {
- Parent = GroupFrame,
- BackgroundTransparency = 1,
- Size = UDim2.new(1, 0, 0, 20),
- LayoutOrder = -999999
- })
- local ExpandButton = Create("TextButton", {
- Parent = HeaderFrame,
- BackgroundTransparency = 1,
- Size = UDim2.new(0, 12, 0, 16),
- Position = UDim2.new(0, 0, 0, 2),
- Font = Enum.Font.SourceSansBold,
- Text = ">",
- TextColor3 = color,
- TextSize = 11
- })
- Create("TextLabel", {
- Parent = HeaderFrame,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 12, 0, 2),
- Size = UDim2.new(0, 10, 0, 16),
- Font = Enum.Font.SourceSans,
- Text = icon,
- TextColor3 = color,
- TextSize = 10
- })
- Create("Frame", {
- Parent = HeaderFrame,
- BackgroundColor3 = color,
- BorderSizePixel = 0,
- Position = UDim2.new(0, 22, 0, 2),
- Size = UDim2.new(0, 3, 0, 16)
- })
- local displayText = CONFIG.ShowClassName and (className .. "." .. memberName) or memberName
- local tags = {}
- if isHidden then table.insert(tags, "H") end
- if isDeprecated then table.insert(tags, "D") end
- if #tags > 0 then displayText = displayText .. "[" .. table.concat(tags) .. "]" end
- Create("TextLabel", {
- Parent = HeaderFrame,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 28, 0, 2),
- Size = UDim2.new(1, -50, 0, 16),
- Font = Enum.Font.SourceSans,
- Text = displayText,
- TextColor3 = color,
- TextSize = 10,
- TextXAlignment = Enum.TextXAlignment.Left,
- TextTruncate = Enum.TextTruncate.AtEnd
- })
- local CountLabel = Create("TextLabel", {
- Parent = HeaderFrame,
- BackgroundTransparency = 1,
- Position = UDim2.new(1, -20, 0, 2),
- Size = UDim2.new(0, 18, 0, 16),
- Font = Enum.Font.SourceSans,
- Text = "0",
- TextColor3 = Color3.fromRGB(150, 150, 150),
- TextSize = 10,
- TextXAlignment = Enum.TextXAlignment.Right
- })
- local HeaderButton = Create("TextButton", {
- Parent = HeaderFrame,
- BackgroundColor3 = Color3.new(0, 0, 0),
- BackgroundTransparency = 0.88,
- BorderSizePixel = 0,
- Size = UDim2.new(1, 0, 0, 16),
- Position = UDim2.new(0, 0, 0, 2),
- AutoButtonColor = false,
- Text = ""
- })
- group.Frame = GroupFrame
- group.CountLabel = CountLabel
- group.ExpandButton = ExpandButton
- local function toggleExpand()
- group.Expanded = not group.Expanded
- ExpandButton.Text = group.Expanded and "v" or ">"
- for _, logData in ipairs(group.Logs) do
- if logData.LogFrame then
- logData.LogFrame.Visible = group.Expanded
- end
- end
- task.defer(function()
- GroupFrame.Size = UDim2.new(1, -4, 0, GroupLayout.AbsoluteContentSize.Y)
- updateLogCanvas()
- end)
- end
- ExpandButton.MouseButton1Click:Connect(toggleExpand)
- HeaderButton.MouseButton2Click:Connect(toggleExpand)
- HeaderButton.MouseButton1Click:Connect(function()
- if #group.Logs > 0 then
- eventSelect(group.Logs[1])
- end
- end)
- groupedLogs[groupKey] = group
- layoutOrderNum = layoutOrderNum - 1
- updateLogCanvas()
- return group
- end
- local function newLog(data)
- local logType
- if data.Type == "PropertyChange" then
- logType = "Property"
- elseif data.Type == "Function" then
- logType = "Function"
- else
- logType = "Signal"
- end
- if currentTab == "Signals" and logType ~= "Signal" then return end
- if currentTab == "Props" and logType ~= "Property" then return end
- if currentTab == "Funcs" and logType ~= "Function" then return end
- local className = data.ClassName or "?"
- local memberName = data.PropertyName or data.SignalName or data.FunctionName
- local group = createGroupEntry(className, memberName, data.IsHidden, data.IsDeprecated, logType)
- group.CallCount = group.CallCount + 1
- group.CountLabel.Text = tostring(group.CallCount)
- data.CallCount = group.CallCount
- local color
- if logType == "Property" then
- color = data.IsHidden and Color3.fromRGB(100, 200, 255) or Color3.fromRGB(100, 180, 255)
- elseif logType == "Function" then
- color = data.IsHidden and Color3.fromRGB(255, 200, 100) or Color3.fromRGB(255, 220, 100)
- else
- color = data.IsHidden and Color3.fromRGB(255, 150, 50) or (data.IsDeprecated and Color3.fromRGB(180, 100, 255) or Color3.fromRGB(190, 190, 190))
- end
- local LogFrame = Create("Frame", {
- Parent = group.Frame,
- BackgroundTransparency = 1,
- Size = UDim2.new(1, 0, 0, 16),
- LayoutOrder = -group.CallCount,
- Visible = group.Expanded
- })
- Create("TextLabel", {
- Parent = LogFrame,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 5, 0, 0),
- Size = UDim2.new(0, 20, 1, 0),
- Font = Enum.Font.SourceSans,
- Text = "#" .. tostring(group.CallCount - 1),
- TextColor3 = Color3.fromRGB(150, 150, 150),
- TextSize = 9,
- TextXAlignment = Enum.TextXAlignment.Left
- })
- Create("TextLabel", {
- Parent = LogFrame,
- BackgroundTransparency = 1,
- Position = UDim2.new(0, 26, 0, 0),
- Size = UDim2.new(1, -28, 1, 0),
- Font = Enum.Font.SourceSans,
- Text = CONFIG.ShowClassName and (className .. "." .. memberName) or memberName,
- TextColor3 = color,
- TextSize = 10,
- TextXAlignment = Enum.TextXAlignment.Left,
- TextTruncate = Enum.TextTruncate.AtEnd
- })
- local LogButton = Create("TextButton", {
- Parent = LogFrame,
- BackgroundColor3 = Color3.new(0, 0, 0),
- BackgroundTransparency = 0.92,
- BorderSizePixel = 0,
- Size = UDim2.new(1, 0, 1, 0),
- AutoButtonColor = false,
- Text = ""
- })
- data.LogFrame = LogFrame
- data.Button = LogButton
- data.id = #logs + 1
- table.insert(group.Logs, 1, data)
- table.insert(logs, 1, data)
- LogButton.MouseButton1Click:Connect(function()
- eventSelect(data)
- end)
- if #logs > CONFIG.MaxLogs then
- local oldest = table.remove(logs)
- if oldest and oldest.LogFrame then
- oldest.LogFrame:Destroy()
- end
- end
- end
- local function logSignal(instance, signalName, signal, args, isHidden, isDeprecated, accessMethod, usedSetScriptable)
- if not CONFIG.Enabled then return end
- local ok, className = pcall(function() return instance.ClassName end)
- className = ok and className or "?"
- local key = className .. "." .. signalName .. "." .. tostring(instance)
- if blacklist[key] or blacklist[signalName] then return end
- if blocklist[key] or blocklist[signalName] then return end
- if isSpammy(key, SpamHistory, CONFIG.SpamThreshold, CONFIG.SpamTimeWindow) then return end
- newLog({
- Type = "Signal",
- SignalName = signalName,
- Instance = instance,
- Signal = signal,
- ClassName = className,
- Args = deepclone(args or {}),
- Timestamp = os.time(),
- IsHidden = isHidden,
- IsDeprecated = isDeprecated,
- AccessMethod = accessMethod,
- UsedSetScriptable = usedSetScriptable
- })
- end
- local function logPropertyChange(instance, propName, oldValue, newValue, isHidden, isReadOnly, isDeprecated, accessMethod, valueType)
- if not CONFIG.Enabled then return end
- if not getgenv().CaptureProperties then return end
- local ok, className = pcall(function() return instance.ClassName end)
- className = ok and className or "?"
- local key = className .. "." .. propName .. "." .. tostring(instance)
- if blacklist[key] or blacklist[propName] then return end
- if blocklist[key] or blocklist[propName] then return end
- if isSpammy(key, PropertySpamHistory, 3, 0.5) then return end
- newLog({
- Type = "PropertyChange",
- PropertyName = propName,
- Instance = instance,
- ClassName = className,
- OldValue = deepclone(oldValue),
- NewValue = deepclone(newValue),
- ValueType = valueType or typeof(newValue),
- Timestamp = os.time(),
- IsHidden = isHidden,
- IsReadOnly = isReadOnly,
- IsDeprecated = isDeprecated,
- AccessMethod = accessMethod
- })
- end
- local function logFunctionCall(instance, funcName, args, returnValue, isHidden, isDeprecated, callingScript)
- if not CONFIG.Enabled then return end
- if not getgenv().CaptureFunctions then return end
- local ok, className = pcall(function() return instance.ClassName end)
- className = ok and className or "?"
- local key = className .. "." .. funcName .. "." .. tostring(instance)
- if blacklist[key] or blacklist[funcName] then return end
- if blocklist[key] or blocklist[funcName] then return end
- if isSpammy(key, FunctionSpamHistory, CONFIG.SpamThreshold, CONFIG.SpamTimeWindow) then return end
- TotalFunctionCalls = TotalFunctionCalls + 1
- newLog({
- Type = "Function",
- FunctionName = funcName,
- Instance = instance,
- ClassName = className,
- Args = deepclone(args or {}),
- ReturnValue = deepclone(returnValue),
- Timestamp = os.time(),
- IsHidden = isHidden,
- IsDeprecated = isDeprecated,
- CallingScript = callingScript
- })
- end
- local function hookSignal(instance, signalName, isHidden, isDeprecated)
- local ok, className = pcall(function() return instance.ClassName end)
- className = ok and className or "Unknown"
- local key = className .. "." .. signalName .. "." .. tostring(instance)
- if HookedSignals[key] then return false end
- local signal, accessMethod, usedSetScriptable = getSignalFromInstance(instance, signalName, isHidden, isDeprecated)
- if not signal then return false end
- HookedSignals[key] = true
- TotalSignalHooks = TotalSignalHooks + 1
- if isHidden then HiddenSignalHooks = HiddenSignalHooks + 1 end
- local conn = signal:Connect(function(...)
- logSignal(instance, signalName, signal, {...}, isHidden, isDeprecated, accessMethod, usedSetScriptable)
- end)
- table.insert(connections, conn)
- return true
- end
- local function hookProperty(instance, propName, isHidden, isReadOnly, isDeprecated, valueType)
- if SPAM_PROPERTIES[propName] then return false end
- local ok, className = pcall(function() return instance.ClassName end)
- className = ok and className or "Unknown"
- local key = className .. "." .. propName .. "." .. tostring(instance)
- if HookedProperties[key] then return false end
- local signal = nil
- if isHidden and ExploitCapabilities.setscriptable then
- pcall(function()
- local was = isscriptable and isscriptable(instance, propName)
- if not was then setscriptable(instance, propName, true) end
- signal = instance:GetPropertyChangedSignal(propName)
- end)
- else
- local ok2
- ok2, signal = pcall(function() return instance:GetPropertyChangedSignal(propName) end)
- if not ok2 then signal = nil end
- end
- if not signal then return false end
- HookedProperties[key] = true
- TotalPropertyHooks = TotalPropertyHooks + 1
- if isHidden then HiddenPropertyHooks = HiddenPropertyHooks + 1 end
- local lastValue = nil
- pcall(function()
- local ok3, val = getPropertyValueSmart(instance, propName, isHidden)
- if ok3 then lastValue = val end
- end)
- local conn = signal:Connect(function()
- local ok4, newValue, method = getPropertyValueSmart(instance, propName, isHidden)
- if ok4 then
- logPropertyChange(instance, propName, lastValue, newValue, isHidden, isReadOnly, isDeprecated, method, valueType)
- lastValue = newValue
- end
- end)
- table.insert(connections, conn)
- return true
- end
- local function hookInstanceByClass(instance)
- for _, className in ipairs(getgenv().CaptureClasses or {}) do
- local ok, isClass = pcall(function() return instance:IsA(className) end)
- if ok and isClass then
- for _, e in ipairs(GetClassEvents(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated)) do
- pcall(function() hookSignal(instance, e.name, e.hidden, e.deprecated) end)
- end
- end
- end
- if getgenv().CaptureProperties then
- for _, className in ipairs(getgenv().PropertyClasses or {}) do
- local ok, isClass = pcall(function() return instance:IsA(className) end)
- if ok and isClass then
- for _, p in ipairs(GetClassProperties(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated, true)) do
- pcall(function() hookProperty(instance, p.name, p.hidden, p.readOnly, p.deprecated, p.valueType) end)
- end
- end
- end
- end
- end
- local function rehookAll()
- TotalSignalHooks = 0
- TotalPropertyHooks = 0
- HiddenSignalHooks = 0
- HiddenPropertyHooks = 0
- HookedSignals = {}
- HookedProperties = {}
- for _, conn in pairs(connections) do
- if typeof(conn) == "RBXScriptConnection" then
- pcall(function() conn:Disconnect() end)
- end
- end
- connections = {}
- StatusLabel.Text = "[Rehooking...]"
- StatusLabel.TextColor3 = Color3.fromRGB(255, 200, 100)
- task.spawn(function()
- task.wait(0.1)
- local count = 0
- for _, desc in ipairs(game:GetDescendants()) do
- count = count + 1
- if count % 400 == 0 then task.wait() end
- pcall(function() hookInstanceByClass(desc) end)
- end
- connections["DescAdded"] = game.DescendantAdded:Connect(function(desc)
- task.defer(function()
- pcall(function() hookInstanceByClass(desc) end)
- end)
- end)
- StatusLabel.Text = string.format("[S:%d/%dh P:%d/%dh F:%d]", TotalSignalHooks, HiddenSignalHooks, TotalPropertyHooks, HiddenPropertyHooks, TotalFunctionCalls)
- StatusLabel.TextColor3 = Color3.fromRGB(100, 255, 100)
- end)
- end
- local originalNamecall
- local namecallHooked = false
- local function setupFunctionSpy()
- if not ExploitCapabilities.hookmetamethod then return end
- if not ExploitCapabilities.getnamecallmethod then return end
- if namecallHooked then return end
- local trackedMethods = {}
- for _, className in ipairs(getgenv().FunctionClasses or {}) do
- local funcs = GetClassFunctions(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated)
- for _, f in ipairs(funcs) do
- trackedMethods[f.name] = {hidden = f.hidden, deprecated = f.deprecated}
- end
- end
- originalNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...)
- local method = getnamecallmethod()
- if getgenv().CaptureFunctions and method and trackedMethods[method] then
- if not CONFIG.LogCheckcaller or not checkcaller() then
- local args = {...}
- local callingScript = nil
- pcall(function()
- callingScript = getcallingscript()
- end)
- task.defer(function()
- local ok, returnVal = pcall(function()
- return originalNamecall(self, unpack(args))
- end)
- logFunctionCall(self, method, args, ok and returnVal or nil, trackedMethods[method].hidden, trackedMethods[method].deprecated, callingScript)
- end)
- end
- end
- return originalNamecall(self, ...)
- end))
- namecallHooked = true
- end
- local function shutdown()
- getgenv().SignalSpyExecuted = false
- for _, conn in pairs(connections) do
- if typeof(conn) == "RBXScriptConnection" then
- pcall(function() conn:Disconnect() end)
- end
- end
- if originalNamecall and namecallHooked then
- pcall(function()
- hookmetamethod(game, "__namecall", originalNamecall)
- end)
- end
- pcall(function() SignalSpy:Destroy() end)
- pcall(function() Storage:Destroy() end)
- UserInputService.MouseIconEnabled = true
- end
- TabSignals.MouseButton1Click:Connect(function()
- currentTab = "Signals"
- TabSignals.BackgroundTransparency = 0.3
- TabProperties.BackgroundTransparency = 0.7
- TabFunctions.BackgroundTransparency = 0.7
- end)
- TabProperties.MouseButton1Click:Connect(function()
- currentTab = "Props"
- TabSignals.BackgroundTransparency = 0.7
- TabProperties.BackgroundTransparency = 0.3
- TabFunctions.BackgroundTransparency = 0.7
- end)
- TabFunctions.MouseButton1Click:Connect(function()
- currentTab = "Funcs"
- TabSignals.BackgroundTransparency = 0.7
- TabProperties.BackgroundTransparency = 0.7
- TabFunctions.BackgroundTransparency = 0.3
- end)
- TitleButton.MouseButton1Click:Connect(function()
- CONFIG.Enabled = not CONFIG.Enabled
- TweenService:Create(TitleButton, TweenInfo.new(0.3), {TextColor3 = CONFIG.Enabled and Color3.fromRGB(100, 255, 100) or Color3.fromRGB(255, 100, 100)}):Play()
- end)
- CloseButton.MouseEnter:Connect(function()
- TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(255, 60, 60)}):Play()
- end)
- CloseButton.MouseLeave:Connect(function()
- TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(37, 36, 38)}):Play()
- end)
- CloseButton.MouseButton1Click:Connect(shutdown)
- MinimizeButton.MouseButton1Click:Connect(function()
- if mainClosing then return end
- mainClosing = true
- closed = not closed
- if closed then
- TweenService:Create(LeftPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 145, 0, 0)}):Play()
- TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 0)}):Play()
- else
- TweenService:Create(LeftPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 145, 0, 301)}):Play()
- if not sideClosed then
- TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 301)}):Play()
- end
- end
- task.delay(0.3, function() mainClosing = false end)
- end)
- MaximizeButton.MouseButton1Click:Connect(function()
- if sideClosing or closed then return end
- sideClosing = true
- sideClosed = not sideClosed
- if sideClosed then
- TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 0, 0, 301)}):Play()
- TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(145, 19)}):Play()
- else
- RightPanel.Visible = true
- TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 301)}):Play()
- TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(520, 19)}):Play()
- end
- task.delay(0.3, function() sideClosing = false end)
- end)
- TopBar.InputBegan:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- local mousePos = UserInputService:GetMouseLocation() - GuiInset
- local relativePos = mousePos - Background.AbsolutePosition
- if relativePos.X <= TopBar.AbsoluteSize.X - 60 and relativePos.X >= 0 and relativePos.Y <= 19 and relativePos.Y >= 0 then
- local dragStart = input.Position
- local startPos = Background.Position
- local dragConn
- dragConn = RunService.RenderStepped:Connect(function()
- local newPos = UserInputService:GetMouseLocation()
- local delta = newPos - Vector2.new(dragStart.X, dragStart.Y)
- Background.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
- end)
- local endConn
- endConn = UserInputService.InputEnded:Connect(function(endInput)
- if endInput == input then
- dragConn:Disconnect()
- endConn:Disconnect()
- end
- end)
- end
- end
- end)
- if Highlight then
- codebox = Highlight.new(CodeBox)
- local caps = {}
- for k, v in pairs(ExploitCapabilities) do
- if v then table.insert(caps, k) end
- end
- codebox:setRaw("SignalSpy+ v7\nCapabilities: " .. table.concat(caps, ", ") .. "\nUGCValidationService: " .. (ExploitCapabilities.ugcGetProperty and "YES" or "NO"))
- end
- getgenv().SignalSpyShutdown = shutdown
- newButton("Copy Code", function() return "Copy generated code" end, function()
- setclipboard(getCode())
- ToolTipText.Text = "Copied!"
- end)
- newButton("Refresh", function() return "Rehook all signals and properties" end, function()
- rehookAll()
- end)
- newButton("Clr Logs", function() return "Clear all logs" end, function()
- for _, g in pairs(groupedLogs) do
- if g.Frame then g.Frame:Destroy() end
- end
- groupedLogs = {}
- logs = {}
- selected = nil
- layoutOrderNum = 999999999
- TotalFunctionCalls = 0
- setCode("")
- updateLogCanvas()
- end)
- newButton("Props", function() return "Properties: " .. (getgenv().CaptureProperties and "ON" or "OFF") end, function()
- getgenv().CaptureProperties = not getgenv().CaptureProperties
- rehookAll()
- end)
- newButton("Funcs", function() return "Functions: " .. (getgenv().CaptureFunctions and "ON" or "OFF") end, function()
- getgenv().CaptureFunctions = not getgenv().CaptureFunctions
- if getgenv().CaptureFunctions and not namecallHooked then
- setupFunctionSpy()
- end
- end)
- newButton("Hidden", function() return "Hidden: " .. (getgenv().CaptureHidden and "ON" or "OFF") end, function()
- getgenv().CaptureHidden = not getgenv().CaptureHidden
- rehookAll()
- end)
- newButton("Fire", function() return "Fire selected signal" end, function()
- if selected and selected.Signal and ExploitCapabilities.firesignal then
- pcall(function()
- firesignal(selected.Signal, unpack(selected.Args or {}))
- end)
- ToolTipText.Text = "Fired!"
- else
- ToolTipText.Text = "N/A"
- end
- end)
- newButton("Exclude (i)", function() return "Exclude this instance" end, function()
- if selected then
- local key = selected.ClassName .. "." .. (selected.PropertyName or selected.SignalName or selected.FunctionName) .. "." .. tostring(selected.Instance)
- blacklist[key] = true
- ToolTipText.Text = "Excluded!"
- end
- end)
- newButton("Exclude (n)", function() return "Exclude by name" end, function()
- if selected then
- local name = selected.PropertyName or selected.SignalName or selected.FunctionName
- blacklist[name] = true
- ToolTipText.Text = "Excluded!"
- end
- end)
- newButton("Clr Blacklist", function() return "Clear exclusions" end, function()
- blacklist = {}
- ToolTipText.Text = "Cleared!"
- end)
- newButton("Stats", function() return "View statistics" end, function()
- local info = "STATISTICS\n\n"
- info = info .. "Signal Hooks: " .. TotalSignalHooks .. " (" .. HiddenSignalHooks .. " hidden)\n"
- info = info .. "Property Hooks: " .. TotalPropertyHooks .. " (" .. HiddenPropertyHooks .. " hidden)\n"
- info = info .. "Function Calls: " .. TotalFunctionCalls .. "\n\n"
- info = info .. "CAPABILITIES:\n"
- for k, v in pairs(ExploitCapabilities) do
- info = info .. " " .. k .. ": " .. (v and "YES" or "NO") .. "\n"
- end
- info = info .. "\nINTERESTING HIDDEN:\n"
- for _, p in ipairs(INTERESTING_HIDDEN) do
- info = info .. " " .. p .. "\n"
- end
- setCode(info)
- end)
- local guiParent = CoreGui
- if gethui then
- guiParent = gethui()
- elseif protect_gui then
- protect_gui(SignalSpy)
- end
- SignalSpy.Parent = guiParent
- task.spawn(function()
- StatusLabel.Text = "[Loading API...]"
- CachedAPIEvents, CachedAPIProperties, CachedAPIFunctions = FetchAPIData()
- local classCount = 0
- for _ in pairs(CachedAPIEvents) do classCount = classCount + 1 end
- if classCount == 0 then
- StatusLabel.Text = "[API FAIL]"
- StatusLabel.TextColor3 = Color3.fromRGB(255, 100, 100)
- return
- end
- task.wait(0.2)
- rehookAll()
- if getgenv().CaptureFunctions then
- setupFunctionSpy()
- end
- end)
- getgenv().SignalSpyExecuted = true
- getgenv().SignalSpy = {
- CONFIG = CONFIG,
- logs = logs,
- blacklist = blacklist,
- blocklist = blocklist,
- shutdown = shutdown,
- rehookAll = rehookAll,
- ExploitCapabilities = ExploitCapabilities,
- SPAM_PROPERTIES = SPAM_PROPERTIES,
- INTERESTING_HIDDEN = INTERESTING_HIDDEN,
- getPropertyValueSmart = getPropertyValueSmart,
- ugcGetProperty = ugcGetProperty,
- setupFunctionSpy = setupFunctionSpy,
- newButton = newButton,
- }
Advertisement
Add Comment
Please, Sign In to add comment