Run it
Copy the script and paste it into your executor.
.SimpleSpyExecuted (.SimpleSpyShutdown) ==
((.SimpleSpyShutdown))
Players = :()
CoreGui = :()
Highlight =
(
:()
)()
SimpleSpy2 = .()
Background = .()
LeftPanel = .()
LogList = .()
UIListLayout = .()
RemoteTemplate = .()
ColorBar = .()
Text = .()
Button = .()
RightPanel = .()
CodeBox = .()
ScrollingFrame = .()
UIGridLayout = .()
FunctionTemplate = .()
ColorBar_2 = .()
Text_2 = .()
Button_2 = .()
TopBar = .()
Simple = .()
CloseButton = .()
ImageLabel = .()
MaximizeButton = .()
ImageLabel_2 = .()
MinimizeButton = .()
ImageLabel_3 = .()
ToolTip = .()
TextLabel = .()
gui = .(,Background)
nextb = .(, gui)
gui = .(, nextb)
SimpleSpy2.Name =
SimpleSpy2.ResetOnSpawn =
SpyFind = CoreGui:(SimpleSpy2.Name)
SpyFind SpyFind ~= SimpleSpy2
SpyFind:()
Background.Name =
Background.Parent = SimpleSpy2
Background.BackgroundColor3 = .(, , )
Background.BackgroundTransparency =
Background.Position = .(, , , )
Background.Size = .(, , , )
Background.Active =
Background.Draggable =
nextb.Position = .(,,,)
nextb.Size = .(,,,)
nextb.BackgroundColor3 = .(, , )
nextb.Image =
nextb.Active =
nextb.Draggable =
nextb.MouseButton1Down:(()
nextb.Image = (Background.Visible )
Background.Visible = Background.Visible
)
LeftPanel.Name =
LeftPanel.Parent = Background
LeftPanel.BackgroundColor3 = .(, , )
LeftPanel.BorderSizePixel =
LeftPanel.Position = .(, , , )
LeftPanel.Size = .(, , , )
LogList.Name =
LogList.Parent = LeftPanel
LogList.Active =
LogList.BackgroundColor3 = .(, , )
LogList.BackgroundTransparency =
LogList.BorderSizePixel =
LogList.Position = .(, , , )
LogList.Size = .(, , , )
LogList.CanvasSize = .(, , , )
LogList.ScrollBarThickness =
UIListLayout.Parent = LogList
UIListLayout.HorizontalAlignment = .HorizontalAlignment.Center
UIListLayout.SortOrder = .SortOrder.LayoutOrder
RemoteTemplate.Name =
RemoteTemplate.Parent = LogList
RemoteTemplate.BackgroundColor3 = .(, , )
RemoteTemplate.BackgroundTransparency =
RemoteTemplate.Size = .(, , , )
ColorBar.Name =
ColorBar.Parent = RemoteTemplate
ColorBar.BackgroundColor3 = .(, , )
ColorBar.BorderSizePixel =
ColorBar.Position = .(, , , )
ColorBar.Size = .(, , , )
ColorBar.ZIndex =
Text.Name =
Text.Parent = RemoteTemplate
Text.BackgroundColor3 = .(, , )
Text.BackgroundTransparency =
Text.Position = .(, , , )
Text.Size = .(, , , )
Text.ZIndex =
Text.Font = .Font.SourceSans
Text.Text =
Text.TextColor3 = .(, , )
Text.TextSize =
Text.TextXAlignment = .TextXAlignment.Left
Text.TextWrapped =
Button.Name =
Button.Parent = RemoteTemplate
Button.BackgroundColor3 = .(, , )
Button.BackgroundTransparency =
Button.BorderColor3 = .(, , )
Button.Position = .(, , , )
Button.Size = .(, , , )
Button.AutoButtonColor =
Button.Font = .Font.SourceSans
Button.Text =
Button.TextColor3 = .(, , )
Button.TextSize =
RightPanel.Name =
RightPanel.Parent = Background
RightPanel.BackgroundColor3 = .(, , )
RightPanel.BorderSizePixel =
RightPanel.Position = .(, , , )
RightPanel.Size = .(, , , )
CodeBox.Name =
CodeBox.Parent = RightPanel
CodeBox.BackgroundColor3 = .(, , )
CodeBox.BorderSizePixel =
CodeBox.Size = .(, , , )
ScrollingFrame.Parent = RightPanel
ScrollingFrame.Active =
ScrollingFrame.BackgroundColor3 = .(, , )
ScrollingFrame.BackgroundTransparency =
ScrollingFrame.Position = .(, , , )
ScrollingFrame.Size = .(, , , -)
ScrollingFrame.CanvasSize = .(, , , )
ScrollingFrame.ScrollBarThickness =
UIGridLayout.Parent = ScrollingFrame
UIGridLayout.HorizontalAlignment = .HorizontalAlignment.Center
UIGridLayout.SortOrder = .SortOrder.LayoutOrder
UIGridLayout.CellPadding = .(, , , )
UIGridLayout.CellSize = .(, , , )
FunctionTemplate.Name =
FunctionTemplate.Parent = ScrollingFrame
FunctionTemplate.BackgroundColor3 = .(, , )
FunctionTemplate.BackgroundTransparency =
FunctionTemplate.Size = .(, , , )
ColorBar_2.Name =
ColorBar_2.Parent = FunctionTemplate
ColorBar_2.BackgroundColor3 = .(, , )
ColorBar_2.BorderSizePixel =
ColorBar_2.Position = .(, , , )
ColorBar_2.Size = .(, , , )
ColorBar_2.ZIndex =
Text_2.Name =
Text_2.Parent = FunctionTemplate
Text_2.BackgroundColor3 = .(, , )
Text_2.BackgroundTransparency =
Text_2.Position = .(, , , )
Text_2.Size = .(, , , )
Text_2.ZIndex =
Text_2.Font = .Font.SourceSans
Text_2.Text =
Text_2.TextColor3 = .(, , )
Text_2.TextSize =
Text_2.TextStrokeColor3 = .(, , )
Text_2.TextXAlignment = .TextXAlignment.Left
Text_2.TextWrapped =
Button_2.Name =
Button_2.Parent = FunctionTemplate
Button_2.BackgroundColor3 = .(, , )
Button_2.BackgroundTransparency =
Button_2.BorderColor3 = .(, , )
Button_2.Position = .(, , , )
Button_2.Size = .(, , , )
Button_2.AutoButtonColor =
Button_2.Font = .Font.SourceSans
Button_2.Text =
Button_2.TextColor3 = .(, , )
Button_2.TextSize =
TopBar.Name =
TopBar.Parent = Background
TopBar.BackgroundColor3 = .(, , )
TopBar.BorderSizePixel =
TopBar.Size = .(, , , )
Simple.Name =
Simple.Parent = TopBar
Simple.BackgroundColor3 = .(, , )
Simple.AutoButtonColor =
Simple.BackgroundTransparency =
Simple.Position = .(, , , )
Simple.Size = .(, , , )
Simple.Font = .Font.SourceSansBold
Simple.Text =
Simple.TextColor3 = .(, , )
Simple.TextSize =
Simple.TextXAlignment = .TextXAlignment.Left
CloseButton.Name =
CloseButton.Parent = TopBar
CloseButton.BackgroundColor3 = .(, , )
CloseButton.BorderSizePixel =
CloseButton.Position = .(, -, , )
CloseButton.Size = .(, , , )
CloseButton.Font = .Font.SourceSans
CloseButton.Text =
CloseButton.TextColor3 = .(, , )
CloseButton.TextSize =
ImageLabel.Parent = CloseButton
ImageLabel.BackgroundColor3 = .(, , )
ImageLabel.BackgroundTransparency =
ImageLabel.Position = .(, , , )
ImageLabel.Size = .(, , , )
ImageLabel.Image =
MaximizeButton.Name =
MaximizeButton.Parent = TopBar
MaximizeButton.BackgroundColor3 = .(, , )
MaximizeButton.BorderSizePixel =
MaximizeButton.Position = .(, -, , )
MaximizeButton.Size = .(, , , )
MaximizeButton.Font = .Font.SourceSans
MaximizeButton.Text =
MaximizeButton.TextColor3 = .(, , )
MaximizeButton.TextSize =
ImageLabel_2.Parent = MaximizeButton
ImageLabel_2.BackgroundColor3 = .(, , )
ImageLabel_2.BackgroundTransparency =
ImageLabel_2.Position = .(, , , )
ImageLabel_2.Size = .(, , , )
ImageLabel_2.Image =
MinimizeButton.Name =
MinimizeButton.Parent = TopBar
MinimizeButton.BackgroundColor3 = .(, , )
MinimizeButton.BorderSizePixel =
MinimizeButton.Position = .(, -, , )
MinimizeButton.Size = .(, , , )
MinimizeButton.Font = .Font.SourceSans
MinimizeButton.Text =
MinimizeButton.TextColor3 = .(, , )
MinimizeButton.TextSize =
ImageLabel_3.Parent = MinimizeButton
ImageLabel_3.BackgroundColor3 = .(, , )
ImageLabel_3.BackgroundTransparency =
ImageLabel_3.Position = .(, , , )
ImageLabel_3.Size = .(, , , )
ImageLabel_3.Image =
ToolTip.Name =
ToolTip.Parent = SimpleSpy2
ToolTip.BackgroundColor3 = .(, , )
ToolTip.BackgroundTransparency =
ToolTip.BorderColor3 = .(, , )
ToolTip.Size = .(, , , )
ToolTip.ZIndex =
ToolTip.Visible =
TextLabel.Parent = ToolTip
TextLabel.BackgroundColor3 = .(, , )
TextLabel.BackgroundTransparency =
TextLabel.Position = .(, , , )
TextLabel.Size = .(, , , )
TextLabel.ZIndex =
TextLabel.Font = .Font.SourceSans
TextLabel.Text =
TextLabel.TextColor3 = .(, , )
TextLabel.TextSize =
TextLabel.TextWrapped =
TextLabel.TextXAlignment = .TextXAlignment.Left
TextLabel.TextYAlignment = .TextYAlignment.Top
RunService = :()
UserInputService = :()
TweenService = :()
ContentProvider = :()
TextService = :()
Mouse
selectedColor = .(, , )
deselectedColor = .(, , )
layoutOrderNum =
mainClosing =
closed =
sideClosing =
sideClosed =
maximized =
logs = {}
selected =
blacklist = {}
blocklist = {}
getNil =
connectedRemotes = {}
toggle =
gm
original
prevTables = {}
remoteLogs = {}
remoteEvent = .()
remoteFunction = .()
originalEvent = remoteEvent.FireServer
originalFunction = remoteFunction.InvokeServer
.SIMPLESPYCONFIG_MaxRemotes =
indent =
scheduled = {}
schedulerconnect
SimpleSpy = {}
topstr =
bottomstr =
remotesFadeIn
rightFadeIn
codebox
p
getnilrequired =
autoblock =
history = {}
excluding = {}
funcEnabled =
remoteSignals = {}
remoteHooks = {}
oldIcon
mouseInGui =
connections = {}
useGetCallingScript =
keyToString =
recordReturnValues =
SimpleSpy:(method, args)
((method) == , .. (method))
((args) == , .. (args))
({ args = args }) .. .. method ..
SimpleSpy:(t)
((t) == , .. (t))
(t)
SimpleSpy:(value, variablename)
(variablename == (variablename) == , .. (variablename))
variablename
variablename =
({ [variablename] = value })
SimpleSpy:(value)
(value)
SimpleSpy:(func)
((func) == , .. (func))
()
({ functionInfo = {
info = debug.(func),
constants = debug.(func),
} })
SimpleSpy:(remote)
((remote) == , .. (remote))
remoteSignals[remote]
remoteSignals[remote] = ()
remoteSignals[remote]
SimpleSpy:(remote, f)
((remote) == , .. (remote))
((f) == , .. (f))
remoteHooks[remote] = f
SimpleSpy:(remote)
(
(remote) == (remote) == ,
.. (remote)
)
blocklist[remote] =
SimpleSpy:(remote)
(
(remote) == (remote) == ,
.. (remote)
)
blacklist[remote] =
()
connected = {}
{
Connect = (self, f)
(connected, )
connected[(f)] = f
{
Connected = ,
Disconnect = (self)
connected
()
self.Connected =
connected[(f)] =
,
}
,
Wait = (self)
thread = .()
connection
connection = self:(()
connection:()
.(thread) ==
.(thread)
)
.()
,
Fire = (self, ...)
_, f (connected)
.(f)(...)
,
}
()
max = .SIMPLESPYCONFIG_MaxRemotes
(max) == .(max) ~= max
max =
#remoteLogs > max
i = , #remoteLogs
v = remoteLogs[i]
(v[]) ==
v[]:()
(v[]) ==
v[]:()
newLogs = {}
i = ,
.(newLogs, remoteLogs[i])
remoteLogs = newLogs
()
size = TextService:(
TextLabel.Text,
TextLabel.TextSize,
TextLabel.Font,
.(, .huge)
)
TextLabel.Size = .(, size.X, , size.Y)
ToolTip.Size = .(, size.X + , , size.Y + )
()
toggle
TweenService:(Simple, TweenInfo.(), { TextColor3 = .(, , ) }):()
TweenService:(Simple, TweenInfo.(), { TextColor3 = .(, , ) }):()
()
TweenService:(Simple, TweenInfo.(), { TextColor3 = .(, , ) }):()
()
TweenService:(CloseButton, TweenInfo.(), { BackgroundColor3 = .(, , ) }):()
()
TweenService:(CloseButton, TweenInfo.(), { BackgroundColor3 = .(, , ) }):()
()
toggle
TweenService:(Simple, TweenInfo.(), { TextColor3 = .(, , ) }):()
TweenService:(Simple, TweenInfo.(), { TextColor3 = .(, , ) }):()
()
()
lastCam = .CurrentCamera:():(bringBackOnResize)
:():(()
lastCam:()
.CurrentCamera
lastCam = .CurrentCamera:():(bringBackOnResize)
)
()
()
sideClosed
()
()
currentX = Background.AbsolutePosition.X
currentY = Background.AbsolutePosition.Y
viewportSize = .CurrentCamera.ViewportSize
(currentX < ) (currentX > (viewportSize.X - (sideClosed Background.AbsoluteSize.X)))
currentX <
currentX =
currentX = viewportSize.X - (sideClosed Background.AbsoluteSize.X)
(currentY < ) (currentY > (viewportSize.Y - (closed Background.AbsoluteSize.Y) - ))
currentY <
currentY =
currentY = viewportSize.Y - (closed Background.AbsoluteSize.Y) -
TweenService.(
TweenService,
Background,
TweenInfo.(),
{ Position = .(, currentX, , currentY) }
):()
(input)
input.UserInputType == .UserInputType.MouseButton1
lastPos = UserInputService.(UserInputService)
mainPos = Background.AbsolutePosition
offset = mainPos - lastPos
currentPos = offset + lastPos
RunService.(RunService, , , ()
newPos = UserInputService.(UserInputService)
newPos ~= lastPos
currentX = (offset + newPos).X
currentY = (offset + newPos).Y
viewportSize = .CurrentCamera.ViewportSize
(currentX < currentX < currentPos.X)
(
currentX > (viewportSize.X - (sideClosed TopBar.AbsoluteSize.X))
currentX > currentPos.X
)
currentX <
currentX =
currentX = viewportSize.X - (sideClosed TopBar.AbsoluteSize.X)
(currentY < currentY < currentPos.Y)
(
currentY > (viewportSize.Y - (closed Background.AbsoluteSize.Y) - )
currentY > currentPos.Y
)
currentY <
currentY =
currentY = viewportSize.Y - (closed Background.AbsoluteSize.Y) -
currentPos = .(currentX, currentY)
lastPos = newPos
TweenService.(
TweenService,
Background,
TweenInfo.(),
{ Position = .(, currentPos.X, , currentPos.Y) }
):()
)
.(
connections,
UserInputService.InputEnded:((inputE)
input == inputE
RunService:()
)
)
(elements)
data = {}
_, v (elements)
(v) == v:() v.Visible
.(()
data[v] = {
BackgroundTransparency = v.BackgroundTransparency,
}
TweenService:(v, TweenInfo.(), { BackgroundTransparency = }):()
v:() v:() v:()
data[v].TextTransparency = v.TextTransparency
TweenService:(v, TweenInfo.(), { TextTransparency = }):()
v:() v:()
data[v].ImageTransparency = v.ImageTransparency
TweenService:(v, TweenInfo.(), { ImageTransparency = }):()
()
v.Visible =
i, x (data[v])
v[i] = x
data[v] =
)()
()
i, _ (data)
.(()
properties = {
BackgroundTransparency = i.BackgroundTransparency,
}
i.BackgroundTransparency =
TweenService
:(i, TweenInfo.(), { BackgroundTransparency = properties.BackgroundTransparency })
:()
i:() i:() i:()
properties.TextTransparency = i.TextTransparency
i.TextTransparency =
TweenService
:(i, TweenInfo.(), { TextTransparency = properties.TextTransparency })
:()
i:() i:()
properties.ImageTransparency = i.ImageTransparency
i.ImageTransparency =
TweenService
:(i, TweenInfo.(), { ImageTransparency = properties.ImageTransparency })
:()
i.Visible =
)()
(override)
mainClosing override maximized
mainClosing =
closed = closed
closed
sideClosed
()
LeftPanel.Visible =
TweenService:(LeftPanel, TweenInfo.(), { Size = .(, , , ) }):()
()
remotesFadeIn = (LeftPanel:())
()
TweenService:(LeftPanel, TweenInfo.(), { Size = .(, , , ) }):()
()
remotesFadeIn
()
remotesFadeIn =
()
mainClosing =
(override)
sideClosing override maximized
sideClosing =
sideClosed = sideClosed
sideClosed
rightFadeIn = (RightPanel:())
()
()
()
RightPanel.Visible =
closed
()
RightPanel.Visible =
()
()
rightFadeIn
()
()
sideClosing =
()
sideClosed maximized
maximized =
disable = .()
prevSize = .(, CodeBox.AbsoluteSize.X, , CodeBox.AbsoluteSize.Y)
prevPos = .(, CodeBox.AbsolutePosition.X, , CodeBox.AbsolutePosition.Y)
disable.Size = .(, , , )
disable.BackgroundColor3 = .()
disable.BorderSizePixel =
disable.Text =
disable.ZIndex =
disable.BackgroundTransparency =
disable.AutoButtonColor =
CodeBox.ZIndex =
CodeBox.Position = prevPos
CodeBox.Size = prevSize
TweenService
:(
CodeBox,
TweenInfo.(),
{ Size = .(, , , ), Position = .(, , , ) }
)
:()
TweenService:(disable, TweenInfo.(), { BackgroundTransparency = }):()
disable.MouseButton1Click:(()
UserInputService:().Y + >= CodeBox.AbsolutePosition.Y
UserInputService:().Y + <= CodeBox.AbsolutePosition.Y + CodeBox.AbsoluteSize.Y
UserInputService:().X >= CodeBox.AbsolutePosition.X
UserInputService:().X <= CodeBox.AbsolutePosition.X + CodeBox.AbsoluteSize.X
TweenService:(CodeBox, TweenInfo.(), { Size = prevSize, Position = prevPos }):()
TweenService:(disable, TweenInfo.(), { BackgroundTransparency = }):()
maximized =
()
disable:()
CodeBox.Size = .(, , , )
CodeBox.Position = .(, , , )
CodeBox.ZIndex =
)
(speed)
speed
speed =
TweenService
:(
LeftPanel,
TweenInfo.(speed),
{ Size = .(LeftPanel.AbsoluteSize.X, Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(RightPanel, TweenInfo.(speed), {
Size = .(
Background.AbsoluteSize.X - LeftPanel.AbsoluteSize.X,
Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y
),
})
:()
TweenService
:(
TopBar,
TweenInfo.(speed),
{ Size = .(Background.AbsoluteSize.X, TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(ScrollingFrame, TweenInfo.(speed), {
Size = .(Background.AbsoluteSize.X - LeftPanel.AbsoluteSize.X, ),
Position = .(, Background.AbsoluteSize.Y - - TopBar.AbsoluteSize.Y),
})
:()
TweenService
:(CodeBox, TweenInfo.(speed), {
Size = .(
Background.AbsoluteSize.X - LeftPanel.AbsoluteSize.X,
Background.AbsoluteSize.Y - - TopBar.AbsoluteSize.Y
),
})
:()
TweenService
:(
LogList,
TweenInfo.(speed),
{ Size = .(LogList.AbsoluteSize.X, Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y - ) }
)
:()
(speed)
speed
speed =
TweenService
:(
LeftPanel,
TweenInfo.(speed),
{ Size = .(LeftPanel.AbsoluteSize.X, Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(
RightPanel,
TweenInfo.(speed),
{ Size = .(, Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(
TopBar,
TweenInfo.(speed),
{ Size = .(LeftPanel.AbsoluteSize.X, TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(ScrollingFrame, TweenInfo.(speed), {
Size = .(, ),
Position = .(, Background.AbsoluteSize.Y - - TopBar.AbsoluteSize.Y),
})
:()
TweenService
:(
CodeBox,
TweenInfo.(speed),
{ Size = .(, Background.AbsoluteSize.Y - - TopBar.AbsoluteSize.Y) }
)
:()
TweenService
:(
LogList,
TweenInfo.(speed),
{ Size = .(LogList.AbsoluteSize.X, Background.AbsoluteSize.Y - TopBar.AbsoluteSize.Y - ) }
)
:()
()
x, y = Background.AbsoluteSize.X, Background.AbsoluteSize.Y
screenSize = .CurrentCamera.ViewportSize
x + Background.AbsolutePosition.X > screenSize.X
screenSize.X - Background.AbsolutePosition.X >=
x = screenSize.X - Background.AbsolutePosition.X
x =
y + Background.AbsolutePosition.Y > screenSize.Y
screenSize.X - Background.AbsolutePosition.Y >=
y = screenSize.Y - Background.AbsolutePosition.Y
y =
Background.Size = .(x, y)
(instance)
_, v (Players:())
v.Character (instance:(v.Character) instance == v.Character)
v
(frame)
selected selected.Log selected.Log.Button
TweenService
:(selected.Log.Button, TweenInfo.(), { BackgroundColor3 = .(, , ) })
:()
selected =
_, v (logs)
frame == v.Log
selected = v
selected selected.Log
TweenService
:(frame.Button, TweenInfo.(), { BackgroundColor3 = .(, , ) })
:()
codebox:(selected.GenScript)
sideClosed
()
()
ScrollingFrame.CanvasSize = .(UIGridLayout.AbsoluteContentSize.X, UIGridLayout.AbsoluteContentSize.Y)
()
LogList.CanvasSize = .(UIListLayout.AbsoluteContentSize.X, UIListLayout.AbsoluteContentSize.Y)
(enable, text)
enable
ToolTip.Visible
ToolTip.Visible =
RunService:()
first =
RunService:(, , ()
topLeft = .(Mouse.X + , Mouse.Y + )
bottomRight = topLeft + ToolTip.AbsoluteSize
topLeft.X <
topLeft = .(, topLeft.Y)
bottomRight.X > .CurrentCamera.ViewportSize.X
topLeft = .(.CurrentCamera.ViewportSize.X - ToolTip.AbsoluteSize.X, topLeft.Y)
topLeft.Y <
topLeft = .(topLeft.X, )
bottomRight.Y > .CurrentCamera.ViewportSize.Y -
topLeft = .(topLeft.X, .CurrentCamera.ViewportSize.Y - ToolTip.AbsoluteSize.Y - )
topLeft.X <= Mouse.X topLeft.Y <= Mouse.Y
topLeft = .(Mouse.X - ToolTip.AbsoluteSize.X - , Mouse.Y - ToolTip.AbsoluteSize.Y - )
first
ToolTip.Position = .(topLeft.X, topLeft.Y)
first =
ToolTip:(.(topLeft.X, topLeft.Y), , , )
)
TextLabel.Text = text
ToolTip.Visible =
ToolTip.Visible
ToolTip.Visible =
RunService:()
(name, description, onClick)
button = FunctionTemplate:()
button.Text.Text = name
button.Button.MouseEnter:(()
(, ())
)
button.Button.MouseLeave:(()
()
)
button.AncestryChanged:(()
()
)
button.Button.MouseButton1Click:((...)
(button, ...)
)
button.Parent = ScrollingFrame
()
(, name, args, remote, function_info, blocked, src, returnValue)
remoteFrame = RemoteTemplate:()
remoteFrame.Text.Text = .(name, , )
remoteFrame.ColorBar.BackgroundColor3 = == .(, , ) .(, , )
id = .()
id.Name =
id.Value = #logs +
id.Parent = remoteFrame
weakRemoteTable = ({ remote = remote }, { __mode = })
log = {
Name = name,
Function = function_info,
Remote = weakRemoteTable,
Log = remoteFrame,
Blocked = blocked,
Source = src,
GenScript = ,
ReturnValue = returnValue,
}
logs[#logs + ] = log
(()
log.GenScript = (remote, args)
blocked
logs[#logs].GenScript =
.. logs[#logs].GenScript
)
connect = remoteFrame.Button.MouseButton1Click:(()
(remoteFrame)
)
layoutOrderNum <
layoutOrderNum =
remoteFrame.LayoutOrder = layoutOrderNum
layoutOrderNum = layoutOrderNum -
remoteFrame.Parent = LogList
.(remoteLogs, , { connect, remoteFrame })
()
()
(remote, args)
prevTables = {}
gen =
#args >
(()
gen = ({ args = args }) ..
)
gen = gen
..
(()
i, v (args)
(i) ~= (i) ~=
gen = gen ..
(i) ==
gen = gen .. .. i ..
(i) == (i) ~=
gen = gen .. .. .(, (v)) ..
(i) ==
gen = gen .. .. i:() ..
(v) ~= (v) ~=
gen = gen ..
(v) ==
gen = gen .. .. v ..
(v) == (v) ~=
gen = gen .. .(, (v))
(v) ==
gen = gen .. .. v:()
gen = gen ..
)
gen = gen ..
remote:() getnilrequired
gen =
.. gen
remote:()
gen = gen .. (remote) ..
remote:()
gen = gen .. (remote) ..
remote:()
gen = gen .. (remote) ..
remote:()
gen = gen .. (remote) ..
gen = gen
prevTables = {}
gen
(v, l, p, n, vtv, i, pt, path, tables, tI)
tI
tI = { }
tI[] +=
(v) ==
v == .huge
(v):()
(v)
(v) ==
(v)
(v) ==
(v, l)
(v) ==
(v)
(v) ==
(v, l, p, n, vtv, i, pt, path, tables, tI)
(v) ==
(v)
(v) ==
(v) ==
(v)
(v) ==
.(, (v.X), (v.Y), (v.Z))
.. (v) ..
(t)
topstr =
bottomstr =
getnilrequired =
ret =
count =
i, v (t)
(i) == i:()
ret = ret .. .. i .. .. (v, , , i, ) ..
(i):()
ret = ret
..
.. (i):()
..
.. (count)
..
.. (v, , , (i):() .. .. (count), )
..
ret = ret
..
.. (v)
..
.. (count)
..
.. (v, , , (v) .. .. (count), )
..
count = count +
getnilrequired
topstr =
.. topstr
#topstr >
ret = topstr .. .. ret
#bottomstr >
ret = ret .. bottomstr
ret
(t, l, p, n, vtv, i, pt, path, tables, tI)
globalIndex = .((), t)
(globalIndex) ==
globalIndex
tI
tI = { }
path
path =
l
l =
tables = {}
p
p = t
_, v (tables)
n (v, t)
bottomstr = bottomstr
..
.. (n)
.. (path)
..
.. (n)
.. (({ (v, p) })[])
.(tables, t)
s =
size =
l = l + indent
k, v (t)
size = size +
size > (.SimpleSpyMaxTableSize )
s = s
..
.. .(, l)
..
(k, t)
bottomstr = bottomstr
..
.. (n)
.. (path)
..
.. (n)
.. (path)
..
..
.. (
(v, k) (n) .. (path)
(v, l, p, n, vtv, k, t, path .. .. (n) .. (path) .. , tables)
)
size -=
currentPath =
(k) == k:()
currentPath = .. k
currentPath = .. (k, l, p, n, vtv, k, t, path .. currentPath, tables, tI) ..
size % ==
()
s = s
..
.. .(, l)
..
.. (k, l, p, n, vtv, k, t, path .. currentPath, tables, tI)
..
.. (v, l, p, n, vtv, k, t, path .. currentPath, tables, tI)
..
#s >
s = s:(, #s - )
size >
s = s .. .. .(, l - indent)
s ..
(v, ...)
keyToString
(v) == (v)
.(
,
(v)
)
(v) ==
.(, (v))
(v) == (v) ~=
.(, (v), (v))
(v) ==
.(, (v))
(v, ...)
(f)
k, x (())
isgucci, gpath
(x, f)
isgucci, gpath = ,
(x) ==
isgucci, gpath = (f, x)
isgucci (k) ~=
(k) == k:()
k .. gpath
.. (k) .. .. gpath
funcEnabled debug.(f).name:()
.. debug.(f).name ..
.. (f) ..
(i)
player = (i)
parent = i
out =
parent ==
player
parent parent == player.Character
player == Players.LocalPlayer
.. out
(player) .. .. out
parent.Name:() ~= parent.Name
out = .. (parent.Name) .. .. out
out = .. parent.Name .. out
parent = parent.Parent
parent ~=
parent parent.Parent ==
service = :(parent.ClassName)
service
parent.ClassName ==
.. out
.. service.ClassName .. .. out
parent.Name:()
.. parent.Name .. out
.. (parent.Name) .. .. out
parent.Parent ==
getnilrequired =
.. (parent.Name) .. .. parent.ClassName .. .. out
parent == Players.LocalPlayer
out = .. out
parent.Name:() ~= parent.Name
out = .. (parent.Name) .. .. out
out = .. parent.Name .. out
parent = parent.Parent
(u)
(u) ==
.. (u.Time)
..
.. (u.EasingStyle)
..
.. (u.EasingDirection)
..
.. (u.RepeatCount)
..
.. (u.Reverses)
..
.. (u.DelayTime)
..
(u) ==
.. (u.Origin) .. .. (u.Direction) ..
(u) ==
ret =
i, v (u.KeyPoints)
ret = ret .. (v)
i < #u.Keypoints
ret = ret ..
ret ..
(u) ==
.. (u) ..
(u) ==
ret =
i, v (u.KeyPoints)
ret = ret .. .. (v) ..
i < #u.Keypoints
ret = ret ..
ret ..
(u) ==
.. (u.Number) ..
(u) ==
.. (u.Min) .. .. (u.Max) ..
(u) ==
center = u.CFrame.Position
size = u.CFrame.Size
vector1 = center - size /
vector2 = center + size /
.. (vector1) .. .. (vector2) ..
(u) ==
faces = {}
u.Top
.(faces, )
u.Bottom
.(faces, )
u.Left
.(faces, )
u.Right
.(faces, )
u.Back
.(faces, )
u.Front
.(faces, )
.. .(faces, ) ..
(u) ==
(u)
(u) ==
(u) ==
.. (u)
(u) ==
(u) ==
.(, (u.X), (u.Y), (u.Z))
(u) ==
xAngle, yAngle, zAngle = u:()
.(
,
(u.X),
(u.Y),
(u.Z),
(xAngle),
(yAngle),
(zAngle)
)
(u) ==
.(
,
,
(u.InitialEnabled),
(u.InitialEnabledShouldOverrideRestore),
(u.FloatingXSize),
(u.FloatingYSize),
(u.MinWidth),
(u.MinHeight)
)
(u) ==
.(, (u.Position), (u.Action))
(u) ==
.(, (u.Scale), (u.Offset))
(u) ==
.(
,
(u.X.Scale),
(u.X.Offset),
(u.Y.Scale),
(u.Y.Offset)
)
(u) ==
.(, (u.Min), (u.Max))
.(, (u))
(instance)
_, v (Players:())
v.Character (instance:(v.Character) instance == v.Character)
v
(x, t, path, prev)
path
path =
prev
prev = {}
(x, t)
,
i, v (t)
(v, x)
(i) == i:()
, (path .. .. i)
, (path .. .. (i) .. )
(v) ==
duplicate =
_, y (prev)
(y, v)
duplicate =
duplicate
.(prev, t)
found
found, p = (x, v, path, prev)
found
(i) == i:()
, .. i .. p
, .. (i) .. .. p
,
(s, indentation)
indentation
indentation =
handled, reachedMax = (s, indentation)
.. handled
..
.. (
reachedMax
)
(value, indentation)
buildStr = {}
i =
char = .(value, i, i)
indentStr
char ~=
char ==
buildStr[i] =
char ==
buildStr[i] =
char ==
buildStr[i] =
char ==
buildStr[i] =
.(char) > .(char) <
buildStr[i] = .(, .(char))
buildStr[i] = char
i = i +
char = .(value, i, i)
i % ==
indentStr = indentStr .(, indentation + indent)
.({ , indentStr, }, , , i, buildStr)
i +=
.(buildStr)
(v: any)
(v) == (v) ==
mt = (v)
badtostring = mt (mt, )
mt badtostring
(mt, , )
out = (v)
(mt, , badtostring)
out
(v)
(src)
realPath
runningTest
s, e
match =
src:(, ) ==
realPath =
s =
runningTest = src:(, e e - -)
_, v (())
v.Name == runningTest
realPath = v
s = #runningTest +
realPath
e = src:(s, -):()
i =
i +=
e
runningTest = src:(s, -)
test = realPath.(realPath, runningTest)
test
realPath = test
match =
runningTest = src:(s, e)
test = realPath.(realPath, runningTest)
yeOld = e
test
realPath = test
s = e +
e = src:(e + , -):()
e = e e + yeOld e
e = src:(e + , -):()
e = e e + yeOld e
match i >=
realPath
(f, ...)
.(scheduled, { f, ... })
()
thread = .()
(()
.(thread)
)
.()
()
toggle
scheduled = {}
#scheduled >
.(scheduled, #scheduled)
#scheduled >
currentf = scheduled[]
.(scheduled, )
(currentf) == (currentf[]) ==
((currentf))
(, methodName, remote, args, funcInfo, calling, returnValue)
validInstance, validClass = (()
remote:() remote:()
)
validInstance validClass
func = funcInfo.func
calling
_, calling = (getScriptFromSrc, funcInfo.source)
.(()
remoteSignals[remote]
remoteSignals[remote]:(args)
)()
autoblock
excluding[remote]
history[remote]
history[remote] = { badOccurances = , lastCall = () }
() - history[remote].lastCall <
history[remote].badOccurances +=
history[remote].badOccurances =
history[remote].badOccurances >
excluding[remote] =
history[remote].lastCall = ()
functionInfoStr
src
func (func)
functionInfo = {}
functionInfo.info = funcInfo
(()
functionInfo.constants = debug.(func)
)
(()
functionInfoStr = ({ functionInfo = functionInfo })
)
(()
(calling) ==
src = calling
)
methodName:() ==
(
,
remote.Name,
args,
remote,
functionInfoStr,
(blocklist[remote] blocklist[remote.Name]),
src
)
methodName:() ==
(
,
remote.Name,
args,
remote,
functionInfoStr,
(blocklist[remote] blocklist[remote.Name]),
src,
returnValue
)
(remoteType, remote, ...)
(remote) ==
args = { ... }
validInstance, remoteName = (()
remote.Name
)
validInstance (blacklist[remote] blacklist[remoteName])
funcInfo = {}
calling
funcEnabled
funcInfo = debug.() funcInfo
calling = useGetCallingScript ()
recordReturnValues remoteType ==
thread = .()
args = { ... }
.(()
returnValue
remoteHooks[remote]
args = { remoteHooks[remote]((args)) }
returnValue = (remote, (args))
returnValue = (remote, (args))
(
remoteHandler,
,
remoteType == ,
remote,
args,
funcInfo,
calling,
returnValue
)
blocklist[remote] blocklist[remoteName]
.(thread)
.(thread, (returnValue))
)
(
remoteHandler,
,
remoteType == ,
remote,
args,
funcInfo,
calling
)
blocklist[remote] blocklist[remoteName]
recordReturnValues remoteType ==
.()
remoteType ==
remoteHooks[remote]
(remote, remoteHooks[remote](...))
(remote, ...)
remoteHooks[remote]
(remote, remoteHooks[remote](...))
(remote, ...)
newnamecall = ((remote, ...)
(remote) ==
args = { ... }
methodName = ()
validInstance, remoteName = (()
remote.Name
)
validInstance
(methodName == methodName == methodName == methodName == )
(blacklist[remote] blacklist[remoteName])
funcInfo = {}
calling
funcEnabled
funcInfo = debug.() funcInfo
calling = useGetCallingScript ()
recordReturnValues (methodName == methodName == )
namecallThread = .()
args = { ... }
.(()
returnValue
(methodName)
remoteHooks[remote]
args = { remoteHooks[remote]((args)) }
returnValue = { (remote, (args)) }
returnValue = { (remote, (args)) }
.(namecallThread, (returnValue))
.(()
(remoteHandler, , methodName, remote, args, funcInfo, calling, returnValue)
)()
)
.(()
(remoteHandler, , methodName, remote, args, funcInfo, calling)
)()
recordReturnValues (methodName == "InvokeServer" or methodName == "invokeServer") then
return coroutine.yield()
elseif
validInstance
and (methodName == "FireServer" or methodName == "fireServer" or methodName == "InvokeServer" or methodName == "invokeServer")
and (blocklist[remote] or blocklist[remoteName])
then
return nil
elseif
(not recordReturnValues or methodName ~= "InvokeServer" or methodName ~= "invokeServer")
and validInstance
and (methodName == "FireServer" or methodName == "fireServer" or methodName == "InvokeServer" or methodName == "invokeServer")
and remoteHooks[remote]
then
return original(remote, remoteHooks[remote](...))
else
return original(remote, ...)
end
end
return original(remote, ...)
end, original)
local newFireServer = newcclosure(function(...)
return hookRemote("RemoteEvent", ...)
end, originalEvent)
local newInvokeServer = newcclosure(function(...)
return hookRemote("RemoteFunction", ...)
end, originalFunction)
--- Toggles on and off the remote spy
function toggleSpy()
if not toggle then
if hookmetamethod then
local oldNamecall = hookmetamethod(game, "__namecall", newnamecall)
original = original or function(...)
return oldNamecall(...)
end
_G.OriginalNamecall = original
else
gm = gm or getrawmetatable(game)
original = original or function(...)
return gm.__namecall(...)
end
setreadonly(gm, false)
if not original then
warn("SimpleSpy: namecall method not found!")
onToggleButtonClick()
return
end
gm.__namecall = newnamecall
setreadonly(gm, true)
end
originalEvent = hookfunction(remoteEvent.FireServer, newFireServer)
originalFunction = hookfunction(remoteFunction.InvokeServer, newInvokeServer)
else
if hookmetamethod then
if original then
hookmetamethod(game, "__namecall", original)
end
else
gm = gm or getrawmetatable(game)
setreadonly(gm, false)
gm.__namecall = original
setreadonly(gm, true)
end
hookfunction(remoteEvent.FireServer, originalEvent)
hookfunction(remoteFunction.InvokeServer, originalFunction)
end
end
--- Toggles between the two remotespy methods (hookfunction currently = disabled)
function toggleSpyMethod()
toggleSpy()
toggle = not toggle
end
--- Shuts down the remote spy
function shutdown()
if schedulerconnect then
schedulerconnect:Disconnect()
end
for _, connection in pairs(connections) do
coroutine.wrap(function()
connection:Disconnect()
end)()
end
SimpleSpy2:Destroy()
hookfunction(remoteEvent.FireServer, originalEvent)
hookfunction(remoteFunction.InvokeServer, originalFunction)
if hookmetamethod then
if original then
hookmetamethod(game, "__namecall", original)
end
else
gm = gm or getrawmetatable(game)
setreadonly(gm, false)
gm.__namecall = original
setreadonly(gm, true)
end
_G.SimpleSpyExecuted = false
end
-- main
if not _G.SimpleSpyExecuted then
local succeeded, err = pcall(function()
if not RunService:IsClient() then
error("SimpleSpy cannot run on the server!")
end
if
not hookfunction
or not getrawmetatable
or getrawmetatable and not getrawmetatable(game).__namecall
or not setreadonly
then
local missing = {}
if not hookfunction then
table.insert(missing, "hookfunction")
end
if not getrawmetatable then
table.insert(missing, "getrawmetatable")
end
if getrawmetatable and not getrawmetatable(game).__namecall then
table.insert(missing, "getrawmetatable(game).__namecall")
end
if not setreadonly then
table.insert(missing, "setreadonly")
end
shutdown()
error(
"This environment does not support method hooks!\n(Your exploit is not capable of running SimpleSpy)\nMissing: "
.. table.concat(missing, ", ")
)
end
_G.SimpleSpyShutdown = shutdown
ContentProvider:PreloadAsync({
"rbxassetid://6065821980",
"rbxassetid://6065774948",
"rbxassetid://6065821086",
"rbxassetid://6065821596",
ImageLabel,
ImageLabel_2,
ImageLabel_3,
})
-- if gethui then funcEnabled = false end
onToggleButtonClick()
RemoteTemplate.Parent = nil
FunctionTemplate.Parent = nil
codebox = Highlight.new(CodeBox)
codebox:setRaw("")
getgenv().SimpleSpy = SimpleSpy
getgenv().getNil = function(name, class)
for _, v in pairs(getnilinstances()) do
if v.ClassName == class and v.Name == name then
return v
end
end
end
TextLabel:GetPropertyChangedSignal("Text"):Connect(scaleToolTip)
-- TopBar.InputBegan:Connect(onBarInput)
MinimizeButton.MouseButton1Click:Connect(toggleMinimize)
MaximizeButton.MouseButton1Click:Connect(toggleSideTray)
Simple.MouseButton1Click:Connect(onToggleButtonClick)
CloseButton.MouseEnter:Connect(onXButtonHover)
CloseButton.MouseLeave:Connect(onXButtonUnhover)
Simple.MouseEnter:Connect(onToggleButtonHover)
Simple.MouseLeave:Connect(onToggleButtonUnhover)
CloseButton.MouseButton1Click:Connect(shutdown)
table.insert(connections, UserInputService.InputBegan:Connect(backgroundUserInput))
connectResize()
SimpleSpy2.Enabled = true
coroutine.wrap(function()
wait(1)
onToggleButtonUnhover()
end)()
schedulerconnect = RunService.Heartbeat:Connect(taskscheduler)
if syn and syn.protect_gui then
pcall(syn.protect_gui, SimpleSpy2)
end
bringBackOnResize()
SimpleSpy2.Parent = --[[gethui and gethui() or]]
CoreGui
_G.SimpleSpyExecuted = true
if not Players.LocalPlayer then
Players:GetPropertyChangedSignal("LocalPlayer"):Wait()
end
Mouse = Players.LocalPlayer:GetMouse()
oldIcon = Mouse.Icon
table.insert(connections, Mouse.Move:Connect(mouseMoved))
end)
if not succeeded then
warn(
"A fatal error has occured, SimpleSpy was unable to launch properly.\nPlease DM this error message to @exx#9394:\n\n"
.. tostring(err)
)
SimpleSpy2:Destroy()
hookfunction(remoteEvent.FireServer, originalEvent)
hookfunction(remoteFunction.InvokeServer, originalFunction)
if hookmetamethod then
if original then
hookmetamethod(game, "__namecall", original)
end
else
setreadonly(gm, false)
gm.__namecall = original
setreadonly(gm, true)
end
return
end
else
SimpleSpy2:Destroy()
return
end
----- ADD ONS ----- (easily add or remove additonal functionality to the RemoteSpy!)
--[[
Some helpful things:
- add your function in here, and create buttons for them through the 'newButton' function
- the first argument provided is the TextButton the player clicks to run the function
- generated scripts are generated when the namecall is initially fired and saved in remoteFrame objects
- blacklisted remotes will be ignored directly in namecall (less lag)
- the properties of a 'remoteFrame' object:
{
Name: (string) The name of the Remote
GenScript: (string) The generated script that appears in the codebox (generated when namecall fired)
Source: (Instance (LocalScript)) The script that fired/invoked the remote
Remote: (Instance (RemoteEvent) | Instance (RemoteFunction)) The remote that was fired/invoked
Log: (Instance (TextButton)) The button being used for the remote (same as 'selected.Log')
}
- globals list: (contact @exx#9394 for more information or if you have suggestions for more to be added)
- closed: (boolean) whether or not the GUI is currently minimized
- logs: (table[remoteFrame]) full of remoteFrame objects (properties listed above)
- selected: (remoteFrame) the currently selected remoteFrame (properties listed above)
- blacklist: (string[] | Instance[] (RemoteEvent) | Instance[] (RemoteFunction)) an array of blacklisted names and remotes
- codebox: (Instance (TextBox)) the textbox that holds all the code- cleared often
]]
-- Copies the contents of the codebox
newButton("Copy Code", function()
return "Click to copy code"
end, function()
setclipboard(codebox:getString())
TextLabel.Text = "Copied successfully!"
end)
--- Copies the source script (that fired the remote)
newButton("Copy Remote", function()
return "Click to copy the path of the remote"
end, function()
if selected then
setclipboard(v2s(selected.Remote.remote))
TextLabel.Text = "Copied!"
end
end)
-- Executes the contents of the codebox through loadstring
newButton("Run Code", function()
return "Click to execute code"
end, function()
local orText = "Click to execute code"
TextLabel.Text = "Executing..."
local succeeded = pcall(function()
return loadstring(codebox:getString())()
end)
if succeeded then
TextLabel.Text = "Executed successfully!"
else
TextLabel.Text = "Execution error!"
end
end)
--- Gets the calling script (not super reliable but w/e)
newButton("Get Script", function()
return "Click to copy calling script to clipboard\nWARNING: Not super reliable, nil == could not find"
end, function()
if selected then
setclipboard(SimpleSpy:ValueToString(selected.Source))
TextLabel.Text = "Done!"
end
end)
--- Decompiles the script that fired the remote and puts it in the code box
newButton("Function Info", function()
return "Click to view calling function information"
end, function()
if selected then
if selected.Function then
codebox:setRaw(
"-- Calling function info\n-- Generated by the SimpleSpy serializer\n\n" .. tostring(selected.Function)
)
end
TextLabel.Text = "Done! Function info generated by the SimpleSpy Serializer."
end
end)
--- Clears the Remote logs
newButton("Clr Logs", function()
return "Click to clear logs"
end, function()
TextLabel.Text = "Clearing..."
logs = {}
for _, v in pairs(LogList:GetChildren()) do
if not v:IsA("UIListLayout") then
v:Destroy()
end
end
codebox:setRaw("")
selected = nil
TextLabel.Text = "Logs cleared!"
end)
--- Excludes the selected.Log Remote from the RemoteSpy
newButton("Exclude (i)", function()
return "Click to exclude this Remote.\nExcluding a remote makes SimpleSpy ignore it, but it will continue to be usable."
end, function()
if selected then
blacklist[selected.Remote.remote] = true
TextLabel.Text = "Excluded!"
end
end)
--- Excludes all Remotes that share the same name as the selected.Log remote from the RemoteSpy
newButton("Exclude (n)", function()
return "Click to exclude all remotes with this name.\nExcluding a remote makes SimpleSpy ignore it, but it will continue to be usable."
end, function()
if selected then
blacklist[selected.Name] = true
TextLabel.Text = "Excluded!"
end
end)
--- clears blacklist
newButton("Clr Blacklist", function()
return "Click to clear the blacklist.\nExcluding a remote makes SimpleSpy ignore it, but it will continue to be usable."
end, function()
blacklist = {}
TextLabel.Text = "Blacklist cleared!"
end)
--- Prevents the selected.Log Remote from firing the server (still logged)
newButton("Block (i)", function()
return "Click to stop this remote from firing.\nBlocking a remote won't remove it from SimpleSpy logs, but it will not continue to fire the server."
end, function()
if selected then
if selected.Remote.remote then
blocklist[selected.Remote.remote] = true
TextLabel.Text = "Excluded!"
else
TextLabel.Text = "Error! Instance may no longer exist, try using Block (n)."
end
end
end)
--- Prevents all remotes from firing that share the same name as the selected.Log remote from the RemoteSpy (still logged)
newButton("Block (n)", function()
return "Click to stop remotes with this name from firing.\nBlocking a remote won't remove it from SimpleSpy logs, but it will not continue to fire the server."
end, function()
if selected then
blocklist[selected.Name] = true
TextLabel.Text = "Excluded!"
end
end)
--- clears blacklist
newButton("Clr Blocklist", function()
return "Click to stop blocking remotes.\nBlocking a remote won't remove it from SimpleSpy logs, but it will not continue to fire the server."
end, function()
blocklist = {}
TextLabel.Text = "Blocklist cleared!"
end)
--- Attempts to decompile the source script
newButton("Decompile", function()
return "Attempts to decompile source script\nWARNING: Not super reliable, nil == could not find"
end, function()
if selected then
if selected.Source then
codebox:setRaw(decompile(selected.Source))
TextLabel.Text = "Done!"
else
TextLabel.Text = "Source not found!"
end
end
end)
newButton("Disable Info", function()
return string.format(
"[%s] Toggle function info (because it can cause lag in some games)",
funcEnabled and "ENABLED" or "DISABLED"
)
end, function()
funcEnabled = not funcEnabled
TextLabel.Text = string.format(
"[%s] Toggle function info (because it can cause lag in some games)",
funcEnabled and "ENABLED" or "DISABLED"
)
end)
newButton("Autoblock", function()
return string.format(
"[%s] [BETA] Intelligently detects and excludes spammy remote calls from logs",
autoblock and "ENABLED" or "DISABLED"
)
end, function()
autoblock = not autoblock
TextLabel.Text = string.format(
"[%s] [BETA] Intelligently detects and excludes spammy remote calls from logs",
autoblock and "ENABLED" or "DISABLED"
)
history = {}
excluding = {}
end)
newButton("CallingScript", function()
return string.format(
"[%s] [UNSAFE] Uses 'getcallingscript' to get calling script for Decompile and GetScript. Much more reliable, but opens up SimpleSpy to detection and/or instability.",
useGetCallingScript and "ENABLED" or "DISABLED"
)
end, function()
useGetCallingScript = not useGetCallingScript
TextLabel.Text = string.format(
"[%s] [UNSAFE] Uses 'getcallingscript' to get calling script for Decompile and GetScript. Much more reliable, but opens up SimpleSpy to detection and/or instability.",
useGetCallingScript and "ENABLED" or "DISABLED"
)
end)
newButton("KeyToString", function()
return string.format(
"[%s] [BETA] Uses an experimental new function to replicate Roblox's behavior when a non-primitive type is used as a key in a table. Still in development and may not properly reflect tostringed (empty) userdata.",
keyToString and "ENABLED" or "DISABLED"
)
end, function()
keyToString = not keyToString
TextLabel.Text = string.format(
"[%s] [BETA] Uses an experimental new function to replicate Roblox's behavior when a non-primitive type is used as a key in a table. Still in development and may not properly reflect tostringed (empty) userdata.",
keyToString and "ENABLED" or "DISABLED"
)
end)
newButton("ToggleReturnValues", function()
return string.format(
"[%s] [EXPERIMENTAL] Enables recording of return values for 'GetReturnValue'\n\nUse this method at your own risk, as it could be detectable.",
recordReturnValues and "ENABLED" or "DISABLED"
)
end, function()
recordReturnValues = not recordReturnValues
TextLabel.Text = string.format(
"[%s] [EXPERIMENTAL] Enables recording of return values for 'GetReturnValue'\n\nUse this method at your own risk, as it could be detectable.",
recordReturnValues and "ENABLED" or "DISABLED"
)
end)
newButton("GetReturnValue", function()
return "[Experimental] If 'ReturnValues' is enabled, this will show the recorded return value for the RemoteFunction (if available)."
end, function()
if selected then
codebox:setRaw(SimpleSpy:ValueToVar(selected.ReturnValue, "returnValue"))
end
end)Loads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: raw.githubusercontent.com, www.roblox.com.