local UIS = game:GetService("UserInputService") local player = game.Players.LocalPlayer local camera = workspace.CurrentCamera local players = game:GetService("Players") local RunService = game:GetService("RunService") -- VALORES DE POTENCIA local slideForce, spinForce, comboPower = 0, 0, 0 local doubleJumpPower, wallJumpPower = 0, 0 local spinImpulsePower = 50 local slideJumpPower = 50 local jumpPowerVal = 50 local vePower = 16 local spinCooldownTime = 0.1 local canImpulse = true -- VALORES ACELERACIÓN local accelIncrement = 0.2 local accelTime = 0.5 local accelLimit = 1000 local currentAccelSpeed = 0 local accelTimer = 0 -- VALORES DASH local dashPower = 0 local canDash = true local dashCooldown = 0.8 -- VALORES FOV local fovValue = 70 -- FPS LOGIC local fps = 0 RunService.RenderStepped:Connect(function(dt) fps = math.floor(1/dt) end) -- VARIABLES DE PERSONALIZACIÓN local menuSize = 1 local menuR, menuG, menuB = 0, 0, 0 local settingsActive = { Slide = false, Spin = false, DoubleJump = false, WallJump = false, Combo = false, SpinImpulse = false, EffectsSound = true, EditMode = false, FEInvisible = false, Acceleration = false, Dash = false, FOV = false, ESP = false, HealthBar = false, Names = false } local character, humanoid, rootPart local isCrouching, isSpinning = false, false local canDoubleJump, hasDoubleJumped = false, false -- --- LÓGICA VISUAL (ESP) --- local function createESP(plr) local highlight = Instance.new("Highlight") highlight.Name = "UltraESP" highlight.FillTransparency = 0.5; highlight.OutlineTransparency = 0; highlight.FillColor = Color3.new(1, 1, 1) local billboard = Instance.new("BillboardGui") billboard.Name = "UltraUI"; billboard.Size = UDim2.new(0, 200, 0, 50); billboard.AlwaysOnTop = true; billboard.ExtentsOffset = Vector3.new(0, 3, 0) local nameLabel = Instance.new("TextLabel", billboard) nameLabel.Name = "PlayerName"; nameLabel.Size = UDim2.new(1, 0, 0.5, 0); nameLabel.BackgroundTransparency = 1; nameLabel.TextColor3 = Color3.new(1, 1, 1); nameLabel.Font = Enum.Font.GothamBold; nameLabel.TextSize = 14; nameLabel.Text = plr.Name local healthBG = Instance.new("Frame", billboard) healthBG.Name = "HealthBG"; healthBG.Size = UDim2.new(0.5, 0, 0.1, 0); healthBG.Position = UDim2.new(0.25, 0, 0.6, 0); healthBG.BackgroundColor3 = Color3.new(0, 0, 0); healthBG.BorderSizePixel = 0 local healthFill = Instance.new("Frame", healthBG) healthFill.Name = "Fill"; healthFill.Size = UDim2.new(1, 0, 1, 0); healthFill.BackgroundColor3 = Color3.new(0, 1, 0); healthFill.BorderSizePixel = 0 return highlight, billboard end task.spawn(function() while task.wait(0.5) do for _, p in pairs(players:GetPlayers()) do if p ~= player and p.Character and p.Character:FindFirstChild("HumanoidRootPart") then local char = p.Character local hrp = char:FindFirstChild("HumanoidRootPart") local high = char:FindFirstChild("UltraESP") local bill = hrp:FindFirstChild("UltraUI") if not high then local h, b = createESP(p); h.Parent = char; b.Parent = hrp; high, bill = h, b end high.Enabled = settingsActive.ESP; bill.Enabled = (settingsActive.Names or settingsActive.HealthBar); bill.PlayerName.Visible = settingsActive.Names; bill.HealthBG.Visible = settingsActive.HealthBar local hum = char:FindFirstChildOfClass("Humanoid") if hum then bill.HealthBG.Fill.Size = UDim2.new(math.clamp(hum.Health/hum.MaxHealth, 0, 1), 0, 1, 0) end end end end end) -- --- EFECTOS --- local function playImpulseEffect(color) if not settingsActive.EffectsSound or not rootPart then return end local sound = Instance.new("Sound", rootPart); sound.SoundId = "rbxassetid://12222200"; sound.Volume = 2; sound:Play(); game:GetService("Debris"):AddItem(sound, 1) local p = Instance.new("Part", workspace); p.Anchored = true; p.CanCollide = false; p.Size = Vector3.new(2, 2, 2); p.CFrame = rootPart.CFrame; p.Color = color or Color3.fromRGB(255, 255, 255); p.Transparency = 0.6; p.Shape = "Ball"; p.Material = Enum.Material.Neon task.spawn(function() for i = 1, 8 do p.Size = p.Size + Vector3.new(1.8, 1.8, 1.8); p.Transparency = p.Transparency + 0.1; task.wait(0.03) end p:Destroy() end) end -- --- INTERFAZ --- local screenGui = Instance.new("ScreenGui", player:WaitForChild("PlayerGui")) screenGui.Name = "Movement_Pro_V40_Clean"; screenGui.ResetOnSpawn = false local mainFrame = Instance.new("Frame", screenGui) local function makeDraggable(obj, isConfig) local dragging, dragStart, startPos obj.InputBegan:Connect(function(input) if (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then if isConfig or settingsActive.EditMode then dragging = true; dragStart = input.Position; startPos = obj.Position end end end) UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart obj.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end) UIS.InputEnded:Connect(function() dragging = false end) end local function createMainButton(name, pos, color) local btn = Instance.new("TextButton", screenGui); btn.Size = UDim2.new(0, 75, 0, 75); btn.Position = pos; btn.BackgroundColor3 = color; btn.Text = name; btn.TextColor3 = Color3.new(1, 1, 1); btn.TextScaled = true; btn.Font = Enum.Font.GothamBold; btn.Visible = false; Instance.new("UICorner", btn).CornerRadius = UDim.new(1, 0) return btn end local crouchButton = createMainButton("SLIDE", UDim2.new(0.85, 0, 0.7, 0), Color3.fromRGB(30, 30, 30)) local spinButton = createMainButton("GIRO", UDim2.new(0.85, 0, 0.7, -85), Color3.fromRGB(0, 120, 200)) local dashBtn = createMainButton("DASH", UDim2.new(0.85, 0, 0.7, -170), Color3.fromRGB(200, 150, 0)) makeDraggable(crouchButton, false); makeDraggable(spinButton, false); makeDraggable(dashBtn, false) mainFrame.Size = UDim2.new(0, 450, 0, 320); mainFrame.Position = UDim2.new(0.5, -225, 0.5, -160); mainFrame.BackgroundColor3 = Color3.fromRGB(0, 0, 0); mainFrame.Visible = false; Instance.new("UICorner", mainFrame) local sidebar = Instance.new("Frame", mainFrame); sidebar.Size = UDim2.new(0, 120, 1, 0); sidebar.BackgroundColor3 = Color3.fromRGB(15, 15, 15); Instance.new("UICorner", sidebar) local contentFrame = Instance.new("Frame", mainFrame); contentFrame.Size = UDim2.new(1, -135, 1, -10); contentFrame.Position = UDim2.new(0, 125, 0, 5); contentFrame.BackgroundTransparency = 1 local pages = {} local function createPage(name) local page = Instance.new("ScrollingFrame", contentFrame); page.Size = UDim2.new(1, 0, 1, 0); page.BackgroundTransparency = 1; page.Visible = false; page.CanvasSize = UDim2.new(0, 0, 0, 1200); page.ScrollBarThickness = 2 pages[name] = page local tabBtn = Instance.new("TextButton", sidebar); tabBtn.Size = UDim2.new(0.9, 0, 0, 35); tabBtn.Position = UDim2.new(0.05, 0, 0, (#sidebar:GetChildren() * 40) - 40); tabBtn.Text = name; tabBtn.Font = Enum.Font.GothamBold; tabBtn.TextSize = 10 tabBtn.MouseButton1Click:Connect(function() for _, p in pairs(pages) do p.Visible = false end page.Visible = true end) return page end local function addToggle(page, name, key) local btn = Instance.new("TextButton", page); btn.Size = UDim2.new(0.95, 0, 0, 35); btn.Font = Enum.Font.GothamBold; btn.TextColor3 = Color3.new(1,1,1); Instance.new("UICorner", btn) local function update() btn.BackgroundColor3 = settingsActive[key] and Color3.fromRGB(0, 180, 0) or Color3.fromRGB(150, 0, 0); btn.Text = name .. (settingsActive[key] and " [ON]" or " [OFF]") if key == "Slide" then crouchButton.Visible = settingsActive.Slide end if key == "Spin" then spinButton.Visible = settingsActive.Spin end if key == "Dash" then dashBtn.Visible = settingsActive.Dash end if key == "FEInvisible" and settingsActive.FEInvisible then loadstring(game:HttpGet("https://raw.githubusercontent.com/GamerScripter/Invisible-FE/main/Script"))() end end btn.MouseButton1Click:Connect(function() settingsActive[key] = not settingsActive[key] update() end); update() end local function addSlider(page, name, min, max, default, keyName) local container = Instance.new("Frame", page); container.Size = UDim2.new(0.95, 0, 0, 50); container.BackgroundTransparency = 1 local label = Instance.new("TextLabel", container); label.Size = UDim2.new(1, 0, 0, 20); label.Text = name .. ": " .. default; label.TextColor3 = Color3.new(1,1,1); label.BackgroundTransparency = 1; label.TextXAlignment = "Left" local bg = Instance.new("Frame", container); bg.Size = UDim2.new(1, 0, 0, 8); bg.Position = UDim2.new(0,0,0,25); bg.BackgroundColor3 = Color3.fromRGB(50,50,50) local fill = Instance.new("Frame", bg); fill.Size = UDim2.new((default-min)/(max-min), 0, 1, 0); fill.BackgroundColor3 = Color3.fromRGB(0, 200, 255) local trigger = Instance.new("TextButton", bg); trigger.Size = UDim2.new(1,0,1,0); trigger.BackgroundTransparency = 1; trigger.Text = "" local dragging = false trigger.InputBegan:Connect(function() dragging = true end); UIS.InputEnded:Connect(function() dragging = false end) UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local pos = math.clamp((input.Position.X - bg.AbsolutePosition.X) / bg.AbsoluteSize.X, 0, 1) fill.Size = UDim2.new(pos, 0, 1, 0); local rawVal = min + (pos * (max - min)) local val = (keyName == "cd" or keyName == "acin" or keyName == "acti" or keyName == "mSize") and math.round(rawVal * 10)/10 or math.floor(rawVal) label.Text = name .. ": " .. val if keyName == "cd" then spinCooldownTime = val elseif keyName == "trans" then mainFrame.BackgroundTransparency = val/10; sidebar.BackgroundTransparency = val/10 elseif keyName == "mSize" then menuSize = val; mainFrame.Size = UDim2.new(0, 450 * val, 0, 320 * val) elseif keyName == "mR" then menuR = val; mainFrame.BackgroundColor3 = Color3.fromRGB(menuR, menuG, menuB) elseif keyName == "mG" then menuG = val; mainFrame.BackgroundColor3 = Color3.fromRGB(menuR, menuG, menuB) elseif keyName == "mB" then menuB = val; mainFrame.BackgroundColor3 = Color3.fromRGB(menuR, menuG, menuB) elseif keyName == "vep" then vePower = val elseif keyName == "acin" then accelIncrement = val elseif keyName == "acti" then accelTime = val elseif keyName == "acli" then accelLimit = val elseif keyName == "dsh" then dashPower = val elseif keyName == "fov" then fovValue = val elseif keyName == "sli" then slideForce = val elseif keyName == "spi" then spinForce = val elseif keyName == "sim" then spinImpulsePower = val elseif keyName == "com" then comboPower = val elseif keyName == "wal" then wallJumpPower = val elseif keyName == "dou" then doubleJumpPower = val elseif keyName == "slj" then slideJumpPower = val end end end) end local function setupLayout(p) Instance.new("UIListLayout", p).Padding = UDim.new(0, 12) end -- PÁGINAS local pG = createPage("GENERAL"); setupLayout(pG); addToggle(pG, "EFECTOS SONIDO", "EffectsSound"); addToggle(pG, "FE INVISIBLE", "FEInvisible"); addSlider(pG, "VELOCIDAD BASE", 0, 100, 16, "vep"); addToggle(pG, "ACELERACIÓN PROG.", "Acceleration"); addSlider(pG, "TIEMPO ACCEL (SEG)", 0.1, 5, 0.5, "acti"); addSlider(pG, "INCREMENTO ACCEL", 0.1, 10, 0.2, "acin"); addSlider(pG, "LÍMITE VEL", 1000, 6000, 1000, "acli"); addToggle(pG, "DASH (BOTÓN)", "Dash"); addSlider(pG, "POTENCIA DASH", 0, 100, 50, "dsh"); addToggle(pG, "FOV DINÁMICO", "FOV"); addSlider(pG, "VALOR FOV", 30, 120, 70, "fov") local pV = createPage("VISUAL"); setupLayout(pV); addToggle(pV, "VER NOMBRES", "Names"); addToggle(pV, "ESP (CUADROS)", "ESP"); addToggle(pV, "BARRAS DE VIDA", "HealthBar") local pM = createPage("MOVIMIENTO"); setupLayout(pM); addToggle(pM, "SLIDE", "Slide"); addSlider(pM, "FUERZA SLIDE", 0, 300, 0, "sli"); addSlider(pM, "SALTO SLIDE", 50, 100, 50, "slj"); addToggle(pM, "GIRO", "Spin"); addSlider(pM, "VELOCIDAD GIRO", 0, 500, 0, "spi") local pI = createPage("IMPULSO"); setupLayout(pI); addToggle(pI, "IMPULSO (SALTO+GIRO)", "SpinImpulse"); addSlider(pI, "FUERZA EMPUJE", 50, 100, 50, "sim"); addSlider(pI, "RETRASO", 0.1, 2.0, 0.1, "cd") local pJ = createPage("SALTOS"); setupLayout(pJ); addToggle(pJ, "COMBO", "Combo"); addSlider(pJ, "FUERZA COMBO", 0, 500, 0, "com"); addToggle(pJ, "SALTO PARED", "WallJump"); addSlider(pJ, "FUERZA PARED", 0, 300, 0, "wal"); addToggle(pJ, "DOBLE SALTO", "DoubleJump"); addSlider(pJ, "POTENCIA DOBLE", 0, 200, 0, "dou") local pC = createPage("CONFIG"); setupLayout(pC); addToggle(pC, "MODO EDICIÓN", "EditMode"); addSlider(pC, "TRANSPARENCIA", 0, 10, 0, "trans"); addSlider(pC, "TAMAÑO MENÚ", 0.5, 2, 1, "mSize"); addSlider(pC, "COLOR ROJO", 0, 255, 0, "mR"); addSlider(pC, "COLOR VERDE", 0, 255, 0, "mG"); addSlider(pC, "COLOR AZUL", 0, 255, 0, "mB") local fpsText = Instance.new("TextLabel", pC); fpsText.Size = UDim2.new(0.95, 0, 0, 30); fpsText.BackgroundTransparency = 1; fpsText.TextColor3 = Color3.new(0, 1, 0); fpsText.Font = Enum.Font.GothamBold; fpsText.TextSize = 14 task.spawn(function() while task.wait(0.5) do fpsText.Text = "RENDIMIENTO FPS: " .. fps end end) pages["GENERAL"].Visible = true local configBtn = createMainButton("⚙️", UDim2.new(0.5, -25, 0.02, 0), Color3.fromRGB(40,40,40)) configBtn.Size = UDim2.new(0, 50, 0, 50); configBtn.Visible = true; configBtn.ZIndex = 100; makeDraggable(configBtn, true) configBtn.MouseButton1Click:Connect(function() mainFrame.Visible = not mainFrame.Visible end) -- --- LÓGICA CORE --- local function standUp() isCrouching = false; if humanoid then humanoid.WalkSpeed, humanoid.HipHeight = vePower, 0 end end local function updateRefs(char) character = char; humanoid = char:WaitForChild("Humanoid"); rootPart = char:WaitForChild("HumanoidRootPart") humanoid.StateChanged:Connect(function(_, newState) if newState == Enum.HumanoidStateType.Landed then canDoubleJump, hasDoubleJumped = false, false elseif newState == Enum.HumanoidStateType.Freefall or newState == Enum.HumanoidStateType.Jumping then task.wait(0.05) canDoubleJump = true end end) end player.CharacterAdded:Connect(updateRefs); if player.Character then updateRefs(player.Character) end RunService.Heartbeat:Connect(function(dt) if character and humanoid and rootPart then if settingsActive.Acceleration and humanoid.MoveDirection.Magnitude > 0 then accelTimer = accelTimer + dt if accelTimer >= accelTime then currentAccelSpeed = math.min(currentAccelSpeed + accelIncrement, accelLimit); accelTimer = 0 end humanoid.WalkSpeed = vePower + currentAccelSpeed else currentAccelSpeed = 0; accelTimer = 0; humanoid.WalkSpeed = vePower end if settingsActive.FOV then camera.FieldOfView = math.clamp(fovValue + (currentAccelSpeed * 0.05), fovValue, 120) end end end) UIS.JumpRequest:Connect(function() if not rootPart or not humanoid or settingsActive.EditMode then return end if isCrouching and isSpinning and settingsActive.Combo then playImpulseEffect(Color3.fromRGB(255, 0, 0)); rootPart.Velocity = Vector3.new(rootPart.Velocity.X, comboPower, rootPart.Velocity.Z); standUp(); return end if settingsActive.WallJump then local rayParams = RaycastParams.new(); rayParams.FilterDescendantsInstances = {character} local result = workspace:Raycast(rootPart.Position, rootPart.CFrame.LookVector * 5, rayParams) if result and result.Normal.Y < 0.3 then playImpulseEffect() rootPart.Velocity = (result.Normal * wallJumpPower) + Vector3.new(0, wallJumpPower * 1.2, 0) rootPart.CFrame = CFrame.new(rootPart.Position, rootPart.Position + result.Normal) return end end if isCrouching and settingsActive.Slide then playImpulseEffect(); rootPart.Velocity = Vector3.new(rootPart.Velocity.X, slideJumpPower, rootPart.Velocity.Z); standUp(); return end if settingsActive.DoubleJump and canDoubleJump and not hasDoubleJumped then hasDoubleJumped = true; playImpulseEffect(Color3.fromRGB(0, 200, 255)); rootPart.Velocity = Vector3.new(rootPart.Velocity.X, doubleJumpPower, rootPart.Velocity.Z) end end) dashBtn.MouseButton1Down:Connect(function() if not settingsActive.Dash or not canDash or not rootPart or settingsActive.EditMode then return end canDash = false; local dv = Instance.new("BodyVelocity", rootPart); dv.MaxForce = Vector3.new(1e6, 1e6, 1e6); dv.Velocity = rootPart.CFrame.LookVector * (dashPower * 5); game:GetService("Debris"):AddItem(dv, 0.15); task.wait(dashCooldown); canDash = true end) -- --- GIRO ACTUALIZADO PARA CELULAR --- spinButton.MouseButton1Down:Connect(function() if settingsActive.EditMode or not settingsActive.Spin or not rootPart or not humanoid then return end -- Detecta si el jugador está moviendo el joystick de celular (MoveDirection.Magnitude > 0) if settingsActive.SpinImpulse and canImpulse and (humanoid:GetState() == Enum.HumanoidStateType.Freefall) and humanoid.MoveDirection.Magnitude > 0 then canImpulse = false; playImpulseEffect() local camLook = camera.CFrame.LookVector local forwardDir = Vector3.new(camLook.X, 0, camLook.Z).Unit rootPart.Velocity = (forwardDir * spinImpulsePower * 1.5) + Vector3.new(0, 25, 0) task.spawn(function() task.wait(spinCooldownTime); canImpulse = true end) end isSpinning = true; local bav = Instance.new("BodyAngularVelocity", rootPart); bav.MaxTorque = Vector3.new(0, 1e6, 0); bav.AngularVelocity = Vector3.new(0, spinForce/5, 0); task.wait(0.6); bav:Destroy(); isSpinning = false end) crouchButton.MouseButton1Down:Connect(function() if settingsActive.EditMode or not settingsActive.Slide or not rootPart then return end isCrouching = not isCrouching if isCrouching then humanoid.WalkSpeed, humanoid.HipHeight = 8, -1.2 if humanoid.MoveDirection.Magnitude > 0 then local bv = Instance.new("BodyVelocity", rootPart); bv.MaxForce = Vector3.new(1e5, 0, 1e5); bv.Velocity = rootPart.CFrame.LookVector * slideForce; task.wait(0.5); bv:Destroy() end else standUp() end end)