--please give credits if you use in projects | discord: faded.cold local settings = { copytoclipboard = true, copyasscript = true, logfireserver = true, loginvokeserver = true, logonclientevent = false, --half working logonclientinvoke = true, logindexing = true, } print("[signalspy] loaded") local mt = getrawmetatable(game) setreadonly(mt, false) local onc = mt.__namecall local oix = mt.__index ------------------------------------------------ local function makescript(remote, method, args) local paradise = remote:GetFullName() .. ":" .. method if #args == 0 then return paradise.."()" end local arguwu = {} for _, v in ipairs(args) do local t = typeof(v) if t == "string" then table.insert(arguwu, '"'..v:gsub('"', '\\"')..'"') elseif t == "Instance" then table.insert(arguwu, v:GetFullName()) elseif t == "table" then local parts = {} for k, val in pairs(v) do local kt = typeof(k) == "string" and '"'..k:gsub('"', '\\"')..'"' or tostring(k) local vt = typeof(val) == "string" and '"'..val:gsub('"', '\\"')..'"' or tostring(val) table.insert(parts, "["..kt.."]="..vt) end table.insert(arguwu, "{"..table.concat(parts, ",").."}") elseif t == "EnumItem" then table.insert(arguwu, tostring(v)) else table.insert(arguwu, tostring(v)) end end return paradise.."("..table.concat(arguwu, ", ")..")" end local function tts(tbl) local str = "" for i, v in ipairs(tbl) do str = str .. "arg["..i.."] = " .. tostring(v) .. "\n" end return str end local function log(where, remote, method, ...) local args = {...} local out = "["..where.."] " .. remote:GetFullName() .. ":" .. method .. "\n" .. tts(args) print(out) if settings.copytoclipboard and setclipboard then setclipboard(out) end if settings.copyasscript and setclipboard then local script = makescript(remote, method, args) setclipboard(script) end end ------------------------------------------------ mt.__namecall = newcclosure(function(self, ...) local method = getnamecallmethod() if method == "FireServer" and settings.logfireserver then log("client → server", self, method, ...) elseif method == "InvokeServer" and settings.loginvokeserver then log("client → server", self, method, ...) end return onc(self, ...) end) mt.__index = newcclosure(function(self, key) if settings.logindexing and typeof(self)=="Instance" and (key=="FireServer" or key=="InvokeServer") then print("[signalspy] accessed: " .. self:GetFullName() .. "." .. key) end if key=="OnClientInvoke" and settings.logonclientinvoke and self:IsA("RemoteFunction") then return function(...) log("server → client", self, "OnClientInvoke", ...) end end return oix(self, key) end) setreadonly(mt, true) if settings.logonclientevent then for _, r in ipairs(game:GetDescendants()) do if r:IsA("RemoteEvent") then pcall(function() r.OnClientEvent:Connect(function(...) log("server → client", r, "OnClientEvent", ...) end) end) end end game.DescendantAdded:Connect(function(obj) if obj:IsA("RemoteEvent") then wait(0.1) pcall(function() obj.OnClientEvent:Connect(function(...) log("server → client", obj, "OnClientEvent", ...) end) end) end end) end --faded was here