-- ============================================= -- ABILITY HUD V4.8 - CORRIDA NAS PAREDES 🕷️ -- ✅ FUNCIONA EM TODOS OS MAPAS | SEM ANIMAÇÃO -- ✅ SEGURA = CORRE NA PAREDE/TETO | SOLTA = DISPARA PULO -- ============================================= local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local TweenService = game:GetService("TweenService") local Math = math local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local root = character:WaitForChild("HumanoidRootPart") local camera = workspace.CurrentCamera -- ==================== HUD PRINCIPAL ==================== local screenGui = Instance.new("ScreenGui") screenGui.Name = "AbilityHUD" screenGui.ResetOnSpawn = false screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling screenGui.Parent = playerGui local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.Size = UDim2.new(1, 0, 1, 0) mainFrame.Position = UDim2.new(0, 0, 0, 0) mainFrame.BackgroundTransparency = 1 mainFrame.Parent = screenGui -- ==================== CRIAÇÃO DOS BOTÕES ==================== local function createAbilityButton(name, emoji, symbolColor, posicao) local btn = Instance.new("TextButton") btn.Name = name btn.Size = UDim2.new(0, 75, 0, 75) btn.Position = posicao btn.BackgroundColor3 = Color3.new(0, 0, 0) btn.BackgroundTransparency = 0 btn.Text = emoji btn.TextColor3 = symbolColor btn.TextScaled = true btn.Font = Enum.Font.GothamBold btn.AutoButtonColor = false btn.Parent = mainFrame Instance.new("UICorner", btn).CornerRadius = UDim.new(0.5, 0) return btn end -- ✅ CORES E POSIÇÕES local xBtn = createAbilityButton("XButton", "X", Color3.fromRGB(0, 140, 255), UDim2.new(0.92, -37, 0.30, -37)) -- Azul local squareBtn = createAbilityButton("SquareButton", "□", Color3.fromRGB(220, 40, 40), UDim2.new(0.92, -37, 0.40, -37)) -- Vermelho local circleBtn = createAbilityButton("CircleButton", "○", Color3.fromRGB(255, 60, 180), UDim2.new(0.92, -37, 0.50, -37)) -- Rosa local triangleBtn = createAbilityButton("TriangleButton", "🪂", Color3.fromRGB(0, 200, 80), UDim2.new(0.92, -37, 0.60, -37)) -- Verde (Asa) -- 🔵 NOVO BOTÃO: CORRIDA NA PAREDE local paredeBtn = createAbilityButton("ParedeButton", "🕷️", Color3.fromRGB(80, 140, 255), UDim2.new(0.92, -37, 0.70, -37)) -- AZUL ARANHA 🕷️ -- Botão de Configurações local settingsBtn = Instance.new("TextButton") settingsBtn.Name = "SettingsButton" settingsBtn.Size = UDim2.new(0, 58, 0, 58) settingsBtn.Position = UDim2.new(0.94, -29, 0.08, -29) settingsBtn.BackgroundColor3 = Color3.new(0,0,0) settingsBtn.Text = "⚙" settingsBtn.TextColor3 = Color3.new(1,1,1) settingsBtn.TextScaled = true settingsBtn.Font = Enum.Font.GothamBold settingsBtn.AutoButtonColor = false settingsBtn.Parent = screenGui Instance.new("UICorner", settingsBtn).CornerRadius = UDim.new(0.5, 0) -- Mira Central local crosshair = Instance.new("Frame", screenGui) crosshair.Size = UDim2.new(0, 26, 0, 2) crosshair.Position = UDim2.new(0.5, -13, 0.5, -1) crosshair.BackgroundColor3 = Color3.new(1,1,1) crosshair.BackgroundTransparency = 0.35 crosshair.BorderSizePixel = 0 local crosshair2 = crosshair:Clone() crosshair2.Size = UDim2.new(0, 2, 0, 26) crosshair2.Position = UDim2.new(0.5, -1, 0.5, -13) crosshair2.Parent = screenGui -- ==================== MENU CONFIG ==================== local configFrame = Instance.new("Frame", screenGui) configFrame.Size = UDim2.new(0, 300, 0, 200) configFrame.Position = UDim2.new(0.5, -150, 0.5, -100) configFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 25) configFrame.Visible = false configFrame.BorderSizePixel = 0 Instance.new("UICorner", configFrame).CornerRadius = UDim.new(0, 12) local title = Instance.new("TextLabel", configFrame) title.Size = UDim2.new(1,0,0,40) title.BackgroundTransparency = 1 title.Text = "Configuração do HUD" title.TextColor3 = Color3.new(1,1,1) title.TextScaled = true title.Font = Enum.Font.GothamBold local editBtn = Instance.new("TextButton", configFrame) editBtn.Size = UDim2.new(0.85,0,0,45) editBtn.Position = UDim2.new(0.075,0,0,55) editBtn.BackgroundColor3 = Color3.fromRGB(0, 120, 255) editBtn.Text = "🔓 Ativar Modo Edição" editBtn.TextScaled = true editBtn.Font = Enum.Font.Gotham editBtn.AutoButtonColor = false Instance.new("UICorner", editBtn).CornerRadius = UDim.new(0, 8) local saveBtn = Instance.new("TextButton", configFrame) saveBtn.Size = UDim2.new(0.85,0,0,45) saveBtn.Position = UDim2.new(0.075,0,0,110) saveBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 0) saveBtn.Text = "🔒 Travar Posições" saveBtn.TextScaled = true saveBtn.Font = Enum.Font.Gotham saveBtn.AutoButtonColor = false Instance.new("UICorner", saveBtn).CornerRadius = UDim.new(0, 8) local resetBtn = Instance.new("TextButton", configFrame) resetBtn.Size = UDim2.new(0.85,0,0,45) resetBtn.Position = UDim2.new(0.075,0,0,165) resetBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50) resetBtn.Text = "🔄 Redefinir HUD" resetBtn.TextScaled = true resetBtn.Font = Enum.Font.Gotham resetBtn.AutoButtonColor = false Instance.new("UICorner", resetBtn).CornerRadius = UDim.new(0, 8) -- ==================== VARIÁVEIS ==================== local isCharging = false local chargeStartTime = 0 local chargeBar = nil local slingshotStage = 0 local editMode = false local draggingBtn = nil local dragStartPos, startMousePos -- ✅ ASA DE TEIA local asaAtiva = false local rastroAsa = nil -- ✅ PULO CARREGADO local MAX_CHARGE_TIME = 1.8 local BASE_UP_POWER = 70 local MAX_UP_POWER = 160 local BASE_FORWARD = 80 local MAX_FORWARD = 220 local VELOCIDADE_EXTRA = 6 local velocidadeOriginal = 16 -- ✅ 🕷️ CORRIDA NA PAREDE - CONFIGS PRINCIPAIS local paredeAtiva = false local raioDetccao = 3.5 -- Distância que detecta a parede local velocidadeParede = 32 -- Velocidade nas paredes local forcaLancamento = 180 -- Força do pulo ao soltar local gravidadeParede = 0.05 -- Quase sem gravidade grudado local normalGravity = 1 -- ==================== 🛠️ SISTEMA DE ARRASTO ==================== local allButtons = {xBtn, squareBtn, circleBtn, triangleBtn, paredeBtn, settingsBtn} for _, btn in pairs(allButtons) do btn.InputBegan:Connect(function(input) if editMode and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then draggingBtn = btn dragStartPos = btn.Position startMousePos = input.Position btn.BackgroundTransparency = 0.3 end end) end UserInputService.InputChanged:Connect(function(input) if draggingBtn and editMode then if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - startMousePos draggingBtn.Position = UDim2.new( dragStartPos.X.Scale, dragStartPos.X.Offset + delta.X, dragStartPos.Y.Scale, dragStartPos.Y.Offset + delta.Y ) end end end) UserInputService.InputEnded:Connect(function(input) if draggingBtn and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then draggingBtn.BackgroundTransparency = 0 draggingBtn = nil end end) -- ==================== CONTROLES DO MENU ==================== settingsBtn.Activated:Connect(function() configFrame.Visible = not configFrame.Visible end) editBtn.Activated:Connect(function() editMode = true editBtn.BackgroundColor3 = Color3.fromRGB(0, 200, 100) editBtn.Text = "✅ Edição Ativada" end) saveBtn.Activated:Connect(function() editMode = false editBtn.BackgroundColor3 = Color3.fromRGB(0, 120, 255) editBtn.Text = "🔓 Ativar Modo Edição" for _,b in pairs(allButtons) do b.BackgroundTransparency = 0 end configFrame.Visible = false end) resetBtn.Activated:Connect(function() xBtn.Position = UDim2.new(0.92, -37, 0.30, -37) squareBtn.Position = UDim2.new(0.92, -37, 0.40, -37) circleBtn.Position = UDim2.new(0.92, -37, 0.50, -37) triangleBtn.Position = UDim2.new(0.92, -37, 0.60, -37) paredeBtn.Position = UDim2.new(0.92, -37, 0.70, -37) settingsBtn.Position = UDim2.new(0.94, -29, 0.08, -29) editMode = false for _,b in pairs(allButtons) do b.BackgroundTransparency = 0 end end) -- ==================== HABILIDADES ==================== -- ===== X = PULO CARREGADO ✅ VELOCIDADE 6X | MAIS ALTO | ARCO ✅ ===== xBtn.InputBegan:Connect(function(input) if editMode or asaAtiva or paredeAtiva then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then if isCharging then return end isCharging = true chargeStartTime = tick() humanoid.WalkSpeed = velocidadeOriginal * VELOCIDADE_EXTRA -- Barra de carga chargeBar = Instance.new("BillboardGui") chargeBar.Size = UDim2.new(7, 0, 1, 0) chargeBar.Adornee = root chargeBar.StudsOffset = Vector3.new(0, 4.5, 0) chargeBar.AlwaysOnTop = true chargeBar.LightInfluence = 0 chargeBar.Parent = screenGui local bg = Instance.new("Frame", chargeBar) bg.Size = UDim2.new(1, 0, 0.20, 0) bg.Position = UDim2.new(0,0, 0.4,0) bg.BackgroundColor3 = Color3.fromRGB(15, 15, 20) bg.BorderSizePixel = 0 bg.BackgroundTransparency = 0.1 Instance.new("UICorner", bg).CornerRadius = UDim.new(1,0) local stroke = Instance.new("UIStroke", bg) stroke.Color = Color3.new(1,1,1) stroke.Thickness = 1.2 stroke.Transparency = 0.4 local bar = Instance.new("Frame", bg) bar.Name = "ChargeFill" bar.Size = UDim2.new(0,0,1,0) bar.BackgroundColor3 = Color3.fromRGB(0, 140, 255) bar.BorderSizePixel = 0 bar.ZIndex = 2 Instance.new("UICorner", bar).CornerRadius = UDim.new(1,0) -- Efeito velocidade local velocidadeEfeito = Instance.new("ParticleEmitter", root) velocidadeEfeito.Name = "VelEfeito" velocidadeEfeito.Color = ColorSequence.new(Color3.fromRGB(100, 180, 255)) velocidadeEfeito.Speed = NumberRange.new(20, 40) velocidadeEfeito.Rate = 15 velocidadeEfeito.Lifetime = NumberRange.new(0.2, 0.4) Debris:AddItem(velocidadeEfeito, 999) end end) local function releaseCharge() if not isCharging then return end isCharging = false humanoid.WalkSpeed = velocidadeOriginal local efeito = root:FindFirstChild("VelEfeito") if efeito then efeito:Destroy() end local chargeTime = Math.clamp(tick() - chargeStartTime, 0, MAX_CHARGE_TIME) local power = chargeTime / MAX_CHARGE_TIME local powerCurve = power ^ 1.2 local upForce = BASE_UP_POWER + (MAX_UP_POWER - BASE_UP_POWER) * powerCurve local forwardForce = BASE_FORWARD + (MAX_FORWARD - BASE_FORWARD) * powerCurve local lookVector = camera.CFrame.LookVector local finalDir = (Vector3.new(lookVector.X, 0, lookVector.Z).Unit * 0.9 + Vector3.new(0, 1.2, 0)).Unit humanoid.JumpPower = upForce humanoid.Jump = true task.wait(0.02) root.Velocity = root.Velocity + (finalDir * forwardForce) if power > 0.2 then local spark = Instance.new("ParticleEmitter", root) spark.Color = ColorSequence.new(Color3.fromRGB(50, 160, 255)) spark.Size = NumberSequence.new(0.4, 0.8) spark.Speed = NumberRange.new(10, 25) spark.Lifetime = NumberRange.new(0.2, 0.4) spark.Rate = 12 Debris:AddItem(spark, 0.25) end if chargeBar then chargeBar:Destroy(); chargeBar = nil end end xBtn.InputEnded:Connect(function(input) if editMode then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then releaseCharge() end end) RunService.RenderStepped:Connect(function() if chargeBar and isCharging then local currentTime = tick() - chargeStartTime local progress = Math.clamp(currentTime / MAX_CHARGE_TIME, 0, 1) local bar = chargeBar:FindFirstChild("ChargeFill", true) if bar then bar.Size = UDim2.new(progress, 0, 1, 0) local r = Math.clamp(progress * 255, 0, 255) local g = Math.clamp(100 + progress * 155, 0, 255) local b = Math.clamp(255 - progress * 50, 0, 255) if progress >= 0.95 then bar.BackgroundColor3 = Color3.fromRGB(255, 220, 50) bar.BackgroundTransparency = 0.2 + Math.sin(tick()*15)*0.15 else bar.BackgroundColor3 = Color3.fromRGB(r, g, b) bar.BackgroundTransparency = 0 end end end end) -- ===== QUADRADO = TEIA / GANCHO ===== squareBtn.Activated:Connect(function() if editMode or asaAtiva or paredeAtiva then return end local ray = camera:ScreenPointToRay(camera.ViewportSize.X/2, camera.ViewportSize.Y/2) local _, pos = workspace:FindPartOnRayWithIgnoreList(Ray.new(ray.Origin, ray.Direction * 350), {character}) local targetPos = pos or (ray.Origin + ray.Direction * 250) local direction = (targetPos - root.Position).Unit root.Velocity = direction * Math.min((targetPos - root.Position).Magnitude * 2.2, 220) local att0 = Instance.new("Attachment", root) local att1 = Instance.new("Attachment", workspace.Terrain) att1.Position = targetPos local beam = Instance.new("Beam", workspace) beam.Attachment0 = att0 beam.Attachment1 = att1 beam.Color = ColorSequence.new(Color3.fromRGB(170, 200, 255)) beam.Width0 = 1.8 beam.Width1 = 0.2 Debris:AddItem(beam, 0.6) Debris:AddItem(att0, 0.6) Debris:AddItem(att1, 0.6) end) -- ===== BOLA = ESTILINGUE ===== circleBtn.Activated:Connect(function() if editMode or asaAtiva or paredeAtiva then return end if slingshotStage == 0 then slingshotStage = 1 circleBtn.Text = "◉" circleBtn.TextColor3 = Color3.fromRGB(255, 120, 200) local recuoVel = -camera.CFrame.LookVector * 45 root.Velocity = recuoVel local efeito = Instance.new("Part", workspace) efeito.Name = "EstilingueEfeito" efeito.Material = Enum.Material.Neon efeito.BrickColor = BrickColor.new("Hot pink") efeito.Transparency = 0.4 efeito.Anchored = false efeito.CanCollide = false efeito.Size = Vector3.new(0.5,0.5,2) efeito.CFrame = CFrame.new(root.Position, root.Position + camera.CFrame.LookVector * -5) efeito.Parent = workspace efeito:SetNetworkOwner(player) local attR = Instance.new("Attachment", root) local attE = Instance.new("Attachment", efeito) local beam = Instance.new("Beam", efeito) beam.Attachment0 = attR beam.Attachment1 = attE beam.Color = ColorSequence.new(Color3.fromRGB(255, 60, 180)) beam.Width0 = 2 beam.Width1 = 0.5 Debris:AddItem(efeito, 0.4) elseif slingshotStage == 1 then slingshotStage = 0 circleBtn.Text = "○" circleBtn.TextColor3 = Color3.fromRGB(255, 60, 180) local impulso = camera.CFrame.LookVector * 200 + Vector3.new(0, 90, 0) root.Velocity = impulso local explosao = Instance.new("ParticleEmitter", root) explosao.Color = ColorSequence.new(Color3.fromRGB(255, 60, 180), Color3.fromRGB(255, 150, 220)) explosao.Size = NumberSequence.new({NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.5, 2), NumberSequenceKeypoint.new(1,0)}) explosao.Speed = NumberRange.new(10, 30) explosao.Rate = 30 explosao.Lifetime = NumberRange.new(0.3, 0.6) Debris:AddItem(explosao, 0.4) local rastro = Instance.new("Trail", root) rastro.Color = ColorSequence.new(Color3.fromRGB(255, 60, 180)) rastro.Transparency = NumberSequence.new(0.2, 1) rastro.Lifetime = 0.5 rastro.WidthScale = NumberSequence.new(1, 0) Debris:AddItem(rastro, 0.6) end end) -- 🔺🔺🔺 TRIÂNGULO = ASA DE TEIA 🪂 CONTROLE EXATO 🔺🔺🔺 triangleBtn.Activated:Connect(function() if editMode or paredeAtiva then return end if humanoid.FloorMaterial ~= Enum.Material.Air and not asaAtiva then return end if not asaAtiva then asaAtiva = true triangleBtn.Text = "🛑" triangleBtn.BackgroundColor3 = Color3.fromRGB(0, 150, 60) humanoid.GravityScale = 0.2 humanoid.PlatformStand = true camera.FieldOfView = 90 rastroAsa = Instance.new("Trail", root) rastroAsa.Color = ColorSequence.new(Color3.fromRGB(150, 255, 180)) rastroAsa.Transparency = NumberSequence.new(0.3, 1) rastroAsa.Lifetime = 1.2 rastroAsa.WidthScale = NumberSequence.new(2, 0) local abertura = Instance.new("ParticleEmitter", root) abertura.Color = ColorSequence.new(Color3.fromRGB(100, 255, 150)) abertura.Speed = NumberRange.new(5,15) abertura.Rate = 10 abertura.Lifetime = NumberRange.new(0.4,0.8) Debris:AddItem(abertura, 0.3) else asaAtiva = false triangleBtn.Text = "🪂" triangleBtn.BackgroundColor3 = Color3.new(0,0,0) humanoid.GravityScale = 1.0 humanoid.PlatformStand = false camera.FieldOfView = 70 if rastroAsa then rastroAsa:Destroy() end end end) RunService.Heartbeat:Connect(function(deltaTime) if asaAtiva then local targetDirection = camera.CFrame.LookVector local speedMultiplier = 1 if targetDirection.Y > 0.2 then speedMultiplier = 1.5 elseif targetDirection.Y < -0.2 then speedMultiplier = 2.5 else speedMultiplier = 1.2 end local velocidadeDesejada = targetDirection * 180 * speedMultiplier root.Velocity = root.Velocity:Lerp(velocidadeDesejada, deltaTime * 4) root.CFrame = CFrame.new(root.Position, root.Position + Vector3.new(targetDirection.X, 0, targetDirection.Z)) if root.Position.Y < workspace.FallenPartsDestroyHeight + 8 then asaAtiva = false triangleBtn.Text = "🪂" triangleBtn.BackgroundColor3 = Color3.new(0,0,0) humanoid.GravityScale = 1.0 humanoid.PlatformStand = false camera.FieldOfView = 70 if rastroAsa then rastroAsa:Destroy() end end end end) -- ===== 🕷️ BOTÃO AZUL = CORRIDA NA PAREDE / TETO ===== paredeBtn.InputBegan:Connect(function(input) if editMode or asaAtiva or isCharging then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then paredeAtiva = true paredeBtn.BackgroundColor3 = Color3.fromRGB(40, 80, 200) humanoid.GravityScale = gravidadeParede -- Quase flutua humanoid.PlatformStand = true -- Evita cair humanoid.WalkSpeed = velocidadeParede -- Efeito de teia grudando local efeitoInicio = Instance.new("ParticleEmitter", root) efeitoInicio.Color = ColorSequence.new(Color3.fromRGB(80, 140, 255)) efeitoInicio.Speed = NumberRange.new(2,8) efeitoInicio.Rate = 15 efeitoInicio.Lifetime = NumberRange.new(0.3, 0.6) efeitoInicio.SpreadAngle = Vector2.new(180,180) Debris:AddItem(efeitoInicio, 0.5) -- Rastro de teia local rastroParede = Instance.new("Trail", root) rastroParede.Name = "RastroParede" rastroParede.Color = ColorSequence.new(Color3.fromRGB(100, 160, 255)) rastroParede.Transparency = NumberSequence.new(0.1, 1) rastroParede.Lifetime = 0.8 rastroParede.WidthScale = NumberSequence.new(1.5, 0) Debris:AddItem(rastroParede, 999) end end) -- ⚙️ FÍSICA PRINCIPAL DA CORRIDA RunService.Heartbeat:Connect(function(deltaTime) if paredeAtiva then -- 1. DETECTA SUPERFÍCIE (Parede, Teto, Chão) local direcaoTeste = -camera.CFrame.LookVector local ray = Ray.new(root.Position, direcaoTeste * raioDetccao) local parteAlvo, pontoContato, normal = workspace:FindPartOnRayWithIgnoreList(ray, {character, workspace.Terrain}) -- Se achou algo por perto -> GRUDA if parteAlvo and normal then -- 2. CALCULA A ROTAÇÃO PARA FICAR DE PÉ NA SUPERFÍCIE local cimaDesejado = normal local frenteDesejado = camera.CFrame.LookVector -- Ajusta para não ficar de ponta-cabeça estranho if Vector3.new(frenteDesejado.X, 0, frenteDesejado.Z).Magnitude < 0.01 then frenteDesejado = Vector3.new(0,0,1) end -- Cria a rotação correta local cframeAlvo = CFrame.new(root.Position, root.Position + frenteDesejado):Inverse() * CFrame.new(0,0,0, cimaDesejado.X, cimaDesejado.Y, cimaDesejado.Z, -frenteDesejado.Z, 0, frenteDesejado.X, -cimaDesejado.Y, cimaDesejado.X, 0) cframeAlvo = CFrame.lookAt(root.Position, root.Position + frenteDesejado, cimaDesejado) -- 3. APLICA A ROTAÇÃO SUAVE root.CFrame = root.CFrame:Lerp(cframeAlvo, deltaTime * 12) -- 4. MOVIMENTO: Anda na direção que você olha local movimento = camera.CFrame.LookVector * velocidadeParede -- Remove componente vertical se estiver em parede vertical if normal.Y < 0.3 and normal.Y > -0.3 then movimento = Vector3.new(movimento.X, 0, movimento.Z) end root.Velocity = movimento else -- Se não achou parede -> FICA ANDANDO NO AR (estilo aranha) local frente = camera.CFrame.LookVector root.CFrame = CFrame.new(root.Position, root.Position + frente) * CFrame.Angles(math.rad(-20),0,0) -- Inclina corpo root.Velocity = camera.CFrame.LookVector * velocidadeParede * 0.8 end end end) -- ✅ AO SOLTAR: SE LANÇA + PULO FORTE paredeBtn.InputEnded:Connect(function(input) if editMode then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then if paredeAtiva then paredeAtiva = false paredeBtn.BackgroundColor3 = Color3.new(0,0,0) -- Volta física ao normal humanoid.GravityScale = normalGravity humanoid.PlatformStand = false humanoid.WalkSpeed = velocidadeOriginal -- 💥 Efeito de disparo local explosao = Instance.new("ParticleEmitter", root) explosao.Color = ColorSequence.new(Color3.fromRGB(50, 120, 255)) explosao.Speed = NumberRange.new(20, 50) explosao.Rate = 25 explosao.Lifetime = NumberRange.new(0.2, 0.4) explosao.SpreadAngle = Vector2.new(180,180) Debris:AddItem(explosao, 0.4) -- 🚀 IMPULSO PRINCIPAL: Pula forte na direção que olha local direcaoLancamento = camera.CFrame.LookVector + Vector3.new(0, 0.3, 0) -- Levemente para cima root.Velocity = direcaoLancamento * forcaLancamento -- 🎯 AJUSTE FINAL: Volta rotação normal root.CFrame = CFrame.new(root.Position, root.Position + Vector3.new(direcaoLancamento.X, 0, direcaoLancamento.Z)) -- Limpa rastro local rastro = root:FindFirstChild("RastroParede") if rastro then rastro:Destroy() end end end end) -- Reseta estados ao cair humanoid.StateChanged:Connect(function(_, new) if new == Enum.HumanoidStateType.Landed then slingshotStage = 0 circleBtn.Text = "○" circleBtn.TextColor3 = Color3.fromRGB(255, 60, 180) if isCharging then humanoid.WalkSpeed = velocidadeOriginal if chargeBar then chargeBar:Destroy() end local efeito = root:FindFirstChild("VelEfeito") if efeito then efeito:Destroy() end isCharging = false end if asaAtiva then asaAtiva = false triangleBtn.Text = "🪂" triangleBtn.BackgroundColor3 = Color3.new(0,0,0) humanoid.GravityScale = 1.0 humanoid.PlatformStand = false camera.FieldOfView = 70 if rastroAsa then rastroAsa:Destroy() end end if paredeAtiva then paredeAtiva = false paredeBtn.BackgroundColor3 = Color3.new(0,0,0) humanoid.GravityScale = normalGravity humanoid.PlatformStand = false humanoid.WalkSpeed = velocidadeOriginal local rastro = root:FindFirstChild("RastroParede") if rastro then rastro:Destroy() end end end end) -- Correção de Renascimento player.CharacterAdded:Connect(function(newChar) task.wait() character = newChar humanoid = character:WaitForChild("Humanoid") root = character:WaitForChild("HumanoidRootPart") camera = workspace.CurrentCamera isCharging = false slingshotStage = 0 asaAtiva = false paredeAtiva = false if chargeBar then chargeBar:Destroy() end if rastroAsa then rastroAsa:Destroy() end end) print("✅ CORRIDA NA PAREDE PRONTA 🕷️ | SEGURA=GRUDA/CORRE | SOLTA=DISPARA 🚀")