local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local Workspace = game:GetService("Workspace") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local backpack = player:WaitForChild("Backpack") if playerGui:FindFirstChild("SpiderUI") then playerGui.SpiderUI:Destroy() end if backpack:FindFirstChild("SpiderPowers") then backpack.SpiderPowers:Destroy() end local tool = Instance.new("Tool") tool.Name = "SpiderPowers" tool.RequiresHandle = false tool.CanBeDropped = false tool.Parent = backpack local SWING_ANIM = "rbxassetid://507767968" local SWING_SOUND = "rbxassetid://1284846268" local ZIP_SOUND = "rbxassetid://9084017080" local swinging = false local swingStep = 1 local zipStep = 1 local swingConn local swingAnchor, swingRope local swingTrack local webLoopSound local webs = {} local ikList = {} local gripAtt local function getParts() local char = player.Character or player.CharacterAdded:Wait() return char, char:WaitForChild("HumanoidRootPart"), char:WaitForChild("Humanoid") end local function applyJump(char) local hum = char:WaitForChild("Humanoid") hum.UseJumpPower = true hum.JumpPower = 100 end if player.Character then applyJump(player.Character) end player.CharacterAdded:Connect(applyJump) local function getAnimator(hum) local animator = hum:FindFirstChildOfClass("Animator") if not animator then animator = Instance.new("Animator") animator.Parent = hum end return animator end local function getHand(char, side) if side == "Right" then return char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm") end return char:FindFirstChild("LeftHand") or char:FindFirstChild("Left Arm") end local function getArmRoot(char, side) if side == "Right" then return char:FindFirstChild("RightUpperArm") or char:FindFirstChild("Right Arm") or char:FindFirstChild("UpperTorso") end return char:FindFirstChild("LeftUpperArm") or char:FindFirstChild("Left Arm") or char:FindFirstChild("UpperTorso") end local function clearWebs() for _, obj in ipairs(webs) do if obj then obj:Destroy() end end webs = {} end local function clearIK() for _, ik in ipairs(ikList) do if ik then ik:Destroy() end end ikList = {} end local function stopWebSound() if webLoopSound then webLoopSound:Stop() webLoopSound:Destroy() webLoopSound = nil end end local function playSound(hrp, id, looped) local snd = Instance.new("Sound") snd.SoundId = id snd.Volume = 2 snd.Looped = looped and true or false snd.Parent = hrp snd:Play() if looped then stopWebSound() webLoopSound = snd else Debris:AddItem(snd, 2) end end local function addWebFromHand(char, targetAtt, side) local hand = getHand(char, side) if not hand or not targetAtt then return end local handAtt = Instance.new("Attachment") handAtt.Parent = hand local beam = Instance.new("Beam") beam.Attachment0 = targetAtt beam.Attachment1 = handAtt beam.Width0 = 0.18 beam.Width1 = 0.10 beam.Color = ColorSequence.new(Color3.new(1, 1, 1)) beam.LightEmission = 1 beam.FaceCamera = true beam.Parent = hand table.insert(webs, beam) table.insert(webs, handAtt) end local function addSingleWeb(targetAtt, grip) local beam = Instance.new("Beam") beam.Attachment0 = targetAtt beam.Attachment1 = grip beam.Width0 = 0.22 beam.Width1 = 0.16 beam.Color = ColorSequence.new(Color3.new(1, 1, 1)) beam.LightEmission = 1 beam.FaceCamera = true beam.Parent = grip.Parent table.insert(webs, beam) end local function attachArm(char, hum, side, targetAtt) local hand = getHand(char, side) local root = getArmRoot(char, side) if not hand or not root or not targetAtt then return end local ik = Instance.new("IKControl") ik.Name = "WebArmIK_" .. side ik.Type = Enum.IKControlType.Position ik.EndEffector = hand ik.ChainRoot = root ik.Target = targetAtt ik.Weight = 1 ik.SmoothTime = 0.08 ik.Parent = hum table.insert(ikList, ik) end ------------------------------------------------ -- UI ------------------------------------------------ local gui = Instance.new("ScreenGui") gui.Name = "SpiderUI" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = playerGui local function makeButton(size, pos, color, text) local b = Instance.new("TextButton") b.Size = size b.Position = pos b.BackgroundColor3 = color b.Text = text b.TextColor3 = Color3.new(1, 1, 1) b.TextScaled = true b.Font = Enum.Font.GothamBold b.Parent = gui Instance.new("UICorner", b).CornerRadius = UDim.new(0.2, 0) return b end local btnSwing = makeButton(UDim2.new(0.28, 0, 0.12, 0), UDim2.new(0.68, 0, 0.78, 0), Color3.fromRGB(190, 25, 25), "BALANÇAR") local btnZip = makeButton(UDim2.new(0.28, 0, 0.12, 0), UDim2.new(0.68, 0, 0.63, 0), Color3.fromRGB(25, 120, 210), "WEB ZIP") ------------------------------------------------ -- BALANÇO ------------------------------------------------ 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 stopWebSound() clearIK() clearWebs() local _, _, hum = getParts() hum.PlatformStand = false hum.JumpPower = 100 if swingRope then swingRope:Destroy() end if swingAnchor then swingAnchor:Destroy() end gripAtt = nil swingStep += 1 if swingStep > 3 then swingStep = 1 end end local function startSwing() if swinging then return end swinging = true local char, hrp, hum = getParts() hum.PlatformStand = true hum.JumpPower = 100 local animator = getAnimator(hum) if not swingTrack then local anim = Instance.new("Animation") anim.AnimationId = SWING_ANIM swingTrack = animator:LoadAnimation(anim) swingTrack.Priority = Enum.AnimationPriority.Action swingTrack.Looped = true end swingTrack:Play(0.15) playSound(hrp, SWING_SOUND, false) swingAnchor = Instance.new("Part") swingAnchor.Anchored = true swingAnchor.CanCollide = false swingAnchor.Transparency = 1 swingAnchor.Size = Vector3.new(0.2, 0.2, 0.2) swingAnchor.Position = hrp.Position + hrp.CFrame.LookVector * 36 + Vector3.new(0, 13, 0) swingAnchor.Parent = Workspace local a0 = Instance.new("Attachment", swingAnchor) local a1 = Instance.new("Attachment", hrp) swingRope = Instance.new("RopeConstraint") swingRope.Attachment0 = a0 swingRope.Attachment1 = a1 swingRope.Length = (swingAnchor.Position - hrp.Position).Magnitude swingRope.Visible = false swingRope.Parent = hrp if swingStep == 1 then addWebFromHand(char, a0, "Right") attachArm(char, hum, "Right", a0) elseif swingStep == 2 then addWebFromHand(char, a0, "Left") attachArm(char, hum, "Left", a0) else gripAtt = Instance.new("Attachment") gripAtt.Name = "WebGrip" gripAtt.Parent = hrp addSingleWeb(a0, gripAtt) attachArm(char, hum, "Right", gripAtt) attachArm(char, hum, "Left", gripAtt) end hrp.AssemblyLinearVelocity += hrp.CFrame.LookVector * 48 swingConn = RunService.Heartbeat:Connect(function() if not hrp.Parent then return end local dir = (swingAnchor.Position - hrp.Position).Unit local vel = hrp.AssemblyLinearVelocity local radial = dir * vel:Dot(dir) hrp.AssemblyLinearVelocity = (vel - radial) + Vector3.new(0, -Workspace.Gravity * 0.03, 0) if gripAtt then local toWeb = swingAnchor.Position - hrp.Position if toWeb.Magnitude > 0.1 then gripAtt.WorldPosition = hrp.Position + toWeb.Unit * 1.8 + Vector3.new(0, 0.9, 0) end end end) end ------------------------------------------------ -- WEB ZIP ------------------------------------------------ btnZip.MouseButton1Down:Connect(function() stopSwing() local char, hrp, hum = getParts() local sides if zipStep == 1 then sides = {"Right"} elseif zipStep == 2 then sides = {"Left"} else sides = {"Right", "Left"} end local tip = Instance.new("Part") tip.Anchored = true tip.CanCollide = false tip.Transparency = 1 tip.Size = Vector3.new(0.2, 0.2, 0.2) tip.Position = hrp.Position + hrp.CFrame.LookVector * 34 + Vector3.new(0, 12, 0) tip.Parent = Workspace local tipAtt = Instance.new("Attachment", tip) for _, side in ipairs(sides) do addWebFromHand(char, tipAtt, side) attachArm(char, hum, side, tipAtt) end playSound(hrp, ZIP_SOUND, false) local push = Instance.new("BodyVelocity") push.MaxForce = Vector3.new(1e7, 1e7, 1e7) push.Velocity = hrp.CFrame.LookVector * 120 + Vector3.new(0, 55, 0) push.Parent = hrp Debris:AddItem(tip, 0.32) Debris:AddItem(push, 0.28) task.delay(0.32, function() clearWebs() clearIK() end) zipStep += 1 if zipStep > 3 then zipStep = 1 end end) ------------------------------------------------ -- CONTROLES ------------------------------------------------ btnSwing.MouseButton1Down:Connect(startSwing) btnSwing.MouseButton1Up:Connect(stopSwing) btnSwing.MouseLeave:Connect(stopSwing) player.CharacterAdded:Connect(function() stopSwing() swingStep = 1 zipStep = 1 end)