-- ╔══════════════════════════════════════════════╗ -- ║ EVENT SPAM v1.4 ║ -- ║ Toggle: DEL key | Made by Fluzzy ║ -- ║ Fixes: Dragging top bar + click-through ║ -- ║ Added: Custom Script Executor Tab ║ -- ╚══════════════════════════════════════════════╝ local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local ProximityPromptService = game:GetService("ProximityPromptService") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") -- ════════════════════════════════════════════ -- CONFIG FILE PATH -- ════════════════════════════════════════════ local CONFIG_FILE = "EventSpam_configs.json" -- ════════════════════════════════════════════ -- STATE -- ════════════════════════════════════════════ local isOpen = false local proxActive = false local proxDistance = 10 local proxRate = 10 local proxConnections = {} local eventList = {} local savedConfig = {} local currentTab = "prox" -- ════════════════════════════════════════════ -- FILE SAVE/LOAD HELPERS -- ════════════════════════════════════════════ -- Lightweight JSON encoder local function encodeJSON(val, indent) indent = indent or 0 local t = type(val) if t == "nil" then return "null" elseif t == "boolean" then return tostring(val) elseif t == "number" then return tostring(val) elseif t == "string" then val = val:gsub('\\', '\\\\'):gsub('"', '\\"'):gsub('\n', '\\n'):gsub('\r', '\\r'):gsub('\t', '\\t') return '"' .. val .. '"' elseif t == "table" then local isArr = true local maxN = 0 for k, _ in pairs(val) do if type(k) ~= "number" then isArr = false break end if k > maxN then maxN = k end end isArr = isArr and maxN == #val local pad = string.rep(" ", indent + 1) local closePad = string.rep(" ", indent) local parts = {} if isArr then for _, v in ipairs(val) do table.insert(parts, pad .. encodeJSON(v, indent + 1)) end return "[\n" .. table.concat(parts, ",\n") .. "\n" .. closePad .. "]" else for k, v in pairs(val) do table.insert(parts, pad .. '"' .. tostring(k) .. '": ' .. encodeJSON(v, indent + 1)) end return "{\n" .. table.concat(parts, ",\n") .. "\n" .. closePad .. "}" end end return "null" end -- Simple JSON decoder local function decodeJSON(s) local pos = 1 local function skipWS() while pos <= #s and s:sub(pos,pos):match("%s") do pos = pos + 1 end end local parseVal local function parseStr() pos = pos + 1 local out = {} while pos <= #s do local c = s:sub(pos,pos) if c == '"' then pos = pos + 1; break end if c == '\\' then pos = pos + 1 local e = s:sub(pos,pos) if e == 'n' then table.insert(out, '\n') elseif e == 'r' then table.insert(out, '\r') elseif e == 't' then table.insert(out, '\t') else table.insert(out, e) end else table.insert(out, c) end pos = pos + 1 end return table.concat(out) end local function parseArr() pos = pos + 1 local arr = {} skipWS() if s:sub(pos,pos) == ']' then pos = pos + 1; return arr end while pos <= #s do skipWS() table.insert(arr, parseVal()) skipWS() local c = s:sub(pos,pos) if c == ']' then pos = pos + 1; break end if c == ',' then pos = pos + 1 end end return arr end local function parseObj() pos = pos + 1 local obj = {} skipWS() if s:sub(pos,pos) == '}' then pos = pos + 1; return obj end while pos <= #s do skipWS() local key = parseStr() skipWS() pos = pos + 1 skipWS() obj[key] = parseVal() skipWS() local c = s:sub(pos,pos) if c == '}' then pos = pos + 1; break end if c == ',' then pos = pos + 1 end end return obj end parseVal = function() skipWS() local c = s:sub(pos,pos) if c == '"' then return parseStr() elseif c == '[' then return parseArr() elseif c == '{' then return parseObj() elseif c == 't' then pos = pos + 4; return true elseif c == 'f' then pos = pos + 5; return false elseif c == 'n' then pos = pos + 4; return nil else local numStr = s:match("^-?%d+%.?%d*", pos) if numStr then pos = pos + #numStr; return tonumber(numStr) end end return nil end local ok, result = pcall(parseVal) if ok then return result else return {} end end local function saveConfigsToDisk() local toSave = {} for name, cfg in pairs(savedConfig) do local evs = {} for _, ev in ipairs(cfg.events or {}) do table.insert(evs, { name = ev.name, eventStr = ev.eventStr, rate = ev.rate }) end toSave[name] = { proxDistance = cfg.proxDistance, proxRate = cfg.proxRate, events = evs } end local ok, err = pcall(function() writefile(CONFIG_FILE, encodeJSON(toSave)) end) if not ok then warn("[EventSpam] Could not write config file: " .. tostring(err)) end end local function loadConfigsFromDisk() local ok, result = pcall(function() if isfile(CONFIG_FILE) then local raw = readfile(CONFIG_FILE) local decoded = decodeJSON(raw) if type(decoded) == "table" then savedConfig = decoded for _, cfg in pairs(savedConfig) do if not cfg.events then cfg.events = {} end end end end end) if not ok then warn("[EventSpam] Could not read config file: " .. tostring(result)) savedConfig = {} end end loadConfigsFromDisk() -- ════════════════════════════════════════════ -- COLORS -- ════════════════════════════════════════════ local C = { bg = Color3.fromRGB(30, 18, 28), panel = Color3.fromRGB(48, 28, 44), surface = Color3.fromRGB(62, 36, 56), accent1 = Color3.fromRGB(255, 195, 120), accent2 = Color3.fromRGB(255, 130, 170), accent3 = Color3.fromRGB(255, 220, 240), textPrimary = Color3.fromRGB(255, 240, 245), textMuted = Color3.fromRGB(200, 160, 185), danger = Color3.fromRGB(255, 75, 110), success = Color3.fromRGB(120, 255, 190), navyBorder = Color3.fromRGB(140, 80, 120), } -- ════════════════════════════════════════════ -- GUI ROOT -- ════════════════════════════════════════════ local existing = PlayerGui:FindFirstChild("EventSpamExecutor") if existing then existing:Destroy() end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "EventSpamExecutor" ScreenGui.ResetOnSpawn = false ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling ScreenGui.Parent = PlayerGui local BgOverlay = Instance.new("Frame") BgOverlay.Size = UDim2.new(1, 0, 1, 0) BgOverlay.BackgroundColor3 = Color3.fromRGB(255, 180, 200) BgOverlay.BackgroundTransparency = 0.82 BgOverlay.BorderSizePixel = 0 BgOverlay.ZIndex = 1 BgOverlay.Active = false BgOverlay.Selectable = false BgOverlay.Parent = ScreenGui local Main = Instance.new("Frame") Main.Name = "Main" Main.Size = UDim2.new(0, 540, 0, 600) Main.Position = UDim2.new(0.5, -270, 0.5, -300) Main.BackgroundColor3 = C.bg Main.BackgroundTransparency = 0.08 Main.BorderSizePixel = 0 Main.Visible = false Main.ZIndex = 2 Main.Parent = ScreenGui Instance.new("UICorner", Main).CornerRadius = UDim.new(0, 14) local border = Instance.new("UIStroke", Main) border.Color = C.accent2 border.Thickness = 1.8 border.Transparency = 0.3 -- ── TITLEBAR (DRAGGABLE TARGET) ────────────── local TitleBar = Instance.new("Frame") TitleBar.Size = UDim2.new(1, 0, 0, 48) TitleBar.BackgroundColor3 = C.panel TitleBar.BorderSizePixel = 0 TitleBar.ZIndex = 4 TitleBar.Parent = Main Instance.new("UICorner", TitleBar).CornerRadius = UDim.new(0, 14) local TitleFix = Instance.new("Frame") TitleFix.Size = UDim2.new(1, 0, 0, 14) TitleFix.Position = UDim2.new(0, 0, 1, -14) TitleFix.BackgroundColor3 = C.panel TitleFix.BorderSizePixel = 0 TitleFix.ZIndex = 4 TitleFix.Parent = TitleBar local TitleLabel = Instance.new("TextLabel") TitleLabel.Size = UDim2.new(1, -100, 1, 0) TitleLabel.Position = UDim2.new(0, 14, 0, 0) TitleLabel.BackgroundTransparency = 1 TitleLabel.Text = "✦ EVENT SPAM" TitleLabel.TextColor3 = C.accent1 TitleLabel.Font = Enum.Font.GothamBold TitleLabel.TextSize = 15 TitleLabel.TextXAlignment = Enum.TextXAlignment.Left TitleLabel.ZIndex = 5 TitleLabel.Parent = TitleBar local VerBadge = Instance.new("TextLabel") VerBadge.Size = UDim2.new(0, 36, 0, 18) VerBadge.Position = UDim2.new(0, 188, 0.5, -9) VerBadge.BackgroundColor3 = C.accent2 VerBadge.Text = "v1.4" VerBadge.TextColor3 = Color3.fromRGB(255, 255, 255) VerBadge.Font = Enum.Font.GothamBold VerBadge.TextSize = 10 VerBadge.ZIndex = 5 VerBadge.Parent = TitleBar Instance.new("UICorner", VerBadge).CornerRadius = UDim.new(0, 4) local MadeBy = Instance.new("TextLabel") MadeBy.Size = UDim2.new(0, 110, 0, 18) MadeBy.Position = UDim2.new(0, 230, 0.5, -9) MadeBy.BackgroundTransparency = 1 MadeBy.Text = "made by Fluzzy ♡" MadeBy.TextColor3 = C.accent3 MadeBy.Font = Enum.Font.GothamSemibold MadeBy.TextSize = 10 MadeBy.ZIndex = 5 MadeBy.Parent = TitleBar local CloseBtn = Instance.new("TextButton") CloseBtn.Size = UDim2.new(0, 30, 0, 30) CloseBtn.Position = UDim2.new(1, -42, 0.5, -15) CloseBtn.BackgroundColor3 = C.danger CloseBtn.Text = "X" CloseBtn.TextColor3 = Color3.fromRGB(255, 255, 255) CloseBtn.Font = Enum.Font.GothamBold CloseBtn.TextSize = 14 CloseBtn.ZIndex = 6 CloseBtn.AutoButtonColor = true CloseBtn.Parent = TitleBar Instance.new("UICorner", CloseBtn).CornerRadius = UDim.new(0, 8) -- ── DRAG SYSTEM LOGIC ─────────────────────── local dragToggle = nil local dragSpeed = 20 local dragStart = nil local startPos = nil local function updateInput(input) local delta = input.Position - dragStart local position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) game:GetService("TweenService"):Create(Main, TweenInfo.new(0.12), {Position = position}):Play() end TitleBar.InputBegan:Connect(function(input) if (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then dragToggle = true dragStart = input.Position startPos = Main.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragToggle = false end end) end end) TitleBar.InputChanged:Connect(function(input) if (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then if dragToggle then updateInput(input) end end end) -- ── TAB BAR ─────────────────────────────── local TabBar = Instance.new("Frame") TabBar.Size = UDim2.new(1, -24, 0, 36) TabBar.Position = UDim2.new(0, 12, 0, 56) TabBar.BackgroundColor3 = C.surface TabBar.BorderSizePixel = 0 TabBar.ZIndex = 3 TabBar.Parent = Main Instance.new("UICorner", TabBar).CornerRadius = UDim.new(0, 9) local TabLayout = Instance.new("UIListLayout", TabBar) TabLayout.FillDirection = Enum.FillDirection.Horizontal TabLayout.SortOrder = Enum.SortOrder.LayoutOrder TabLayout.Padding = UDim.new(0, 4) local TabPadding = Instance.new("UIPadding", TabBar) TabPadding.PaddingLeft = UDim.new(0, 4) TabPadding.PaddingRight = UDim.new(0, 4) TabPadding.PaddingTop = UDim.new(0, 4) TabPadding.PaddingBottom = UDim.new(0, 4) local function makeTab(name, key, order) local btn = Instance.new("TextButton") btn.Name = key btn.Size = UDim2.new(0.25, -4, 1, 0) btn.BackgroundColor3 = C.panel btn.Text = name btn.TextColor3 = C.textMuted btn.Font = Enum.Font.GothamSemibold btn.TextSize = 11 btn.ZIndex = 4 btn.LayoutOrder = order btn.Parent = TabBar Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6) return btn end local TabProx = makeTab("PROXIMITY", "prox", 1) local TabEvents = makeTab("EVENT SPAM", "events", 2) local TabScripts = makeTab("SCRIPTS", "scripts", 3) local TabSettings = makeTab("SETTINGS", "settings", 4) local Content = Instance.new("Frame") Content.Size = UDim2.new(1, -24, 1, -112) Content.Position = UDim2.new(0, 12, 0, 100) Content.BackgroundTransparency = 1 Content.ZIndex = 3 Content.Parent = Main -- ════════════════════════════════════════════ -- HELPERS -- ════════════════════════════════════════════ local function makeDivider(parent, yPos) local d = Instance.new("Frame") d.Size = UDim2.new(1, 0, 0, 1) d.Position = UDim2.new(0, 0, 0, yPos) d.BackgroundColor3 = C.navyBorder d.BorderSizePixel = 0 d.ZIndex = 4 d.Parent = parent return d end local function makeLabel(parent, text, x, y, w, h, color, size, font, align) local l = Instance.new("TextLabel") l.Size = UDim2.new(0, w, 0, h) l.Position = UDim2.new(0, x, 0, y) l.BackgroundTransparency = 1 l.Text = text l.TextColor3 = color or C.textPrimary l.Font = font or Enum.Font.Gotham l.TextSize = size or 13 l.TextXAlignment = align or Enum.TextXAlignment.Left l.ZIndex = 4 l.Parent = parent return l end local function makeButton(parent, text, x, y, w, h, bgColor, textColor) local btn = Instance.new("TextButton") btn.Size = UDim2.new(0, w, 0, h) btn.Position = UDim2.new(0, x, 0, y) btn.BackgroundColor3 = bgColor or C.accent1 btn.Text = text btn.TextColor3 = textColor or C.bg btn.Font = Enum.Font.GothamBold btn.TextSize = 13 btn.ZIndex = 5 btn.Parent = parent Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8) return btn end local function makeInput(parent, placeholder, x, y, w, h) local box = Instance.new("TextBox") box.Size = UDim2.new(0, w, 0, h) box.Position = UDim2.new(0, x, 0, y) box.BackgroundColor3 = C.surface box.Text = "" box.PlaceholderText = placeholder box.PlaceholderColor3 = C.textMuted box.TextColor3 = C.textPrimary box.Font = Enum.Font.Gotham box.TextSize = 12 box.ZIndex = 5 box.Parent = parent Instance.new("UICorner", box).CornerRadius = UDim.new(0, 7) local stroke = Instance.new("UIStroke", box) stroke.Color = C.navyBorder stroke.Thickness = 1 return box end -- ════════════════════════════════════════════ -- FIRE HELPER -- ════════════════════════════════════════════ local function fireEvent(ev) local s = ev.eventStr local isCode = s:find("game:") or s:find("local ") or s:find(":FireServer") or s:find("buffer%.") if isCode then local fn, err = loadstring(s) if fn then pcall(fn) else warn("[EventSpam] loadstring error: " .. tostring(err)) end else local ok, result = pcall(function() local fn2 = loadstring("return " .. s) if fn2 then local remote = fn2() if remote and remote.FireServer then remote:FireServer() end end end) if not ok then warn("[EventSpam] path lookup failed: " .. tostring(result)) end end end -- ════════════════════════════════════════════ -- PROXIMITY PROMPT TRIGGER -- ════════════════════════════════════════════ local function triggerPrompt(prompt) local ok1 = pcall(function() ProximityPromptService:TriggerPrompt(prompt) end) if ok1 then return end local ok2 = pcall(function() prompt:InputHoldBegin() task.delay(0.05, function() pcall(function() prompt:InputHoldEnd() end) end) end) if ok2 then return end pcall(function() fireproximityprompt(prompt) end) end -- ════════════════════════════════════════════ -- PAGE: PROXIMITY PROMPT SPAMMER -- ════════════════════════════════════════════ local ProxPage = Instance.new("Frame") ProxPage.Size = UDim2.new(1, 0, 1, 0) ProxPage.BackgroundTransparency = 1 ProxPage.Visible = true ProxPage.ZIndex = 3 ProxPage.Parent = Content makeLabel(ProxPage, "PROXIMITY PROMPT SPAMMER", 0, 0, 320, 22, C.accent1, 13, Enum.Font.GothamBold) makeLabel(ProxPage, "Triggers all nearby prompts repeatedly", 0, 22, 340, 18, C.textMuted, 11) makeDivider(ProxPage, 46) local DistSlider = Instance.new("TextBox") DistSlider.Size = UDim2.new(0, 80, 0, 32) DistSlider.Position = UDim2.new(0, 0, 0, 78) DistSlider.BackgroundColor3 = C.surface DistSlider.Text = "10" DistSlider.TextColor3 = C.accent1 DistSlider.Font = Enum.Font.GothamBold DistSlider.TextSize = 16 DistSlider.ZIndex = 5 DistSlider.Parent = ProxPage Instance.new("UICorner", DistSlider).CornerRadius = UDim.new(0, 8) local distStroke = Instance.new("UIStroke", DistSlider) distStroke.Color = C.accent1 distStroke.Thickness = 1.2 makeLabel(ProxPage, "studs", 88, 88, 50, 18, C.textMuted, 11) local DistMinus = makeButton(ProxPage, "-", 144, 78, 32, 32, C.surface, C.accent1) local DistPlus = makeButton(ProxPage, "+", 182, 78, 32, 32, C.accent1, C.bg) DistMinus.MouseButton1Click:Connect(function() local v = tonumber(DistSlider.Text) or 10 v = math.max(1, v - 1) DistSlider.Text = tostring(v) proxDistance = v end) DistPlus.MouseButton1Click:Connect(function() local v = tonumber(DistSlider.Text) or 10 v = math.min(500, v + 1) DistSlider.Text = tostring(v) proxDistance = v end) DistSlider.FocusLost:Connect(function() local v = tonumber(DistSlider.Text) or 10 v = math.clamp(v, 1, 500) DistSlider.Text = tostring(v) proxDistance = v end) makeLabel(ProxPage, "Spam Rate", 230, 58, 140, 18, C.accent3, 12, Enum.Font.GothamSemibold) local RateSlider = Instance.new("TextBox") RateSlider.Size = UDim2.new(0, 60, 0, 32) RateSlider.Position = UDim2.new(0, 230, 0, 78) RateSlider.BackgroundColor3 = C.surface RateSlider.Text = "10" RateSlider.TextColor3 = C.accent2 RateSlider.Font = Enum.Font.GothamBold RateSlider.TextSize = 16 RateSlider.ZIndex = 5 RateSlider.Parent = ProxPage Instance.new("UICorner", RateSlider).CornerRadius = UDim.new(0, 8) local rateStroke = Instance.new("UIStroke", RateSlider) rateStroke.Color = C.accent2 rateStroke.Thickness = 1.2 makeLabel(ProxPage, "fires/s", 298, 88, 60, 18, C.textMuted, 11) local RateMinus = makeButton(ProxPage, "-", 362, 78, 32, 32, C.surface, C.accent2) local RatePlus = makeButton(ProxPage, "+", 400, 78, 32, 32, C.accent2, C.bg) RateMinus.MouseButton1Click:Connect(function() local v = tonumber(RateSlider.Text) or 10 v = math.max(1, v - 1) RateSlider.Text = tostring(v) proxRate = v end) RatePlus.MouseButton1Click:Connect(function() local v = tonumber(RateSlider.Text) or 10 v = math.min(100, v + 1) RateSlider.Text = tostring(v) proxRate = v end) RateSlider.FocusLost:Connect(function() local v = tonumber(RateSlider.Text) or 10 v = math.clamp(v, 1, 100) RateSlider.Text = tostring(v) proxRate = v end) makeDivider(ProxPage, 124) local ProxStatus = makeLabel(ProxPage, "IDLE", 0, 136, 300, 22, C.textMuted, 12, Enum.Font.GothamBold) local ProxToggle = Instance.new("TextButton") ProxToggle.Size = UDim2.new(1, 0, 0, 56) ProxToggle.Position = UDim2.new(0, 0, 0, 162) ProxToggle.BackgroundColor3 = C.success ProxToggle.Text = "START SPAMMING" ProxToggle.TextColor3 = C.bg ProxToggle.Font = Enum.Font.GothamBold ProxToggle.TextSize = 18 ProxToggle.ZIndex = 5 ProxToggle.Parent = ProxPage local proxCorner = Instance.new("UICorner", ProxToggle) proxCorner.CornerRadius = UDim.new(0, 12) local proxGlow = Instance.new("UIStroke", ProxToggle) proxGlow.Color = C.success proxGlow.Thickness = 1.5 proxGlow.Transparency = 0.5 local function clearProxConnections() for _, v in ipairs(proxConnections) do if typeof(v) == "RBXScriptConnection" then v:Disconnect() end end proxConnections = {} end local function spamNearbyPrompts() clearProxConnections() local accumulator = 0 local conn = RunService.Heartbeat:Connect(function(dt) if not proxActive then return end accumulator = accumulator + dt local interval = 1 / math.max(proxRate, 0.01) if accumulator < interval then return end accumulator = 0 local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end for _, obj in ipairs(workspace:GetDescendants()) do if obj:IsA("ProximityPrompt") then local part = obj.Parent if part and not part:IsA("BasePart") then part = part:FindFirstChildOfClass("BasePart") or (part.Parent and part.Parent:FindFirstChildOfClass("BasePart")) end if part and part:IsA("BasePart") then local dist = (hrp.Position - part.Position).Magnitude if dist <= proxDistance then if obj.Enabled then triggerPrompt(obj) end end end end end end) table.insert(proxConnections, conn) end ProxToggle.MouseButton1Click:Connect(function() proxActive = not proxActive if proxActive then proxRate = tonumber(RateSlider.Text) or 10 ProxToggle.Text = "STOP SPAMMING" ProxToggle.BackgroundColor3 = C.danger proxGlow.Color = C.danger ProxStatus.Text = "ACTIVE — " .. proxRate .. "/s | radius: " .. proxDistance .. " studs" ProxStatus.TextColor3 = C.success spamNearbyPrompts() else ProxToggle.Text = "START SPAMMING" ProxToggle.BackgroundColor3 = C.success proxGlow.Color = C.success ProxStatus.Text = "IDLE" ProxStatus.TextColor3 = C.textMuted clearProxConnections() end end) -- ════════════════════════════════════════════ -- PAGE: EVENT SPAMMER -- ════════════════════════════════════════════ local EventPage = Instance.new("Frame") EventPage.Size = UDim2.new(1, 0, 1, 0) EventPage.BackgroundTransparency = 1 EventPage.Visible = false EventPage.ZIndex = 3 EventPage.Parent = Content makeLabel(EventPage, "REMOTE EVENT SPAMMER", 0, 0, 300, 22, C.accent2, 13, Enum.Font.GothamBold) makeLabel(EventPage, "Paste the full Rspy line into the event path field", 0, 22, 480, 18, C.textMuted, 11) makeDivider(EventPage, 46) local EvNameInput = makeInput(EventPage, "BuyItem", 0, 76, 78, 30) local EvPathInput = makeInput(EventPage, "paste full Rspy code here", 84, 76, 356, 30) local EvRateInput = makeInput(EventPage, "10", 448, 76, 46, 30) local AddEvBtn = makeButton(EventPage, "+ ADD EVENT", 0, 116, 494, 32, C.accent2, C.bg) local EvListFrame = Instance.new("ScrollingFrame") EvListFrame.Size = UDim2.new(1, 0, 1, -162) EvListFrame.Position = UDim2.new(0, 0, 0, 162) EvListFrame.BackgroundTransparency = 1 EvListFrame.ScrollBarThickness = 3 EvListFrame.ScrollBarImageColor3 = C.accent2 EvListFrame.ZIndex = 4 EvListFrame.CanvasSize = UDim2.new(0, 0, 0, 0) EvListFrame.Parent = EventPage local EvLayout = Instance.new("UIListLayout", EvListFrame) EvLayout.SortOrder = Enum.SortOrder.LayoutOrder EvLayout.Padding = UDim.new(0, 6) EvLayout.FillDirection = Enum.FillDirection.Vertical local function refreshEvListCanvas() EvListFrame.CanvasSize = UDim2.new(0, 0, 0, EvLayout.AbsoluteContentSize.Y + 8) end local function rebuildEventList() for _, ch in ipairs(EvListFrame:GetChildren()) do if ch:IsA("Frame") then ch:Destroy() end end end local renderEventRow renderEventRow = function(ev, idx) local row = Instance.new("Frame") row.Name = "EvRow_"..idx row.Size = UDim2.new(1, -4, 0, 52) row.BackgroundColor3 = C.surface row.BorderSizePixel = 0 row.ZIndex = 5 row.LayoutOrder = idx row.Parent = EvListFrame Instance.new("UICorner", row).CornerRadius = UDim.new(0, 8) local rowStroke = Instance.new("UIStroke", row) rowStroke.Color = ev.active and C.accent2 or C.navyBorder rowStroke.Thickness = 1 makeLabel(row, ev.name, 10, 6, 130, 16, C.textPrimary, 12, Enum.Font.GothamBold) local pathStr = ev.eventStr if #pathStr > 34 then pathStr = pathStr:sub(1, 31).."..." end makeLabel(row, pathStr, 10, 26, 260, 14, C.textMuted, 10) makeLabel(row, ev.rate.."/s", 278, 16, 46, 18, C.accent1, 11, Enum.Font.GothamBold, Enum.TextXAlignment.Center) local onceBtn = makeButton(row, "1x", 330, 12, 34, 28, C.accent1, C.bg) onceBtn.TextSize = 11 onceBtn.MouseButton1Click:Connect(function() fireEvent(ev) end) local togBtn = makeButton(row, ev.active and "ON" or "OFF", 370, 12, 44, 28, ev.active and C.success or C.navyBorder, ev.active and C.bg or C.textMuted) togBtn.MouseButton1Click:Connect(function() ev.active = not ev.active if ev.active then local interval = 1 / math.max(ev.rate, 0.01) local acc = 0 ev.connection = RunService.Heartbeat:Connect(function(dt) if not ev.active then return end acc = acc + dt if acc < interval then return end acc = 0 fireEvent(ev) end) else if ev.connection then ev.connection:Disconnect() ev.connection = nil end end row:Destroy() renderEventRow(ev, idx) refreshEvListCanvas() end) local delBtn = makeButton(row, "X", 420, 12, 28, 28, C.danger, Color3.new(1,1,1)) delBtn.MouseButton1Click:Connect(function() if ev.connection then ev.connection:Disconnect() end table.remove(eventList, idx) rebuildEventList() for i, e in ipairs(eventList) do renderEventRow(e, i) end refreshEvListCanvas() end) refreshEvListCanvas() end AddEvBtn.MouseButton1Click:Connect(function() local name = EvNameInput.Text local path = EvPathInput.Text local rate = tonumber(EvRateInput.Text) or 1 if name == "" or path == "" then return end local ev = { name = name, eventStr = path, rate = math.clamp(rate, 0.1, 100), active = false, connection = nil } table.insert(eventList, ev) renderEventRow(ev, #eventList) EvNameInput.Text = "" EvPathInput.Text = "" EvRateInput.Text = "10" end) -- ════════════════════════════════════════════ -- PAGE: CUSTOM SCRIPT EXECUTOR (FIXED SCROLL) -- ════════════════════════════════════════════ local ScriptsPage = Instance.new("Frame") ScriptsPage.Size = UDim2.new(1, 0, 1, 0) ScriptsPage.BackgroundTransparency = 1 ScriptsPage.Visible = false ScriptsPage.ZIndex = 3 ScriptsPage.Parent = Content makeLabel(ScriptsPage, "CUSTOM SCRIPT RUNNER", 0, 0, 300, 22, C.accent1, 13, Enum.Font.GothamBold) makeLabel(ScriptsPage, "Paste text scripts and run them directly in-game.", 0, 22, 480, 18, C.textMuted, 11) makeDivider(ScriptsPage, 46) local ScriptEditorFrame = Instance.new("Frame") ScriptEditorFrame.Size = UDim2.new(1, 0, 1, -120) ScriptEditorFrame.Position = UDim2.new(0, 0, 0, 58) ScriptEditorFrame.BackgroundColor3 = C.surface ScriptEditorFrame.BorderSizePixel = 0 ScriptEditorFrame.ZIndex = 4 ScriptEditorFrame.ClipsDescendants = true ScriptEditorFrame.Parent = ScriptsPage Instance.new("UICorner", ScriptEditorFrame).CornerRadius = UDim.new(0, 8) local editorStroke = Instance.new("UIStroke", ScriptEditorFrame) editorStroke.Color = C.navyBorder editorStroke.Thickness = 1 local EditorScroll = Instance.new("ScrollingFrame") EditorScroll.Size = UDim2.new(1, -6, 1, -12) EditorScroll.Position = UDim2.new(0, 6, 0, 6) EditorScroll.BackgroundTransparency = 1 EditorScroll.BorderSizePixel = 0 EditorScroll.ScrollBarThickness = 4 EditorScroll.ScrollBarImageColor3 = C.accent1 EditorScroll.ZIndex = 5 EditorScroll.CanvasSize = UDim2.new(0, 0, 0, 0) EditorScroll.Parent = ScriptEditorFrame local CodeTextBox = Instance.new("TextBox") CodeTextBox.Size = UDim2.new(1, -12, 1, 0) CodeTextBox.Position = UDim2.new(0, 4, 0, 4) CodeTextBox.BackgroundTransparency = 1 CodeTextBox.Text = "" CodeTextBox.PlaceholderText = "-- Paste your custom Lua/Luau script here...\n-- Example:\nprint('Hello from internal runner!')" CodeTextBox.PlaceholderColor3 = C.textMuted CodeTextBox.TextColor3 = C.textPrimary CodeTextBox.Font = Enum.Font.Code CodeTextBox.TextSize = 12 CodeTextBox.ClearTextOnFocus = false CodeTextBox.MultiLine = true CodeTextBox.TextXAlignment = Enum.TextXAlignment.Left CodeTextBox.TextYAlignment = Enum.TextYAlignment.Top CodeTextBox.ZIndex = 6 CodeTextBox.Parent = EditorScroll local function autoResizeCanvas() local txtHeight = CodeTextBox.TextBounds.Y local txtWidth = CodeTextBox.TextBounds.X local frameHeight = EditorScroll.AbsoluteSize.Y CodeTextBox.Size = UDim2.new(1, -12, 0, math.max(txtHeight, frameHeight)) EditorScroll.CanvasSize = UDim2.new(0, txtWidth + 30, 0, txtHeight + 30) end CodeTextBox:GetPropertyChangedSignal("Text"):Connect(autoResizeCanvas) CodeTextBox:GetPropertyChangedSignal("TextBounds"):Connect(autoResizeCanvas) local ExecuteScriptBtn = makeButton(ScriptsPage, "⚡ RUN SCRIPT", 0, 420, 240, 40, C.accent1, C.bg) local ClearScriptBtn = makeButton(ScriptsPage, "CLEAR CODE", 254, 420, 240, 40, C.panel, C.textMuted) ClearScriptBtn.Font = Enum.Font.GothamSemibold ExecuteScriptBtn.MouseButton1Click:Connect(function() local code = CodeTextBox.Text if code == "" then return end local func, compileError = loadstring(code) if func then local success, runtimeError = pcall(func) if not success then warn("[Script Tab] Runtime Error: " .. tostring(runtimeError)) end else warn("[Script Tab] Syntax Compilation Error: " .. tostring(compileError)) end end) ClearScriptBtn.MouseButton1Click:Connect(function() CodeTextBox.Text = "" end) -- ════════════════════════════════════════════ -- PAGE: SETTINGS -- ════════════════════════════════════════════ local SettingsPage = Instance.new("Frame") SettingsPage.Size = UDim2.new(1, 0, 1, 0) SettingsPage.BackgroundTransparency = 1 SettingsPage.Visible = false SettingsPage.ZIndex = 3 SettingsPage.Parent = Content makeLabel(SettingsPage, "SETTINGS & CONFIG", 0, 0, 300, 22, C.accent3, 13, Enum.Font.GothamBold) makeLabel(SettingsPage, "Configs are saved to disk (EventSpam_configs.json)", 0, 22, 500, 16, C.textMuted, 10) makeDivider(SettingsPage, 42) makeLabel(SettingsPage, "Config Name", 0, 54, 150, 16, C.accent3, 11, Enum.Font.GothamSemibold) local CfgNameInput = makeInput(SettingsPage, "my config", 0, 72, 240, 32) local SaveBtn = makeButton(SettingsPage, "SAVE CONFIG", 0, 116, 150, 34, C.accent1, C.bg) local LoadBtn = makeButton(SettingsPage, "LOAD CONFIG", 158, 116, 150, 34, C.surface, C.accent3) local ClearBtn = makeButton(SettingsPage, "CLEAR ALL", 316, 116, 150, 34, C.danger, Color3.new(1,1,1)) local CfgStatusLabel = makeLabel(SettingsPage, "", 0, 158, 494, 16, C.success, 10, Enum.Font.GothamSemibold) local function showCfgStatus(msg, color) CfgStatusLabel.Text = msg CfgStatusLabel.TextColor3 = color or C.success task.delay(3, function() if CfgStatusLabel.Text == msg then CfgStatusLabel.Text = "" end end) end local CfgScroll = Instance.new("ScrollingFrame") CfgScroll.Size = UDim2.new(1, 0, 0, 140) CfgScroll.Position = UDim2.new(0, 0, 0, 178) CfgScroll.BackgroundColor3 = C.surface CfgScroll.ScrollBarThickness = 3 CfgScroll.ScrollBarImageColor3 = C.accent1 CfgScroll.ZIndex = 4 CfgScroll.CanvasSize = UDim2.new(0, 0, 0, 0) CfgScroll.Parent = SettingsPage Instance.new("UICorner", CfgScroll).CornerRadius = UDim.new(0, 8) local cfgLayout = Instance.new("UIListLayout", CfgScroll) cfgLayout.Padding = UDim.new(0, 4) local function refreshCfgList() for _, ch in ipairs(CfgScroll:GetChildren()) do if ch:IsA("Frame") then ch:Destroy() end end local hasAny = false for cfgName, _ in pairs(savedConfig) do hasAny = true local row = Instance.new("Frame") row.Size = UDim2.new(1, -8, 0, 32) row.BackgroundTransparency = 1 row.ZIndex = 5 row.Parent = CfgScroll makeLabel(row, cfgName, 8, 7, 380, 18, C.textPrimary, 12) local loadC = makeButton(row, "LOAD", 400, 4, 44, 24, C.accent1, C.bg) loadC.TextSize = 10 loadC.MouseButton1Click:Connect(function() CfgNameInput.Text = cfgName local cfg = savedConfig[cfgName] if not cfg then return end proxDistance = cfg.proxDistance or 10 proxRate = cfg.proxRate or 10 DistSlider.Text = tostring(proxDistance) RateSlider.Text = tostring(proxRate) for _, ev in ipairs(eventList) do if ev.connection then ev.connection:Disconnect() end end eventList = {} rebuildEventList() for i, e in ipairs(cfg.events or {}) do local newEv = { name = e.name, eventStr = e.eventStr, rate = e.rate, active = false, connection = nil } table.insert(eventList, newEv) renderEventRow(newEv, i) end showCfgStatus("✓ Loaded config: " .. cfgName) end) local delC = makeButton(row, "X", 450, 4, 28, 24, C.danger, Color3.new(1,1,1)) delC.MouseButton1Click:Connect(function() savedConfig[cfgName] = nil saveConfigsToDisk() refreshCfgList() showCfgStatus("Deleted config: " .. cfgName, C.danger) end) end if not hasAny then makeLabel(CfgScroll, "No saved configs yet", 8, 8, 300, 18, C.textMuted, 11) end CfgScroll.CanvasSize = UDim2.new(0, 0, 0, cfgLayout.AbsoluteContentSize.Y + 8) end SaveBtn.MouseButton1Click:Connect(function() local n = CfgNameInput.Text if n == "" then showCfgStatus("⚠ Enter a config name first", C.accent1) return end local evs = {} for _, ev in ipairs(eventList) do table.insert(evs, { name = ev.name, eventStr = ev.eventStr, rate = ev.rate }) end savedConfig[n] = { proxDistance = proxDistance, proxRate = proxRate, events = evs } saveConfigsToDisk() refreshCfgList() showCfgStatus("✓ Saved configuration context: " .. n) end) LoadBtn.MouseButton1Click:Connect(function() loadConfigsFromDisk() refreshCfgList() showCfgStatus("✓ Hard refreshed registry configs from disk") end) ClearBtn.MouseButton1Click:Connect(function() for _, ev in ipairs(eventList) do if ev.connection then ev.connection:Disconnect() end end eventList = {} rebuildEventList() refreshEvListCanvas() showCfgStatus("Cleared internal variables list frame tracking", C.accent2) end) refreshCfgList() -- ════════════════════════════════════════════ -- NAVIGATION INTERACTION INTERFACE -- ════════════════════════════════════════════ local function switchTab(tabKey) currentTab = tabKey ProxPage.Visible = (tabKey == "prox") EventPage.Visible = (tabKey == "events") ScriptsPage.Visible = (tabKey == "scripts") SettingsPage.Visible = (tabKey == "settings") TabProx.TextColor3 = (tabKey == "prox") and C.accent1 or C.textMuted TabProx.BackgroundColor3 = (tabKey == "prox") and C.surface or C.panel TabEvents.TextColor3 = (tabKey == "events") and C.accent2 or C.textMuted TabEvents.BackgroundColor3 = (tabKey == "events") and C.surface or C.panel TabScripts.TextColor3 = (tabKey == "scripts") and C.accent1 or C.textMuted TabScripts.BackgroundColor3 = (tabKey == "scripts") and C.surface or C.panel TabSettings.TextColor3 = (tabKey == "settings") and C.accent3 or C.textMuted TabSettings.BackgroundColor3 = (tabKey == "settings") and C.surface or C.panel end TabProx.MouseButton1Click:Connect(function() switchTab("prox") end) TabEvents.MouseButton1Click:Connect(function() switchTab("events") end) TabScripts.MouseButton1Click:Connect(function() switchTab("scripts") end) TabSettings.MouseButton1Click:Connect(function() switchTab("settings") end) switchTab("prox") -- ── TOGGLE FUNCTIONALITY (DEL KEY) ────────── local function toggleUI() isOpen = not isOpen Main.Visible = isOpen BgOverlay.Visible = isOpen end UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.Delete then toggleUI() end end) CloseBtn.MouseButton1Click:Connect(function() toggleUI() end) Main.Visible = true isOpen = true