-- SPIDER SYSTEM v23.4 — CASULO GROSSO + BALANÇO NORMAL -- Web Swing + Web Zip + Wall Climb + Ceiling Web + Slingshot -- TEIA BRANCA + ANIMAÇÕES + SONS + MÃOS -- Mobile / Delta / R15 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 TweenService = game:GetService("TweenService") 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") screenGui.Name = "SpiderUI" screenGui.ResetOnSpawn = false screenGui.Enabled = false screenGui.Parent = gui 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 btnSling = btn("Sling", UDim2.new(0.22,0,0.12,0), UDim2.new(0.72,0,0.45,0), Color3.fromRGB(255,140,0), "ESTILINGUE") 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), "") local btnTeto = btn("Teto", UDim2.new(0.13,0,0.13,0), UDim2.new(0.06,0,0.60,0), Color3.fromRGB(140,0,200), "") Instance.new("UICorner", btnWall).CornerRadius = UDim.new(1,0) Instance.new("UICorner", btnTeto).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 local SWING_ANIM_ID = "rbxassetid://507767968" local CLIMB_ANIM_ID = "rbxassetid://507765644" local swingTrack, climbTrack local function loadAnimations(hum) local animator = hum:FindFirstChildOfClass("Animator") if not animator then animator = Instance.new("Animator") animator.Parent = hum end local swingAnim = Instance.new("Animation") swingAnim.AnimationId = SWING_ANIM_ID swingTrack = animator:LoadAnimation(swingAnim) swingTrack.Priority = Enum.AnimationPriority.Action swingTrack.Looped = true local climbAnim = Instance.new("Animation") climbAnim.AnimationId = CLIMB_ANIM_ID climbTrack = animator:LoadAnimation(climbAnim) climbTrack.Priority = Enum.AnimationPriority.Action climbTrack.Looped = true end ------------------------------------------------ -- LANÇADORES NOS PULSOS ------------------------------------------------ local wristShooters = {} local function clearWristShooters() for _, s in pairs(wristShooters) do if s then s:Destroy() end end wristShooters = {} end local function createWristShooter(hand, offset) if not hand then return end local shooter = Instance.new("Part") shooter.Name = "WebShooter" shooter.Size = Vector3.new(0.38, 0.26, 0.48) shooter.Color = Color3.fromRGB(20, 20, 20) shooter.Material = Enum.Material.Metal shooter.CanCollide = false shooter.Massless = true shooter.Parent = hand local weld = Instance.new("Weld") weld.Part0 = hand weld.Part1 = shooter weld.C0 = offset weld.Parent = shooter local detail = Instance.new("Part") detail.Size = Vector3.new(0.14, 0.11, 0.14) detail.Color = Color3.fromRGB(200, 0, 0) detail.Material = Enum.Material.Neon detail.CanCollide = false detail.Massless = true detail.Parent = shooter local detailWeld = Instance.new("Weld") detailWeld.Part0 = shooter detailWeld.Part1 = detail detailWeld.C0 = CFrame.new(0, 0, -0.25) detailWeld.Parent = detail table.insert(wristShooters, shooter) table.insert(wristShooters, detail) end local function equipWristShooters(char) clearWristShooters() local rightHand = char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm") local leftHand = char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm") createWristShooter(rightHand, CFrame.new(0.05, -0.18, 0.22) * CFrame.Angles(math.rad(-8), math.rad(12), 0)) createWristShooter(leftHand, CFrame.new(-0.05, -0.18, 0.22) * CFrame.Angles(math.rad(-8), math.rad(-12), 0)) end ------------------------------------------------ -- CASULO DE TEIA (MAIS GROSSO) ------------------------------------------------ local function playCocoonTransformation(char, hrp) local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum.PlatformStand = true end local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 2 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) local cocoonParts = {} local numParts = 105 -- bem mais pedaços for i = 1, numParts do local part = Instance.new("Part") part.Name = "CocoonPiece" part.Size = Vector3.new(0.7, 0.7, 0.7) part.Color = Color3.fromRGB(245, 245, 245) part.Material = Enum.Material.SmoothPlastic part.CanCollide = false part.Anchored = true part.CastShadow = false part.Parent = Workspace local theta = math.rad(math.random(0, 360)) local phi = math.rad(math.random(0, 180)) local radius = 2.8 -- casulo maior local offset = Vector3.new( radius * math.sin(phi) * math.cos(theta), radius * math.cos(phi) * 1.1, radius * math.sin(phi) * math.sin(theta) ) part.CFrame = CFrame.new(hrp.Position + offset) table.insert(cocoonParts, part) local tween = TweenService:Create(part, TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), { Size = Vector3.new(1.8, 1.8, 1.8) }) tween:Play() end task.wait(0.75) -- Explosão local explodeSound = Instance.new("Sound") explodeSound.SoundId = "rbxassetid://9084017080" explodeSound.Volume = 2.3 explodeSound.Pitch = 1.25 explodeSound.Parent = hrp explodeSound:Play() Debris:AddItem(explodeSound, 2) for _, part in ipairs(cocoonParts) do if part and part.Parent then part.Anchored = false local dir = (part.Position - hrp.Position).Unit local bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(1e5, 1e5, 1e5) bv.Velocity = dir * math.random(40, 65) + Vector3.new(0, math.random(12, 28), 0) bv.Parent = part Debris:AddItem(bv, 0.45) Debris:AddItem(part, 0.8) end end task.wait(0.15) if hum then hum.PlatformStand = false end end ------------------------------------------------ -- WEB SWING (NORMAL - SEM MIRA) ------------------------------------------------ local swinging = false local rope, anchor, att0, att1, align local handBeams = {} local swingConn local lastSwingVelocity = Vector3.zero local swingHandCycle = 0 local function clearHandBeams() for _, b in pairs(handBeams) do if b then b:Destroy() end end handBeams = {} end local function createHandWebs(char, targetAttachment, mode) clearHandBeams() local leftHand = char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm") local rightHand = char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm") local function addBeam(hand) if not hand then return end local a1 = Instance.new("Attachment", hand) local hb = Instance.new("Beam") hb.Attachment0 = targetAttachment hb.Attachment1 = a1 hb.Width0 = 0.09 hb.Width1 = 0.09 hb.Color = ColorSequence.new(Color3.new(1,1,1)) hb.FaceCamera = true hb.LightEmission = 1 hb.Parent = hand table.insert(handBeams, hb) table.insert(handBeams, a1) end if mode == 0 then addBeam(rightHand) elseif mode == 1 then addBeam(leftHand) else addBeam(leftHand) addBeam(rightHand) end end local function startSwing() if swinging then return end swinging = true local char, hrp, hum = getChar() hum.PlatformStand = true if not swingTrack then loadAnimations(hum) end if swingTrack then swingTrack:Play(0.2) end local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 1.8 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) -- Balanço normal (posição à frente) anchor = Instance.new("Part", Workspace) anchor.Anchored = true anchor.Transparency = 1 anchor.CanCollide = false anchor.Size = Vector3.new(0.3,0.3,0.3) anchor.Position = hrp.Position + hrp.CFrame.LookVector * 45 + Vector3.new(0, 14, 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 local mode = swingHandCycle % 3 createHandWebs(char, att0, mode) swingHandCycle = swingHandCycle + 1 align = Instance.new("AlignOrientation", hrp) align.Attachment0 = att1 align.Responsiveness = 8 align.MaxTorque = 8000 hrp.AssemblyLinearVelocity = hrp.AssemblyLinearVelocity + hrp.CFrame.LookVector * 55 swingConn = RunService.Heartbeat:Connect(function() if not hrp or not hrp.Parent then return end lastSwingVelocity = hrp.AssemblyLinearVelocity 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 if swingTrack and swingTrack.IsPlaying then swingTrack:Stop(0.2) end local _, hrp, hum = getChar() hum.PlatformStand = false if hrp and lastSwingVelocity.Magnitude > 5 then local boostDirection = lastSwingVelocity.Unit local finalDir = (boostDirection + hrp.CFrame.LookVector * 0.4).Unit hrp.AssemblyLinearVelocity = hrp.AssemblyLinearVelocity + finalDir * 65 + Vector3.new(0, 25, 0) end clearHandBeams() if rope then rope:Destroy() end if anchor then anchor:Destroy() end if align then align:Destroy() end lastSwingVelocity = Vector3.zero end ------------------------------------------------ -- WEB ZIP ------------------------------------------------ btnZip.MouseButton1Down:Connect(function() stopSwing() local char, hrp = getChar() 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 leftHand = char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm") local rightHand = char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm") local extra = {} for _, hand in ipairs({leftHand, rightHand}) do if hand then local a1 = Instance.new("Attachment", hand) local hb = Instance.new("Beam") hb.Attachment0 = att0 hb.Attachment1 = a1 hb.Width0 = 0.09 hb.Width1 = 0.09 hb.Color = ColorSequence.new(Color3.new(1,1,1)) hb.FaceCamera = true hb.LightEmission = 1 hb.Parent = hand table.insert(extra, hb) table.insert(extra, a1) end end Debris:AddItem(zipAnchor, 0.35) Debris:AddItem(att1, 0.35) for _, v in ipairs(extra) do Debris:AddItem(v, 0.35) end local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 1.8 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 ------------------------------------------------ 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 if not climbTrack then loadAnimations(hum) end 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) 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 ------------------------------------------------ -- TETO ------------------------------------------------ local ceilingMode = false local ceilingRope, ceilingAnchor, ceilingAtt0, ceilingAtt1 local ceilingConn local function stopCeiling() if not ceilingMode then return end ceilingMode = false if ceilingConn then ceilingConn:Disconnect() end if climbTrack and climbTrack.IsPlaying then climbTrack:Stop(0.2) end local _, _, hum = getChar() hum.PlatformStand = false clearHandBeams() if ceilingRope then ceilingRope:Destroy() end if ceilingAnchor then ceilingAnchor:Destroy() end arrows.Visible = false btnTeto.BackgroundColor3 = Color3.fromRGB(140,0,200) moveDir = Vector3.zero end local function startCeiling() if ceilingMode then return end stopSwing() stopClimb() local char, hrp, hum = getChar() local params = RaycastParams.new() params.FilterDescendantsInstances = {char} params.FilterType = Enum.RaycastFilterType.Blacklist local hit = Workspace:Raycast(hrp.Position, Vector3.new(0, 60, 0), params) if not hit then return end ceilingMode = true btnTeto.BackgroundColor3 = Color3.fromRGB(0,200,0) arrows.Visible = true hum.PlatformStand = true if not climbTrack then loadAnimations(hum) end if climbTrack then climbTrack:Play(0.2) end local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 1.8 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) ceilingAnchor = Instance.new("Part", Workspace) ceilingAnchor.Anchored = true ceilingAnchor.Transparency = 1 ceilingAnchor.CanCollide = false ceilingAnchor.Size = Vector3.new(0.3,0.3,0.3) ceilingAnchor.Position = hit.Position ceilingAtt0 = Instance.new("Attachment", ceilingAnchor) ceilingAtt1 = Instance.new("Attachment", hrp) ceilingRope = Instance.new("RopeConstraint", hrp) ceilingRope.Attachment0 = ceilingAtt0 ceilingRope.Attachment1 = ceilingAtt1 ceilingRope.Length = (hit.Position - hrp.Position).Magnitude ceilingRope.Thickness = 0.4 ceilingRope.Visible = false createHandWebs(char, ceilingAtt0, 0) ceilingConn = RunService.Heartbeat:Connect(function() if not ceilingMode or not hrp or not hrp.Parent then return end if moveDir.Y > 0 then ceilingRope.Length = math.max(1, ceilingRope.Length - 0.65) elseif moveDir.Y < 0 then ceilingRope.Length = math.min(80, ceilingRope.Length + 0.65) end end) end ------------------------------------------------ -- ESTILINGUE ------------------------------------------------ local slingActive = false local slingAnchor local slingBeams = {} local function clearSlingBeams() for _, v in pairs(slingBeams) do if v then v:Destroy() end end slingBeams = {} end local function stopSling() if not slingActive then return end slingActive = false btnSling.BackgroundColor3 = Color3.fromRGB(255,140,0) clearSlingBeams() if slingAnchor then slingAnchor:Destroy() end slingAnchor = nil end local function startSling() stopSwing() stopClimb() stopCeiling() stopSling() local char, hrp = getChar() slingActive = true btnSling.BackgroundColor3 = Color3.fromRGB(0,220,0) slingAnchor = Instance.new("Part") slingAnchor.Anchored = true slingAnchor.CanCollide = false slingAnchor.Transparency = 1 slingAnchor.Size = Vector3.new(0.3,0.3,0.3) slingAnchor.Position = hrp.Position + hrp.CFrame.LookVector * 28 + Vector3.new(0, 10, 0) slingAnchor.Parent = Workspace local att0 = Instance.new("Attachment", slingAnchor) local leftHand = char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm") local rightHand = char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm") for _, hand in ipairs({leftHand, rightHand}) do if hand then local a1 = Instance.new("Attachment", hand) local hb = Instance.new("Beam") hb.Attachment0 = att0 hb.Attachment1 = a1 hb.Width0 = 0.11 hb.Width1 = 0.11 hb.Color = ColorSequence.new(Color3.new(1,1,1)) hb.FaceCamera = true hb.LightEmission = 1 hb.Parent = hand table.insert(slingBeams, hb) table.insert(slingBeams, a1) end end local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 2 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) hrp.AssemblyLinearVelocity = hrp.AssemblyLinearVelocity * 0.35 + (-hrp.CFrame.LookVector * 32 + Vector3.new(0, 8, 0)) end local function launchSling() if not slingActive then return end local _, hrp = getChar() local bv = Instance.new("BodyVelocity", hrp) bv.MaxForce = Vector3.new(1e7, 1e7, 1e7) bv.Velocity = hrp.CFrame.LookVector * 165 + Vector3.new(0, 95, 0) Debris:AddItem(bv, 0.35) local webSound = Instance.new("Sound") webSound.SoundId = "rbxassetid://9084017080" webSound.Volume = 1.6 webSound.Parent = hrp webSound:Play() Debris:AddItem(webSound, 2) stopSling() end btnSling.MouseButton1Click:Connect(function() if not slingActive then startSling() else launchSling() end 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 + EQUIPAR ------------------------------------------------ btnSwing.MouseButton1Down:Connect(startSwing) btnSwing.MouseButton1Up:Connect(stopSwing) btnSwing.MouseLeave:Connect(stopSwing) btnWall.MouseButton1Click:Connect(function() if climbing then stopClimb() else startClimb() end end) btnTeto.MouseButton1Click:Connect(function() if ceilingMode then stopCeiling() else startCeiling() end end) tool.Equipped:Connect(function() local char, hrp = getChar() task.spawn(function() playCocoonTransformation(char, hrp) screenGui.Enabled = true equipWristShooters(char) end) end) tool.Unequipped:Connect(function() screenGui.Enabled = false stopSwing() stopClimb() stopCeiling() stopSling() clearWristShooters() clearHandBeams() end) UserInputService.JumpRequest:Connect(function() if climbing then stopClimb() end if ceilingMode then stopCeiling() end if slingActive then stopSling() end end) player.CharacterAdded:Connect(function() stopSwing() stopClimb() stopCeiling() stopSling() clearHandBeams() clearWristShooters() swingTrack = nil climbTrack = nil swingHandCycle = 0 screenGui.Enabled = false end) print("🕷️ SPIDER SYSTEM v23.4 — CASULO GROSSO + BALANÇO NORMAL")