-- SPIDER SYSTEM v22.2 — COM ANIMAÇÕES -- Web Swing REAL + Web Zip + Wall Climb + SUBIR funcional -- TEIA BRANCA VISÍVEL + ANIMAÇÕES -- Mobile / Delta / R15 -- + Teia no Web Zip + Double Jump + Sons de Teia local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local Debris = game:GetService("Debris") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local backpack = player:WaitForChild("Backpack") local gui = player:WaitForChild("PlayerGui") ------------------------------------------------ -- TOOL ------------------------------------------------ local tool = Instance.new("Tool") tool.Name = "SpiderPowers" tool.RequiresHandle = false tool.Parent = backpack ------------------------------------------------ -- GUI ------------------------------------------------ local screenGui = Instance.new("ScreenGui", gui) screenGui.Name = "SpiderUI" screenGui.ResetOnSpawn = false local function btn(name,size,pos,color,text) local b = Instance.new("TextButton") b.Name = name b.Size = size b.Position = pos b.BackgroundColor3 = color b.Text = text or "" b.TextScaled = true b.ZIndex = 5 b.Parent = screenGui return b end local btnSwing = btn("Swing",UDim2.new(0.22,0,0.12,0),UDim2.new(0.72,0,0.75,0),Color3.fromRGB(220,40,40),"BALANÇAR") local btnZip = btn("Zip",UDim2.new(0.22,0,0.12,0),UDim2.new(0.72,0,0.60,0),Color3.fromRGB(30,130,220),"WEB ZIP") local btnWall = btn("Wall",UDim2.new(0.13,0,0.13,0),UDim2.new(0.06,0,0.75,0),Color3.fromRGB(180,0,0),"") Instance.new("UICorner",btnWall).CornerRadius = UDim.new(1,0) local btnSubir = btn( "Subir", UDim2.new(0.25,0,0.08,0), UDim2.new(0.375,0,0.04,0), Color3.fromRGB(0,180,0), "SUBIR" ) btnSubir.Visible = false ------------------------------------------------ -- SETAS ------------------------------------------------ local arrows = Instance.new("Frame",screenGui) arrows.Size = UDim2.new(1,0,1,0) arrows.BackgroundTransparency = 1 arrows.Visible = false local function arrow(pos,txt) local b = Instance.new("TextButton") b.Size = UDim2.new(0.14,0,0.1,0) b.Position = pos b.Text = txt b.TextScaled = true b.BackgroundColor3 = Color3.fromRGB(40,40,40) b.TextColor3 = Color3.new(1,1,1) b.Parent = arrows return b end local up = arrow(UDim2.new(0.43,0,0.75,0),"↑") local down = arrow(UDim2.new(0.43,0,0.87,0),"↓") local left = arrow(UDim2.new(0.30,0,0.81,0),"←") local right = arrow(UDim2.new(0.56,0,0.81,0),"→") ------------------------------------------------ -- CHAR + ANIMAÇÕES ------------------------------------------------ local function getChar() local c = player.Character or player.CharacterAdded:Wait() return c, c:WaitForChild("HumanoidRootPart"), c:WaitForChild("Humanoid") end -- IDs de animação oficiais do Roblox (R15) local SWING_ANIM_ID = "rbxassetid://507767968" -- Fall (funciona muito bem no swing) local CLIMB_ANIM_ID = "rbxassetid://507765644" -- Climb oficial local swingTrack, climbTrack local function loadAnimations(hum) local animator = hum:FindFirstChildOfClass("Animator") if not animator then animator = Instance.new("Animator") animator.Parent = hum end -- Swing local swingAnim = Instance.new("Animation") swingAnim.AnimationId = SWING_ANIM_ID swingTrack = animator:LoadAnimation(swingAnim) swingTrack.Priority = Enum.AnimationPriority.Action swingTrack.Looped = true -- Climb local climbAnim = Instance.new("Animation") climbAnim.AnimationId = CLIMB_ANIM_ID climbTrack = animator:LoadAnimation(climbAnim) climbTrack.Priority = Enum.AnimationPriority.Action climbTrack.Looped = true end ------------------------------------------------ -- WEB SWING (COM TEIA VISÍVEL + ANIMAÇÃO + SOM) ------------------------------------------------ local swinging = false local rope, anchor, att0, att1, align, beam local swingConn local function startSwing() if swinging then return end swinging = true local char, hrp, hum = getChar() hum.PlatformStand = true -- Carrega animações se ainda não tiver if not swingTrack then loadAnimations(hum) end -- Toca animação de swing if swingTrack then swingTrack:Play(0.2) end -- ===== SOM DE TEIA ===== local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 2 webSound.PlaybackSpeed = 1.1 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) -- ======================= anchor = Instance.new("Part", Workspace) anchor.Anchored = true anchor.Transparency = 1 anchor.Size = Vector3.new(0.2,0.2,0.2) anchor.Position = hrp.Position + hrp.CFrame.LookVector * 40 + Vector3.new(0,15,0) att0 = Instance.new("Attachment", anchor) att1 = Instance.new("Attachment", hrp) rope = Instance.new("RopeConstraint", hrp) rope.Attachment0 = att0 rope.Attachment1 = att1 rope.Length = (anchor.Position - hrp.Position).Magnitude rope.Thickness = 0.4 rope.Visible = false -- TEIA BRANCA beam = Instance.new("Beam", hrp) beam.Attachment0 = att0 beam.Attachment1 = att1 beam.Width0 = 0.15 beam.Width1 = 0.15 beam.Color = ColorSequence.new(Color3.new(1,1,1)) beam.FaceCamera = true beam.LightEmission = 1 align = Instance.new("AlignOrientation", hrp) align.Attachment0 = att1 align.Responsiveness = 8 align.MaxTorque = 8000 hrp.AssemblyLinearVelocity += hrp.CFrame.LookVector * 55 swingConn = RunService.Heartbeat:Connect(function() local dir = (anchor.Position - hrp.Position).Unit local vel = hrp.AssemblyLinearVelocity local radial = dir * vel:Dot(dir) local tangential = vel - radial hrp.AssemblyLinearVelocity = tangential + Vector3.new(0, -workspace.Gravity * 0.03, 0) end) end local function stopSwing() if not swinging then return end swinging = false if swingConn then swingConn:Disconnect() end -- Para a animação if swingTrack and swingTrack.IsPlaying then swingTrack:Stop(0.2) end local _, _, hum = getChar() hum.PlatformStand = false if rope then rope:Destroy() end if beam then beam:Destroy() end if anchor then anchor:Destroy() end if align then align:Destroy() end end ------------------------------------------------ -- WEB ZIP (COM TEIA VISÍVEL + SOM) ------------------------------------------------ btnZip.MouseButton1Down:Connect(function() stopSwing() local _, hrp = getChar() -- ===== TEIA VISÍVEL DO ZIP ===== local zipAnchor = Instance.new("Part") zipAnchor.Anchored = true zipAnchor.CanCollide = false zipAnchor.Transparency = 1 zipAnchor.Size = Vector3.new(0.2, 0.2, 0.2) zipAnchor.Position = hrp.Position + hrp.CFrame.LookVector * 35 + Vector3.new(0, 12, 0) zipAnchor.Parent = Workspace local att0 = Instance.new("Attachment", zipAnchor) local att1 = Instance.new("Attachment", hrp) local zipBeam = Instance.new("Beam") zipBeam.Attachment0 = att0 zipBeam.Attachment1 = att1 zipBeam.Width0 = 0.15 zipBeam.Width1 = 0.15 zipBeam.Color = ColorSequence.new(Color3.new(1, 1, 1)) zipBeam.FaceCamera = true zipBeam.LightEmission = 1 zipBeam.Parent = hrp Debris:AddItem(zipAnchor, 0.35) Debris:AddItem(zipBeam, 0.35) Debris:AddItem(att1, 0.35) -- ================================ -- ===== SOM DE TEIA ===== local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 2 webSound.PlaybackSpeed = 1.25 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) -- ======================= local bv = Instance.new("BodyVelocity", hrp) bv.MaxForce = Vector3.new(1e7,1e7,1e7) bv.Velocity = hrp.CFrame.LookVector * 120 + Vector3.new(0,60,0) Debris:AddItem(bv, 0.3) end) ------------------------------------------------ -- WALL CLIMB (COM ANIMAÇÃO) ------------------------------------------------ local climbing = false local moveDir = Vector3.zero local vel, gyro local function getWall(char, hrp) local params = RaycastParams.new() params.FilterDescendantsInstances = {char} params.FilterType = Enum.RaycastFilterType.Blacklist for _, dir in ipairs({ hrp.CFrame.LookVector, -hrp.CFrame.LookVector, hrp.CFrame.RightVector, -hrp.CFrame.RightVector }) do local hit = Workspace:Raycast(hrp.Position, dir * 3, params) if hit then return hit end end end local function startClimb() if climbing then return end stopSwing() climbing = true btnWall.BackgroundColor3 = Color3.fromRGB(0,200,0) arrows.Visible = true btnSubir.Visible = true local char, hrp, hum = getChar() hum.PlatformStand = true -- Carrega animações se ainda não tiver if not climbTrack then loadAnimations(hum) end -- Toca animação de climb if climbTrack then climbTrack:Play(0.2) end vel = Instance.new("BodyVelocity", hrp) vel.MaxForce = Vector3.new(1e7,1e7,1e7) gyro = Instance.new("BodyGyro", hrp) gyro.MaxTorque = Vector3.new(1e7,1e7,1e7) gyro.P = 60000 task.spawn(function() while climbing do task.wait(0.03) local hit = getWall(char, hrp) if hit then local face = -hit.Normal local rightVec = face:Cross(Vector3.new(0,1,0)).Unit local upVec = rightVec:Cross(face).Unit vel.Velocity = (rightVec * moveDir.X + upVec * moveDir.Y) * 18 + face * 30 gyro.CFrame = CFrame.lookAt(hrp.Position, hrp.Position + face) else vel.Velocity = Vector3.zero end end end) end local function stopClimb() if not climbing then return end climbing = false arrows.Visible = false btnSubir.Visible = false btnWall.BackgroundColor3 = Color3.fromRGB(180,0,0) -- Para a animação de climb if climbTrack and climbTrack.IsPlaying then climbTrack:Stop(0.2) end local _, _, hum = getChar() hum.PlatformStand = false if vel then vel:Destroy() end if gyro then gyro:Destroy() end moveDir = Vector3.zero end ------------------------------------------------ -- SUBIR ------------------------------------------------ btnSubir.MouseButton1Down:Connect(function() if not climbing then return end stopClimb() local _, hrp = getChar() local bv = Instance.new("BodyVelocity", hrp) bv.MaxForce = Vector3.new(1e7,1e7,1e7) bv.Velocity = Vector3.new(0,40,0) + hrp.CFrame.LookVector * 20 Debris:AddItem(bv, 0.25) end) ------------------------------------------------ -- SETAS ------------------------------------------------ local function bind(b, d) b.MouseButton1Down:Connect(function() moveDir = d end) b.MouseButton1Up:Connect(function() moveDir = Vector3.zero end) b.MouseLeave:Connect(function() moveDir = Vector3.zero end) end bind(up, Vector3.new(0,1,0)) bind(down, Vector3.new(0,-1,0)) bind(left, Vector3.new(-1,0,0)) bind(right, Vector3.new(1,0,0)) ------------------------------------------------ -- BOTÕES ------------------------------------------------ btnSwing.MouseButton1Down:Connect(startSwing) btnSwing.MouseButton1Up:Connect(stopSwing) btnSwing.MouseLeave:Connect(stopSwing) btnWall.MouseButton1Click:Connect(function() if climbing then stopClimb() else startClimb() end end) ------------------------------------------------ -- DOUBLE JUMP + JumpRequest (Wall Climb) ------------------------------------------------ local jumpCount = 0 local maxJumps = 2 local function setupDoubleJump(hum, hrp) jumpCount = 0 hum.StateChanged:Connect(function(_, newState) if newState == Enum.HumanoidStateType.Landed or newState == Enum.HumanoidStateType.Running then jumpCount = 0 end end) end UserInputService.JumpRequest:Connect(function() -- Mantém a função original de sair do Wall Climb if climbing then stopClimb() return end local char, hrp, hum = getChar() if not hum or not hrp then return end local state = hum:GetState() -- Se já está no ar e ainda tem jump sobrando → Double Jump if (state == Enum.HumanoidStateType.Freefall or state == Enum.HumanoidStateType.Jumping) and jumpCount < maxJumps then jumpCount += 1 hrp.AssemblyLinearVelocity = Vector3.new( hrp.AssemblyLinearVelocity.X, 55, -- força do double jump (pode ajustar) hrp.AssemblyLinearVelocity.Z ) elseif state == Enum.HumanoidStateType.Running or state == Enum.HumanoidStateType.Landed then -- Pulo normal do chão jumpCount = 1 end end) -- Configura o double jump sempre que o personagem respawna player.CharacterAdded:Connect(function(char) stopSwing() stopClimb() swingTrack = nil climbTrack = nil local hum = char:WaitForChild("Humanoid") local hrp = char:WaitForChild("HumanoidRootPart") setupDoubleJump(hum, hrp) end) -- Já configura no personagem atual task.spawn(function() local char, hrp, hum = getChar() setupDoubleJump(hum, hrp) end) print("🕷️ SPIDER SYSTEM v22.2 — TEIA BRANCA + ANIMAÇÕES + ZIP TEIA + DOUBLE JUMP + SONS")