How do i make my grapple system have swining?

local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()

local PlayGui = Player.PlayerGui

local Humanoid = Character:FindFirstChild("Humanoid")
local HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")

local Animator = Humanoid:FindFirstChild("Animator")

local Mouse = Player:GetMouse()

local controls = require(game:GetService("Players").LocalPlayer.PlayerScripts.PlayerModule):GetControls()


local MaxGrappleDistance = 100
local GrappleCooldown = 0.5
local GrappleDamage = 10
local GrappleActive = false
local GrappleDebounce = false
local DisableGrappleWhenTouched = false

Humanoid.StateChanged:Connect(function(Old,New)

	Humanoid:SetStateEnabled(Enum.HumanoidStateType.Ragdoll, false)
	Humanoid:SetStateEnabled(Enum.HumanoidStateType.FallingDown, false)

end)

Mouse.Button1Up:Connect(function()
	GrappleActive = false
end)


Mouse.Button1Down:Connect(function()
	local HitPosition = Mouse.Hit.Position
	local Origin = HumanoidRootPart.Position
	
	local Distance = (HitPosition - Origin).Magnitude
	Distance = math.floor(Distance / 1 + 0.5) * 1
	
	if Distance <= MaxGrappleDistance then
		GrappleActive = true
		local Part = Instance.new("Part")
		Part.Parent = workspace
		Part.Anchored = true
		Part.CanCollide = false
		Part.Transparency = 0.5
		Part.Position = HitPosition
		
		
		local Attachment0 = Instance.new("Attachment")
		Attachment0.Parent = Part
		Attachment0.Name = "GrappleAttachment"
		local Attachment1 = Instance.new("Attachment")
		Attachment1.Parent = HumanoidRootPart
		Attachment1.Name = "GrappleAttachment"
		
		local RopeConstraint = Instance.new("RopeConstraint")
		RopeConstraint.Parent = HumanoidRootPart
		RopeConstraint.Attachment0 = Attachment0
		RopeConstraint.Attachment1 = Attachment1
		RopeConstraint.Length = Distance
		RopeConstraint.Restitution = 0
		RopeConstraint.Visible = true
		RopeConstraint.Color = BrickColor.new("Black")
		
		Humanoid.Touched:Connect(function(Hit)
			if GrappleActive == true and DisableGrappleWhenTouched == true then
				GrappleActive = false
			end
		end)
		
		while GrappleActive == true do
			task.wait(0.1)
		end
		
		local BV = Instance.new("BodyVelocity",HumanoidRootPart)
		BV.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
		local Direction = (HitPosition - Origin).Unit -- Normalized direction vector
		local LaunchSpeed = HumanoidRootPart.Velocity.Magnitude * 1.5
		if LaunchSpeed < 50 then
			LaunchSpeed = 50
		end
		if LaunchSpeed > 200 then
			LaunchSpeed = 200
		end
		BV.Velocity = Direction * LaunchSpeed
		
		game.Debris:AddItem(RopeConstraint,0.3)
		game.Debris:AddItem(BV,0.3)
		game.Debris:AddItem(Part,0.1)
	end
end)

end)

i dont want to change the players physics to physics because that messes with the camera and causes the player to ragdoll

1 Like