-- FE2 Master Controller: Fixed Round-1 Immediate Startup Check -- Fixes: Instantly detects and runs on Round 1 even if executed mid-round local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local Remote = ReplicatedStorage:WaitForChild("Remote") local StartClientMapTimer = Remote:WaitForChild("StartClientMapTimer") -- ============================================================================ -- MASTER GUI DASHBOARD -- ============================================================================ local screenGui = Instance.new("ScreenGui") screenGui.Name = "FE2_MasterControllerGui_FixedRound1" screenGui.ResetOnSpawn = false screenGui.Parent = PlayerGui local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.Size = UDim2.new(0, 280, 0, 130) mainFrame.Position = UDim2.new(0.02, 0, 0.35, 0) mainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 28) mainFrame.BackgroundTransparency = 0.15 mainFrame.BorderSizePixel = 0 mainFrame.Active = true mainFrame.Draggable = true mainFrame.Parent = screenGui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 8) corner.Parent = mainFrame local stroke = Instance.new("UIStroke") stroke.Color = Color3.fromRGB(60, 60, 80) stroke.Thickness = 1.5 stroke.Parent = mainFrame local titleLabel = Instance.new("TextLabel") titleLabel.Name = "Title" titleLabel.Size = UDim2.new(1, -20, 0, 25) titleLabel.Position = UDim2.new(0, 10, 0, 6) titleLabel.BackgroundTransparency = 1 titleLabel.Text = "⚡ FE2 Master Controller" titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255) titleLabel.TextSize = 13 titleLabel.Font = Enum.Font.GothamBold titleLabel.TextXAlignment = Enum.TextXAlignment.Left titleLabel.Parent = mainFrame local statusLabel = Instance.new("TextLabel") statusLabel.Name = "StatusText" statusLabel.Size = UDim2.new(1, -20, 0, 32) statusLabel.Position = UDim2.new(0, 10, 0, 32) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "Status: Idle / Waiting for round..." statusLabel.TextColor3 = Color3.fromRGB(200, 200, 215) statusLabel.TextSize = 11 statusLabel.Font = Enum.Font.GothamMedium statusLabel.TextXAlignment = Enum.TextXAlignment.Left statusLabel.TextWrapped = true statusLabel.Parent = mainFrame local voteStatusLabel = Instance.new("TextLabel") voteStatusLabel.Name = "VoteStatusText" voteStatusLabel.Size = UDim2.new(1, -20, 0, 22) voteStatusLabel.Position = UDim2.new(0, 10, 0, 66) voteStatusLabel.BackgroundTransparency = 1 voteStatusLabel.Text = "Map Vote: Auto-Voter Active" voteStatusLabel.TextColor3 = Color3.fromRGB(241, 196, 15) voteStatusLabel.TextSize = 11 voteStatusLabel.Font = Enum.Font.GothamMedium voteStatusLabel.TextXAlignment = Enum.TextXAlignment.Left voteStatusLabel.Parent = mainFrame local countLabel = Instance.new("TextLabel") countLabel.Name = "CountText" countLabel.Size = UDim2.new(1, -20, 0, 22) countLabel.Position = UDim2.new(0, 10, 0, 92) countLabel.BackgroundTransparency = 1 countLabel.Text = "Buttons Found: 0" countLabel.TextColor3 = Color3.fromRGB(150, 150, 170) countLabel.TextSize = 11 countLabel.Font = Enum.Font.Gotham countLabel.TextXAlignment = Enum.TextXAlignment.Left countLabel.Parent = mainFrame -- ============================================================================ -- MODULE 1: ALERT & ESCAPE CONFIRMATION LISTENER -- ============================================================================ local escapedConfirmed = false local function checkTextForEscape(text) if type(text) == "string" and string.find(text, "Escaped") then escapedConfirmed = true statusLabel.Text = "Status: Escaped Confirmed by Server!" end end -- Hook Remote.Alert local remoteAlert = Remote:FindFirstChild("Alert") if remoteAlert and remoteAlert:IsA("RemoteEvent") then remoteAlert.OnClientEvent:Connect(function(text) checkTextForEscape(text) end) end -- Hook CL_MAIN_GameScript.Alert local playerScripts = LocalPlayer:FindFirstChild("PlayerScripts") local gameScript = playerScripts and playerScripts:FindFirstChild("CL_MAIN_GameScript") local bindableAlert = gameScript and gameScript:FindFirstChild("Alert") if bindableAlert and bindableAlert:IsA("BindableEvent") then bindableAlert.Event:Connect(function(text) checkTextForEscape(text) end) end -- ============================================================================ -- MODULE 2: BACKGROUND AUTO MAP VOTER -- ============================================================================ local newMapVoteRemote = Remote:FindFirstChild("NewMapVote") if newMapVoteRemote and newMapVoteRemote:IsA("RemoteEvent") then newMapVoteRemote.OnClientEvent:Connect(function(mapPayload, isVotable) if not (mapPayload and mapPayload.mapData) then return end local myUserId = tostring(LocalPlayer.UserId) local existingVote = mapPayload.pVotes and mapPayload.pVotes[myUserId] if existingVote and existingVote.voteCount and existingVote.voteCount > 0 then return end local targetMap = nil for _, mapInfo in ipairs(mapPayload.mapData) do if mapInfo.displayMap and not mapInfo.cooldown and not mapInfo.locked then targetMap = mapInfo break end end if not targetMap then for _, mapInfo in ipairs(mapPayload.mapData) do if mapInfo.displayMap and not mapInfo.cooldown then targetMap = mapInfo break end end end if targetMap then local updVoteRemote = Remote:FindFirstChild("UpdMapVote") if updVoteRemote and updVoteRemote:IsA("RemoteEvent") then updVoteRemote:FireServer(targetMap.ID, 0) voteStatusLabel.Text = "Map Vote: Voted " .. tostring(targetMap.name) end end end) end -- ============================================================================ -- MODULE 3: MAP SCANNER & TOUCHINTEREST SPAMMER -- ============================================================================ local function scanAndAddNewButtons(map, buttonList, knownSet) if not map then return 0 end local newlyAddedCount = 0 for _, desc in ipairs(map:GetDescendants()) do if desc:IsA("BasePart") then local hasTouchInterest = desc:FindFirstChildOfClass("TouchInterest") ~= nil or desc:FindFirstChild("TouchInterest") ~= nil if hasTouchInterest and not knownSet[desc] then local nameLower = desc.Name:lower() local parentNameLower = desc.Parent and desc.Parent.Name:lower() or "" local isExcluded = nameLower:find("exit") or nameLower:find("spawn") or nameLower:find("air") or parentNameLower:find("airtank") or parentNameLower:find("exit") if not isExcluded then knownSet[desc] = true table.insert(buttonList, desc) newlyAddedCount = newlyAddedCount + 1 end end end end return newlyAddedCount end local function waitForMapLoad() local timeout = tick() + 4 while tick() < timeout do local multiplayer = workspace:FindFirstChild("Multiplayer") local map = multiplayer and multiplayer:FindFirstChild("Map") if map and #map:GetChildren() > 0 then task.wait(0.5) return map end task.wait(0.1) end return nil end local function isExitActive(exitPart) if not (exitPart and exitPart:IsDescendantOf(workspace)) then return false end local locatorGui = PlayerGui:FindFirstChild("LocatorGui") local locater = locatorGui and locatorGui:FindFirstChild("Locater") if locater and locater.Visible then local line = locater:FindFirstChild("Line") if line and line:IsA("BasePart") and line.Size.X > 0 then local beamTargetPos = (line.CFrame * CFrame.new(line.Size.X * 0.5, 0, 0)).Position if (beamTargetPos - exitPart.Position).Magnitude <= 15 then return true end end end return false end local function findExitRegion(map) if not map then return nil end for _, desc in ipairs(map:GetDescendants()) do if (desc.Name == "ExitRegion" or desc.Name == "ExitBlock") and desc:IsA("BasePart") then return desc end end return nil end -- ============================================================================ -- MAIN ROUND CONTROLLER -- ============================================================================ local currentRoundID = 0 local function startRoundLogic() currentRoundID = currentRoundID + 1 local myRoundID = currentRoundID escapedConfirmed = false statusLabel.Text = "Status: Waiting for map models..." local map = waitForMapLoad() local buttons = {} local knownSet = {} scanAndAddNewButtons(map, buttons, knownSet) countLabel.Text = string.format("Buttons Found: %d", #buttons) statusLabel.Text = string.format("Status: Spamming %d buttons...", #buttons) -- LOOP 1: Background Button Scanner task.spawn(function() while currentRoundID == myRoundID and not escapedConfirmed do task.wait(0.3) if map and map.Parent then local newlyDiscovered = scanAndAddNewButtons(map, buttons, knownSet) if newlyDiscovered > 0 then countLabel.Text = string.format("Buttons Found: %d", #buttons) statusLabel.Text = string.format("Status: Spamming %d buttons...", #buttons) end end end end) -- LOOP 2: Remote Spammer & Repeat Escape Controller task.spawn(function() local pressedRemote = Remote:FindFirstChild("PressedMapButton") local survivedRemote = Remote:FindFirstChild("Survived") local escapeAttemptActive = false while currentRoundID == myRoundID and not escapedConfirmed and task.wait(1/60) do -- A. Spam PressedMapButton on ALL discovered button hitboxes if pressedRemote and pressedRemote:IsA("RemoteEvent") then for i = 1, #buttons do local btnPart = buttons[i] if btnPart and btnPart.Parent and btnPart:IsDescendantOf(workspace) then pressedRemote:FireServer(btnPart) end end end -- B. Repeat Escape Attempts once Exit becomes active if not escapedConfirmed and not escapeAttemptActive then local exitPart = findExitRegion(map) if exitPart and isExitActive(exitPart) then escapeAttemptActive = true statusLabel.Text = "Status: Attempting Escape..." -- REPEAT ATTEMPT LOOP task.spawn(function() while currentRoundID == myRoundID and not escapedConfirmed do if survivedRemote then pcall(function() if survivedRemote:IsA("RemoteFunction") then local result = survivedRemote:InvokeServer(LocalPlayer) if result == true then escapedConfirmed = true statusLabel.Text = "Status: Escaped Confirmed!" end elseif survivedRemote:IsA("RemoteEvent") then survivedRemote:FireServer(LocalPlayer) end end) end task.wait(0.1) -- Retries escape every 0.1s end end) end end end end) end -- Connect to Map Timer for subsequent rounds StartClientMapTimer.OnClientEvent:Connect(startRoundLogic) -- STARTUP CHECK (Ensures Round 1 runs immediately if executed mid-round) local existingMap = workspace:FindFirstChild("Multiplayer") and workspace.Multiplayer:FindFirstChild("Map") if existingMap and #existingMap:GetChildren() > 0 then task.spawn(startRoundLogic) end