-- 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 = 0.8, ExposureCompensation = 0.5, ShadowSoftness = 1.2, EnvironmentDiffuseScale = 0.6, EnvironmentSpecularScale = 1.1, ClockTime = 14, FogStart = 10000, FogEnd = 10000, GlobalShadows = true, ColorShift_Top = Color3.fromRGB(190, 190, 190), ColorShift_Bottom = Color3.fromRGB(110, 110, 110), OutdoorAmbient = Color3.fromRGB(135, 135, 135), Ambient = Color3.fromRGB(115, 115, 115), Reflectance = 0.03, } for property, value in pairs(LightingConfig) do pcall(function() Lighting[property] = value end) end local function applyPartReflectance(part) if part:IsA("BasePart") then pcall(function() part.Reflectance = LightingConfig.Reflectance or 0.03 end) end end for _, part in ipairs(Workspace:GetDescendants()) do applyPartReflectance(part) end Workspace.DescendantAdded:Connect(applyPartReflectance) ----------------------------------------------------- -- Efectos ----------------------------------------------------- local EffectsConfig = { BloomEffect = { Name = "Bloom", Intensity = 0.35, Size = 22, Threshold = 2.4, Enabled = true }, DepthOfFieldEffect = { Name = "DepthOfField", InFocusRadius = 80, NearIntensity = 0.25, FarIntensity = 0.35, FocusDistance = 18, Enabled = true }, ColorCorrectionEffect = { Name = "ColorCorrection", Brightness = 0, Contrast = 0.2, Saturation = 0.25, TintColor = Color3.fromRGB(250, 250, 250), Enabled = true }, SunRaysEffect = { Name = "SunRays", Intensity = 0.4, Spread = 2.8, 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 = 760 local DEFAULT_HEIGHT = 620 local SCREEN_MARGIN = 20 ----------------------------------------------------- -- Guardados originales ----------------------------------------------------- local originalCoreGuiStates = {} local originalNameDistance = nil local originalPlayerGuiStates = {} -- Estado temporal de las interfaces propias del juego. -- Se captura JUSTO al ocultarlas, no al ejecutar el script, para poder restaurar -- exactamente las que estaban visibles en ese momento. CoreGui de Roblox no se toca. local gameInterfaceHidden = false local hiddenGameGuiStates = {} local gameGuiAddedConnection = nil -- Estado temporal de la interfaz de Roblox/CoreGui. -- Se captura justo al ocultarla para restaurar exactamente lo que estaba visible. local robloxInterfaceHidden = false local hiddenCoreGuiStates = {} 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 toggleMenu 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, 48, 0, 48) FloatingButton.Position = UDim2.new(1, -68, 1, -68) FloatingButton.BackgroundColor3 = Color3.fromRGB(29,29,34) FloatingButton.Text = "" FloatingButton.Font = Enum.Font.GothamBold FloatingButton.TextSize = 21 FloatingButton.TextColor3 = Color3.fromRGB(225,230,240) FloatingButton.AutoButtonColor = false FloatingButton.ZIndex = 1200 local FloatingCorner = Instance.new("UICorner", FloatingButton) FloatingCorner.CornerRadius = UDim.new(0, 14) local FloatingStroke = Instance.new("UIStroke", FloatingButton) FloatingStroke.Color = Color3.fromRGB(58,58,66) FloatingStroke.Thickness = 1.5 local FloatingScale = Instance.new("UIScale", FloatingButton) FloatingScale.Scale = 1 -- Icono de configuración dibujado, sin letras ni emojis. local gear = Instance.new("Frame", FloatingButton) gear.Size = UDim2.fromOffset(18,18) gear.Position = UDim2.new(.5,-9,.5,-9) gear.BackgroundTransparency = 1 gear.BorderSizePixel = 0 gear.ZIndex = 1201 local gearStroke = Instance.new("UIStroke", gear) gearStroke.Color = Color3.fromRGB(205,208,216) gearStroke.Thickness = 1.7 gearStroke.Transparency = 0.05 Instance.new("UICorner", gear).CornerRadius = UDim.new(1,0) local gearCenter = Instance.new("Frame", gear) gearCenter.Size = UDim2.fromOffset(6,6) gearCenter.Position = UDim2.new(.5,-3,.5,-3) gearCenter.BackgroundColor3 = Color3.fromRGB(205,208,216) gearCenter.BorderSizePixel = 0 gearCenter.ZIndex = 1202 Instance.new("UICorner", gearCenter).CornerRadius = UDim.new(1,0) for i=0,7 do local tooth = Instance.new("Frame", gear) tooth.Size = UDim2.fromOffset(3,6) tooth.AnchorPoint = Vector2.new(.5,.5) local a = math.rad(i*45) tooth.Position = UDim2.new(.5,math.cos(a)*9,.5,math.sin(a)*9) tooth.Rotation = i*45 tooth.BackgroundColor3 = Color3.fromRGB(205,208,216) tooth.BorderSizePixel = 0 tooth.ZIndex = 1201 Instance.new("UICorner", tooth).CornerRadius = UDim.new(1,0) end FloatingButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then TweenService:Create(FloatingScale, TweenInfo.new(.08), {Scale = .94}):Play() end end) FloatingButton.MouseEnter:Connect(function() TweenService:Create(FloatingButton, TweenInfo.new(.15, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {BackgroundColor3 = Color3.fromRGB(38,38,44)}):Play() TweenService:Create(FloatingStroke, TweenInfo.new(.15), {Color = Color3.fromRGB(72,72,80)}):Play() TweenService:Create(gearStroke, TweenInfo.new(.15), {Transparency = 0}):Play() TweenService:Create(FloatingScale, TweenInfo.new(.15, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Scale = 1.04}):Play() end) FloatingButton.MouseLeave:Connect(function() TweenService:Create(FloatingButton, TweenInfo.new(.15), {BackgroundColor3 = Color3.fromRGB(29,29,34)}):Play() TweenService:Create(FloatingStroke, TweenInfo.new(.15), {Color = Color3.fromRGB(70,75,90)}):Play() TweenService:Create(FloatingScale, TweenInfo.new(.15), {Scale = 1}):Play() end) FloatingButton.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then TweenService:Create(FloatingScale, TweenInfo.new(.16, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Scale = 1}):Play() end end) 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.Name = "Header" Header.Size = UDim2.new(1, -70, 0, 48) Header.Position = UDim2.new(0, 22, 0, 8) Header.BackgroundTransparency = 1 Header.Text = "VISUAL" Header.TextColor3 = Color3.fromRGB(245,245,245) Header.Font = Enum.Font.GothamBold Header.TextSize = 21 Header.TextXAlignment = Enum.TextXAlignment.Left Header.ZIndex = 1001 local Subtitle = Instance.new("TextLabel", Frame) Subtitle.Size = UDim2.new(1, -70, 0, 22) Subtitle.Position = UDim2.new(0, 22, 0, 36) Subtitle.BackgroundTransparency = 1 Subtitle.Text = "Configuración visual" Subtitle.TextColor3 = Color3.fromRGB(145,145,150) Subtitle.Font = Enum.Font.Gotham Subtitle.TextSize = 12 Subtitle.TextXAlignment = Enum.TextXAlignment.Left Subtitle.ZIndex = 1001 local CloseBtn = Instance.new("TextButton", Frame) CloseBtn.Name = "CloseButton" CloseBtn.Size = UDim2.fromOffset(36,36) CloseBtn.Position = UDim2.new(1,-50,0,12) CloseBtn.BackgroundColor3 = Color3.fromRGB(42,42,48) CloseBtn.Text = "×" CloseBtn.Font = Enum.Font.Gotham CloseBtn.TextSize = 24 CloseBtn.TextColor3 = Color3.fromRGB(225,225,230) CloseBtn.AutoButtonColor = false CloseBtn.ZIndex = 1001 Instance.new("UICorner", CloseBtn).CornerRadius = UDim.new(0,10) local closeStroke = Instance.new("UIStroke", CloseBtn) closeStroke.Color = Color3.fromRGB(75,75,82) closeStroke.Thickness = 1 local closeHover = CloseBtn.MouseEnter:Connect(function() TweenService:Create(CloseBtn,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(52,52,58)}):Play() end) CloseBtn.MouseLeave:Connect(function() TweenService:Create(CloseBtn,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(42,42,48)}):Play() end) 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) local Divider = Instance.new("Frame", Frame) Divider.Size = UDim2.new(1,-40,0,1) Divider.Position = UDim2.new(0,20,0,62) Divider.BackgroundColor3 = Color3.fromRGB(55,55,62) Divider.BorderSizePixel = 0 Divider.ZIndex = 1001 -- Sidebar: solo navega dentro del mismo ScrollFrame, nunca cambia de pestaña. local Sidebar = Instance.new("Frame", Frame) Sidebar.Name = "CategorySidebar" Sidebar.Size = UDim2.new(0,178,1,-90) Sidebar.Position = UDim2.new(0,15,0,75) Sidebar.BackgroundColor3 = Color3.fromRGB(29,29,34) Sidebar.BorderSizePixel = 0 Sidebar.ZIndex = 1001 Instance.new("UICorner", Sidebar).CornerRadius = UDim.new(0,12) local SideTitle = Instance.new("TextLabel", Sidebar) SideTitle.Size = UDim2.new(1,-24,0,26) SideTitle.Position = UDim2.new(0,12,0,12) SideTitle.BackgroundTransparency = 1 SideTitle.Text = "CATEGORÍAS" SideTitle.TextColor3 = Color3.fromRGB(125,125,135) SideTitle.Font = Enum.Font.GothamBold SideTitle.TextSize = 10 SideTitle.TextXAlignment = Enum.TextXAlignment.Left SideTitle.ZIndex = 1002 local ScrollClip = Instance.new("Frame", Frame) ScrollClip.Name = "ScrollClip" ScrollClip.Size = UDim2.new(1,-218,1,-90) ScrollClip.Position = UDim2.new(0,203,0,75) ScrollClip.BackgroundColor3 = Color3.fromRGB(24,24,28) ScrollClip.BorderSizePixel = 0 ScrollClip.ClipsDescendants = true ScrollClip.ZIndex = 999 local scrollClipCorner = Instance.new("UICorner", ScrollClip) scrollClipCorner.CornerRadius = UDim.new(0,14) local scrollClipStroke = Instance.new("UIStroke", ScrollClip) scrollClipStroke.Color = Color3.fromRGB(48,48,55) scrollClipStroke.Thickness = 1 local Scroll = Instance.new("ScrollingFrame", ScrollClip) Scroll.Name = "ScrollArea" Scroll.Size = UDim2.new(1,0,1,0) Scroll.Position = UDim2.fromOffset(0,0) Scroll.BackgroundTransparency = 1 Scroll.BorderSizePixel = 0 Scroll.ScrollBarThickness = 4 Scroll.ScrollBarImageTransparency = 0.35 Scroll.ScrollingDirection = Enum.ScrollingDirection.Y Scroll.CanvasSize = UDim2.new(0,0,0,0) Scroll.ZIndex = 1000 Scroll.Active = true Scroll.ClipsDescendants = true local UIListLayout = Instance.new("UIListLayout", Scroll) UIListLayout.Padding = UDim.new(0,10) UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder local UIPadding = Instance.new("UIPadding", Scroll) UIPadding.PaddingLeft = UDim.new(0,2) UIPadding.PaddingRight = UDim.new(0,8) UIPadding.PaddingTop = UDim.new(0,2) UIPadding.PaddingBottom = UDim.new(0,10) local categoryButtons = {} local categorySections = {} local activeCategory = nil local function makeSection(key, titleText, descriptionText, order) local section = Instance.new("Frame", Scroll) section.Name = "Section_"..key section.Size = UDim2.new(1,0,0,0) section.AutomaticSize = Enum.AutomaticSize.Y section.BackgroundColor3 = Color3.fromRGB(27,27,31) section.BorderSizePixel = 0 section.LayoutOrder = order section.ZIndex = 1000 Instance.new("UICorner",section).CornerRadius = UDim.new(0,12) local stroke = Instance.new("UIStroke",section) stroke.Color = Color3.fromRGB(48,48,55) stroke.Thickness = 1 local pad = Instance.new("UIPadding",section) pad.PaddingLeft = UDim.new(0,14) pad.PaddingRight = UDim.new(0,14) pad.PaddingTop = UDim.new(0,12) pad.PaddingBottom = UDim.new(0,8) local title = Instance.new("TextLabel",section) title.Size = UDim2.new(1,0,0,28) title.BackgroundTransparency = 1 title.Text = titleText title.TextColor3 = Color3.fromRGB(245,245,245) title.Font = Enum.Font.GothamBold title.TextSize = 16 title.TextXAlignment = Enum.TextXAlignment.Left title.ZIndex = 1001 local desc = Instance.new("TextLabel",section) desc.Size = UDim2.new(1,0,0,22) desc.Position = UDim2.fromOffset(0,27) desc.BackgroundTransparency = 1 desc.Text = descriptionText desc.TextColor3 = Color3.fromRGB(135,135,145) desc.Font = Enum.Font.Gotham desc.TextSize = 11 desc.TextXAlignment = Enum.TextXAlignment.Left desc.ZIndex = 1001 local controls = Instance.new("Frame",section) controls.Name = "Controls" controls.Size = UDim2.new(1,0,0,0) controls.Position = UDim2.fromOffset(0,57) controls.AutomaticSize = Enum.AutomaticSize.Y controls.BackgroundTransparency = 1 controls.ZIndex = 1000 local layout = Instance.new("UIListLayout",controls) layout.Padding = UDim.new(0,2) layout.SortOrder = Enum.SortOrder.LayoutOrder categorySections[key] = section return controls, section end local Sections = {} Sections.Lighting = makeSection("Lighting","Iluminación","Brillo, exposición y sombras",1) Sections.Time = makeSection("Time","Tiempo y niebla","Hora, ciclo automático y distancia visual",2) Sections.Environment = makeSection("Environment","Ambiente y reflejos","Entorno, escalas y reflectancia",3) Sections.Bloom = makeSection("Bloom","Bloom","Resplandor de las zonas luminosas",4) Sections.Color = makeSection("Color","Corrección de color","Contraste, saturación y brillo",5) Sections.Blur = makeSection("Blur","Desenfoque","Desenfoque general y profundidad de campo",6) Sections.Sun = makeSection("Sun","Rayos de sol","Intensidad y dispersión de los rayos",7) Sections.Interface = makeSection("Interface","Interfaz","Elementos de la interfaz de Roblox",8) local categoryData = { {"Lighting","Iluminación","Lighting"}, {"Time","Tiempo","Clock"}, {"Environment","Ambiente","Environment"}, {"Bloom","Bloom","Bloom"}, {"Color","Color","Color"}, {"Blur","Desenfoque","Blur"}, {"Sun","Rayos de sol","SunRays"}, {"Interface","Interfaz","Window"}, } -- Iconos vectoriales dibujados con Frames. No dependen de fuentes, emojis ni asset IDs. local function iconLine(parent, x, y, w, h, rotation) local line = Instance.new("Frame", parent) line.Size = UDim2.fromOffset(w, h) line.Position = UDim2.new(0.5, x, 0.5, y) line.AnchorPoint = Vector2.new(0.5, 0.5) line.BackgroundColor3 = Color3.fromRGB(178,180,190) line.BorderSizePixel = 0 line.Rotation = rotation or 0 line.ZIndex = 1004 Instance.new("UICorner", line).CornerRadius = UDim.new(1,0) return line end local function drawIcon(parent, kind) local holder = Instance.new("Frame", parent) holder.Name = "VectorIcon" holder.Size = UDim2.fromOffset(24,24) holder.Position = UDim2.new(0,8,0.5,-12) holder.BackgroundTransparency = 1 holder.BorderSizePixel = 0 holder.ZIndex = 1003 local strokeColor = Color3.fromRGB(178,180,190) local function circle(size, pos, thickness) local f = Instance.new("Frame", holder) f.Size = UDim2.fromOffset(size,size) f.Position = pos f.BackgroundTransparency = 1 f.BorderSizePixel = 0 f.ZIndex = 1004 local st = Instance.new("UIStroke", f) st.Color = strokeColor st.Thickness = thickness or 1.5 return f end if kind == "Lighting" then -- Bombilla/lámpara: icono exclusivo para Iluminación. local bulb = Instance.new("Frame", holder) bulb.Size = UDim2.fromOffset(10,10) bulb.Position = UDim2.fromOffset(7,5) bulb.BackgroundTransparency = 1 bulb.BorderSizePixel = 0 bulb.ZIndex = 1004 local st = Instance.new("UIStroke", bulb) st.Color = strokeColor st.Thickness = 1.5 Instance.new("UICorner", bulb).CornerRadius = UDim.new(1,0) iconLine(holder, 0, 5, 6, 1.5, 0) iconLine(holder, 0, 8, 5, 1.5, 0) iconLine(holder, 0, -8, 5, 1.3, 0) iconLine(holder, -7, -3, 4, 1.3, 45) iconLine(holder, 7, -3, 4, 1.3, -45) elseif kind == "SunRays" then -- Rayos de sol: abanico de haces diagonales, deliberadamente distinto. local center = Instance.new("Frame", holder) center.Size = UDim2.fromOffset(5,5) center.Position = UDim2.fromOffset(4,10) center.BackgroundColor3 = strokeColor center.BorderSizePixel = 0 center.ZIndex = 1004 Instance.new("UICorner", center).CornerRadius = UDim.new(1,0) iconLine(holder, 5, 5, 12, 1.6, -18) iconLine(holder, 6, 1, 11, 1.6, -35) iconLine(holder, 5, -3, 10, 1.6, -52) iconLine(holder, 3, -7, 8, 1.6, -68) elseif kind == "Clock" then circle(16, UDim2.fromOffset(4,4), 1.6) iconLine(holder, 0, -3, 7, 1.5, 90) iconLine(holder, 2.5, 1.5, 5, 1.5, 35) elseif kind == "Environment" then local a=Instance.new("Frame",holder); a.Size=UDim2.fromOffset(14,8); a.Position=UDim2.fromOffset(5,10); a.BackgroundTransparency=1; a.BorderSizePixel=0; a.ZIndex=1004 local st=Instance.new("UIStroke",a); st.Color=strokeColor; st.Thickness=1.5 iconLine(holder,0,-5,10,1.5,0); iconLine(holder,0,-2,7,1.5,0) elseif kind == "Bloom" then circle(8, UDim2.fromOffset(8,8), 1.5) for i=0,7 do local a=i*45; local rad=math.rad(a) local dot=Instance.new("Frame",holder); dot.Size=UDim2.fromOffset(4,4); dot.AnchorPoint=Vector2.new(.5,.5); dot.Position=UDim2.new(.5,math.cos(rad)*8,.5,math.sin(rad)*8); dot.BackgroundColor3=strokeColor; dot.BorderSizePixel=0; dot.ZIndex=1004; Instance.new("UICorner",dot).CornerRadius=UDim.new(1,0) end elseif kind == "Color" then local cols={{5,9},{9,5},{9,13}} for _,v in ipairs(cols) do local d=Instance.new("Frame",holder); d.Size=UDim2.fromOffset(9,9); d.Position=UDim2.fromOffset(v[1],v[2]); d.BackgroundTransparency=1; d.BorderSizePixel=0; d.ZIndex=1004; local st=Instance.new("UIStroke",d); st.Color=strokeColor; st.Thickness=1.3; Instance.new("UICorner",d).CornerRadius=UDim.new(1,0) end elseif kind == "Blur" then circle(13, UDim2.fromOffset(5,5), 1.4) local d=Instance.new("Frame",holder); d.Size=UDim2.fromOffset(5,5); d.Position=UDim2.fromOffset(9,9); d.BackgroundColor3=strokeColor; d.BackgroundTransparency=.25; d.BorderSizePixel=0; d.ZIndex=1004; Instance.new("UICorner",d).CornerRadius=UDim.new(1,0) elseif kind == "Window" then local w=Instance.new("Frame",holder); w.Size=UDim2.fromOffset(16,14); w.Position=UDim2.fromOffset(4,5); w.BackgroundTransparency=1; w.BorderSizePixel=0; w.ZIndex=1004; local st=Instance.new("UIStroke",w); st.Color=strokeColor; st.Thickness=1.5; Instance.new("UICorner",w).CornerRadius=UDim.new(0,3); iconLine(w,0,-3,12,1,0) end return holder end local CategoryList = Instance.new("Frame", Sidebar) CategoryList.Name = "CategoryList" CategoryList.Size = UDim2.new(1,0,1,-98) CategoryList.Position = UDim2.new(0,0,0,42) CategoryList.BackgroundTransparency = 1 CategoryList.BorderSizePixel = 0 CategoryList.ZIndex = 1001 local sideLayout = Instance.new("UIListLayout",CategoryList) sideLayout.Padding = UDim.new(0,10) sideLayout.SortOrder = Enum.SortOrder.LayoutOrder sideLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center local sidePad = Instance.new("UIPadding",CategoryList) sidePad.PaddingTop = UDim.new(0,2) sidePad.PaddingLeft = UDim.new(0,8) sidePad.PaddingRight = UDim.new(0,8) local function setCategoryActive(key) activeCategory = key for k,button in pairs(categoryButtons) do local selected = k == key button.BackgroundColor3 = selected and Color3.fromRGB(55,55,63) or Color3.fromRGB(29,29,34) button.TextColor3 = selected and Color3.fromRGB(245,245,250) or Color3.fromRGB(175,175,185) local label = button:FindFirstChild("Label") if label then label.TextColor3 = selected and Color3.fromRGB(245,245,250) or Color3.fromRGB(175,175,185) end local marker = button:FindFirstChild("Marker") if marker then marker.Visible = selected end end end local function scrollToCategory(key) local section = categorySections[key] if not section then return end task.defer(function() local y = math.max(0, section.AbsolutePosition.Y - Scroll.AbsolutePosition.Y + Scroll.CanvasPosition.Y - 2) local maxY = math.max(0, Scroll.CanvasSize.Y.Offset - Scroll.AbsoluteSize.Y) y = math.min(y, maxY) TweenService:Create(Scroll,TweenInfo.new(.32,Enum.EasingStyle.Quint,Enum.EasingDirection.Out),{CanvasPosition=Vector2.new(0,y)}):Play() setCategoryActive(key) end) end for index,data in ipairs(categoryData) do local key,name,icon = data[1],data[2],data[3] local button = Instance.new("TextButton",CategoryList) button.Name = "Category_"..key button.Size = UDim2.new(1,0,0,44) button.LayoutOrder = index button.BackgroundColor3 = Color3.fromRGB(29,29,34) button.BorderSizePixel = 0 button.Text = "" button.TextColor3 = Color3.fromRGB(175,175,185) button.Font = Enum.Font.GothamMedium button.TextSize = 12 button.TextXAlignment = Enum.TextXAlignment.Left button.AutoButtonColor = false button.ZIndex = 1002 Instance.new("UICorner",button).CornerRadius = UDim.new(0,9) drawIcon(button, icon) local categoryLabel = Instance.new("TextLabel", button) categoryLabel.Name = "Label" categoryLabel.Size = UDim2.new(1,-48,1,0) categoryLabel.Position = UDim2.fromOffset(40,0) categoryLabel.BackgroundTransparency = 1 categoryLabel.Text = name categoryLabel.TextColor3 = Color3.fromRGB(175,175,185) categoryLabel.Font = Enum.Font.GothamMedium categoryLabel.TextSize = 12 categoryLabel.TextXAlignment = Enum.TextXAlignment.Left categoryLabel.TextTruncate = Enum.TextTruncate.AtEnd categoryLabel.ZIndex = 1004 local marker = Instance.new("Frame",button) marker.Name = "Marker" marker.Size = UDim2.new(0,3,0,20) marker.Position = UDim2.new(0,0,.5,-10) marker.BackgroundColor3 = Color3.fromRGB(95,165,255) marker.BorderSizePixel = 0 marker.Visible = false marker.ZIndex = 1003 Instance.new("UICorner",marker).CornerRadius = UDim.new(1,0) categoryButtons[key] = button button.MouseEnter:Connect(function() if activeCategory ~= key then TweenService:Create(button,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(38,38,44)}):Play() end end) button.MouseLeave:Connect(function() if activeCategory ~= key then TweenService:Create(button,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(29,29,34)}):Play() end end) button.MouseButton1Click:Connect(function() scrollToCategory(key) end) end -- Pie del sidebar: reinicio separado de las categorías para que destaque local ResetSeparator = Instance.new("Frame", Sidebar) ResetSeparator.Size = UDim2.new(1,-20,0,1) ResetSeparator.Position = UDim2.new(0,10,1,-66) ResetSeparator.BackgroundColor3 = Color3.fromRGB(55,55,62) ResetSeparator.BackgroundTransparency = 0.25 ResetSeparator.BorderSizePixel = 0 ResetSeparator.ZIndex = 1002 local ResetButton = Instance.new("TextButton", Sidebar) ResetButton.Name = "ResetButton" ResetButton.Size = UDim2.new(1,-20,0,42) ResetButton.Position = UDim2.new(0,10,1,-54) ResetButton.BackgroundColor3 = Color3.fromRGB(38,38,44) ResetButton.Text = "Reiniciar configuración" ResetButton.Font = Enum.Font.GothamMedium ResetButton.TextSize = 11 ResetButton.TextColor3 = Color3.fromRGB(220,220,228) ResetButton.ZIndex = 1003 ResetButton.AutoButtonColor = false Instance.new("UICorner",ResetButton).CornerRadius = UDim.new(0,10) local resetStroke = Instance.new("UIStroke",ResetButton) resetStroke.Color = Color3.fromRGB(70,70,78) resetStroke.Thickness = 1 ResetButton.MouseEnter:Connect(function() TweenService:Create(ResetButton,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(46,46,52)}):Play() TweenService:Create(resetStroke,TweenInfo.new(.12),{Color=Color3.fromRGB(88,88,98)}):Play() end) ResetButton.MouseLeave:Connect(function() TweenService:Create(ResetButton,TweenInfo.new(.12),{BackgroundColor3=Color3.fromRGB(38,38,44)}):Play() TweenService:Create(resetStroke,TweenInfo.new(.12),{Color=Color3.fromRGB(70,70,78)}):Play() end) local CloseHint = Instance.new("TextLabel", Frame) CloseHint.Size = UDim2.new(0,170,0,20) CloseHint.Position = UDim2.new(1,-185,1,-24) CloseHint.BackgroundTransparency = 1 CloseHint.Text = "Ctrl Derecho · abrir/cerrar" CloseHint.TextColor3 = Color3.fromRGB(115,115,125) CloseHint.Font = Enum.Font.Gotham CloseHint.TextSize = 10 CloseHint.TextXAlignment = Enum.TextXAlignment.Right CloseHint.ZIndex = 1001 -- Variables de arrastre del botón flotante local draggingFloatingButton = false local floatingButtonOffset = Vector2.new(0, 0) local clickStartTime = 0 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 cam = workspace.CurrentCamera if not cam then return end local vs = cam.ViewportSize local newX = math.max(0,math.min(input.Position.X+floatingButtonOffset.X,vs.X-48)) local newY = math.max(0,math.min(input.Position.Y+floatingButtonOffset.Y,vs.Y-48)) 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 if tick()-clickStartTime < .3 then if toggleMenu then toggleMenu() end end end end end) local ScrollCapture = Instance.new("Frame", ScreenGui) ScrollCapture.Name = "ScrollCapture" ScrollCapture.Size = UDim2.new(1,0,1,0) ScrollCapture.BackgroundTransparency = 1 ScrollCapture.BorderSizePixel = 0 ScrollCapture.ZIndex = 501 ScrollCapture.Visible = false ScrollCapture.Active = true local function updateScrollCaptureVisibility() ScrollCapture.Visible = Frame.Visible end Frame:GetPropertyChangedSignal("Visible"):Connect(updateScrollCaptureVisibility) local touchStartY, scrollStartCanvasPosition, lastTouchY, touchVelocity, scrollConnection = 0,0,0,0,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 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 touchVelocity=lastTouchY-currentY local newY=scrollStartCanvasPosition+(touchStartY-currentY) newY=math.max(0,math.min(newY,math.max(0,Scroll.CanvasSize.Y.Offset-Scroll.AbsoluteSize.Y))) Scroll.CanvasPosition=Vector2.new(0,newY); lastTouchY=currentY end end) ScrollCapture.InputEnded:Connect(function(input) if input.UserInputType==Enum.UserInputType.Touch and Frame.Visible then local currentVelocity=touchVelocity if scrollConnection then scrollConnection:Disconnect() end scrollConnection=RunService.RenderStepped:Connect(function() if math.abs(currentVelocity)>.1 then local newY=Scroll.CanvasPosition.Y+currentVelocity newY=math.max(0,math.min(newY,math.max(0,Scroll.CanvasSize.Y.Offset-Scroll.AbsoluteSize.Y))) Scroll.CanvasPosition=Vector2.new(0,newY); currentVelocity=currentVelocity*.92 else if scrollConnection then scrollConnection:Disconnect(); scrollConnection=nil end end end) end end) 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 0.8, Sections.Lighting, 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.5, Sections.Lighting, -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 1.2, Sections.Lighting, 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, Sections.Time, 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, Sections.Time, 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, Sections.Time, 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 10000, Sections.Time, 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 10000, Sections.Time, 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.6, Sections.Environment, 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 1.1, Sections.Environment, 0, 2, function(v) Lighting.EnvironmentSpecularScale = v end, 0.01), getter = function() return Lighting.EnvironmentSpecularScale end } controlRefs.Reflectance = { ctrl = createSliderControl("Reflejos de Partes", LightingConfig.Reflectance or 0.03, Sections.Environment, 0, 1, function(v) LightingConfig.Reflectance = v for _, part in ipairs(Workspace:GetDescendants()) do applyPartReflectance(part) end end, 0.01), getter = function() return LightingConfig.Reflectance or 0.03 end } -- INTERFAZ DEL JUEGO + INTERFAZ DE ROBLOX local function restoreGameInterface() if not gameInterfaceHidden then return end gameInterfaceHidden = false if gameGuiAddedConnection then gameGuiAddedConnection:Disconnect() gameGuiAddedConnection = nil end -- Restaurar SOLO el estado capturado al pulsar ocultar. for gui, state in pairs(hiddenGameGuiStates) do if gui and gui.Parent then pcall(function() gui.Enabled = state.Enabled end) end end hiddenGameGuiStates = {} end local function hideGameInterface() if gameInterfaceHidden then return end gameInterfaceHidden = true hiddenGameGuiStates = {} local playerGui = LOCAL_PLAYER:WaitForChild("PlayerGui") -- Captura el estado exacto en este momento. for _, gui in ipairs(playerGui:GetChildren()) do if gui:IsA("ScreenGui") and gui ~= ScreenGui then hiddenGameGuiStates[gui] = { Enabled = gui.Enabled } pcall(function() gui.Enabled = false end) end end -- Las interfaces nuevas que aparezcan mientras está oculto también -- permanecen ocultas y NO se agregan al snapshot de restauración. gameGuiAddedConnection = playerGui.ChildAdded:Connect(function(child) if not gameInterfaceHidden then return end if child:IsA("ScreenGui") and child ~= ScreenGui then task.defer(function() if gameInterfaceHidden and child.Parent then pcall(function() child.Enabled = false end) end end) end end) end local function restoreRobloxInterface() if not robloxInterfaceHidden then return end robloxInterfaceHidden = false -- Restaurar exactamente el estado que tenía cada CoreGui antes de ocultar. for name, enabled in pairs(hiddenCoreGuiStates) do local coreType = Enum.CoreGuiType[name] if coreType then setCoreGuiEnabledSafe(coreType, enabled) end end hiddenCoreGuiStates = {} end local function hideRobloxInterface() if robloxInterfaceHidden then return end robloxInterfaceHidden = true hiddenCoreGuiStates = {} local coreTypes = { Enum.CoreGuiType.Chat, Enum.CoreGuiType.Backpack, Enum.CoreGuiType.PlayerList, Enum.CoreGuiType.Health } -- Capturamos el estado ACTUAL, no el que tenía al ejecutar el script. for _, coreType in ipairs(coreTypes) do local ok, enabled = pcall(function() return StarterGui:GetCoreGuiEnabled(coreType) end) hiddenCoreGuiStates[coreType.Name] = (ok and type(enabled) == "boolean") and enabled or true setCoreGuiEnabledSafe(coreType, false) end end local hideGameInterfaceBtn = createToggleControl("Ocultar interfaz del juego", false, Sections.Interface, function(v) if v then hideGameInterface() else restoreGameInterface() end end) controlRefs.HideGameInterface = { ctrl = hideGameInterfaceBtn, getter = function() return gameInterfaceHidden end } local hideRobloxInterfaceBtn = createToggleControl("Ocultar interfaz de Roblox", false, Sections.Interface, function(v) if v then hideRobloxInterface() else restoreRobloxInterface() end end) controlRefs.HideRobloxInterface = { ctrl = hideRobloxInterfaceBtn, getter = function() return robloxInterfaceHidden end } -- EFECTOS: BLOOM do local bloomInst = addOrUpdateEffect("BloomEffect", EffectsConfig.BloomEffect) if bloomInst then controlRefs.Bloom_Intensity = { ctrl = createSliderControl("Brillo Bloom", bloomInst.Intensity or 0.35, Sections.Bloom, 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 2.4, Sections.Bloom, 0, 5, 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 22, Sections.Bloom, 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, Sections.Bloom, 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, Sections.Color, -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.2, Sections.Color, -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.25, Sections.Color, -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, Sections.Color, 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, Sections.Blur, 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, Sections.Blur, 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, Sections.Blur, 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, Sections.Blur, 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, Sections.Blur, 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, Sections.Blur, 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, Sections.Blur, 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.4, Sections.Sun, 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 2.8, Sections.Sun, 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, Sections.Sun, function(v) pcall(function() sunInst.Enabled = v end) end), getter = function() return sunInst.Enabled end } end end end -- CANVAS SIZE + detección de sección visible local function updateCanvasSize() Scroll.CanvasSize = UDim2.new(0,0,0,UIListLayout.AbsoluteContentSize.Y+16) end UIListLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(updateCanvasSize) Scroll.ChildAdded:Connect(function() task.defer(updateCanvasSize) end) Scroll.ChildRemoved:Connect(function() task.defer(updateCanvasSize) end) Scroll:GetPropertyChangedSignal("CanvasPosition"):Connect(function() local viewportY = Scroll.AbsolutePosition.Y + 20 local bestKey, bestDistance = activeCategory, math.huge for key,section in pairs(categorySections) do local d = math.abs(section.AbsolutePosition.Y - viewportY) if section.AbsolutePosition.Y <= viewportY + 80 and d < bestDistance then bestKey=key; bestDistance=d end end if bestKey then setCategoryActive(bestKey) end end) RunService.Heartbeat:Wait() updateCanvasSize() setCategoryActive("Lighting") -- RESET BUTTON ResetButton.MouseButton1Click:Connect(function() autoClockRunning = false for property, value in pairs(LightingConfig) do pcall(function() Lighting[property] = value end) end for _, part in ipairs(Workspace:GetDescendants()) do applyPartReflectance(part) end for effectType, properties in pairs(EffectsConfig) do addOrUpdateEffect(effectType, properties) end -- Restaurar ambas clases de interfaz sin inventar estados nuevos. if gameInterfaceHidden then restoreGameInterface() end if robloxInterfaceHidden then restoreRobloxInterface() else -- Si no estaba temporalmente oculta, mantener la restauración -- original del script para el botón de reinicio. for name, val in pairs(originalCoreGuiStates) do local enumVal = Enum.CoreGuiType[name] if enumVal then setCoreGuiEnabledSafe(enumVal, val) end 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() toggleMenu = function() 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(760, math.max(100, vs.X - 40)) local h = math.min(620, 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)