--[[ SimpleSpy v2.2 SOURCE Credits: exx - basically everything Frosty - GUI to Lua ]] -- shuts down the previous instance of SimpleSpy if _G.SimpleSpyExecuted and type(_G.SimpleSpyShutdown) == "function" then _G.SimpleSpyShutdown() end local Players = game:GetService("Players") local CoreGui = game:GetService("CoreGui") local Highlight = loadstring(game:HttpGet("https://github.com/exxtremestuffs/SimpleSpySource/raw/master/highlight.lua"))() ---- GENERATED (kinda sorta mostly) BY GUI to LUA ---- -- Instances: local SimpleSpy2 = Instance.new("ScreenGui") local Background = Instance.new("Frame") local LeftPanel = Instance.new("Frame") local LogList = Instance.new("ScrollingFrame") local UIListLayout = Instance.new("UIListLayout") local RemoteTemplate = Instance.new("Frame") local ColorBar = Instance.new("Frame") local Text = Instance.new("TextLabel") local Button = Instance.new("TextButton") local RightPanel = Instance.new("Frame") local CodeBox = Instance.new("Frame") local ScrollingFrame = Instance.new("ScrollingFrame") local UIGridLayout = Instance.new("UIGridLayout") local FunctionTemplate = Instance.new("Frame") local ColorBar_2 = Instance.new("Frame") local Text_2 = Instance.new("TextLabel") local Button_2 = Instance.new("TextButton") local TopBar = Instance.new("Frame") local Simple = Instance.new("TextButton") local CloseButton = Instance.new("TextButton") local ImageLabel = Instance.new("ImageLabel") local MaximizeButton = Instance.new("TextButton") local ImageLabel_2 = Instance.new("ImageLabel") local MinimizeButton = Instance.new("TextButton") local ImageLabel_3 = Instance.new("ImageLabel") local ToolTip = Instance.new("Frame") local TextLabel = Instance.new("TextLabel") --Properties: SimpleSpy2.Name = "SimpleSpy2" SimpleSpy2.ResetOnSpawn = false Background.Name = "Background" Background.Parent = SimpleSpy2 Background.BackgroundColor3 = Color3.new(1, 1, 1) Background.BackgroundTransparency = 1 Background.Position = UDim2.new(0, 500, 0, 200) Background.Size = UDim2.new(0, 450, 0, 268) LeftPanel.Name = "LeftPanel" LeftPanel.Parent = Background LeftPanel.BackgroundColor3 = Color3.new(0.207843, 0.203922, 0.215686) LeftPanel.BorderSizePixel = 0 LeftPanel.Position = UDim2.new(0, 0, 0, 19) LeftPanel.Size = UDim2.new(0, 131, 0, 249) LogList.Name = "LogList" LogList.Parent = LeftPanel LogList.Active = true LogList.BackgroundColor3 = Color3.new(1, 1, 1) LogList.BackgroundTransparency = 1 LogList.BorderSizePixel = 0 LogList.Position = UDim2.new(0, 0, 0, 9) LogList.Size = UDim2.new(0, 131, 0, 232) LogList.CanvasSize = UDim2.new(0, 0, 0, 0) LogList.ScrollBarThickness = 4 UIListLayout.Parent = LogList UIListLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder RemoteTemplate.Name = "RemoteTemplate" RemoteTemplate.Parent = LogList RemoteTemplate.BackgroundColor3 = Color3.new(1, 1, 1) RemoteTemplate.BackgroundTransparency = 1 RemoteTemplate.Size = UDim2.new(0, 117, 0, 27) ColorBar.Name = "ColorBar" ColorBar.Parent = RemoteTemplate ColorBar.BackgroundColor3 = Color3.new(1, 0.94902, 0) ColorBar.BorderSizePixel = 0 ColorBar.Position = UDim2.new(0, 0, 0, 1) ColorBar.Size = UDim2.new(0, 7, 0, 18) ColorBar.ZIndex = 2 Text.Name = "Text" Text.Parent = RemoteTemplate Text.BackgroundColor3 = Color3.new(1, 1, 1) Text.BackgroundTransparency = 1 Text.Position = UDim2.new(0, 12, 0, 1) Text.Size = UDim2.new(0, 105, 0, 18) Text.ZIndex = 2 Text.Font = Enum.Font.SourceSans Text.Text = "TEXT" Text.TextColor3 = Color3.new(1, 1, 1) Text.TextSize = 14 Text.TextXAlignment = Enum.TextXAlignment.Left Button.Name = "Button" Button.Parent = RemoteTemplate Button.BackgroundColor3 = Color3.new(0, 0, 0) Button.BackgroundTransparency = 0.75 Button.BorderColor3 = Color3.new(1, 1, 1) Button.Position = UDim2.new(0, 0, 0, 1) Button.Size = UDim2.new(0, 117, 0, 18) Button.AutoButtonColor = false Button.Font = Enum.Font.SourceSans Button.Text = "" Button.TextColor3 = Color3.new(0, 0, 0) Button.TextSize = 14 RightPanel.Name = "RightPanel" RightPanel.Parent = Background RightPanel.BackgroundColor3 = Color3.new(0.145098, 0.141176, 0.14902) RightPanel.BorderSizePixel = 0 RightPanel.Position = UDim2.new(0, 131, 0, 19) RightPanel.Size = UDim2.new(0, 319, 0, 249) CodeBox.Name = "CodeBox" CodeBox.Parent = RightPanel CodeBox.BackgroundColor3 = Color3.new(0.0823529, 0.0745098, 0.0784314) CodeBox.BorderSizePixel = 0 CodeBox.Size = UDim2.new(0, 319, 0, 119) ScrollingFrame.Parent = RightPanel ScrollingFrame.Active = true ScrollingFrame.BackgroundColor3 = Color3.new(1, 1, 1) ScrollingFrame.BackgroundTransparency = 1 ScrollingFrame.Position = UDim2.new(0, 0, 0.5, 0) ScrollingFrame.Size = UDim2.new(1, 0, 0.5, -9) ScrollingFrame.CanvasSize = UDim2.new(0, 0, 0, 0) ScrollingFrame.ScrollBarThickness = 4 UIGridLayout.Parent = ScrollingFrame UIGridLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center UIGridLayout.SortOrder = Enum.SortOrder.LayoutOrder UIGridLayout.CellPadding = UDim2.new(0, 0, 0, 0) UIGridLayout.CellSize = UDim2.new(0, 94, 0, 27) FunctionTemplate.Name = "FunctionTemplate" FunctionTemplate.Parent = ScrollingFrame FunctionTemplate.BackgroundColor3 = Color3.new(1, 1, 1) FunctionTemplate.BackgroundTransparency = 1 FunctionTemplate.Size = UDim2.new(0, 117, 0, 23) ColorBar_2.Name = "ColorBar" ColorBar_2.Parent = FunctionTemplate ColorBar_2.BackgroundColor3 = Color3.new(1, 1, 1) ColorBar_2.BorderSizePixel = 0 ColorBar_2.Position = UDim2.new(0, 7, 0, 10) ColorBar_2.Size = UDim2.new(0, 7, 0, 18) ColorBar_2.ZIndex = 3 Text_2.Name = "Text" Text_2.Parent = FunctionTemplate Text_2.BackgroundColor3 = Color3.new(1, 1, 1) Text_2.BackgroundTransparency = 1 Text_2.Position = UDim2.new(0, 19, 0, 10) Text_2.Size = UDim2.new(0, 69, 0, 18) Text_2.ZIndex = 2 Text_2.Font = Enum.Font.SourceSans Text_2.Text = "TEXT" Text_2.TextColor3 = Color3.new(1, 1, 1) Text_2.TextSize = 14 Text_2.TextStrokeColor3 = Color3.new(0.145098, 0.141176, 0.14902) Text_2.TextXAlignment = Enum.TextXAlignment.Left Button_2.Name = "Button" Button_2.Parent = FunctionTemplate Button_2.BackgroundColor3 = Color3.new(0, 0, 0) Button_2.BackgroundTransparency = 0.69999998807907 Button_2.BorderColor3 = Color3.new(1, 1, 1) Button_2.Position = UDim2.new(0, 7, 0, 10) Button_2.Size = UDim2.new(0, 80, 0, 18) Button_2.AutoButtonColor = false Button_2.Font = Enum.Font.SourceSans Button_2.Text = "" Button_2.TextColor3 = Color3.new(0, 0, 0) Button_2.TextSize = 14 TopBar.Name = "TopBar" TopBar.Parent = Background TopBar.BackgroundColor3 = Color3.new(0.145098, 0.141176, 0.14902) TopBar.BorderSizePixel = 0 TopBar.Size = UDim2.new(0, 450, 0, 19) Simple.Name = "Simple" Simple.Parent = TopBar Simple.BackgroundColor3 = Color3.new(1, 1, 1) Simple.AutoButtonColor = false Simple.BackgroundTransparency = 1 Simple.Position = UDim2.new(0, 5, 0, 0) Simple.Size = UDim2.new(0, 57, 0, 18) Simple.Font = Enum.Font.SourceSansBold Simple.Text = "SimpleSpy" Simple.TextColor3 = Color3.new(1, 1, 1) Simple.TextSize = 14 Simple.TextXAlignment = Enum.TextXAlignment.Left CloseButton.Name = "CloseButton" CloseButton.Parent = TopBar CloseButton.BackgroundColor3 = Color3.new(0.145098, 0.141176, 0.14902) CloseButton.BorderSizePixel = 0 CloseButton.Position = UDim2.new(1, -19, 0, 0) CloseButton.Size = UDim2.new(0, 19, 0, 19) CloseButton.Font = Enum.Font.SourceSans CloseButton.Text = "" CloseButton.TextColor3 = Color3.new(0, 0, 0) CloseButton.TextSize = 14 ImageLabel.Parent = CloseButton ImageLabel.BackgroundColor3 = Color3.new(1, 1, 1) ImageLabel.BackgroundTransparency = 1 ImageLabel.Position = UDim2.new(0, 5, 0, 5) ImageLabel.Size = UDim2.new(0, 9, 0, 9) ImageLabel.Image = "http://www.roblox.com/asset/?id=5597086202" MaximizeButton.Name = "MaximizeButton" MaximizeButton.Parent = TopBar MaximizeButton.BackgroundColor3 = Color3.new(0.145098, 0.141176, 0.14902) MaximizeButton.BorderSizePixel = 0 MaximizeButton.Position = UDim2.new(1, -38, 0, 0) MaximizeButton.Size = UDim2.new(0, 19, 0, 19) MaximizeButton.Font = Enum.Font.SourceSans MaximizeButton.Text = "" MaximizeButton.TextColor3 = Color3.new(0, 0, 0) MaximizeButton.TextSize = 14 ImageLabel_2.Parent = MaximizeButton ImageLabel_2.BackgroundColor3 = Color3.new(1, 1, 1) ImageLabel_2.BackgroundTransparency = 1 ImageLabel_2.Position = UDim2.new(0, 5, 0, 5) ImageLabel_2.Size = UDim2.new(0, 9, 0, 9) ImageLabel_2.Image = "http://www.roblox.com/asset/?id=5597108117" MinimizeButton.Name = "MinimizeButton" MinimizeButton.Parent = TopBar MinimizeButton.BackgroundColor3 = Color3.new(0.145098, 0.141176, 0.14902) MinimizeButton.BorderSizePixel = 0 MinimizeButton.Position = UDim2.new(1, -57, 0, 0) MinimizeButton.Size = UDim2.new(0, 19, 0, 19) MinimizeButton.Font = Enum.Font.SourceSans MinimizeButton.Text = "" MinimizeButton.TextColor3 = Color3.new(0, 0, 0) MinimizeButton.TextSize = 14 ImageLabel_3.Parent = MinimizeButton ImageLabel_3.BackgroundColor3 = Color3.new(1, 1, 1) ImageLabel_3.BackgroundTransparency = 1 ImageLabel_3.Position = UDim2.new(0, 5, 0, 5) ImageLabel_3.Size = UDim2.new(0, 9, 0, 9) ImageLabel_3.Image = "http://www.roblox.com/asset/?id=5597105827" ToolTip.Name = "ToolTip" ToolTip.Parent = SimpleSpy2 ToolTip.BackgroundColor3 = Color3.fromRGB(26, 26, 26) ToolTip.BackgroundTransparency = 0.1 ToolTip.BorderColor3 = Color3.new(1, 1, 1) ToolTip.Size = UDim2.new(0, 200, 0, 50) ToolTip.ZIndex = 3 ToolTip.Visible = false TextLabel.Parent = ToolTip TextLabel.BackgroundColor3 = Color3.new(1, 1, 1) TextLabel.BackgroundTransparency = 1 TextLabel.Position = UDim2.new(0, 2, 0, 2) TextLabel.Size = UDim2.new(0, 196, 0, 46) TextLabel.ZIndex = 3 TextLabel.Font = Enum.Font.SourceSans TextLabel.Text = "This is some slightly longer text." TextLabel.TextColor3 = Color3.new(1, 1, 1) TextLabel.TextSize = 14 TextLabel.TextWrapped = true TextLabel.TextXAlignment = Enum.TextXAlignment.Left TextLabel.TextYAlignment = Enum.TextYAlignment.Top ------------------------------------------------------------------------------- -- init local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local ContentProvider = game:GetService("ContentProvider") local TextService = game:GetService("TextService") local Mouse = game:GetService("Players").LocalPlayer:GetMouse() local selectedColor = Color3.new(0.321569, 0.333333, 1) local deselectedColor = Color3.new(0.8, 0.8, 0.8) --- So things are descending local layoutOrderNum = 999999999 --- Whether or not the gui is closing local mainClosing = false --- Whether or not the gui is closed (defaults to false) local closed = false --- Whether or not the sidebar is closing local sideClosing = false --- Whether or not the sidebar is closed (defaults to true but opens automatically on remote selection) local sideClosed = false --- Whether or not the code box is maximized (defaults to false) local maximized = false --- The event logs to be read from local logs = {} --- The event currently selected.Log (defaults to nil) local selected = nil --- The blacklist (can be a string name or the Remote Instance) local blacklist = {} --- The block list (can be a string name or the Remote Instance) local blocklist = {} --- Whether or not to add getNil function local getNil = false --- Array of remotes (and original functions) connected to local connectedRemotes = {} --- True = hookfunction, false = namecall local toggle = false local gm = getrawmetatable(game) local original = gm.__namecall setreadonly(gm, false) --- used to prevent recursives local prevTables = {} --- holds logs (for deletion) local remoteLogs = {} --- used for hookfunction local remoteEvent = Instance.new("RemoteEvent") --- used for hookfunction local remoteFunction = Instance.new("RemoteFunction") local originalEvent = remoteEvent.FireServer local originalFunction = remoteFunction.InvokeServer --- the maximum amount of remotes allowed in logs _G.SIMPLESPYCONFIG_MaxRemotes = 500 --- how many spaces to indent local indent = 4 --- used for task scheduler local scheduled = {} --- RBXScriptConnect of the task scheduler local schedulerconnect local SimpleSpy = {} local topstr = "" local bottomstr = "" local remotesFadeIn local rightFadeIn local codebox local p local getnilrequired = false -- autoblock variables local autoblock = false local history = {} local excluding = {} -- function info variables local funcEnabled = true -- remote hooking/connecting api variables local remoteSignals = {} local remoteHooks = {} -- original mouse icon local oldIcon = Mouse.Icon -- if mouse inside gui local mouseInGui = false -- handy array of RBXScriptConnections to disconnect on shutdown local connections = {} -- whether or not SimpleSpy uses 'getcallingscript()' to get the script (default is false because detection) local useGetCallingScript = false -- functions --- Converts arguments to a string and generates code that calls the specified method with them, recommended to be used in conjunction with ValueToString (method must be a string, e.g. `game:GetService("ReplicatedStorage").Remote:FireServer`) --- @param method string --- @param args any[] --- @return string function SimpleSpy:ArgsToString(method, args) assert(typeof(method) == "string", "string expected, got " .. typeof(method)) assert(typeof(args) == "table", "table expected, got " .. typeof(args)) return v2v({args = args}) .. "\n\n" .. method .. "(unpack(args))" end --- Converts a value to variables with the specified index as the variable name (if nil/invalid then the name will be assigned automatically) --- @param t any[] --- @return string function SimpleSpy:TableToVars(t) assert(typeof(t) == "table", "table expected, got " .. typeof(t)) return v2v(t) end --- Converts a value to a variable with the specified `variablename` (if nil/invalid then the name will be assigned automatically) --- @param value any --- @return string function SimpleSpy:ValueToVar(value, variablename) assert(variablename == nil or typeof(variablename) == "string", "string expected, got " .. typeof(variablename)) if not variablename then variablename = 1 end return v2v({[variablename] = value}) end --- Converts any value to a string, cannot preserve function contents --- @param value any --- @return string function SimpleSpy:ValueToString(value) return v2s(value) end --- Generates the simplespy function info --- @param func function --- @return string function SimpleSpy:GetFunctionInfo(func) assert(typeof(func) == "function", "Instance expected, got " .. typeof(func)) return v2v{functionInfo = { info = debug.getinfo(func), constants = debug.getconstants(func) }} end --- Gets the ScriptSignal for a specified remote being fired --- @param remote Instance function SimpleSpy:GetRemoteFiredSignal(remote) assert(typeof(remote) == "Instance", "Instance expected, got " .. typeof(remote)) if not remoteSignals[remote] then remoteSignals[remote] = newSignal() end return remoteSignals[remote] end --- Allows for direct hooking of remotes **THIS CAN BE VERY DANGEROUS** --- @param remote Instance --- @param f function function SimpleSpy:HookRemote(remote, f) assert(typeof(remote) == "Instance", "Instance expected, got " .. typeof(remote)) assert(typeof(f) == "function", "function expected, got " .. typeof(f)) remoteHooks[remote] = f end --- Blocks the specified remote instance/string --- @param remote any function SimpleSpy:BlockRemote(remote) assert(typeof(remote) == "Instance" or typeof(remote) == "string", "Instance | string expected, got " .. typeof(remote)) blocklist[remote] = true end --- Excludes the specified remote from logs (instance/string) --- @param remote any function SimpleSpy:ExcludeRemote(remote) assert(typeof(remote) == "Instance" or typeof(remote) == "string", "Instance | string expected, got " .. typeof(remote)) blacklist[remote] = true end --- Creates a new ScriptSignal that can be connected to and fired --- @return table function newSignal() local connected = {} return { Connect = function(self, f) assert(connected, "Signal is closed") connected[tostring(f)] = f return setmetatable({ Connected = true, Disconnect = function(self) if not connected then warn("Signal is already closed") end self.Connected = false connected[tostring(f)] = nil end }, { __index = function(self, i) if i == "Connected" then return not not connected[tostring(f)] end end }) end, Fire = function(self, ...) for _, f in pairs(connected) do coroutine.wrap(f)(...) end end } end --- Prevents remote spam from causing lag (clears logs after `_G.SIMPLESPYCONFIG_MaxRemotes` or 500 remotes) function clean() local max = _G.SIMPLESPYCONFIG_MaxRemotes if not typeof(max) == "number" and math.floor(max) ~= max then max = 500 end if #remoteLogs > max then for i = 100, #remoteLogs do local v = remoteLogs[i] if typeof(v[1]) == "RBXScriptConnection" then v[1]:Disconnect() end if typeof(v[2]) == "Instance" then v[2]:Destroy() end end local newLogs = {} for i = 1, 100 do table.insert(newLogs, remoteLogs[i]) end remoteLogs = newLogs end end --- Scales the ToolTip to fit containing text function scaleToolTip() local size = TextService:GetTextSize(TextLabel.Text, TextLabel.TextSize, TextLabel.Font, Vector2.new(196, math.huge)) TextLabel.Size = UDim2.new(0, size.X, 0, size.Y) ToolTip.Size = UDim2.new(0, size.X + 4, 0, size.Y + 4) end --- Executed when the toggle button (the SimpleSpy logo) is hovered over function onToggleButtonHover() if not toggle then TweenService:Create(Simple, TweenInfo.new(0.5), {TextColor3 = Color3.fromRGB(252, 51, 51)}):Play() else TweenService:Create(Simple, TweenInfo.new(0.5), {TextColor3 = Color3.fromRGB(68, 206, 91)}):Play() end end --- Executed when the toggle button is unhovered over function onToggleButtonUnhover() TweenService:Create(Simple, TweenInfo.new(0.5), {TextColor3 = Color3.fromRGB(255, 255, 255)}):Play() end --- Executed when the X button is hovered over function onXButtonHover() TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(255, 60, 60)}):Play() end --- Executed when the X button is unhovered over function onXButtonUnhover() TweenService:Create(CloseButton, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(37, 36, 38)}):Play() end --- Toggles the remote spy method (when button clicked) function onToggleButtonClick() if toggle then TweenService:Create(Simple, TweenInfo.new(0.5), {TextColor3 = Color3.fromRGB(252, 51, 51)}):Play() else TweenService:Create(Simple, TweenInfo.new(0.5), {TextColor3 = Color3.fromRGB(68, 206, 91)}):Play() end toggleSpyMethod() end --- Reconnects bringBackOnResize if the current viewport changes and also connects it initially function connectResize() local lastCam = workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(bringBackOnResize) workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function() lastCam:Disconnect() if workspace.CurrentCamera then lastCam = workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(bringBackOnResize) end end) end --- Brings gui back if it gets lost offscreen (connected to the camera viewport changing) function bringBac