-- LightingMenu.lua -- Versión mejorada: Nombres específicos, entrada manual de números, animaciones Windows 11 -- CON BOTONES DE REINICIO INDIVIDUALES MEJORADOS local Lighting = game:GetService("Lighting") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local StarterGui = game:GetService("StarterGui") local TweenService = game:GetService("TweenService") local LOCAL_PLAYER = Players.LocalPlayer ----------------------------------------------------- -- Configuración inicial ----------------------------------------------------- local LightingConfig = { Brightness = 1.05, ExposureCompensation = 0.15, ShadowSoftness = 0.55, EnvironmentDiffuseScale = 0.22, EnvironmentSpecularScale = 0.20, ClockTime = 14, FogStart = 0, FogEnd = 1800, GlobalShadows = true, } for property, value in pairs(LightingConfig) do pcall(function() Lighting[property] = value end) end ----------------------------------------------------- -- Efectos ----------------------------------------------------- local EffectsConfig = { BloomEffect = { Name = "Bloom", Intensity = 0.12, Size = 25, Threshold = 0.32, Enabled = true }, DepthOfFieldEffect = { Name = "DepthOfField", InFocusRadius = 80, NearIntensity = 0.25, FarIntensity = 0.35, FocusDistance = 18, Enabled = true }, ColorCorrectionEffect = { Name = "ColorCorrection", Brightness = 0.05, Contrast = 0.10, Saturation = 0.05, Enabled = true }, SunRaysEffect = { Name = "SunRays", Intensity = 0.08, Spread = 3.5, Enabled = true }, BlurEffect = { Name = "Blur", Size = 0, Enabled = false }, } local function addOrUpdateEffect(effectType, properties) local effect = Lighting:FindFirstChildOfClass(effectType) if not effect then local ok, inst = pcall(function() return Instance.new(effectType, Lighting) end) effect = ok and inst or nil end if not effect then return nil end for property, value in pairs(properties) do if effect[property] ~= nil then pcall(function() effect[property] = value end) end end return effect end for effectType, properties in pairs(EffectsConfig) do addOrUpdateEffect(effectType, properties) end ----------------------------------------------------- -- Helpers ----------------------------------------------------- local function clamp(n, a, b) return math.max(a, math.min(b, n)) end local function formatValue(v) if type(v) ~= "number" then return tostring(v) end if math.abs(v - math.floor(v + 0.5)) < 1e-6 then return tostring(math.floor(v + 0.5)) else return string.format("%.2f", v) end end local DEFAULT_WIDTH = 420 local DEFAULT_HEIGHT = 750 local SCREEN_MARGIN = 20 ----------------------------------------------------- -- Guardados originales ----------------------------------------------------- local originalCoreGuiStates = {} local originalNameDistance = nil local originalPlayerGuiStates = {} do local ok, val = pcall(function() return StarterGui:GetCore("NameDisplayDistance") end) originalNameDistance = (ok and type(val) == "number") and val or 100 local coreTypes = { Enum.CoreGuiType.Chat, Enum.CoreGuiType.Backpack, Enum.CoreGuiType.PlayerList, Enum.CoreGuiType.Health } for _, t in ipairs(coreTypes) do local ok2, enabled = pcall(function() return StarterGui:GetCoreGuiEnabled(t) end) originalCoreGuiStates[t.Name] = (ok2 and type(enabled) == "boolean") and enabled or true end local playerGui = LOCAL_PLAYER:WaitForChild("PlayerGui") for _, gui in ipairs(playerGui:GetChildren()) do if gui:IsA("ScreenGui") then table.insert(originalPlayerGuiStates, { Name = gui.Name, IsScreenGui = true, Enabled = gui.Enabled }) elseif gui:IsA("GuiObject") then table.insert(originalPlayerGuiStates, { Name = gui.Name, IsScreenGui = false, Visible = gui.Visible }) end end end local function setCoreGuiEnabledSafe(coreType, enabled) pcall(function() StarterGui:SetCoreGuiEnabled(coreType, enabled) end) end local function setCoreSafe(name, value) pcall(function() StarterGui:SetCore(name, value) end) end ----------------------------------------------------- -- Variables de hora automática GLOBALES ----------------------------------------------------- local autoClockRunning = false local autoClockSpeed = 0.2 -- Conexión global para actualizar constantemente local globalAutoClockLoop = nil ----------------------------------------------------- -- Función para controlar la hora automática globalmente ----------------------------------------------------- local function startGlobalAutoClock() if globalAutoClockLoop then return end globalAutoClockLoop = RunService.Heartbeat:Connect(function(deltaTime) if autoClockRunning then -- Actualizar la hora constantemente SOLO si está activado local newTime = (Lighting.ClockTime + (autoClockSpeed * deltaTime)) % 24 Lighting.ClockTime = newTime end end) end startGlobalAutoClock() ----------------------------------------------------- -- UI MENU ----------------------------------------------------- local function createScreenGui() local old = LOCAL_PLAYER.PlayerGui:FindFirstChild("LightingMenu") if old then old:Destroy() end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "LightingMenu" ScreenGui.ResetOnSpawn = false ScreenGui.DisplayOrder = 1000 ScreenGui.Parent = LOCAL_PLAYER:WaitForChild("PlayerGui") -- CAPA INVISIBLE PARA BLOQUEAR INPUTS (Toque en celular) local InputBlocker = Instance.new("Frame", ScreenGui) InputBlocker.Name = "InputBlocker" InputBlocker.Size = UDim2.new(1, 0, 1, 0) InputBlocker.Position = UDim2.new(0, 0, 0, 0) InputBlocker.BackgroundTransparency = 1 InputBlocker.BorderSizePixel = 0 InputBlocker.ZIndex = 500 InputBlocker.Visible = false InputBlocker.Active = true -- BOTÓN FLOTANTE PARA CELULAR (PEQUEÑO) local FloatingButton = Instance.new("TextButton", ScreenGui) FloatingButton.Name = "FloatingButton" FloatingButton.Size = UDim2.new(0, 45, 0, 45) FloatingButton.Position = UDim2.new(1, -65, 1, -65) FloatingButton.BackgroundColor3 = Color3.fromRGB(50,150,255) FloatingButton.Text = "⚙" FloatingButton.Font = Enum.Font.GothamBold FloatingButton.TextSize = 22 FloatingButton.TextColor3 = Color3.fromRGB(255,255,255) FloatingButton.AutoButtonColor = true FloatingButton.ZIndex = 999 local FloatingCorner = Instance.new("UICorner", FloatingButton) FloatingCorner.CornerRadius = UDim.new(0, 25) -- Sombra para el botón flotante local FloatingStroke = Instance.new("UIStroke", FloatingButton) FloatingStroke.Color = Color3.fromRGB(30,100,200) FloatingStroke.Thickness = 2 local Frame = Instance.new("Frame", ScreenGui) Frame.Name = "MainFrame" Frame.BackgroundColor3 = Color3.fromRGB(40,40,40) Frame.BorderSizePixel = 0 Frame.ClipsDescendants = true Frame.ZIndex = 1000 Frame.Visible = false local UICorner = Instance.new("UICorner", Frame) UICorner.CornerRadius = UDim.new(0, 10) local function adaptFrame() local cam = workspace.CurrentCamera if not cam then return end local vs = cam.ViewportSize local maxW = math.max(100, vs.X - SCREEN_MARGIN * 2) local maxH = math.max(100, vs.Y - SCREEN_MARGIN * 2) local w = math.min(DEFAULT_WIDTH, maxW) local h = math.min(DEFAULT_HEIGHT, maxH) Frame.Size = UDim2.new(0, w, 0, h) -- POSICIONAR EN EL CENTRO - Centrado verticalmente en la pantalla, pero más arriba -- Centro horizontal local xPos = (vs.X - w) / 2 -- Centro vertical pero restando 200 para subirlo más de lo normal local yPos = (vs.Y - h) / 2 - 60 Frame.Position = UDim2.new(0, xPos, 0, yPos) end RunService.RenderStepped:Connect(adaptFrame) adaptFrame() local Header = Instance.new("TextLabel", Frame) Header.Size = UDim2.new(1, 0, 0, 40) Header.Position = UDim2.new(0, 0, 0, 10) Header.BackgroundTransparency = 1 Header.Text = "Menú de Iluminación" Header.TextColor3 = Color3.fromRGB(240,240,240) Header.Font = Enum.Font.SourceSansBold Header.TextSize = 18 Header.TextXAlignment = Enum.TextXAlignment.Center Header.ZIndex = 1001 local CloseBtn = Instance.new("TextButton", Frame) CloseBtn.Name = "CloseButton" CloseBtn.Size = UDim2.new(0, 34, 0, 34) CloseBtn.Position = UDim2.new(1, -44, 0, 8) CloseBtn.BackgroundColor3 = Color3.fromRGB(60,60,60) CloseBtn.Text = "" CloseBtn.Font = Enum.Font.SourceSansBold CloseBtn.TextSize = 20 CloseBtn.TextColor3 = Color3.fromRGB(230,230,230) CloseBtn.AutoButtonColor = true CloseBtn.ZIndex = 1001 local CloseCorner = Instance.new("UICorner", CloseBtn) CloseCorner.CornerRadius = UDim.new(0, 8) -- Crear líneas para hacer la X local line1 = Instance.new("Frame", CloseBtn) line1.Size = UDim2.new(0, 2, 0, 24) line1.Position = UDim2.new(0.5, -1, 0.5, -12) line1.BackgroundColor3 = Color3.fromRGB(230,230,230) line1.BorderSizePixel = 0 line1.Rotation = 45 line1.ZIndex = 1002 local line2 = Instance.new("Frame", CloseBtn) line2.Size = UDim2.new(0, 2, 0, 24) line2.Position = UDim2.new(0.5, -1, 0.5, -12) line2.BackgroundColor3 = Color3.fromRGB(230,230,230) line2.BorderSizePixel = 0 line2.Rotation = -45 line2.ZIndex = 1002 local function closeMenu() local tweenInfo = TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.In) local tween = TweenService:Create(Frame, tweenInfo, { Position = UDim2.new(0.5, -Frame.AbsoluteSize.X/2, 1, Frame.AbsoluteSize.Y) }) tween:Play() tween.Completed:Connect(function() Frame.Visible = false InputBlocker.Visible = false end) end CloseBtn.MouseButton1Click:Connect(closeMenu) -- VARIABLE PARA DRAGGING DEL BOTÓN FLOTANTE local draggingFloatingButton = false local floatingButtonOffset = Vector2.new(0, 0) local clickStartTime = 0 -- FUNCIONALIDAD DE ARRASTRE DEL BOTÓN FLOTANTE FloatingButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then clickStartTime = tick() draggingFloatingButton = true local buttonPos = FloatingButton.AbsolutePosition local inputPos = input.Position floatingButtonOffset = Vector2.new( buttonPos.X - inputPos.X, buttonPos.Y - inputPos.Y ) end end) local floatingDragConnection = nil FloatingButton.InputChanged:Connect(function(input) if (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) and draggingFloatingButton then if not floatingDragConnection then floatingDragConnection = RunService.RenderStepped:Connect(function() if draggingFloatingButton and input.Position then local newX = input.Position.X + floatingButtonOffset.X local newY = input.Position.Y + floatingButtonOffset.Y local cam = workspace.CurrentCamera local vs = cam.ViewportSize -- Limitar movimiento dentro de la pantalla newX = math.max(0, math.min(newX, vs.X - 45)) newY = math.max(0, math.min(newY, vs.Y - 45)) FloatingButton.Position = UDim2.new(0, newX, 0, newY) end end) end end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then if draggingFloatingButton then draggingFloatingButton = false if floatingDragConnection then floatingDragConnection:Disconnect() floatingDragConnection = nil end -- Si fue un click corto (no arrastre), abrir/cerrar menú if tick() - clickStartTime < 0.3 then if Frame.Visible then closeMenu() else Frame.Visible = true InputBlocker.Visible = true local cam = workspace.CurrentCamera if cam then local vs = cam.ViewportSize local w = math.min(420, math.max(100, vs.X - 40)) local h = math.min(750, math.max(100, vs.Y - 40)) Frame.Size = UDim2.new(0, w, 0, h) -- Posicionamiento adaptado - Centrado pero más arriba local xPos = (vs.X - w) / 2 local yPos = (vs.Y - h) / 2 - 60 Frame.Position = UDim2.new(0, xPos, 0, yPos) end local tweenInfo = TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) local tween = TweenService:Create(Frame, tweenInfo, Frame.Position) tween:Play() end end end end end) -- CAPA INVISIBLE PARA CAPTURAR SCROLL EN TODA LA PANTALLA local ScrollCapture = Instance.new("Frame", ScreenGui) ScrollCapture.Name = "ScrollCapture" ScrollCapture.Size = UDim2.new(1, 0, 1, 0) ScrollCapture.Position = UDim2.new(0, 0, 0, 0) ScrollCapture.BackgroundTransparency = 1 ScrollCapture.BorderSizePixel = 0 ScrollCapture.ZIndex = 501 ScrollCapture.Visible = false local Scroll = Instance.new("ScrollingFrame", Frame) Scroll.Name = "ScrollArea" Scroll.Size = UDim2.new(1, -20, 1, -160) Scroll.Position = UDim2.new(0, 10, 0, 60) Scroll.BackgroundTransparency = 1 Scroll.BorderSizePixel = 0 Scroll.ScrollBarThickness = 8 Scroll.ScrollingDirection = Enum.ScrollingDirection.Y Scroll.CanvasSize = UDim2.new(0,0,0,0) Scroll.ZIndex = 1000 Scroll.Active = true Scroll.ClipsDescendants = true -- CONECTAR SCROLL CAPTURE AL SCROLL PRINCIPAL local function updateScrollCaptureVisibility() ScrollCapture.Visible = Frame.Visible end Frame:GetPropertyChangedSignal("Visible"):Connect(updateScrollCaptureVisibility) -- MANEJAR SCROLL EN LA CAPA DE CAPTURA CON INERTIA local touchStartY = 0 local scrollStartCanvasPosition = 0 local lastTouchY = 0 local touchVelocity = 0 local scrollConnection = nil ScrollCapture.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch and Frame.Visible then touchStartY = input.Position.Y lastTouchY = input.Position.Y scrollStartCanvasPosition = Scroll.CanvasPosition.Y touchVelocity = 0 -- Detener inertia previa si existe if scrollConnection then scrollConnection:Disconnect() scrollConnection = nil end end end) ScrollCapture.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch and Frame.Visible then local currentY = input.Position.Y local delta = lastTouchY - currentY touchVelocity = delta -- Aplicar scroll inmediatamente local newCanvasY = scrollStartCanvasPosition + (touchStartY - currentY) newCanvasY = math.max(0, math.min(newCanvasY, math.max(0, Scroll.CanvasSize.Y.Offset - Scroll.AbsoluteSize.Y))) Scroll.CanvasPosition = Vector2.new(0, newCanvasY) lastTouchY = currentY end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch and Frame.Visible then -- Iniciar inertia (momentum scrolling) if scrollConnection then scrollConnection:Disconnect() end local currentVelocity = touchVelocity scrollConnection = RunService.RenderStepped:Connect(function() if currentVelocity ~= 0 then local newCanvasY = Scroll.CanvasPosition.Y + currentVelocity newCanvasY = math.max(0, math.min(newCanvasY, math.max(0, Scroll.CanvasSize.Y.Offset - Scroll.AbsoluteSize.Y))) Scroll.CanvasPosition = Vector2.new(0, newCanvasY) -- Aplicar fricción currentVelocity = currentVelocity * 0.92 -- Detener cuando la velocidad es muy pequeña if math.abs(currentVelocity) < 0.1 then currentVelocity = 0 if scrollConnection then scrollConnection:Disconnect() scrollConnection = nil end end end end) end end) local UIListLayout = Instance.new("UIListLayout", Scroll) UIListLayout.Padding = UDim.new(0, 10) UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder UIListLayout.VerticalAlignment = Enum.VerticalAlignment.Top local UIPadding = Instance.new("UIPadding", Scroll) UIPadding.PaddingLeft = UDim.new(0,10) UIPadding.PaddingRight = UDim.new(0,10) UIPadding.PaddingTop = UDim.new(0,4) UIPadding.PaddingBottom = UDim.new(0,4) local ResetButton = Instance.new("TextButton", Frame) ResetButton.Size = UDim2.new(0,200,0,40) ResetButton.Position = UDim2.new(0.5, -100, 1, -60) ResetButton.BackgroundColor3 = Color3.fromRGB(50,150,255) ResetButton.Text = "Reiniciar Configuración" ResetButton.Font = Enum.Font.SourceSansBold ResetButton.TextSize = 16 ResetButton.TextColor3 = Color3.fromRGB(255,255,255) ResetButton.ZIndex = 1001 local ResetCorner = Instance.new("UICorner", ResetButton) ResetCorner.CornerRadius = UDim.new(0,8) local CloseHint = Instance.new("TextLabel", Frame) CloseHint.Size = UDim2.new(1, -40, 0, 20) CloseHint.Position = UDim2.new(0,20,1,-30) CloseHint.BackgroundTransparency = 1 CloseHint.Text = "Ctrl Derecho: abrir/cerrar" CloseHint.TextColor3 = Color3.fromRGB(200,200,200) CloseHint.Font = Enum.Font.SourceSans CloseHint.TextSize = 12 CloseHint.TextXAlignment = Enum.TextXAlignment.Left CloseHint.ZIndex = 1001 local activeSlider = nil local function createToggleControl(name, defaultValue, parent, onToggle) local Container = Instance.new("Frame", parent) Container.Size = UDim2.new(1,0,0,60) Container.BackgroundTransparency = 1 Container.ZIndex = 1000 local Label = Instance.new("TextLabel", Container) Label.Size = UDim2.new(0.65,0,0,30) Label.Position = UDim2.new(0,10,0,0) Label.BackgroundTransparency = 1 Label.Text = name Label.Font = Enum.Font.SourceSansBold Label.TextSize = 14 Label.TextColor3 = Color3.new(1,1,1) Label.TextXAlignment = Enum.TextXAlignment.Left Label.TextYAlignment = Enum.TextYAlignment.Center Label.ZIndex = 1001 local Button = Instance.new("TextButton", Container) Button.Size = UDim2.new(0.3, 0, 0, 30) Button.Position = UDim2.new(0.65, 10, 0, 0) Button.Font = Enum.Font.SourceSans Button.TextSize = 13 Button.ZIndex = 1001 local corner = Instance.new("UICorner", Button) corner.CornerRadius = UDim.new(0,6) local current = defaultValue local function setValueInternal(v, callToggle) current = v and true or false Button.Text = current and "Activo" or "Inactivo" Button.BackgroundColor3 = current and Color3.fromRGB(0,180,0) or Color3.fromRGB(180,40,40) if callToggle and onToggle then pcall(function() onToggle(current) end) end end setValueInternal(defaultValue, false) Button.MouseButton1Click:Connect(function() setValueInternal(not current, true) end) return { button = Button, label = Label, setValue = function(v) setValueInternal(v, true) end, setValueSilent = function(v) setValueInternal(v, false) end, getValue = function() return current end, container = Container } end local function createSliderControl(name, defaultValue, parent, minVal, maxVal, onChange, step) if minVal == nil then minVal = -100 end if maxVal == nil then maxVal = 100 end if minVal > maxVal then minVal, maxVal = maxVal, minVal end if step == nil then step = 0.01 end defaultValue = clamp(defaultValue, minVal, maxVal) local Container = Instance.new("Frame", parent) Container.Size = UDim2.new(1,0,0,70) Container.BackgroundTransparency = 1 Container.ZIndex = 1000 -- LABEL (Nombre) - Al lado izquierdo del slider local Label = Instance.new("TextLabel", Container) Label.Size = UDim2.new(0.5,0,0,20) Label.Position = UDim2.new(0,10,0,25) Label.BackgroundTransparency = 1 Label.Font = Enum.Font.SourceSansBold Label.TextSize = 14 Label.TextXAlignment = Enum.TextXAlignment.Left Label.TextColor3 = Color3.new(1,1,1) Label.ZIndex = 1001 -- CUADRO DE TEXTO (Número) - Al lado derecho sobre el slider local ValueLabel = Instance.new("TextButton", Container) ValueLabel.Size = UDim2.new(0,65,0,28) ValueLabel.Position = UDim2.new(1, -80,0,18) ValueLabel.BackgroundColor3 = Color3.fromRGB(50,50,50) ValueLabel.BorderSizePixel = 0 ValueLabel.Font = Enum.Font.SourceSans ValueLabel.TextSize = 16 ValueLabel.TextXAlignment = Enum.TextXAlignment.Center ValueLabel.TextColor3 = Color3.fromRGB(200,200,200) ValueLabel.ZIndex = 1001 ValueLabel.Text = formatValue(defaultValue) local ValueCorner = Instance.new("UICorner", ValueLabel) ValueCorner.CornerRadius = UDim.new(0, 6) local ValueStroke = Instance.new("UIStroke", ValueLabel) ValueStroke.Color = Color3.fromRGB(100,100,100) ValueStroke.Thickness = 1 -- BOTÓN DE REINICIO INDIVIDUAL - Al lado izquierdo del cuadro de texto local ResetBtn = Instance.new("TextButton", Container) ResetBtn.Size = UDim2.new(0, 35, 0, 28) ResetBtn.Position = UDim2.new(1, -120, 0, 18) ResetBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 0) ResetBtn.BorderSizePixel = 0 ResetBtn.Font = Enum.Font.SourceSansBold ResetBtn.Text = "Ret" ResetBtn.TextSize = 12 ResetBtn.TextColor3 = Color3.fromRGB(255, 255, 255) ResetBtn.ZIndex = 1001 local ResetCorner = Instance.new("UICorner", ResetBtn) ResetCorner.CornerRadius = UDim.new(0, 6) local ResetStroke = Instance.new("UIStroke", ResetBtn) ResetStroke.Color = Color3.fromRGB(0, 120, 0) ResetStroke.Thickness = 1 -- SLIDER TRACK local Track = Instance.new("Frame", Container) Track.Size = UDim2.new(1, -20, 0, 12) Track.Position = UDim2.new(0,10,0,50) Track.BackgroundColor3 = Color3.fromRGB(70,70,70) Track.ZIndex = 1000 local TrackCorner = Instance.new("UICorner", Track) TrackCorner.CornerRadius = UDim.new(0,6) local TrackStroke = Instance.new("UIStroke", Track) TrackStroke.Color = Color3.fromRGB(45,45,45) TrackStroke.Thickness = 1 local Fill = Instance.new("Frame", Track) Fill.Size = UDim2.new(0,0,1,0) Fill.Position = UDim2.new(0,0,0,0) Fill.BackgroundColor3 = Color3.fromRGB(50,160,255) Fill.ZIndex = 1001 local FillCorner = Instance.new("UICorner", Fill) FillCorner.CornerRadius = UDim.new(0,6) local Knob = Instance.new("ImageButton", Track) Knob.Size = UDim2.new(0,20,0,20) Knob.Position = UDim2.new(0, -10, 0.5, -10) Knob.BackgroundTransparency = 1 Knob.ZIndex = 1002 local KnobFrame = Instance.new("Frame", Knob) KnobFrame.Size = UDim2.new(1,0,1,0) KnobFrame.BackgroundColor3 = Color3.fromRGB(240,240,240) local KnobCorner = Instance.new("UICorner", KnobFrame) KnobCorner.CornerRadius = UDim.new(0,10) local KnobStroke = Instance.new("UIStroke", KnobFrame) KnobStroke.Color = Color3.fromRGB(200,200,200) KnobStroke.Thickness = 1 local origTrackStrokeColor = TrackStroke.Color local origTrackStrokeThickness = TrackStroke.Thickness local origKnobStrokeColor = KnobStroke.Color local origKnobStrokeThickness = KnobStroke.Thickness local dragging = false local dragInput = nil local mouseMoveConn = nil local targetRel = 0 local visualRel = 0 local animConn = nil local function setVisualPositions(rel) rel = clamp(rel, 0, 1) Fill.Size = UDim2.new(rel, 0, 1, 0) Knob.Position = UDim2.new(rel, -10, 0.5, -10) end local function startAnim() if animConn then return end animConn = RunService.RenderStepped:Connect(function(dt) local speed = 14 visualRel = visualRel + (targetRel - visualRel) * math.min(1, speed * dt) setVisualPositions(visualRel) end) end local function stopAnim() if animConn then animConn:Disconnect() animConn = nil end end local function applyVisualsImmediate(value) if step and step > 0 then value = math.floor((value - minVal) / step + 0.5) * step + minVal value = clamp(value, minVal, maxVal) end local rel = 0 if maxVal > minVal then rel = (value - minVal) / (maxVal - minVal) end targetRel = rel visualRel = rel setVisualPositions(rel) Label.Text = name ValueLabel.Text = formatValue(value) if onChange then pcall(function() onChange(value) end) end end local function applyVisuals(value) if step and step > 0 then value = math.floor((value - minVal) / step + 0.5) * step + minVal value = clamp(value, minVal, maxVal) end local rel = 0 if maxVal > minVal then rel = (value - minVal) / (maxVal - minVal) end targetRel = rel Label.Text = name ValueLabel.Text = formatValue(value) if onChange then pcall(function() onChange(value) end) end startAnim() end local function setValueFromRelative(rel) rel = clamp(rel, 0, 1) local value = minVal + rel * (maxVal - minVal) applyVisuals(value) end local function updateFromInputPosition(x) local absX = Track.AbsolutePosition.X local width = Track.AbsoluteSize.X if width <= 0 then return end local rel = (x - absX) / width setValueFromRelative(rel) end local function stopMouseMoveConn() if mouseMoveConn then mouseMoveConn:Disconnect() mouseMoveConn = nil end end local function updateResetButtonColor() local currentValue = tonumber(ValueLabel.Text) or tonumber(inputTextBox.Text) or defaultValue if math.abs(currentValue - defaultValue) < 0.001 then -- En valor por defecto - Verde ResetBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 0) ResetStroke.Color = Color3.fromRGB(0, 120, 0) else -- No está en valor por defecto - Rojo ResetBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40) ResetStroke.Color = Color3.fromRGB(120, 20, 20) end end local function beginDrag(input) if activeSlider ~= nil and activeSlider ~= Container then return end activeSlider = Container dragging = true dragInput = input TrackStroke.Color = Color3.fromRGB(40,255,40) TrackStroke.Thickness = 2 KnobStroke.Color = Color3.fromRGB(40,255,40) KnobStroke.Thickness = 2 startAnim() if input.UserInputType == Enum.UserInputType.MouseButton1 then stopMouseMoveConn() mouseMoveConn = RunService.RenderStepped:Connect(function() if not dragging then return end local mouseLoc = UserInputService:GetMouseLocation() updateFromInputPosition(mouseLoc.X) end) end input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false dragInput = nil stopMouseMoveConn() visualRel = targetRel setVisualPositions(visualRel) stopAnim() TrackStroke.Color = origTrackStrokeColor TrackStroke.Thickness = origTrackStrokeThickness KnobStroke.Color = origKnobStrokeColor KnobStroke.Thickness = origKnobStrokeThickness activeSlider = nil updateResetButtonColor() end end) end Knob.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then beginDrag(input) end end) Track.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then if activeSlider == nil then beginDrag(input) if input.Position then updateFromInputPosition(input.Position.X) elseif input.UserInputType == Enum.UserInputType.MouseButton1 then local mouseLoc = UserInputService:GetMouseLocation() updateFromInputPosition(mouseLoc.X) end end end end) UserInputService.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType == Enum.UserInputType.Touch then if dragInput and input == dragInput then updateFromInputPosition(input.Position.X) end elseif input.UserInputType == Enum.UserInputType.MouseMovement then if dragInput and dragInput.UserInputType == Enum.UserInputType.MouseButton1 then updateFromInputPosition(input.Position.X) end end end) UserInputService.InputEnded:Connect(function(input) if not dragging then return end if input == dragInput or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false dragInput = nil stopMouseMoveConn() visualRel = targetRel setVisualPositions(visualRel) stopAnim() TrackStroke.Color = origTrackStrokeColor TrackStroke.Thickness = origTrackStrokeThickness KnobStroke.Color = origKnobStrokeColor KnobStroke.Thickness = origKnobStrokeThickness activeSlider = nil updateResetButtonColor() end end) -- INPUT MANUAL (Click en el número para editar) local editingInput = false local inputTextBox = Instance.new("TextBox", Container) inputTextBox.Size = UDim2.new(0, 65, 0, 28) inputTextBox.Position = UDim2.new(1, -80, 0, 18) inputTextBox.BackgroundColor3 = Color3.fromRGB(30,30,30) inputTextBox.BorderSizePixel = 0 inputTextBox.Font = Enum.Font.SourceSans inputTextBox.TextSize = 16 inputTextBox.TextXAlignment = Enum.TextXAlignment.Center inputTextBox.TextColor3 = Color3.fromRGB(255,200,0) inputTextBox.Visible = false inputTextBox.ZIndex = 1002 inputTextBox.ClearTextOnFocus = false local inputCorner = Instance.new("UICorner", inputTextBox) inputCorner.CornerRadius = UDim.new(0, 6) local inputStroke = Instance.new("UIStroke", inputTextBox) inputStroke.Color = Color3.fromRGB(255,200,0) inputStroke.Thickness = 1.5 ValueLabel.MouseButton1Click:Connect(function() if editingInput then return end editingInput = true ValueLabel.Visible = false inputTextBox.Visible = true inputTextBox.Text = ValueLabel.Text inputTextBox:CaptureFocus() inputTextBox.SelectionStart = 1 inputTextBox.CursorPosition = #inputTextBox.Text + 1 end) local function finishEditing() if not editingInput then return end editingInput = false inputTextBox.Visible = false ValueLabel.Visible = true local inputText = inputTextBox.Text:gsub(" ", "") local inputValue = tonumber(inputText) if inputValue then inputValue = clamp(inputValue, minVal, maxVal) applyVisualsImmediate(inputValue) updateResetButtonColor() end end inputTextBox.FocusLost:Connect(finishEditing) inputTextBox.InputBegan:Connect(function(input) if input.KeyCode == Enum.KeyCode.Return then finishEditing() elseif input.KeyCode == Enum.KeyCode.Escape then editingInput = false inputTextBox.Visible = false ValueLabel.Visible = true end end) -- Solo permitir números y punto inputTextBox.Changed:Connect(function(property) if property == "Text" and editingInput then local filtered = inputTextBox.Text:gsub("[^0-9.-]", "") if filtered ~= inputTextBox.Text then inputTextBox.Text = filtered end end end) -- BOTÓN DE REINICIO: Vuelve al valor por defecto ResetBtn.MouseButton1Click:Connect(function() applyVisualsImmediate(defaultValue) updateResetButtonColor() end) RunService.Heartbeat:Wait() applyVisualsImmediate(defaultValue) updateResetButtonColor() return { setValue = function(v) applyVisualsImmediate(clamp(v, minVal, maxVal)) end, getValue = function() return tonumber(ValueLabel.Text) or tonumber(inputTextBox.Text) or defaultValue end, container = Container } end local controlRefs = {} -- CONTROLES PRINCIPALES controlRefs.Brightness = { ctrl = createSliderControl("Brillo Global", Lighting.Brightness or 1.05, Scroll, 0, 3, function(v) Lighting.Brightness = v end, 0.01), getter = function() return Lighting.Brightness end } controlRefs.Exposure = { ctrl = createSliderControl("Exposición", Lighting.ExposureCompensation or 0.15, Scroll, -10, 10, function(v) Lighting.ExposureCompensation = v end, 0.01), getter = function() return Lighting.ExposureCompensation end } controlRefs.ShadowSoftness = { ctrl = createSliderControl("Suavidad de Sombras", Lighting.ShadowSoftness or 0.55, Scroll, 0, 1, function(v) Lighting.ShadowSoftness = v end, 0.01), getter = function() return Lighting.ShadowSoftness end } -- CONTROL DE HORA MEJORADO local clockSlider = createSliderControl("Hora del Día", Lighting.ClockTime or 14, Scroll, 0, 24, function(v) if not autoClockRunning then Lighting.ClockTime = v end end, 0.01) controlRefs.ClockTime = { ctrl = clockSlider, getter = function() return Lighting.ClockTime end } -- HORA AUTOMÁTICA local autoClockBtn = createToggleControl("Hora Automática", false, Scroll, function(enabled) autoClockRunning = enabled end) controlRefs.AutoClock = { ctrl = autoClockBtn, getter = function() return autoClockBtn.getValue() end } -- VELOCIDAD DE HORA (En horas por segundo) - Rango de 0.01 a 5, predeterminado 0.2 controlRefs.ClockSpeed = { ctrl = createSliderControl("Velocidad de Hora", 0.2, Scroll, 0.01, 5.0, function(v) autoClockSpeed = v end, 0.01), getter = function() return autoClockSpeed end } controlRefs.FogStart = { ctrl = createSliderControl("Inicio de Niebla", Lighting.FogStart or 0, Scroll, 0, 4000, function(v) Lighting.FogStart = v end, 0.01), getter = function() return Lighting.FogStart end } controlRefs.FogEnd = { ctrl = createSliderControl("Final de Niebla", Lighting.FogEnd or 1800, Scroll, 0, 4000, function(v) Lighting.FogEnd = v end, 0.01), getter = function() return Lighting.FogEnd end } controlRefs.EnvironmentDiffuseScale = { ctrl = createSliderControl("Escala Difusa", Lighting.EnvironmentDiffuseScale or 0.22, Scroll, 0, 1, function(v) Lighting.EnvironmentDiffuseScale = v end, 0.01), getter = function() return Lighting.EnvironmentDiffuseScale end } controlRefs.EnvironmentSpecularScale = { ctrl = createSliderControl("Escala Especular", Lighting.EnvironmentSpecularScale or 0.20, Scroll, 0, 1, function(v) Lighting.EnvironmentSpecularScale = v end, 0.01), getter = function() return Lighting.EnvironmentSpecularScale end } -- UI ROBLOX local hideRobloxBtn = createToggleControl("Ocultar Interfaz", false, Scroll, function(v) pcall(function() setCoreGuiEnabledSafe(Enum.CoreGuiType.Chat, not v) setCoreGuiEnabledSafe(Enum.CoreGuiType.Backpack, not v) setCoreGuiEnabledSafe(Enum.CoreGuiType.PlayerList, not v) setCoreGuiEnabledSafe(Enum.CoreGuiType.Health, not v) end) end) controlRefs.HideRobloxCore = { ctrl = hideRobloxBtn, getter = function() return hideRobloxBtn.getValue() end } -- EFECTOS: BLOOM do local bloomInst = addOrUpdateEffect("BloomEffect", EffectsConfig.BloomEffect) if bloomInst then controlRefs.Bloom_Intensity = { ctrl = createSliderControl("Brillo Bloom", bloomInst.Intensity or 0.12, Scroll, 0, 5, function(v) pcall(function() bloomInst.Intensity = v end) end, 0.01), getter = function() return bloomInst.Intensity end } controlRefs.Bloom_Threshold = { ctrl = createSliderControl("Umbral Bloom", bloomInst.Threshold or 0.32, Scroll, 0, 1, function(v) pcall(function() bloomInst.Threshold = v end) end, 0.01), getter = function() return bloomInst.Threshold end } controlRefs.Bloom_Size = { ctrl = createSliderControl("Tamaño Bloom", bloomInst.Size or 25, Scroll, 0, 100, function(v) pcall(function() bloomInst.Size = v end) end, 0.01), getter = function() return bloomInst.Size end } controlRefs.Bloom_Enabled = { ctrl = createToggleControl("Efecto Bloom", bloomInst.Enabled, Scroll, function(v) pcall(function() bloomInst.Enabled = v end) end), getter = function() return bloomInst.Enabled end } end end -- EFECTOS: COLOR CORRECTION do local ccInst = addOrUpdateEffect("ColorCorrectionEffect", EffectsConfig.ColorCorrectionEffect) if ccInst then controlRefs.CC_Brightness = { ctrl = createSliderControl("Brillo Color", ccInst.Brightness or 0.05, Scroll, -1, 1, function(v) pcall(function() ccInst.Brightness = v end) end, 0.01), getter = function() return ccInst.Brightness end } controlRefs.CC_Contrast = { ctrl = createSliderControl("Contraste Color", ccInst.Contrast or 0.10, Scroll, -2, 2, function(v) pcall(function() ccInst.Contrast = v end) end, 0.01), getter = function() return ccInst.Contrast end } controlRefs.CC_Saturation = { ctrl = createSliderControl("Saturación Color", ccInst.Saturation or 0.05, Scroll, -2, 2, function(v) pcall(function() ccInst.Saturation = v end) end, 0.01), getter = function() return ccInst.Saturation end } controlRefs.CC_Enabled = { ctrl = createToggleControl("Corrección de Color", ccInst.Enabled, Scroll, function(v) pcall(function() ccInst.Enabled = v end) end), getter = function() return ccInst.Enabled end } end end -- EFECTOS: BLUR do local blurInst = addOrUpdateEffect("BlurEffect", EffectsConfig.BlurEffect) if blurInst then controlRefs.Blur_Size = { ctrl = createSliderControl("Intensidad Desenfoque", blurInst.Size or 0, Scroll, 0, 50, function(v) pcall(function() blurInst.Size = v end) end, 0.01), getter = function() return blurInst.Size end } controlRefs.Blur_Enabled = { ctrl = createToggleControl("Efecto Desenfoque", blurInst.Enabled, Scroll, function(v) pcall(function() blurInst.Enabled = v end) end), getter = function() return blurInst.Enabled end } end end -- EFECTOS: DOF (Solo PC) if not UserInputService.TouchEnabled then do local dofInst = addOrUpdateEffect("DepthOfFieldEffect", EffectsConfig.DepthOfFieldEffect) if dofInst then controlRefs.DOF_Radius = { ctrl = createSliderControl("Radio Enfoque", dofInst.InFocusRadius or 80, Scroll, 0, 350, function(v) pcall(function() dofInst.InFocusRadius = v end) end, 0.01), getter = function() return dofInst.InFocusRadius end } controlRefs.DOF_NearIntensity = { ctrl = createSliderControl("Intensidad Cercano", dofInst.NearIntensity or 0.25, Scroll, 0, 10, function(v) pcall(function() dofInst.NearIntensity = v end) end, 0.01), getter = function() return dofInst.NearIntensity end } controlRefs.DOF_FarIntensity = { ctrl = createSliderControl("Intensidad Lejano", dofInst.FarIntensity or 0.35, Scroll, 0, 1, function(v) pcall(function() dofInst.FarIntensity = v end) end, 0.01), getter = function() return dofInst.FarIntensity end } controlRefs.DOF_FocusDistance = { ctrl = createSliderControl("Distancia Enfoque", dofInst.FocusDistance or 18, Scroll, 0, 200, function(v) pcall(function() dofInst.FocusDistance = v end) end, 0.01), getter = function() return dofInst.FocusDistance end } controlRefs.DOF_Enabled = { ctrl = createToggleControl("Efecto DOF", dofInst.Enabled, Scroll, function(v) pcall(function() dofInst.Enabled = v end) end), getter = function() return dofInst.Enabled end } end end do local sunInst = addOrUpdateEffect("SunRaysEffect", EffectsConfig.SunRaysEffect) if sunInst then controlRefs.Sun_Intensity = { ctrl = createSliderControl("Intensidad Rayos Sol", sunInst.Intensity or 0.08, Scroll, 0, 5, function(v) pcall(function() sunInst.Intensity = v end) end, 0.01), getter = function() return sunInst.Intensity end } controlRefs.Sun_Spread = { ctrl = createSliderControl("Dispersión Rayos Sol", sunInst.Spread or 3.5, Scroll, 0, 10, function(v) pcall(function() sunInst.Spread = v end) end, 0.01), getter = function() return sunInst.Spread end } controlRefs.Sun_Enabled = { ctrl = createToggleControl("Efecto Rayos Sol", sunInst.Enabled, Scroll, function(v) pcall(function() sunInst.Enabled = v end) end), getter = function() return sunInst.Enabled end } end end end -- CANVAS SIZE local function updateCanvasSize() local contentSize = UIListLayout.AbsoluteContentSize Scroll.CanvasSize = UDim2.new(0, 0, 0, contentSize.Y + 16) end UIListLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(updateCanvasSize) Scroll.ChildAdded:Connect(function() task.wait(0.03); updateCanvasSize() end) Scroll.ChildRemoved:Connect(function() task.wait(0.03); updateCanvasSize() end) RunService.Heartbeat:Wait() updateCanvasSize() -- RESET BUTTON ResetButton.MouseButton1Click:Connect(function() autoClockRunning = false for property, value in pairs(LightingConfig) do pcall(function() Lighting[property] = value end) end for effectType, properties in pairs(EffectsConfig) do addOrUpdateEffect(effectType, properties) end for name, val in pairs(originalCoreGuiStates) do local enumVal = Enum.CoreGuiType[name] if enumVal then setCoreGuiEnabledSafe(enumVal, val) end end for k, ref in pairs(controlRefs) do if ref.ctrl and ref.ctrl.setValue then local ok, value = pcall(function() return ref.getter and ref.getter() end) if ok and value ~= nil then pcall(function() ref.ctrl.setValue(value) end) end elseif ref.ctrl and ref.ctrl.setValueSilent then local ok, value = pcall(function() return ref.getter and ref.getter() end) if ok and value ~= nil then pcall(function() ref.ctrl.setValueSilent(value) end) end end end end) return ScreenGui, Frame end local ScreenGui, Frame = createScreenGui() local function toggleMenu() if Frame then if Frame.Visible then -- SALIDA (fluida) local tweenInfo = TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut) local tween = TweenService:Create(Frame, tweenInfo, { Position = UDim2.new(0.5, -Frame.AbsoluteSize.X/2, 1, Frame.AbsoluteSize.Y), BackgroundTransparency = 1 }) tween:Play() tween.Completed:Connect(function() Frame.Visible = false ScreenGui.InputBlocker.Visible = false end) else -- ENTRADA (realmente animada) Frame.Visible = true ScreenGui.InputBlocker.Visible = true Frame.BackgroundTransparency = 1 local cam = workspace.CurrentCamera if cam then local vs = cam.ViewportSize local w = math.min(420, math.max(100, vs.X - 40)) local h = math.min(750, math.max(100, vs.Y - 40)) Frame.Size = UDim2.new(0, w, 0, h) local xPos = (vs.X - w) / 2 local yPos = (vs.Y - h) / 2 - 60 -- posición final (centro) local finalPos = UDim2.new(0, xPos, 0, yPos) -- posición inicial (abajo, fuera de pantalla) Frame.Position = UDim2.new(0, xPos, 1, h) local tweenInfo = TweenInfo.new(0.6, Enum.EasingStyle.Back, Enum.EasingDirection.Out) local tween = TweenService:Create(Frame, tweenInfo, { Position = finalPos, BackgroundTransparency = 0 }) tween:Play() end end end end UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.RightControl then toggleMenu() end end) task.delay(5, function() pcall(function() StarterGui:SetCore("SendNotification", { Title = "Menú de Iluminación", Text = "Presiona Ctrl Derecho para abrir/cerrar o usa el botón ⚙", Duration = 6 }) end) end) local function ensureUI() if not LOCAL_PLAYER.PlayerGui:FindFirstChild("LightingMenu") then ScreenGui, Frame = createScreenGui() end end LOCAL_PLAYER.CharacterAdded:Connect(function() RunService.RenderStepped:Wait(); ensureUI() end) LOCAL_PLAYER.PlayerGui.ChildRemoved:Connect(function(child) if child.Name == "LightingMenu" then RunService.RenderStepped:Wait(); ensureUI() end end)