Dark_Agent

SignalSpy Tool 03

Jan 12th, 2026
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 70.24 KB | Cybersecurity | 0 0
  1. if getgenv().SignalSpyExecuted and type(getgenv().SignalSpyShutdown) == "function" then
  2.     getgenv().SignalSpyShutdown()
  3.     task.wait(0.3)
  4. end
  5.  
  6. if not game:IsLoaded() then game.Loaded:Wait() end
  7.  
  8. local function missing(t, f, fallback)
  9.     if type(f) == t then return f end
  10.     return fallback
  11. end
  12.  
  13. cloneref = missing("function", cloneref, function(...) return ... end)
  14. newcclosure = missing("function", newcclosure, function(f) return f end)
  15. checkcaller = missing("function", checkcaller, function() return false end)
  16. getconnections = missing("function", getconnections or get_signal_cons)
  17. firesignal = missing("function", firesignal or fire_signal)
  18. replicatesignal = missing("function", replicatesignal)
  19. getnilinstances = missing("function", getnilinstances or get_nil_instances, function() return {} end)
  20. gethui = missing("function", gethui or get_hidden_gui)
  21. protect_gui = missing("function", protect_gui or (syn and syn.protect_gui))
  22. gethiddenproperty = missing("function", gethiddenproperty or get_hidden_property)
  23. sethiddenproperty = missing("function", sethiddenproperty or set_hidden_property)
  24. isscriptable = missing("function", isscriptable or is_scriptable)
  25. setscriptable = missing("function", setscriptable or set_scriptable)
  26. getrawmetatable = missing("function", getrawmetatable)
  27. setreadonly = missing("function", setreadonly)
  28. isreadonly = missing("function", isreadonly)
  29. hookmetamethod = missing("function", hookmetamethod)
  30. hookfunction = missing("function", hookfunction or replaceclosure or hookfunc)
  31. getnamecallmethod = missing("function", getnamecallmethod)
  32. getcallingscript = missing("function", getcallingscript, function() return nil end)
  33. getinfo = missing("function", getinfo or debug.getinfo, function() return {} end)
  34. iscclosure = missing("function", iscclosure, function() return false end)
  35. islclosure = missing("function", islclosure or is_l_closure, function() return true end)
  36. getupvalues = missing("function", getupvalues or debug.getupvalues, function() return {} end)
  37. getconstants = missing("function", getconstants or debug.getconstants, function() return {} end)
  38. isfile = missing("function", isfile, function() return false end)
  39. readfile = missing("function", readfile, function() return "" end)
  40. writefile = missing("function", writefile)
  41. makefolder = missing("function", makefolder)
  42.  
  43. local setclipboard = missing("function", setclipboard or toclipboard or set_clipboard, function() end)
  44.  
  45. local lower = string.lower
  46. local byte = string.byte
  47. local running = coroutine.running
  48. local resume = coroutine.resume
  49. local status = coroutine.status
  50. local yield = coroutine.yield
  51. local create = coroutine.create
  52.  
  53. local function Create(instance, properties, children)
  54.     local obj = Instance.new(instance)
  55.     for i, v in next, properties or {} do
  56.         obj[i] = v
  57.     end
  58.     for _, child in next, children or {} do
  59.         child.Parent = obj
  60.     end
  61.     return obj
  62. end
  63.  
  64. local Services = setmetatable({}, {
  65.     __index = function(self, name)
  66.         local ok, svc = pcall(function()
  67.             return cloneref(game:GetService(name))
  68.         end)
  69.         if ok and svc then
  70.             rawset(self, name, svc)
  71.             return svc
  72.         end
  73.         return nil
  74.     end
  75. })
  76.  
  77. local Players = Services.Players
  78. local HttpService = Services.HttpService
  79. local TweenService = Services.TweenService
  80. local UserInputService = Services.UserInputService
  81. local RunService = Services.RunService
  82. local CoreGui = Services.CoreGui
  83. local TextService = Services.TextService
  84. local GuiService = Services.GuiService
  85. local UGCValidationService = Services.UGCValidationService
  86.  
  87. local LocalPlayer = Players and Players.LocalPlayer
  88. local GuiInset = GuiService:GetGuiInset()
  89.  
  90. local function ugcGetProperty(instance, property)
  91.     if not UGCValidationService then return false, nil end
  92.     local ok, result = pcall(function()
  93.         return UGCValidationService:GetPropertyValue(instance, property)
  94.     end)
  95.     return ok, result
  96. end
  97.  
  98. getgenv().gethiddenpropertyy = newcclosure(function(inst, prop)
  99.     if type(gethiddenproperty) == "function" then
  100.         local ok, result = pcall(gethiddenproperty, inst, prop)
  101.         if ok then return result end
  102.     end
  103.     if type(setscriptable) == "function" then
  104.         local ok = pcall(function()
  105.             local was = isscriptable and isscriptable(inst, prop)
  106.             if not was then setscriptable(inst, prop, true) end
  107.         end)
  108.         if ok then
  109.             local ok2, val = pcall(function() return inst[prop] end)
  110.             if ok2 then return val end
  111.         end
  112.     end
  113.     local ok, result = ugcGetProperty(inst, prop)
  114.     if ok then return result end
  115.     return nil
  116. end)
  117.  
  118. local ExploitCapabilities = {
  119.     setscriptable = type(setscriptable) == "function",
  120.     isscriptable = type(isscriptable) == "function",
  121.     gethiddenproperty = type(gethiddenproperty) == "function",
  122.     sethiddenproperty = type(sethiddenproperty) == "function",
  123.     ugcGetProperty = UGCValidationService ~= nil,
  124.     getrawmetatable = type(getrawmetatable) == "function",
  125.     setreadonly = type(setreadonly) == "function",
  126.     replicatesignal = type(replicatesignal) == "function",
  127.     firesignal = type(firesignal) == "function",
  128.     getconnections = type(getconnections) == "function",
  129.     hookmetamethod = type(hookmetamethod) == "function",
  130.     hookfunction = type(hookfunction) == "function",
  131.     checkcaller = type(checkcaller) == "function",
  132.     getnamecallmethod = type(getnamecallmethod) == "function",
  133. }
  134.  
  135. local Highlight
  136. pcall(function()
  137.     Highlight = loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/SimpleSpyV3/highlight.lua"))()
  138. end)
  139.  
  140. local LazyFix
  141. pcall(function()
  142.     LazyFix = loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/refs/heads/main/SimpleSpyV3/DataToCode.lua"))()
  143. end)
  144.  
  145. local SPAM_PROPERTIES = {
  146.     Position = true,
  147.     CFrame = true,
  148.     Rotation = true,
  149.     Orientation = true,
  150.     Velocity = true,
  151.     RotVelocity = true,
  152.     AssemblyLinearVelocity = true,
  153.     AssemblyAngularVelocity = true,
  154.     AssemblyCenterOfMass = true,
  155.     CenterOfMass = true,
  156.     LocalTransparencyModifier = true,
  157.     ReceiveAge = true,
  158.     ExtentsCFrame = true,
  159.     Focus = true,
  160.     CoordinateFrame = true,
  161.     MoveDirection = true,
  162.     WalkToPoint = true,
  163.     DistributedGameTime = true,
  164.     FloorMaterial = true,
  165.     TargetPoint = true,
  166.     Origin = true,
  167. }
  168.  
  169. local INTERESTING_HIDDEN = {
  170.     "ReplicationPV",
  171.     "NetworkOwnerV3",
  172.     "PhysicsRepRootPart",
  173.     "NetworkIsSleeping",
  174.     "NetworkOwnershipRule",
  175.     "LocalSimulationValidation",
  176.     "Attributes",
  177.     "AttributesReplicate",
  178.     "RobloxLocked",
  179.     "SourceAssetId",
  180.     "UniqueId",
  181. }
  182.  
  183. local selectedColor = Color3.fromRGB(92, 126, 229)
  184. local deselectedColor = Color3.fromRGB(0, 0, 0)
  185. local layoutOrderNum = 999999999
  186.  
  187. local logs = {}
  188. local groupedLogs = {}
  189. local selected = nil
  190. local blacklist = {}
  191. local blocklist = {}
  192. local connections = {}
  193. local HookedSignals = {}
  194. local HookedProperties = {}
  195. local SpamHistory = {}
  196. local PropertySpamHistory = {}
  197. local FunctionSpamHistory = {}
  198. local CachedAPIEvents = {}
  199. local CachedAPIProperties = {}
  200. local CachedAPIFunctions = {}
  201.  
  202. local TotalSignalHooks = 0
  203. local TotalPropertyHooks = 0
  204. local TotalFunctionCalls = 0
  205. local HiddenSignalHooks = 0
  206. local HiddenPropertyHooks = 0
  207.  
  208. local closed = false
  209. local sideClosed = false
  210. local mainClosing = false
  211. local sideClosing = false
  212. local maximized = false
  213. local toggle = true
  214. local mouseInGui = false
  215. local currentTab = "Signals"
  216.  
  217. local codebox
  218. local remotesFadeIn
  219. local rightFadeIn
  220.  
  221. getgenv().CaptureClasses = getgenv().CaptureClasses or {"Humanoid", "Tool", "ClickDetector", "ProximityPrompt", "Player"}
  222. getgenv().CaptureHidden = getgenv().CaptureHidden or false
  223. getgenv().CaptureDeprecated = getgenv().CaptureDeprecated or false
  224. getgenv().CaptureProperties = getgenv().CaptureProperties or false
  225. getgenv().CaptureFunctions = getgenv().CaptureFunctions or false
  226. getgenv().PropertyClasses = getgenv().PropertyClasses or {"Humanoid", "Tool"}
  227. getgenv().FunctionClasses = getgenv().FunctionClasses or {"Humanoid", "Tool", "ClickDetector", "ProximityPrompt"}
  228.  
  229. local CONFIG = {
  230.     Enabled = true,
  231.     FilterSpammy = true,
  232.     SpamThreshold = 5,
  233.     SpamTimeWindow = 1,
  234.     MaxLogs = 500,
  235.     ShowClassName = true,
  236.     LogCheckcaller = false,
  237.     FuncInfoEnabled = true,
  238.     AutoBlock = false,
  239. }
  240.  
  241. local function randomString()
  242.     local arr = {}
  243.     for i = 1, math.random(10, 20) do
  244.         arr[i] = string.char(math.random(65, 90))
  245.     end
  246.     return table.concat(arr)
  247. end
  248.  
  249. local SignalSpy = Create("ScreenGui", {
  250.     ResetOnSpawn = false,
  251.     Name = randomString(),
  252.     ZIndexBehavior = Enum.ZIndexBehavior.Sibling
  253. })
  254.  
  255. local Storage = Create("Folder", {})
  256.  
  257. local Background = Create("Frame", {
  258.     Parent = SignalSpy,
  259.     BackgroundColor3 = Color3.new(1, 1, 1),
  260.     BackgroundTransparency = 1,
  261.     Position = UDim2.new(0, 500, 0, 200),
  262.     Size = UDim2.new(0, 520, 0, 320)
  263. })
  264.  
  265. local TopBar = Create("Frame", {
  266.     Parent = Background,
  267.     BackgroundColor3 = Color3.fromRGB(37, 35, 38),
  268.     BorderSizePixel = 0,
  269.     Size = UDim2.new(0, 520, 0, 19),
  270.     ZIndex = 2
  271. })
  272.  
  273. local LeftPanel = Create("Frame", {
  274.     Parent = Background,
  275.     BackgroundColor3 = Color3.fromRGB(53, 52, 55),
  276.     BorderSizePixel = 0,
  277.     Position = UDim2.new(0, 0, 0, 19),
  278.     Size = UDim2.new(0, 145, 0, 301),
  279.     ClipsDescendants = true
  280. })
  281.  
  282. local TabFrame = Create("Frame", {
  283.     Parent = LeftPanel,
  284.     BackgroundColor3 = Color3.fromRGB(37, 36, 38),
  285.     BorderSizePixel = 0,
  286.     Position = UDim2.new(0, 3, 0, 3),
  287.     Size = UDim2.new(1, -6, 0, 22)
  288. })
  289.  
  290. Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = TabFrame})
  291.  
  292. local TabSignals = Create("TextButton", {
  293.     Parent = TabFrame,
  294.     BackgroundColor3 = Color3.fromRGB(255, 100, 150),
  295.     BackgroundTransparency = 0.3,
  296.     BorderSizePixel = 0,
  297.     Position = UDim2.new(0, 2, 0, 2),
  298.     Size = UDim2.new(0.33, -2, 0, 18),
  299.     Font = Enum.Font.SourceSansBold,
  300.     Text = "Signals",
  301.     TextColor3 = Color3.new(1, 1, 1),
  302.     TextSize = 10,
  303.     AutoButtonColor = false
  304. })
  305. Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabSignals})
  306.  
  307. local TabProperties = Create("TextButton", {
  308.     Parent = TabFrame,
  309.     BackgroundColor3 = Color3.fromRGB(100, 180, 255),
  310.     BackgroundTransparency = 0.7,
  311.     BorderSizePixel = 0,
  312.     Position = UDim2.new(0.33, 1, 0, 2),
  313.     Size = UDim2.new(0.33, -2, 0, 18),
  314.     Font = Enum.Font.SourceSansBold,
  315.     Text = "Props",
  316.     TextColor3 = Color3.new(1, 1, 1),
  317.     TextSize = 10,
  318.     AutoButtonColor = false
  319. })
  320. Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabProperties})
  321.  
  322. local TabFunctions = Create("TextButton", {
  323.     Parent = TabFrame,
  324.     BackgroundColor3 = Color3.fromRGB(255, 220, 100),
  325.     BackgroundTransparency = 0.7,
  326.     BorderSizePixel = 0,
  327.     Position = UDim2.new(0.66, 1, 0, 2),
  328.     Size = UDim2.new(0.34, -3, 0, 18),
  329.     Font = Enum.Font.SourceSansBold,
  330.     Text = "Funcs",
  331.     TextColor3 = Color3.fromRGB(30, 30, 30),
  332.     TextSize = 10,
  333.     AutoButtonColor = false
  334. })
  335. Create("UICorner", {CornerRadius = UDim.new(0, 3), Parent = TabFunctions})
  336.  
  337. local LogList = Create("ScrollingFrame", {
  338.     Parent = LeftPanel,
  339.     Active = true,
  340.     BackgroundColor3 = Color3.new(1, 1, 1),
  341.     BackgroundTransparency = 1,
  342.     BorderSizePixel = 0,
  343.     Position = UDim2.new(0, 0, 0, 28),
  344.     Size = UDim2.new(1, 0, 1, -32),
  345.     CanvasSize = UDim2.new(0, 0, 0, 0),
  346.     ScrollBarThickness = 4,
  347.     ScrollBarImageColor3 = Color3.fromRGB(255, 100, 150)
  348. })
  349.  
  350. local UIListLayout = Create("UIListLayout", {
  351.     Parent = LogList,
  352.     HorizontalAlignment = Enum.HorizontalAlignment.Center,
  353.     SortOrder = Enum.SortOrder.LayoutOrder,
  354.     Padding = UDim.new(0, 1)
  355. })
  356.  
  357. local RightPanel = Create("Frame", {
  358.     Parent = Background,
  359.     BackgroundColor3 = Color3.fromRGB(37, 36, 38),
  360.     BorderSizePixel = 0,
  361.     Position = UDim2.new(0, 145, 0, 19),
  362.     Size = UDim2.new(0, 375, 0, 301),
  363.     ClipsDescendants = true
  364. })
  365.  
  366. local CodeBox = Create("Frame", {
  367.     Parent = RightPanel,
  368.     BackgroundColor3 = Color3.fromRGB(21, 19, 20),
  369.     BorderSizePixel = 0,
  370.     Size = UDim2.new(1, 0, 0.5, 0)
  371. })
  372.  
  373. local ButtonsFrame = Create("ScrollingFrame", {
  374.     Parent = RightPanel,
  375.     Active = true,
  376.     BackgroundColor3 = Color3.new(1, 1, 1),
  377.     BackgroundTransparency = 1,
  378.     Position = UDim2.new(0, 0, 0.5, 0),
  379.     Size = UDim2.new(1, 0, 0.5, -9),
  380.     CanvasSize = UDim2.new(0, 0, 0, 0),
  381.     ScrollBarThickness = 4,
  382.     ScrollBarImageColor3 = Color3.fromRGB(255, 100, 150)
  383. })
  384.  
  385. local UIGridLayout = Create("UIGridLayout", {
  386.     Parent = ButtonsFrame,
  387.     HorizontalAlignment = Enum.HorizontalAlignment.Center,
  388.     SortOrder = Enum.SortOrder.LayoutOrder,
  389.     CellPadding = UDim2.new(0, 0, 0, 0),
  390.     CellSize = UDim2.new(0, 94, 0, 27)
  391. })
  392.  
  393. local TitleButton = Create("TextButton", {
  394.     Parent = TopBar,
  395.     BackgroundColor3 = Color3.new(1, 1, 1),
  396.     AutoButtonColor = false,
  397.     BackgroundTransparency = 1,
  398.     Position = UDim2.new(0, 5, 0, 0),
  399.     Size = UDim2.new(0, 80, 0, 18),
  400.     Font = Enum.Font.SourceSansBold,
  401.     Text = "SignalSpy+",
  402.     TextColor3 = Color3.fromRGB(100, 255, 100),
  403.     TextSize = 13,
  404.     TextXAlignment = Enum.TextXAlignment.Left,
  405.     ZIndex = 2
  406. })
  407.  
  408. local StatusLabel = Create("TextLabel", {
  409.     Parent = TopBar,
  410.     BackgroundTransparency = 1,
  411.     Position = UDim2.new(0, 88, 0, 0),
  412.     Size = UDim2.new(0, 250, 0, 18),
  413.     Font = Enum.Font.SourceSans,
  414.     Text = "[Loading...]",
  415.     TextColor3 = Color3.fromRGB(150, 150, 150),
  416.     TextSize = 10,
  417.     TextXAlignment = Enum.TextXAlignment.Left,
  418.     ZIndex = 2
  419. })
  420.  
  421. local CloseButton = Create("TextButton", {
  422.     Parent = TopBar,
  423.     BackgroundColor3 = Color3.fromRGB(37, 36, 38),
  424.     BorderSizePixel = 0,
  425.     Position = UDim2.new(1, -19, 0, 0),
  426.     Size = UDim2.new(0, 19, 0, 19),
  427.     Font = Enum.Font.SourceSans,
  428.     Text = "",
  429.     TextColor3 = Color3.new(0, 0, 0),
  430.     TextSize = 14,
  431.     ZIndex = 2
  432. })
  433.  
  434. Create("ImageLabel", {
  435.     Parent = CloseButton,
  436.     BackgroundTransparency = 1,
  437.     Position = UDim2.new(0, 5, 0, 5),
  438.     Size = UDim2.new(0, 9, 0, 9),
  439.     Image = "rbxassetid://5597086202",
  440.     ZIndex = 2
  441. })
  442.  
  443. local MaximizeButton = Create("TextButton", {
  444.     Parent = TopBar,
  445.     BackgroundColor3 = Color3.fromRGB(37, 36, 38),
  446.     BorderSizePixel = 0,
  447.     Position = UDim2.new(1, -38, 0, 0),
  448.     Size = UDim2.new(0, 19, 0, 19),
  449.     Font = Enum.Font.SourceSans,
  450.     Text = "",
  451.     ZIndex = 2
  452. })
  453.  
  454. Create("ImageLabel", {
  455.     Parent = MaximizeButton,
  456.     BackgroundTransparency = 1,
  457.     Position = UDim2.new(0, 5, 0, 5),
  458.     Size = UDim2.new(0, 9, 0, 9),
  459.     Image = "rbxassetid://5597108117",
  460.     ZIndex = 2
  461. })
  462.  
  463. local MinimizeButton = Create("TextButton", {
  464.     Parent = TopBar,
  465.     BackgroundColor3 = Color3.fromRGB(37, 36, 38),
  466.     BorderSizePixel = 0,
  467.     Position = UDim2.new(1, -57, 0, 0),
  468.     Size = UDim2.new(0, 19, 0, 19),
  469.     Font = Enum.Font.SourceSans,
  470.     Text = "",
  471.     ZIndex = 2
  472. })
  473.  
  474. Create("ImageLabel", {
  475.     Parent = MinimizeButton,
  476.     BackgroundTransparency = 1,
  477.     Position = UDim2.new(0, 5, 0, 5),
  478.     Size = UDim2.new(0, 9, 0, 9),
  479.     Image = "rbxassetid://5597105827",
  480.     ZIndex = 2
  481. })
  482.  
  483. local ToolTip = Create("Frame", {
  484.     Parent = SignalSpy,
  485.     BackgroundColor3 = Color3.fromRGB(26, 26, 26),
  486.     BackgroundTransparency = 0.1,
  487.     BorderColor3 = Color3.new(1, 1, 1),
  488.     Size = UDim2.new(0, 200, 0, 50),
  489.     ZIndex = 100,
  490.     Visible = false
  491. })
  492.  
  493. local ToolTipText = Create("TextLabel", {
  494.     Parent = ToolTip,
  495.     BackgroundTransparency = 1,
  496.     Position = UDim2.new(0, 4, 0, 4),
  497.     Size = UDim2.new(1, -8, 1, -8),
  498.     ZIndex = 100,
  499.     Font = Enum.Font.SourceSans,
  500.     Text = "",
  501.     TextColor3 = Color3.new(1, 1, 1),
  502.     TextSize = 12,
  503.     TextWrapped = true,
  504.     TextXAlignment = Enum.TextXAlignment.Left,
  505.     TextYAlignment = Enum.TextYAlignment.Top
  506. })
  507.  
  508. local function deepclone(args, copies)
  509.     local copy = nil
  510.     copies = copies or {}
  511.     if type(args) == "table" then
  512.         if copies[args] then
  513.             copy = copies[args]
  514.         else
  515.             copy = {}
  516.             copies[args] = copy
  517.             for i, v in next, args do
  518.                 copy[deepclone(i, copies)] = deepclone(v, copies)
  519.             end
  520.         end
  521.     elseif typeof(args) == "Instance" then
  522.         local ok, c = pcall(cloneref, args)
  523.         copy = ok and c or args
  524.     else
  525.         copy = args
  526.     end
  527.     return copy
  528. end
  529.  
  530. local function getPlayerFromInstance(instance)
  531.     for _, v in next, Players:GetPlayers() do
  532.         if v.Character and (instance:IsDescendantOf(v.Character) or instance == v.Character) then
  533.             return v
  534.         end
  535.     end
  536.     return nil
  537. end
  538.  
  539. local function instanceToPath(inst)
  540.     if not inst then return "nil" end
  541.     if inst == game then return "game" end
  542.     if inst == workspace then return "workspace" end
  543.     if inst == LocalPlayer then return 'game:GetService("Players").LocalPlayer' end
  544.  
  545.     local player = getPlayerFromInstance(inst)
  546.     local parts = {}
  547.     local current = inst
  548.  
  549.     if player then
  550.         while current and current ~= player.Character do
  551.             if current.Name:match("^[%a_][%w_]*$") then
  552.                 table.insert(parts, 1, "." .. current.Name)
  553.             else
  554.                 table.insert(parts, 1, ':FindFirstChild("' .. current.Name .. '")')
  555.             end
  556.             current = current.Parent
  557.         end
  558.         if player == LocalPlayer then
  559.             return 'game:GetService("Players").LocalPlayer.Character' .. table.concat(parts)
  560.         else
  561.             return 'game:GetService("Players"):FindFirstChild("' .. player.Name .. '").Character' .. table.concat(parts)
  562.         end
  563.     end
  564.  
  565.     local ok, result = pcall(function()
  566.         while current and current.Parent ~= game do
  567.             if not current.Parent then
  568.                 return 'getNil("' .. inst.Name .. '", "' .. inst.ClassName .. '")'
  569.             end
  570.             if current.Name:match("^[%a_][%w_]*$") then
  571.                 table.insert(parts, 1, "." .. current.Name)
  572.             else
  573.                 table.insert(parts, 1, ':FindFirstChild("' .. current.Name .. '")')
  574.             end
  575.             current = current.Parent
  576.         end
  577.         if current and current.Parent == game then
  578.             local svc = current.ClassName
  579.             if pcall(function() return game:GetService(svc) end) then
  580.                 return 'game:GetService("' .. svc .. '")' .. table.concat(parts)
  581.             end
  582.             return "game." .. current.Name .. table.concat(parts)
  583.         end
  584.         return "game"
  585.     end)
  586.  
  587.     return ok and result or tostring(inst)
  588. end
  589.  
  590. local function deepSerialize(val, depth)
  591.     depth = depth or 0
  592.     if depth > 4 then return "..." end
  593.  
  594.     if LazyFix then
  595.         local ok, result = pcall(function()
  596.             return LazyFix.Convert(val, true)
  597.         end)
  598.         if ok and result then return result end
  599.     end
  600.  
  601.     local t = typeof(val)
  602.     local spacing = string.rep("    ", depth)
  603.     local nextSpacing = string.rep("    ", depth + 1)
  604.  
  605.     if t == "nil" then
  606.         return "nil"
  607.     elseif t == "string" then
  608.         local str = val
  609.         if #str > 150 then str = str:sub(1, 150) .. "..." end
  610.         return string.format("%q", str)
  611.     elseif t == "number" then
  612.         if val == math.huge then return "math.huge" end
  613.         if val == -math.huge then return "-math.huge" end
  614.         if val ~= val then return "0/0" end
  615.         return tostring(val)
  616.     elseif t == "boolean" then
  617.         return tostring(val)
  618.     elseif t == "Instance" then
  619.         return instanceToPath(val)
  620.     elseif t == "Vector3" then
  621.         return string.format("Vector3.new(%s, %s, %s)", val.X, val.Y, val.Z)
  622.     elseif t == "Vector2" then
  623.         return string.format("Vector2.new(%s, %s)", val.X, val.Y)
  624.     elseif t == "CFrame" then
  625.         return string.format("CFrame.new(%s)", table.concat({val:GetComponents()}, ", "))
  626.     elseif t == "Color3" then
  627.         return string.format("Color3.new(%s, %s, %s)", val.R, val.G, val.B)
  628.     elseif t == "BrickColor" then
  629.         return string.format('BrickColor.new("%s")', tostring(val))
  630.     elseif t == "UDim2" then
  631.         return string.format("UDim2.new(%s, %s, %s, %s)", val.X.Scale, val.X.Offset, val.Y.Scale, val.Y.Offset)
  632.     elseif t == "UDim" then
  633.         return string.format("UDim.new(%s, %s)", val.Scale, val.Offset)
  634.     elseif t == "EnumItem" then
  635.         return tostring(val)
  636.     elseif t == "Enum" then
  637.         return tostring(val)
  638.     elseif t == "Ray" then
  639.         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)
  640.     elseif t == "function" then
  641.         return "function() end"
  642.     elseif t == "table" then
  643.         local parts = {}
  644.         local count = 0
  645.         for k, v in pairs(val) do
  646.             count = count + 1
  647.             if count > 15 then
  648.                 table.insert(parts, nextSpacing .. "...")
  649.                 break
  650.             end
  651.             local ks
  652.             if type(k) == "string" and k:match("^[%a_][%w_]*$") then
  653.                 ks = k
  654.             else
  655.                 ks = "[" .. deepSerialize(k, depth + 1) .. "]"
  656.             end
  657.             table.insert(parts, nextSpacing .. ks .. " = " .. deepSerialize(v, depth + 1))
  658.         end
  659.         if #parts == 0 then
  660.             return "{}"
  661.         end
  662.         return "{\n" .. table.concat(parts, ",\n") .. "\n" .. spacing .. "}"
  663.     else
  664.         return "<" .. t .. ">"
  665.     end
  666. end
  667.  
  668. local function getPropertyValueSmart(instance, propName, isHidden)
  669.     if not isHidden then
  670.         local ok, val = pcall(function() return instance[propName] end)
  671.         if ok then return true, val, "direct" end
  672.     end
  673.  
  674.     if isHidden and ExploitCapabilities.setscriptable then
  675.         local wasScriptable = nil
  676.         pcall(function()
  677.             wasScriptable = isscriptable and isscriptable(instance, propName)
  678.             if not wasScriptable then
  679.                 setscriptable(instance, propName, true)
  680.             end
  681.         end)
  682.         local ok, val = pcall(function() return instance[propName] end)
  683.         if ok then return true, val, "setscriptable" end
  684.     end
  685.  
  686.     if isHidden and ExploitCapabilities.gethiddenproperty then
  687.         local ok, val = pcall(function() return gethiddenproperty(instance, propName) end)
  688.         if ok then return true, val, "gethiddenproperty" end
  689.     end
  690.  
  691.     if isHidden and ExploitCapabilities.ugcGetProperty then
  692.         local ok, val = ugcGetProperty(instance, propName)
  693.         if ok then return true, val, "UGCValidationService" end
  694.     end
  695.  
  696.     if isHidden and ExploitCapabilities.getrawmetatable then
  697.         local ok, mt = pcall(function() return getrawmetatable(instance) end)
  698.         if ok and mt then
  699.             local oldRO
  700.             if setreadonly then
  701.                 pcall(function()
  702.                     oldRO = isreadonly and isreadonly(mt)
  703.                     setreadonly(mt, false)
  704.                 end)
  705.             end
  706.             local ok2, val = pcall(function()
  707.                 local idx = rawget(mt, "__index")
  708.                 if type(idx) == "function" then
  709.                     return idx(instance, propName)
  710.                 elseif type(idx) == "table" then
  711.                     return rawget(idx, propName)
  712.                 end
  713.             end)
  714.             if setreadonly and oldRO then
  715.                 pcall(function() setreadonly(mt, true) end)
  716.             end
  717.             if ok2 then return true, val, "rawmetatable" end
  718.         end
  719.     end
  720.  
  721.     local ok, val = pcall(function() return instance[propName] end)
  722.     if ok then return true, val, "direct_fallback" end
  723.  
  724.     return false, nil, "failed"
  725. end
  726.  
  727. local function getSignalFromInstance(instance, signalName, isHidden, isDeprecated)
  728.     if (isHidden or isDeprecated) and ExploitCapabilities.setscriptable then
  729.         local wasScriptable = nil
  730.         pcall(function()
  731.             wasScriptable = isscriptable and isscriptable(instance, signalName)
  732.             if not wasScriptable then
  733.                 setscriptable(instance, signalName, true)
  734.             end
  735.         end)
  736.         local ok, sig = pcall(function() return instance[signalName] end)
  737.         if ok and sig and typeof(sig) == "RBXScriptSignal" then
  738.             return sig, "setscriptable", wasScriptable == false
  739.         end
  740.     end
  741.  
  742.     local ok, result = pcall(function() return instance[signalName] end)
  743.     if ok and result and typeof(result) == "RBXScriptSignal" then
  744.         return result, "direct", false
  745.     end
  746.  
  747.     if isHidden and ExploitCapabilities.gethiddenproperty then
  748.         local ok2, result2 = pcall(function() return gethiddenproperty(instance, signalName) end)
  749.         if ok2 and result2 and typeof(result2) == "RBXScriptSignal" then
  750.             return result2, "gethiddenproperty", false
  751.         end
  752.     end
  753.  
  754.     return nil, "failed", false
  755. end
  756.  
  757. local function FetchAPIData()
  758.     local ok, response = pcall(function()
  759.         return game:HttpGet("https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/refs/heads/roblox/Full-API-Dump.json")
  760.     end)
  761.     if not ok or not response then return {}, {}, {} end
  762.  
  763.     local success, apiData = pcall(function()
  764.         return HttpService:JSONDecode(response)
  765.     end)
  766.     if not success or not apiData or not apiData.Classes then return {}, {}, {} end
  767.  
  768.     local events = {}
  769.     local properties = {}
  770.     local functions = {}
  771.  
  772.     for _, class in ipairs(apiData.Classes) do
  773.         if type(class.Name) == "string" then
  774.             events[class.Name] = {
  775.                 Superclass = class.Superclass,
  776.                 Events = {},
  777.                 HiddenEvents = {},
  778.                 DeprecatedEvents = {}
  779.             }
  780.             properties[class.Name] = {
  781.                 Superclass = class.Superclass,
  782.                 Properties = {},
  783.                 HiddenProperties = {},
  784.                 ReadOnlyProperties = {},
  785.                 DeprecatedProperties = {}
  786.             }
  787.             functions[class.Name] = {
  788.                 Superclass = class.Superclass,
  789.                 Functions = {},
  790.                 HiddenFunctions = {},
  791.                 DeprecatedFunctions = {}
  792.             }
  793.  
  794.             if class.Members then
  795.                 for _, member in ipairs(class.Members) do
  796.                     local isHidden = false
  797.                     local isDeprecated = false
  798.                     local isNotScriptable = false
  799.                     local isReadOnly = false
  800.  
  801.                     for _, tag in ipairs(member.Tags or {}) do
  802.                         if type(tag) == "string" then
  803.                             if tag == "Hidden" then isHidden = true end
  804.                             if tag == "Deprecated" then isDeprecated = true end
  805.                             if tag == "NotScriptable" then isNotScriptable = true end
  806.                             if tag == "ReadOnly" then isReadOnly = true end
  807.                         end
  808.                     end
  809.  
  810.                     if member.MemberType == "Event" and type(member.Name) == "string" and not isNotScriptable then
  811.                         local params = {}
  812.                         for _, p in ipairs(member.Parameters or {}) do
  813.                             table.insert(params, {name = p.Name, type = p.Type and p.Type.Name or "any"})
  814.                         end
  815.                         local eventData = {name = member.Name, parameters = params}
  816.  
  817.                         if isDeprecated then
  818.                             table.insert(events[class.Name].DeprecatedEvents, eventData)
  819.                         elseif isHidden then
  820.                             table.insert(events[class.Name].HiddenEvents, eventData)
  821.                         else
  822.                             table.insert(events[class.Name].Events, eventData)
  823.                         end
  824.  
  825.                     elseif member.MemberType == "Property" and type(member.Name) == "string" then
  826.                         local valueType = member.ValueType and member.ValueType.Name or "unknown"
  827.                         local propData = {
  828.                             name = member.Name,
  829.                             valueType = valueType,
  830.                             hidden = isHidden,
  831.                             readOnly = isReadOnly,
  832.                             deprecated = isDeprecated,
  833.                             notScriptable = isNotScriptable
  834.                         }
  835.  
  836.                         if not isNotScriptable then
  837.                             if isDeprecated then
  838.                                 table.insert(properties[class.Name].DeprecatedProperties, propData)
  839.                             elseif isHidden then
  840.                                 table.insert(properties[class.Name].HiddenProperties, propData)
  841.                             elseif isReadOnly then
  842.                                 table.insert(properties[class.Name].ReadOnlyProperties, propData)
  843.                             else
  844.                                 table.insert(properties[class.Name].Properties, propData)
  845.                             end
  846.                         end
  847.  
  848.                     elseif member.MemberType == "Function" and type(member.Name) == "string" and not isNotScriptable then
  849.                         local params = {}
  850.                         for _, p in ipairs(member.Parameters or {}) do
  851.                             table.insert(params, {name = p.Name, type = p.Type and p.Type.Name or "any", default = p.Default})
  852.                         end
  853.                         local returnType = member.ReturnType and member.ReturnType.Name or "void"
  854.                         local funcData = {
  855.                             name = member.Name,
  856.                             parameters = params,
  857.                             returnType = returnType,
  858.                             hidden = isHidden,
  859.                             deprecated = isDeprecated
  860.                         }
  861.  
  862.                         if isDeprecated then
  863.                             table.insert(functions[class.Name].DeprecatedFunctions, funcData)
  864.                         elseif isHidden then
  865.                             table.insert(functions[class.Name].HiddenFunctions, funcData)
  866.                         else
  867.                             table.insert(functions[class.Name].Functions, funcData)
  868.                         end
  869.                     end
  870.                 end
  871.             end
  872.         end
  873.     end
  874.  
  875.     return events, properties, functions
  876. end
  877.  
  878. local function GetClassEvents(className, includeHidden, includeDeprecated)
  879.     if type(className) ~= "string" then return {} end
  880.     local allEvents = {}
  881.     local current = className
  882.     local visited = {}
  883.  
  884.     while current and CachedAPIEvents[current] and not visited[current] do
  885.         visited[current] = true
  886.         local classData = CachedAPIEvents[current]
  887.  
  888.         for _, e in ipairs(classData.Events or {}) do
  889.             allEvents[e.name] = {hidden = false, deprecated = false, parameters = e.parameters}
  890.         end
  891.         if includeHidden then
  892.             for _, e in ipairs(classData.HiddenEvents or {}) do
  893.                 allEvents[e.name] = {hidden = true, deprecated = false, parameters = e.parameters}
  894.             end
  895.         end
  896.         if includeDeprecated then
  897.             for _, e in ipairs(classData.DeprecatedEvents or {}) do
  898.                 allEvents[e.name] = {hidden = false, deprecated = true, parameters = e.parameters}
  899.             end
  900.         end
  901.  
  902.         current = classData.Superclass
  903.     end
  904.  
  905.     local result = {}
  906.     for name, data in pairs(allEvents) do
  907.         table.insert(result, {name = name, hidden = data.hidden, deprecated = data.deprecated, parameters = data.parameters})
  908.     end
  909.     table.sort(result, function(a, b) return a.name < b.name end)
  910.     return result
  911. end
  912.  
  913. local function GetClassProperties(className, includeHidden, includeDeprecated, excludeSpam)
  914.     if type(className) ~= "string" then return {} end
  915.     local allProps = {}
  916.     local current = className
  917.     local visited = {}
  918.  
  919.     while current and CachedAPIProperties[current] and not visited[current] do
  920.         visited[current] = true
  921.         local classData = CachedAPIProperties[current]
  922.  
  923.         for _, p in ipairs(classData.Properties or {}) do
  924.             if not excludeSpam or not SPAM_PROPERTIES[p.name] then
  925.                 allProps[p.name] = {hidden = false, readOnly = false, deprecated = false, valueType = p.valueType}
  926.             end
  927.         end
  928.         for _, p in ipairs(classData.ReadOnlyProperties or {}) do
  929.             if not excludeSpam or not SPAM_PROPERTIES[p.name] then
  930.                 allProps[p.name] = {hidden = false, readOnly = true, deprecated = false, valueType = p.valueType}
  931.             end
  932.         end
  933.         if includeHidden then
  934.             for _, p in ipairs(classData.HiddenProperties or {}) do
  935.                 if not excludeSpam or not SPAM_PROPERTIES[p.name] then
  936.                     allProps[p.name] = {hidden = true, readOnly = p.readOnly, deprecated = false, valueType = p.valueType}
  937.                 end
  938.             end
  939.         end
  940.         if includeDeprecated then
  941.             for _, p in ipairs(classData.DeprecatedProperties or {}) do
  942.                 if not excludeSpam or not SPAM_PROPERTIES[p.name] then
  943.                     allProps[p.name] = {hidden = p.hidden, readOnly = p.readOnly, deprecated = true, valueType = p.valueType}
  944.                 end
  945.             end
  946.         end
  947.  
  948.         current = classData.Superclass
  949.     end
  950.  
  951.     local result = {}
  952.     for name, data in pairs(allProps) do
  953.         table.insert(result, {name = name, hidden = data.hidden, readOnly = data.readOnly, deprecated = data.deprecated, valueType = data.valueType})
  954.     end
  955.     table.sort(result, function(a, b) return a.name < b.name end)
  956.     return result
  957. end
  958.  
  959. local function GetClassFunctions(className, includeHidden, includeDeprecated)
  960.     if type(className) ~= "string" then return {} end
  961.     local allFuncs = {}
  962.     local current = className
  963.     local visited = {}
  964.  
  965.     while current and CachedAPIFunctions[current] and not visited[current] do
  966.         visited[current] = true
  967.         local classData = CachedAPIFunctions[current]
  968.  
  969.         for _, f in ipairs(classData.Functions or {}) do
  970.             allFuncs[f.name] = {hidden = false, deprecated = false, parameters = f.parameters, returnType = f.returnType}
  971.         end
  972.         if includeHidden then
  973.             for _, f in ipairs(classData.HiddenFunctions or {}) do
  974.                 allFuncs[f.name] = {hidden = true, deprecated = false, parameters = f.parameters, returnType = f.returnType}
  975.             end
  976.         end
  977.         if includeDeprecated then
  978.             for _, f in ipairs(classData.DeprecatedFunctions or {}) do
  979.                 allFuncs[f.name] = {hidden = false, deprecated = true, parameters = f.parameters, returnType = f.returnType}
  980.             end
  981.         end
  982.  
  983.         current = classData.Superclass
  984.     end
  985.  
  986.     local result = {}
  987.     for name, data in pairs(allFuncs) do
  988.         table.insert(result, {name = name, hidden = data.hidden, deprecated = data.deprecated, parameters = data.parameters, returnType = data.returnType})
  989.     end
  990.     table.sort(result, function(a, b) return a.name < b.name end)
  991.     return result
  992. end
  993.  
  994. local function generateScript(data)
  995.     if data.Type == "PropertyChange" then
  996.         local script = ""
  997.         local path = instanceToPath(data.Instance)
  998.  
  999.         if path:find("getNil") then
  1000.             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'
  1001.         end
  1002.  
  1003.         script = script .. "local instance = " .. path .. "\n\n"
  1004.         script = script .. "local oldValue = " .. deepSerialize(data.OldValue) .. "\n"
  1005.         script = script .. "local newValue = " .. deepSerialize(data.NewValue) .. "\n\n"
  1006.  
  1007.         if data.IsHidden then
  1008.             if ExploitCapabilities.setscriptable then
  1009.                 script = script .. 'setscriptable(instance, "' .. data.PropertyName .. '", true)\n'
  1010.                 script = script .. "local value = instance." .. data.PropertyName .. "\n\n"
  1011.             elseif ExploitCapabilities.gethiddenproperty then
  1012.                 script = script .. 'local value = gethiddenproperty(instance, "' .. data.PropertyName .. '")\n\n'
  1013.             elseif ExploitCapabilities.ugcGetProperty then
  1014.                 script = script .. 'local UGC = game:GetService("UGCValidationService")\n'
  1015.                 script = script .. 'local value = UGC:GetPropertyValue(instance, "' .. data.PropertyName .. '")\n\n'
  1016.             end
  1017.         else
  1018.             script = script .. "local value = instance." .. data.PropertyName .. "\n\n"
  1019.         end
  1020.  
  1021.         if not data.IsReadOnly then
  1022.             if data.IsHidden and ExploitCapabilities.setscriptable then
  1023.                 script = script .. 'setscriptable(instance, "' .. data.PropertyName .. '", true)\n'
  1024.             end
  1025.             script = script .. "instance." .. data.PropertyName .. " = newValue\n"
  1026.         end
  1027.  
  1028.         return script
  1029.  
  1030.     elseif data.Type == "Function" then
  1031.         local script = ""
  1032.         local path = instanceToPath(data.Instance)
  1033.  
  1034.         if path:find("getNil") then
  1035.             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'
  1036.         end
  1037.  
  1038.         script = script .. "local instance = " .. path .. "\n\n"
  1039.  
  1040.         if data.Args and #data.Args > 0 then
  1041.             script = script .. "local args = " .. deepSerialize(data.Args) .. "\n\n"
  1042.         end
  1043.  
  1044.         if data.ReturnValue ~= nil then
  1045.             script = script .. "local result = instance:" .. data.FunctionName .. "(unpack(args or {}))\n"
  1046.         else
  1047.             script = script .. "instance:" .. data.FunctionName .. "(unpack(args or {}))\n"
  1048.         end
  1049.  
  1050.         return script
  1051.  
  1052.     else
  1053.         local script = ""
  1054.         local path = instanceToPath(data.Instance)
  1055.  
  1056.         if path:find("getNil") then
  1057.             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'
  1058.         end
  1059.  
  1060.         if data.UsedSetScriptable then
  1061.             script = script .. 'setscriptable(' .. path .. ', "' .. data.SignalName .. '", true)\n\n'
  1062.         end
  1063.  
  1064.         if data.Args and #data.Args > 0 then
  1065.             script = script .. "local args = " .. deepSerialize(data.Args) .. "\n\n"
  1066.         end
  1067.  
  1068.         script = script .. "local signal = " .. path .. "." .. data.SignalName .. "\n\n"
  1069.  
  1070.         if ExploitCapabilities.replicatesignal then
  1071.             script = script .. "replicatesignal(signal, unpack(args or {}))\n"
  1072.         elseif ExploitCapabilities.firesignal then
  1073.             script = script .. "firesignal(signal, unpack(args or {}))\n"
  1074.         end
  1075.  
  1076.         return script
  1077.     end
  1078. end
  1079.  
  1080. local function isSpammy(key, history, threshold, window)
  1081.     if not CONFIG.FilterSpammy then return false end
  1082.     local now = tick()
  1083.     if not history[key] then
  1084.         history[key] = {count = 1, lastTime = now}
  1085.         return false
  1086.     end
  1087.     local h = history[key]
  1088.     if now - h.lastTime > window then
  1089.         h.count = 1
  1090.     else
  1091.         h.count = h.count + 1
  1092.     end
  1093.     h.lastTime = now
  1094.     return h.count > threshold
  1095. end
  1096.  
  1097. local function updateLogCanvas()
  1098.     task.defer(function()
  1099.         LogList.CanvasSize = UDim2.new(0, 0, 0, UIListLayout.AbsoluteContentSize.Y + 5)
  1100.     end)
  1101. end
  1102.  
  1103. local function updateButtonCanvas()
  1104.     ButtonsFrame.CanvasSize = UDim2.new(0, 0, 0, UIGridLayout.AbsoluteContentSize.Y)
  1105. end
  1106.  
  1107. local function setCode(text)
  1108.     if codebox then
  1109.         codebox:setRaw(text)
  1110.     end
  1111. end
  1112.  
  1113. local function getCode()
  1114.     return codebox and codebox:getString() or ""
  1115. end
  1116.  
  1117. local function scaleToolTip()
  1118.     local size = TextService:GetTextSize(ToolTipText.Text, ToolTipText.TextSize, ToolTipText.Font, Vector2.new(196, math.huge))
  1119.     ToolTipText.Size = UDim2.new(0, size.X, 0, size.Y)
  1120.     ToolTip.Size = UDim2.new(0, size.X + 8, 0, size.Y + 8)
  1121. end
  1122.  
  1123. local function makeToolTip(enable, text)
  1124.     if enable and text then
  1125.         if connections["ToolTip"] then
  1126.             connections["ToolTip"]:Disconnect()
  1127.         end
  1128.         connections["ToolTip"] = RunService.RenderStepped:Connect(function()
  1129.             local mousePos = UserInputService:GetMouseLocation()
  1130.             local x = mousePos.X + 15
  1131.             local y = mousePos.Y - 10 - GuiInset.Y
  1132.             local viewSize = workspace.CurrentCamera.ViewportSize
  1133.             if x + ToolTip.AbsoluteSize.X > viewSize.X then
  1134.                 x = mousePos.X - ToolTip.AbsoluteSize.X - 10
  1135.             end
  1136.             if y + ToolTip.AbsoluteSize.Y > viewSize.Y - 50 then
  1137.                 y = viewSize.Y - ToolTip.AbsoluteSize.Y - 50
  1138.             end
  1139.             ToolTip.Position = UDim2.new(0, x, 0, y)
  1140.         end)
  1141.         ToolTipText.Text = text
  1142.         scaleToolTip()
  1143.         ToolTip.Visible = true
  1144.     else
  1145.         ToolTip.Visible = false
  1146.         if connections["ToolTip"] then
  1147.             connections["ToolTip"]:Disconnect()
  1148.         end
  1149.     end
  1150. end
  1151.  
  1152. local function newButton(name, description, onClick)
  1153.     local FunctionTemplate = Create("Frame", {
  1154.         Name = "FunctionTemplate",
  1155.         Parent = ButtonsFrame,
  1156.         BackgroundColor3 = Color3.new(1, 1, 1),
  1157.         BackgroundTransparency = 1,
  1158.         Size = UDim2.new(0, 94, 0, 23)
  1159.     })
  1160.  
  1161.     local ColorBar = Create("Frame", {
  1162.         Name = "ColorBar",
  1163.         Parent = FunctionTemplate,
  1164.         BackgroundColor3 = Color3.fromRGB(255, 100, 150),
  1165.         BorderSizePixel = 0,
  1166.         Position = UDim2.new(0, 7, 0, 10),
  1167.         Size = UDim2.new(0, 5, 0, 16),
  1168.         ZIndex = 3
  1169.     })
  1170.  
  1171.     local Text = Create("TextLabel", {
  1172.         Name = "Text",
  1173.         Parent = FunctionTemplate,
  1174.         BackgroundTransparency = 1,
  1175.         Position = UDim2.new(0, 16, 0, 10),
  1176.         Size = UDim2.new(0, 72, 0, 16),
  1177.         Font = Enum.Font.SourceSans,
  1178.         Text = name,
  1179.         TextColor3 = Color3.new(1, 1, 1),
  1180.         TextSize = 12,
  1181.         TextXAlignment = Enum.TextXAlignment.Left,
  1182.         TextTruncate = Enum.TextTruncate.AtEnd
  1183.     })
  1184.  
  1185.     local Button = Create("TextButton", {
  1186.         Name = "Button",
  1187.         Parent = FunctionTemplate,
  1188.         BackgroundColor3 = Color3.new(0, 0, 0),
  1189.         BackgroundTransparency = 0.7,
  1190.         BorderSizePixel = 0,
  1191.         Position = UDim2.new(0, 7, 0, 10),
  1192.         Size = UDim2.new(0, 80, 0, 16),
  1193.         AutoButtonColor = false,
  1194.         Font = Enum.Font.SourceSans,
  1195.         Text = "",
  1196.         TextSize = 14
  1197.     })
  1198.  
  1199.     Button.MouseEnter:Connect(function()
  1200.         makeToolTip(true, type(description) == "function" and description() or description)
  1201.     end)
  1202.  
  1203.     Button.MouseLeave:Connect(function()
  1204.         makeToolTip(false)
  1205.     end)
  1206.  
  1207.     Button.MouseButton1Click:Connect(function()
  1208.         pcall(onClick, FunctionTemplate)
  1209.     end)
  1210.  
  1211.     updateButtonCanvas()
  1212. end
  1213.  
  1214. local function eventSelect(data)
  1215.     if selected and selected.Button then
  1216.         TweenService:Create(selected.Button, TweenInfo.new(0.3), {BackgroundColor3 = deselectedColor}):Play()
  1217.     end
  1218.     selected = data
  1219.     if selected and selected.Button then
  1220.         TweenService:Create(selected.Button, TweenInfo.new(0.3), {BackgroundColor3 = selectedColor}):Play()
  1221.     end
  1222.     if selected then
  1223.         selected.GenScript = selected.GenScript or generateScript(selected)
  1224.         setCode(selected.GenScript)
  1225.     end
  1226.     if sideClosed then
  1227.         sideClosed = false
  1228.         RightPanel.Visible = true
  1229.         TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.fromOffset(375, Background.AbsoluteSize.Y - 19)}):Play()
  1230.         TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(520, 19)}):Play()
  1231.     end
  1232. end
  1233.  
  1234. local function createGroupEntry(className, memberName, isHidden, isDeprecated, logType)
  1235.     local groupKey = className .. "." .. memberName .. "." .. logType
  1236.     if groupedLogs[groupKey] then return groupedLogs[groupKey] end
  1237.     if layoutOrderNum < 1 then layoutOrderNum = 999999999 end
  1238.  
  1239.     local group = {
  1240.         MemberName = memberName,
  1241.         ClassName = className,
  1242.         Logs = {},
  1243.         Expanded = false,
  1244.         CallCount = 0,
  1245.         IsHidden = isHidden,
  1246.         IsDeprecated = isDeprecated,
  1247.         LogType = logType
  1248.     }
  1249.  
  1250.     local color
  1251.     if logType == "Property" then
  1252.         color = isHidden and Color3.fromRGB(100, 200, 255) or Color3.fromRGB(100, 180, 255)
  1253.     elseif logType == "Function" then
  1254.         color = isHidden and Color3.fromRGB(255, 200, 100) or Color3.fromRGB(255, 220, 100)
  1255.     else
  1256.         color = isHidden and Color3.fromRGB(255, 150, 50) or (isDeprecated and Color3.fromRGB(180, 100, 255) or Color3.fromRGB(255, 100, 150))
  1257.     end
  1258.  
  1259.     local icon
  1260.     if logType == "Property" then
  1261.         icon = "◆"
  1262.     elseif logType == "Function" then
  1263.         icon = "ƒ"
  1264.     else
  1265.         icon = "⚡"
  1266.     end
  1267.  
  1268.     local GroupFrame = Create("Frame", {
  1269.         Parent = LogList,
  1270.         BackgroundTransparency = 1,
  1271.         Size = UDim2.new(1, -4, 0, 20),
  1272.         LayoutOrder = layoutOrderNum,
  1273.         ClipsDescendants = true
  1274.     })
  1275.  
  1276.     local GroupLayout = Create("UIListLayout", {
  1277.         Parent = GroupFrame,
  1278.         SortOrder = Enum.SortOrder.LayoutOrder,
  1279.         Padding = UDim.new(0, 1)
  1280.     })
  1281.  
  1282.     GroupLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
  1283.         GroupFrame.Size = UDim2.new(1, -4, 0, GroupLayout.AbsoluteContentSize.Y)
  1284.         task.defer(updateLogCanvas)
  1285.     end)
  1286.  
  1287.     local HeaderFrame = Create("Frame", {
  1288.         Parent = GroupFrame,
  1289.         BackgroundTransparency = 1,
  1290.         Size = UDim2.new(1, 0, 0, 20),
  1291.         LayoutOrder = -999999
  1292.     })
  1293.  
  1294.     local ExpandButton = Create("TextButton", {
  1295.         Parent = HeaderFrame,
  1296.         BackgroundTransparency = 1,
  1297.         Size = UDim2.new(0, 12, 0, 16),
  1298.         Position = UDim2.new(0, 0, 0, 2),
  1299.         Font = Enum.Font.SourceSansBold,
  1300.         Text = ">",
  1301.         TextColor3 = color,
  1302.         TextSize = 11
  1303.     })
  1304.  
  1305.     Create("TextLabel", {
  1306.         Parent = HeaderFrame,
  1307.         BackgroundTransparency = 1,
  1308.         Position = UDim2.new(0, 12, 0, 2),
  1309.         Size = UDim2.new(0, 10, 0, 16),
  1310.         Font = Enum.Font.SourceSans,
  1311.         Text = icon,
  1312.         TextColor3 = color,
  1313.         TextSize = 10
  1314.     })
  1315.  
  1316.     Create("Frame", {
  1317.         Parent = HeaderFrame,
  1318.         BackgroundColor3 = color,
  1319.         BorderSizePixel = 0,
  1320.         Position = UDim2.new(0, 22, 0, 2),
  1321.         Size = UDim2.new(0, 3, 0, 16)
  1322.     })
  1323.  
  1324.     local displayText = CONFIG.ShowClassName and (className .. "." .. memberName) or memberName
  1325.     local tags = {}
  1326.     if isHidden then table.insert(tags, "H") end
  1327.     if isDeprecated then table.insert(tags, "D") end
  1328.     if #tags > 0 then displayText = displayText .. "[" .. table.concat(tags) .. "]" end
  1329.  
  1330.     Create("TextLabel", {
  1331.         Parent = HeaderFrame,
  1332.         BackgroundTransparency = 1,
  1333.         Position = UDim2.new(0, 28, 0, 2),
  1334.         Size = UDim2.new(1, -50, 0, 16),
  1335.         Font = Enum.Font.SourceSans,
  1336.         Text = displayText,
  1337.         TextColor3 = color,
  1338.         TextSize = 10,
  1339.         TextXAlignment = Enum.TextXAlignment.Left,
  1340.         TextTruncate = Enum.TextTruncate.AtEnd
  1341.     })
  1342.  
  1343.     local CountLabel = Create("TextLabel", {
  1344.         Parent = HeaderFrame,
  1345.         BackgroundTransparency = 1,
  1346.         Position = UDim2.new(1, -20, 0, 2),
  1347.         Size = UDim2.new(0, 18, 0, 16),
  1348.         Font = Enum.Font.SourceSans,
  1349.         Text = "0",
  1350.         TextColor3 = Color3.fromRGB(150, 150, 150),
  1351.         TextSize = 10,
  1352.         TextXAlignment = Enum.TextXAlignment.Right
  1353.     })
  1354.  
  1355.     local HeaderButton = Create("TextButton", {
  1356.         Parent = HeaderFrame,
  1357.         BackgroundColor3 = Color3.new(0, 0, 0),
  1358.         BackgroundTransparency = 0.88,
  1359.         BorderSizePixel = 0,
  1360.         Size = UDim2.new(1, 0, 0, 16),
  1361.         Position = UDim2.new(0, 0, 0, 2),
  1362.         AutoButtonColor = false,
  1363.         Text = ""
  1364.     })
  1365.  
  1366.     group.Frame = GroupFrame
  1367.     group.CountLabel = CountLabel
  1368.     group.ExpandButton = ExpandButton
  1369.  
  1370.     local function toggleExpand()
  1371.         group.Expanded = not group.Expanded
  1372.         ExpandButton.Text = group.Expanded and "v" or ">"
  1373.         for _, logData in ipairs(group.Logs) do
  1374.             if logData.LogFrame then
  1375.                 logData.LogFrame.Visible = group.Expanded
  1376.             end
  1377.         end
  1378.         task.defer(function()
  1379.             GroupFrame.Size = UDim2.new(1, -4, 0, GroupLayout.AbsoluteContentSize.Y)
  1380.             updateLogCanvas()
  1381.         end)
  1382.     end
  1383.  
  1384.     ExpandButton.MouseButton1Click:Connect(toggleExpand)
  1385.     HeaderButton.MouseButton2Click:Connect(toggleExpand)
  1386.     HeaderButton.MouseButton1Click:Connect(function()
  1387.         if #group.Logs > 0 then
  1388.             eventSelect(group.Logs[1])
  1389.         end
  1390.     end)
  1391.  
  1392.     groupedLogs[groupKey] = group
  1393.     layoutOrderNum = layoutOrderNum - 1
  1394.     updateLogCanvas()
  1395.     return group
  1396. end
  1397.  
  1398. local function newLog(data)
  1399.     local logType
  1400.     if data.Type == "PropertyChange" then
  1401.         logType = "Property"
  1402.     elseif data.Type == "Function" then
  1403.         logType = "Function"
  1404.     else
  1405.         logType = "Signal"
  1406.     end
  1407.  
  1408.     if currentTab == "Signals" and logType ~= "Signal" then return end
  1409.     if currentTab == "Props" and logType ~= "Property" then return end
  1410.     if currentTab == "Funcs" and logType ~= "Function" then return end
  1411.  
  1412.     local className = data.ClassName or "?"
  1413.     local memberName = data.PropertyName or data.SignalName or data.FunctionName
  1414.  
  1415.     local group = createGroupEntry(className, memberName, data.IsHidden, data.IsDeprecated, logType)
  1416.     group.CallCount = group.CallCount + 1
  1417.     group.CountLabel.Text = tostring(group.CallCount)
  1418.     data.CallCount = group.CallCount
  1419.  
  1420.     local color
  1421.     if logType == "Property" then
  1422.         color = data.IsHidden and Color3.fromRGB(100, 200, 255) or Color3.fromRGB(100, 180, 255)
  1423.     elseif logType == "Function" then
  1424.         color = data.IsHidden and Color3.fromRGB(255, 200, 100) or Color3.fromRGB(255, 220, 100)
  1425.     else
  1426.         color = data.IsHidden and Color3.fromRGB(255, 150, 50) or (data.IsDeprecated and Color3.fromRGB(180, 100, 255) or Color3.fromRGB(190, 190, 190))
  1427.     end
  1428.  
  1429.     local LogFrame = Create("Frame", {
  1430.         Parent = group.Frame,
  1431.         BackgroundTransparency = 1,
  1432.         Size = UDim2.new(1, 0, 0, 16),
  1433.         LayoutOrder = -group.CallCount,
  1434.         Visible = group.Expanded
  1435.     })
  1436.  
  1437.     Create("TextLabel", {
  1438.         Parent = LogFrame,
  1439.         BackgroundTransparency = 1,
  1440.         Position = UDim2.new(0, 5, 0, 0),
  1441.         Size = UDim2.new(0, 20, 1, 0),
  1442.         Font = Enum.Font.SourceSans,
  1443.         Text = "#" .. tostring(group.CallCount - 1),
  1444.         TextColor3 = Color3.fromRGB(150, 150, 150),
  1445.         TextSize = 9,
  1446.         TextXAlignment = Enum.TextXAlignment.Left
  1447.     })
  1448.  
  1449.     Create("TextLabel", {
  1450.         Parent = LogFrame,
  1451.         BackgroundTransparency = 1,
  1452.         Position = UDim2.new(0, 26, 0, 0),
  1453.         Size = UDim2.new(1, -28, 1, 0),
  1454.         Font = Enum.Font.SourceSans,
  1455.         Text = CONFIG.ShowClassName and (className .. "." .. memberName) or memberName,
  1456.         TextColor3 = color,
  1457.         TextSize = 10,
  1458.         TextXAlignment = Enum.TextXAlignment.Left,
  1459.         TextTruncate = Enum.TextTruncate.AtEnd
  1460.     })
  1461.  
  1462.     local LogButton = Create("TextButton", {
  1463.         Parent = LogFrame,
  1464.         BackgroundColor3 = Color3.new(0, 0, 0),
  1465.         BackgroundTransparency = 0.92,
  1466.         BorderSizePixel = 0,
  1467.         Size = UDim2.new(1, 0, 1, 0),
  1468.         AutoButtonColor = false,
  1469.         Text = ""
  1470.     })
  1471.  
  1472.     data.LogFrame = LogFrame
  1473.     data.Button = LogButton
  1474.     data.id = #logs + 1
  1475.  
  1476.     table.insert(group.Logs, 1, data)
  1477.     table.insert(logs, 1, data)
  1478.  
  1479.     LogButton.MouseButton1Click:Connect(function()
  1480.         eventSelect(data)
  1481.     end)
  1482.  
  1483.     if #logs > CONFIG.MaxLogs then
  1484.         local oldest = table.remove(logs)
  1485.         if oldest and oldest.LogFrame then
  1486.             oldest.LogFrame:Destroy()
  1487.         end
  1488.     end
  1489. end
  1490.  
  1491. local function logSignal(instance, signalName, signal, args, isHidden, isDeprecated, accessMethod, usedSetScriptable)
  1492.     if not CONFIG.Enabled then return end
  1493.     local ok, className = pcall(function() return instance.ClassName end)
  1494.     className = ok and className or "?"
  1495.     local key = className .. "." .. signalName .. "." .. tostring(instance)
  1496.     if blacklist[key] or blacklist[signalName] then return end
  1497.     if blocklist[key] or blocklist[signalName] then return end
  1498.     if isSpammy(key, SpamHistory, CONFIG.SpamThreshold, CONFIG.SpamTimeWindow) then return end
  1499.  
  1500.     newLog({
  1501.         Type = "Signal",
  1502.         SignalName = signalName,
  1503.         Instance = instance,
  1504.         Signal = signal,
  1505.         ClassName = className,
  1506.         Args = deepclone(args or {}),
  1507.         Timestamp = os.time(),
  1508.         IsHidden = isHidden,
  1509.         IsDeprecated = isDeprecated,
  1510.         AccessMethod = accessMethod,
  1511.         UsedSetScriptable = usedSetScriptable
  1512.     })
  1513. end
  1514.  
  1515. local function logPropertyChange(instance, propName, oldValue, newValue, isHidden, isReadOnly, isDeprecated, accessMethod, valueType)
  1516.     if not CONFIG.Enabled then return end
  1517.     if not getgenv().CaptureProperties then return end
  1518.     local ok, className = pcall(function() return instance.ClassName end)
  1519.     className = ok and className or "?"
  1520.     local key = className .. "." .. propName .. "." .. tostring(instance)
  1521.     if blacklist[key] or blacklist[propName] then return end
  1522.     if blocklist[key] or blocklist[propName] then return end
  1523.     if isSpammy(key, PropertySpamHistory, 3, 0.5) then return end
  1524.  
  1525.     newLog({
  1526.         Type = "PropertyChange",
  1527.         PropertyName = propName,
  1528.         Instance = instance,
  1529.         ClassName = className,
  1530.         OldValue = deepclone(oldValue),
  1531.         NewValue = deepclone(newValue),
  1532.         ValueType = valueType or typeof(newValue),
  1533.         Timestamp = os.time(),
  1534.         IsHidden = isHidden,
  1535.         IsReadOnly = isReadOnly,
  1536.         IsDeprecated = isDeprecated,
  1537.         AccessMethod = accessMethod
  1538.     })
  1539. end
  1540.  
  1541. local function logFunctionCall(instance, funcName, args, returnValue, isHidden, isDeprecated, callingScript)
  1542.     if not CONFIG.Enabled then return end
  1543.     if not getgenv().CaptureFunctions then return end
  1544.     local ok, className = pcall(function() return instance.ClassName end)
  1545.     className = ok and className or "?"
  1546.     local key = className .. "." .. funcName .. "." .. tostring(instance)
  1547.     if blacklist[key] or blacklist[funcName] then return end
  1548.     if blocklist[key] or blocklist[funcName] then return end
  1549.     if isSpammy(key, FunctionSpamHistory, CONFIG.SpamThreshold, CONFIG.SpamTimeWindow) then return end
  1550.  
  1551.     TotalFunctionCalls = TotalFunctionCalls + 1
  1552.  
  1553.     newLog({
  1554.         Type = "Function",
  1555.         FunctionName = funcName,
  1556.         Instance = instance,
  1557.         ClassName = className,
  1558.         Args = deepclone(args or {}),
  1559.         ReturnValue = deepclone(returnValue),
  1560.         Timestamp = os.time(),
  1561.         IsHidden = isHidden,
  1562.         IsDeprecated = isDeprecated,
  1563.         CallingScript = callingScript
  1564.     })
  1565. end
  1566.  
  1567. local function hookSignal(instance, signalName, isHidden, isDeprecated)
  1568.     local ok, className = pcall(function() return instance.ClassName end)
  1569.     className = ok and className or "Unknown"
  1570.     local key = className .. "." .. signalName .. "." .. tostring(instance)
  1571.     if HookedSignals[key] then return false end
  1572.  
  1573.     local signal, accessMethod, usedSetScriptable = getSignalFromInstance(instance, signalName, isHidden, isDeprecated)
  1574.     if not signal then return false end
  1575.  
  1576.     HookedSignals[key] = true
  1577.     TotalSignalHooks = TotalSignalHooks + 1
  1578.     if isHidden then HiddenSignalHooks = HiddenSignalHooks + 1 end
  1579.  
  1580.     local conn = signal:Connect(function(...)
  1581.         logSignal(instance, signalName, signal, {...}, isHidden, isDeprecated, accessMethod, usedSetScriptable)
  1582.     end)
  1583.     table.insert(connections, conn)
  1584.     return true
  1585. end
  1586.  
  1587. local function hookProperty(instance, propName, isHidden, isReadOnly, isDeprecated, valueType)
  1588.     if SPAM_PROPERTIES[propName] then return false end
  1589.  
  1590.     local ok, className = pcall(function() return instance.ClassName end)
  1591.     className = ok and className or "Unknown"
  1592.     local key = className .. "." .. propName .. "." .. tostring(instance)
  1593.     if HookedProperties[key] then return false end
  1594.  
  1595.     local signal = nil
  1596.     if isHidden and ExploitCapabilities.setscriptable then
  1597.         pcall(function()
  1598.             local was = isscriptable and isscriptable(instance, propName)
  1599.             if not was then setscriptable(instance, propName, true) end
  1600.             signal = instance:GetPropertyChangedSignal(propName)
  1601.         end)
  1602.     else
  1603.         local ok2
  1604.         ok2, signal = pcall(function() return instance:GetPropertyChangedSignal(propName) end)
  1605.         if not ok2 then signal = nil end
  1606.     end
  1607.  
  1608.     if not signal then return false end
  1609.  
  1610.     HookedProperties[key] = true
  1611.     TotalPropertyHooks = TotalPropertyHooks + 1
  1612.     if isHidden then HiddenPropertyHooks = HiddenPropertyHooks + 1 end
  1613.  
  1614.     local lastValue = nil
  1615.     pcall(function()
  1616.         local ok3, val = getPropertyValueSmart(instance, propName, isHidden)
  1617.         if ok3 then lastValue = val end
  1618.     end)
  1619.  
  1620.     local conn = signal:Connect(function()
  1621.         local ok4, newValue, method = getPropertyValueSmart(instance, propName, isHidden)
  1622.         if ok4 then
  1623.             logPropertyChange(instance, propName, lastValue, newValue, isHidden, isReadOnly, isDeprecated, method, valueType)
  1624.             lastValue = newValue
  1625.         end
  1626.     end)
  1627.     table.insert(connections, conn)
  1628.     return true
  1629. end
  1630.  
  1631. local function hookInstanceByClass(instance)
  1632.     for _, className in ipairs(getgenv().CaptureClasses or {}) do
  1633.         local ok, isClass = pcall(function() return instance:IsA(className) end)
  1634.         if ok and isClass then
  1635.             for _, e in ipairs(GetClassEvents(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated)) do
  1636.                 pcall(function() hookSignal(instance, e.name, e.hidden, e.deprecated) end)
  1637.             end
  1638.         end
  1639.     end
  1640.  
  1641.     if getgenv().CaptureProperties then
  1642.         for _, className in ipairs(getgenv().PropertyClasses or {}) do
  1643.             local ok, isClass = pcall(function() return instance:IsA(className) end)
  1644.             if ok and isClass then
  1645.                 for _, p in ipairs(GetClassProperties(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated, true)) do
  1646.                     pcall(function() hookProperty(instance, p.name, p.hidden, p.readOnly, p.deprecated, p.valueType) end)
  1647.                 end
  1648.             end
  1649.         end
  1650.     end
  1651. end
  1652.  
  1653. local function rehookAll()
  1654.     TotalSignalHooks = 0
  1655.     TotalPropertyHooks = 0
  1656.     HiddenSignalHooks = 0
  1657.     HiddenPropertyHooks = 0
  1658.     HookedSignals = {}
  1659.     HookedProperties = {}
  1660.  
  1661.     for _, conn in pairs(connections) do
  1662.         if typeof(conn) == "RBXScriptConnection" then
  1663.             pcall(function() conn:Disconnect() end)
  1664.         end
  1665.     end
  1666.     connections = {}
  1667.  
  1668.     StatusLabel.Text = "[Rehooking...]"
  1669.     StatusLabel.TextColor3 = Color3.fromRGB(255, 200, 100)
  1670.  
  1671.     task.spawn(function()
  1672.         task.wait(0.1)
  1673.         local count = 0
  1674.         for _, desc in ipairs(game:GetDescendants()) do
  1675.             count = count + 1
  1676.             if count % 400 == 0 then task.wait() end
  1677.             pcall(function() hookInstanceByClass(desc) end)
  1678.         end
  1679.  
  1680.         connections["DescAdded"] = game.DescendantAdded:Connect(function(desc)
  1681.             task.defer(function()
  1682.                 pcall(function() hookInstanceByClass(desc) end)
  1683.             end)
  1684.         end)
  1685.  
  1686.         StatusLabel.Text = string.format("[S:%d/%dh P:%d/%dh F:%d]", TotalSignalHooks, HiddenSignalHooks, TotalPropertyHooks, HiddenPropertyHooks, TotalFunctionCalls)
  1687.         StatusLabel.TextColor3 = Color3.fromRGB(100, 255, 100)
  1688.     end)
  1689. end
  1690.  
  1691. local originalNamecall
  1692. local namecallHooked = false
  1693.  
  1694. local function setupFunctionSpy()
  1695.     if not ExploitCapabilities.hookmetamethod then return end
  1696.     if not ExploitCapabilities.getnamecallmethod then return end
  1697.     if namecallHooked then return end
  1698.  
  1699.     local trackedMethods = {}
  1700.     for _, className in ipairs(getgenv().FunctionClasses or {}) do
  1701.         local funcs = GetClassFunctions(className, getgenv().CaptureHidden, getgenv().CaptureDeprecated)
  1702.         for _, f in ipairs(funcs) do
  1703.             trackedMethods[f.name] = {hidden = f.hidden, deprecated = f.deprecated}
  1704.         end
  1705.     end
  1706.  
  1707.     originalNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...)
  1708.         local method = getnamecallmethod()
  1709.  
  1710.         if getgenv().CaptureFunctions and method and trackedMethods[method] then
  1711.             if not CONFIG.LogCheckcaller or not checkcaller() then
  1712.                 local args = {...}
  1713.                 local callingScript = nil
  1714.                 pcall(function()
  1715.                     callingScript = getcallingscript()
  1716.                 end)
  1717.  
  1718.                 task.defer(function()
  1719.                     local ok, returnVal = pcall(function()
  1720.                         return originalNamecall(self, unpack(args))
  1721.                     end)
  1722.                     logFunctionCall(self, method, args, ok and returnVal or nil, trackedMethods[method].hidden, trackedMethods[method].deprecated, callingScript)
  1723.                 end)
  1724.             end
  1725.         end
  1726.  
  1727.         return originalNamecall(self, ...)
  1728.     end))
  1729.  
  1730.     namecallHooked = true
  1731. end
  1732.  
  1733. local function shutdown()
  1734.     getgenv().SignalSpyExecuted = false
  1735.  
  1736.     for _, conn in pairs(connections) do
  1737.         if typeof(conn) == "RBXScriptConnection" then
  1738.             pcall(function() conn:Disconnect() end)
  1739.         end
  1740.     end
  1741.  
  1742.     if originalNamecall and namecallHooked then
  1743.         pcall(function()
  1744.             hookmetamethod(game, "__namecall", originalNamecall)
  1745.         end)
  1746.     end
  1747.  
  1748.     pcall(function() SignalSpy:Destroy() end)
  1749.     pcall(function() Storage:Destroy() end)
  1750.     UserInputService.MouseIconEnabled = true
  1751. end
  1752.  
  1753. TabSignals.MouseButton1Click:Connect(function()
  1754.     currentTab = "Signals"
  1755.     TabSignals.BackgroundTransparency = 0.3
  1756.     TabProperties.BackgroundTransparency = 0.7
  1757.     TabFunctions.BackgroundTransparency = 0.7
  1758. end)
  1759.  
  1760. TabProperties.MouseButton1Click:Connect(function()
  1761.     currentTab = "Props"
  1762.     TabSignals.BackgroundTransparency = 0.7
  1763.     TabProperties.BackgroundTransparency = 0.3
  1764.     TabFunctions.BackgroundTransparency = 0.7
  1765. end)
  1766.  
  1767. TabFunctions.MouseButton1Click:Connect(function()
  1768.     currentTab = "Funcs"
  1769.     TabSignals.BackgroundTransparency = 0.7
  1770.     TabProperties.BackgroundTransparency = 0.7
  1771.     TabFunctions.BackgroundTransparency = 0.3
  1772. end)
  1773.  
  1774. TitleButton.MouseButton1Click:Connect(function()
  1775.     CONFIG.Enabled = not CONFIG.Enabled
  1776.     TweenService:Create(TitleButton, TweenInfo.new(0.3), {TextColor3 = CONFIG.Enabled and Color3.fromRGB(100, 255, 100) or Color3.fromRGB(255, 100, 100)}):Play()
  1777. end)
  1778.  
  1779. CloseButton.MouseEnter:Connect(function()
  1780.     TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(255, 60, 60)}):Play()
  1781. end)
  1782.  
  1783. CloseButton.MouseLeave:Connect(function()
  1784.     TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(37, 36, 38)}):Play()
  1785. end)
  1786.  
  1787. CloseButton.MouseButton1Click:Connect(shutdown)
  1788.  
  1789. MinimizeButton.MouseButton1Click:Connect(function()
  1790.     if mainClosing then return end
  1791.     mainClosing = true
  1792.     closed = not closed
  1793.     if closed then
  1794.         TweenService:Create(LeftPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 145, 0, 0)}):Play()
  1795.         TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 0)}):Play()
  1796.     else
  1797.         TweenService:Create(LeftPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 145, 0, 301)}):Play()
  1798.         if not sideClosed then
  1799.             TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 301)}):Play()
  1800.         end
  1801.     end
  1802.     task.delay(0.3, function() mainClosing = false end)
  1803. end)
  1804.  
  1805. MaximizeButton.MouseButton1Click:Connect(function()
  1806.     if sideClosing or closed then return end
  1807.     sideClosing = true
  1808.     sideClosed = not sideClosed
  1809.     if sideClosed then
  1810.         TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 0, 0, 301)}):Play()
  1811.         TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(145, 19)}):Play()
  1812.     else
  1813.         RightPanel.Visible = true
  1814.         TweenService:Create(RightPanel, TweenInfo.new(0.3), {Size = UDim2.new(0, 375, 0, 301)}):Play()
  1815.         TweenService:Create(TopBar, TweenInfo.new(0.3), {Size = UDim2.fromOffset(520, 19)}):Play()
  1816.     end
  1817.     task.delay(0.3, function() sideClosing = false end)
  1818. end)
  1819.  
  1820. TopBar.InputBegan:Connect(function(input)
  1821.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  1822.         local mousePos = UserInputService:GetMouseLocation() - GuiInset
  1823.         local relativePos = mousePos - Background.AbsolutePosition
  1824.         if relativePos.X <= TopBar.AbsoluteSize.X - 60 and relativePos.X >= 0 and relativePos.Y <= 19 and relativePos.Y >= 0 then
  1825.             local dragStart = input.Position
  1826.             local startPos = Background.Position
  1827.  
  1828.             local dragConn
  1829.             dragConn = RunService.RenderStepped:Connect(function()
  1830.                 local newPos = UserInputService:GetMouseLocation()
  1831.                 local delta = newPos - Vector2.new(dragStart.X, dragStart.Y)
  1832.                 Background.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
  1833.             end)
  1834.  
  1835.             local endConn
  1836.             endConn = UserInputService.InputEnded:Connect(function(endInput)
  1837.                 if endInput == input then
  1838.                     dragConn:Disconnect()
  1839.                     endConn:Disconnect()
  1840.                 end
  1841.             end)
  1842.         end
  1843.     end
  1844. end)
  1845.  
  1846. if Highlight then
  1847.     codebox = Highlight.new(CodeBox)
  1848.     local caps = {}
  1849.     for k, v in pairs(ExploitCapabilities) do
  1850.         if v then table.insert(caps, k) end
  1851.     end
  1852.     codebox:setRaw("SignalSpy+ v7\nCapabilities: " .. table.concat(caps, ", ") .. "\nUGCValidationService: " .. (ExploitCapabilities.ugcGetProperty and "YES" or "NO"))
  1853. end
  1854.  
  1855. getgenv().SignalSpyShutdown = shutdown
  1856.  
  1857. newButton("Copy Code", function() return "Copy generated code" end, function()
  1858.     setclipboard(getCode())
  1859.     ToolTipText.Text = "Copied!"
  1860. end)
  1861.  
  1862. newButton("Refresh", function() return "Rehook all signals and properties" end, function()
  1863.     rehookAll()
  1864. end)
  1865.  
  1866. newButton("Clr Logs", function() return "Clear all logs" end, function()
  1867.     for _, g in pairs(groupedLogs) do
  1868.         if g.Frame then g.Frame:Destroy() end
  1869.     end
  1870.     groupedLogs = {}
  1871.     logs = {}
  1872.     selected = nil
  1873.     layoutOrderNum = 999999999
  1874.     TotalFunctionCalls = 0
  1875.     setCode("")
  1876.     updateLogCanvas()
  1877. end)
  1878.  
  1879. newButton("Props", function() return "Properties: " .. (getgenv().CaptureProperties and "ON" or "OFF") end, function()
  1880.     getgenv().CaptureProperties = not getgenv().CaptureProperties
  1881.     rehookAll()
  1882. end)
  1883.  
  1884. newButton("Funcs", function() return "Functions: " .. (getgenv().CaptureFunctions and "ON" or "OFF") end, function()
  1885.     getgenv().CaptureFunctions = not getgenv().CaptureFunctions
  1886.     if getgenv().CaptureFunctions and not namecallHooked then
  1887.         setupFunctionSpy()
  1888.     end
  1889. end)
  1890.  
  1891. newButton("Hidden", function() return "Hidden: " .. (getgenv().CaptureHidden and "ON" or "OFF") end, function()
  1892.     getgenv().CaptureHidden = not getgenv().CaptureHidden
  1893.     rehookAll()
  1894. end)
  1895.  
  1896. newButton("Fire", function() return "Fire selected signal" end, function()
  1897.     if selected and selected.Signal and ExploitCapabilities.firesignal then
  1898.         pcall(function()
  1899.             firesignal(selected.Signal, unpack(selected.Args or {}))
  1900.         end)
  1901.         ToolTipText.Text = "Fired!"
  1902.     else
  1903.         ToolTipText.Text = "N/A"
  1904.     end
  1905. end)
  1906.  
  1907. newButton("Exclude (i)", function() return "Exclude this instance" end, function()
  1908.     if selected then
  1909.         local key = selected.ClassName .. "." .. (selected.PropertyName or selected.SignalName or selected.FunctionName) .. "." .. tostring(selected.Instance)
  1910.         blacklist[key] = true
  1911.         ToolTipText.Text = "Excluded!"
  1912.     end
  1913. end)
  1914.  
  1915. newButton("Exclude (n)", function() return "Exclude by name" end, function()
  1916.     if selected then
  1917.         local name = selected.PropertyName or selected.SignalName or selected.FunctionName
  1918.         blacklist[name] = true
  1919.         ToolTipText.Text = "Excluded!"
  1920.     end
  1921. end)
  1922.  
  1923. newButton("Clr Blacklist", function() return "Clear exclusions" end, function()
  1924.     blacklist = {}
  1925.     ToolTipText.Text = "Cleared!"
  1926. end)
  1927.  
  1928. newButton("Stats", function() return "View statistics" end, function()
  1929.     local info = "STATISTICS\n\n"
  1930.     info = info .. "Signal Hooks: " .. TotalSignalHooks .. " (" .. HiddenSignalHooks .. " hidden)\n"
  1931.     info = info .. "Property Hooks: " .. TotalPropertyHooks .. " (" .. HiddenPropertyHooks .. " hidden)\n"
  1932.     info = info .. "Function Calls: " .. TotalFunctionCalls .. "\n\n"
  1933.     info = info .. "CAPABILITIES:\n"
  1934.     for k, v in pairs(ExploitCapabilities) do
  1935.         info = info .. "  " .. k .. ": " .. (v and "YES" or "NO") .. "\n"
  1936.     end
  1937.     info = info .. "\nINTERESTING HIDDEN:\n"
  1938.     for _, p in ipairs(INTERESTING_HIDDEN) do
  1939.         info = info .. "  " .. p .. "\n"
  1940.     end
  1941.     setCode(info)
  1942. end)
  1943.  
  1944. local guiParent = CoreGui
  1945. if gethui then
  1946.     guiParent = gethui()
  1947. elseif protect_gui then
  1948.     protect_gui(SignalSpy)
  1949. end
  1950. SignalSpy.Parent = guiParent
  1951.  
  1952. task.spawn(function()
  1953.     StatusLabel.Text = "[Loading API...]"
  1954.     CachedAPIEvents, CachedAPIProperties, CachedAPIFunctions = FetchAPIData()
  1955.  
  1956.     local classCount = 0
  1957.     for _ in pairs(CachedAPIEvents) do classCount = classCount + 1 end
  1958.  
  1959.     if classCount == 0 then
  1960.         StatusLabel.Text = "[API FAIL]"
  1961.         StatusLabel.TextColor3 = Color3.fromRGB(255, 100, 100)
  1962.         return
  1963.     end
  1964.  
  1965.     task.wait(0.2)
  1966.     rehookAll()
  1967.  
  1968.     if getgenv().CaptureFunctions then
  1969.         setupFunctionSpy()
  1970.     end
  1971. end)
  1972.  
  1973. getgenv().SignalSpyExecuted = true
  1974.  
  1975. getgenv().SignalSpy = {
  1976.     CONFIG = CONFIG,
  1977.     logs = logs,
  1978.     blacklist = blacklist,
  1979.     blocklist = blocklist,
  1980.     shutdown = shutdown,
  1981.     rehookAll = rehookAll,
  1982.     ExploitCapabilities = ExploitCapabilities,
  1983.     SPAM_PROPERTIES = SPAM_PROPERTIES,
  1984.     INTERESTING_HIDDEN = INTERESTING_HIDDEN,
  1985.     getPropertyValueSmart = getPropertyValueSmart,
  1986.     ugcGetProperty = ugcGetProperty,
  1987.     setupFunctionSpy = setupFunctionSpy,
  1988.     newButton = newButton,
  1989. }
  1990.  
Advertisement
Add Comment
Please, Sign In to add comment