local Players = game:GetService("Players") local RunService = game:GetService("RunService") local CoreGui = game:GetService("CoreGui") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer -- Cleanup old versions on restart if CoreGui:FindFirstChild("HaloMenuGui") then CoreGui.HaloMenuGui:Destroy() end if workspace.CurrentCamera:FindFirstChild("ClientHalo3D") then workspace.CurrentCamera.ClientHalo3D:Destroy() end -- ======================================================= -- DEFAULT SETTINGS -- ======================================================= local config = { mode = "Rainbow", -- "Rainbow", "Angel", "Fire" rotationSpeed = 1.2, radius = 1.3, height = 2.0, thickness = 0.22, segments = 72, -- "Parts" slider (72 - 200) fireWaves = 4 -- "Points" slider (2 - 12) } local currentRotation = 0 local haloParts = {} local jointParts = {} -- ======================================================= -- HALO CONTAINER -- ======================================================= local haloModel = Instance.new("Model") haloModel.Name = "ClientHalo3D" haloModel.Parent = workspace.CurrentCamera local centerPart = Instance.new("Part") centerPart.Size = Vector3.new(0.1, 0.1, 0.1) centerPart.Transparency = 1 centerPart.CanCollide = false centerPart.Anchored = true centerPart.Parent = haloModel haloModel.PrimaryPart = centerPart local function adjustSegmentCount(targetCount) while #haloParts < targetCount do local p = Instance.new("Part") p.Material = Enum.Material.Neon p.CanCollide = false p.Anchored = true p.Shape = Enum.PartType.Cylinder p.Parent = haloModel table.insert(haloParts, p) local s = Instance.new("Part") s.Material = Enum.Material.Neon s.CanCollide = false s.Anchored = true s.Shape = Enum.PartType.Ball s.Parent = haloModel table.insert(jointParts, s) end while #haloParts > targetCount do local p = table.remove(haloParts) if p then p:Destroy() end local s = table.remove(jointParts) if s then s:Destroy() end end end adjustSegmentCount(config.segments) -- ======================================================= -- INTERFACE (GUI) WITH SEPARATE SECTIONS -- ======================================================= local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "HaloMenuGui" ScreenGui.Parent = CoreGui ScreenGui.ResetOnSpawn = false ScreenGui.IgnoreGuiInset = true -- Toggle Button local ToggleBtn = Instance.new("TextButton") ToggleBtn.Size = UDim2.new(0, 90, 0, 30) ToggleBtn.Position = UDim2.new(1, -105, 0.4, -150) ToggleBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 35) ToggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) ToggleBtn.Text = "Halo GUI" ToggleBtn.Font = Enum.Font.SourceSansBold ToggleBtn.TextSize = 14 ToggleBtn.Parent = ScreenGui Instance.new("UICorner", ToggleBtn).CornerRadius = UDim.new(0, 6) -- Main Frame local MainFrame = Instance.new("Frame") MainFrame.Size = UDim2.new(0, 220, 0, 410) -- Initial size MainFrame.Position = UDim2.new(1, -235, 0.4, -110) MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 25) MainFrame.BorderSizePixel = 0 MainFrame.Visible = true MainFrame.Parent = ScreenGui Instance.new("UICorner", MainFrame).CornerRadius = UDim.new(0, 10) local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, 0, 0, 35) Title.BackgroundTransparency = 1 Title.Text = "Premium Halo GUI" Title.TextColor3 = Color3.fromRGB(255, 255, 255) Title.Font = Enum.Font.SourceSansBold Title.TextSize = 18 Title.Parent = MainFrame local layout = Instance.new("UIListLayout") layout.Parent = MainFrame layout.SortOrder = Enum.SortOrder.LayoutOrder layout.Padding = UDim.new(0, 6) layout.HorizontalAlignment = Enum.HorizontalAlignment.Center -- Section: MODES local ModeSectionLabel = Instance.new("TextLabel") ModeSectionLabel.Size = UDim2.new(0, 190, 0, 20) ModeSectionLabel.BackgroundTransparency = 1 ModeSectionLabel.Text = "— MODES —" ModeSectionLabel.TextColor3 = Color3.fromRGB(120, 120, 130) ModeSectionLabel.Font = Enum.Font.SourceSansBold ModeSectionLabel.TextSize = 12 ModeSectionLabel.Parent = MainFrame -- Horizontal Container for Mode Buttons local ModesContainer = Instance.new("Frame") ModesContainer.Size = UDim2.new(0, 190, 0, 32) ModesContainer.BackgroundTransparency = 1 ModesContainer.Parent = MainFrame local hLayout = Instance.new("UIListLayout") hLayout.Parent = ModesContainer hLayout.FillDirection = Enum.FillDirection.Horizontal hLayout.SortOrder = Enum.SortOrder.LayoutOrder hLayout.Padding = UDim.new(0, 5) -- Button Tracking Table for Color Changes local modeButtons = {} local fireSliderFrame -- Reference to "Points" slider to toggle visibility local function updateMenuVisuals() for mName, btn in pairs(modeButtons) do if config.mode == mName then -- Highlight active mode if mName == "Rainbow" then btn.BackgroundColor3 = Color3.fromRGB(0, 160, 255) elseif mName == "Angel" then btn.BackgroundColor3 = Color3.fromRGB(200, 160, 40) elseif mName == "Fire" then btn.BackgroundColor3 = Color3.fromRGB(220, 60, 20) end btn.TextColor3 = Color3.fromRGB(255, 255, 255) else -- Inactive mode btn.BackgroundColor3 = Color3.fromRGB(35, 35, 40) btn.TextColor3 = Color3.fromRGB(160, 160, 160) end end -- Toggle visibility of the "Points" slider for Fire mode if fireSliderFrame then if config.mode == "Fire" then fireSliderFrame.Visible = true MainFrame.Size = UDim2.new(0, 220, 0, 415) -- Expand frame else fireSliderFrame.Visible = false MainFrame.Size = UDim2.new(0, 220, 0, 365) -- Shrink frame end end end local function createModeBtn(mName, text, order) local btn = Instance.new("TextButton") btn.Size = UDim2.new(0, 60, 1, 0) btn.Font = Enum.Font.SourceSansBold btn.TextSize = 11 btn.Text = text btn.LayoutOrder = order btn.Parent = ModesContainer Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 5) modeButtons[mName] = btn btn.MouseButton1Click:Connect(function() config.mode = mName updateMenuVisuals() end) end createModeBtn("Rainbow", "Rainbow 🌈", 1) createModeBtn("Angel", "Angel 👼", 2) createModeBtn("Fire", "Fire 🔥", 3) -- Section: SETTINGS local SettingsSectionLabel = Instance.new("TextLabel") SettingsSectionLabel.Size = UDim2.new(0, 190, 0, 20) SettingsSectionLabel.BackgroundTransparency = 1 SettingsSectionLabel.Text = "— SETTINGS —" SettingsSectionLabel.TextColor3 = Color3.fromRGB(120, 120, 130) SettingsSectionLabel.Font = Enum.Font.SourceSansBold SettingsSectionLabel.TextSize = 12 SettingsSectionLabel.Parent = MainFrame -- Slider Creator Function local function createSliderRow(labelText, minVal, maxVal, startVal, isInteger, callback) local row = Instance.new("Frame") row.Size = UDim2.new(0, 190, 0, 45) row.BackgroundTransparency = 1 row.Parent = MainFrame local label = Instance.new("TextLabel") label.Size = UDim2.new(1, 0, 0, 20) label.BackgroundTransparency = 1 label.Text = labelText .. ": " .. (isInteger and tostring(math.round(startVal)) or string.format("%.1f", startVal)) label.TextColor3 = Color3.fromRGB(200, 200, 200) label.Font = Enum.Font.SourceSans label.TextSize = 14 label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = row local sliderBar = Instance.new("Frame") sliderBar.Size = UDim2.new(1, 0, 0, 6) sliderBar.Position = UDim2.new(0, 0, 0, 25) sliderBar.BackgroundColor3 = Color3.fromRGB(40, 40, 45) sliderBar.BorderSizePixel = 0 sliderBar.Parent = row Instance.new("UICorner", sliderBar).CornerRadius = UDim.new(0, 3) local knob = Instance.new("TextButton") knob.Size = UDim2.new(0, 14, 0, 14) knob.BackgroundColor3 = Color3.fromRGB(0, 255, 240) knob.Text = "" knob.Parent = sliderBar Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0) local startPct = (startVal - minVal) / (maxVal - minVal) knob.Position = UDim2.new(startPct, -7, 0.5, -7) local dragging = false local function updateSlider() local mousePos = UserInputService:GetMouseLocation() local barAbsPos = sliderBar.AbsolutePosition local barAbsSize = sliderBar.AbsoluteSize local pct = math.clamp((mousePos.X - barAbsPos.X) / barAbsSize.X, 0, 1) knob.Position = UDim2.new(pct, -7, 0.5, -7) local exactVal = minVal + (maxVal - minVal) * pct if isInteger then exactVal = math.round(exactVal) label.Text = labelText .. ": " .. tostring(exactVal) else exactVal = math.round(exactVal * 10) / 10 label.Text = labelText .. ": " .. string.format("%.1f", exactVal) end callback(exactVal) end knob.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) RunService.RenderStepped:Connect(function() if dragging then updateSlider() end end) return row end -- Create Standard Sliders createSliderRow("Speed", 0, 5, config.rotationSpeed, false, function(val) config.rotationSpeed = val end) createSliderRow("Size", 0.3, 4, config.radius, false, function(val) config.radius = val end) createSliderRow("Height", 0.5, 5, config.height, false, function(val) config.height = val end) createSliderRow("Parts", 3, 400, config.segments, true, function(val) config.segments = val end) -- Create "Points" slider and save reference to dynamically hide it fireSliderFrame = createSliderRow("Points", 2, 12, config.fireWaves, true, function(val) config.fireWaves = val end) -- Initial UI Setup updateMenuVisuals() ToggleBtn.MouseButton1Click:Connect(function() MainFrame.Visible = not MainFrame.Visible end) -- ======================================================= -- MAIN MATH AND RENDERING LOOP -- ======================================================= local connection connection = RunService.RenderStepped:Connect(function(dt) local character = player.Character if not character then return end local head = character:FindFirstChild("Head") if not head then return end if not haloModel or not haloModel.Parent then connection:Disconnect() return end -- Update physics segment counts from the Parts slider adjustSegmentCount(config.segments) local currentSegments = #haloParts currentRotation = (currentRotation + dt * config.rotationSpeed) % (math.pi * 2) local baseWave = math.sin(tick() * 2.5) * 0.08 local yOffset = config.height + baseWave centerPart.CFrame = head.CFrame * CFrame.new(0, yOffset, 0) * CFrame.Angles(0, currentRotation, 0) local positions = {} local colors = {} -- Pre-calculate Geometry for i = 1, currentSegments + 1 do local angle = (i / currentSegments) * math.pi * 2 local x = math.cos(angle) * config.radius local z = math.sin(angle) * config.radius local localWave = 0 local partColor = Color3.fromRGB(255, 255, 255) if config.mode == "Rainbow" then partColor = Color3.fromHSV((tick() * 0.15 + i / currentSegments) % 1, 1, 1) localWave = math.sin(tick() * 3 + angle * 2) * 0.05 elseif config.mode == "Angel" then partColor = Color3.fromRGB(255, 235, 140) localWave = math.sin(tick() * 1.2 + angle * 1) * 0.02 elseif config.mode == "Fire" then -- The "Points" slider (config.fireWaves) handles how many peaks the flame has local fireHue = 0.02 + (math.sin(tick() * 4 + angle * config.fireWaves) * 0.04) partColor = Color3.fromHSV(fireHue, 0.95, 1) localWave = math.sin(tick() * 6 + angle * config.fireWaves) * 0.14 end local worldPos = Vector3.new(x, localWave, z) table.insert(positions, centerPart.CFrame * worldPos) table.insert(colors, partColor) end -- Render cylinders and joints for i = 1, currentSegments do local p = haloParts[i] local s = jointParts[i] local pos1 = positions[i] local pos2 = positions[i + 1] local currentColor = colors[i] -- Joint Spheres local ballSize = config.thickness + 0.04 s.Size = Vector3.new(ballSize, ballSize, ballSize) s.CFrame = CFrame.new(pos1) s.Color = currentColor -- Neon Cylinders local distance = (pos2 - pos1).Magnitude p.Size = Vector3.new(distance + 0.01, config.thickness, config.thickness) p.CFrame = CFrame.lookAt(pos1:Lerp(pos2, 0.5), pos2) * CFrame.Angles(0, math.rad(90), 0) p.Color = currentColor end end)