Fling Glitch [HELP]

Hello! So I’m working on a Wall Running mechanic and I found a glitch. I tried a few ways to fix it however none of these works so I’m asking if anyone else knows how to fix it. Basically if you wall run into a wall it rapidly rotates the player then they get flung, and I’m just curious if anyone knows why and how to fix it. Thanks!

Video of Issue:

It usually wont send you that far but sometimes you can literally get sent hundreds of studs.

Both scripts are in StarterCharacterScripts as well.

Wall Run Script:

-- Settings --
local Speed = 4000
local Gravity = 0
local MaxWallrunRadius = 4
local CameraTiltAmount = 15
local Cooldown = 0.75
local RightAnimId = "rbxassetid://83121519454876"
local LeftAnimId = "rbxassetid://124890838985456"

-- References --
local char = script.Parent
local plr = game.Players:GetPlayerFromCharacter(char)
local HRP: Part = char:WaitForChild("HumanoidRootPart")
local hum = char:WaitForChild("Humanoid")

-- Raycast Parameters --
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = {char}

-- Attachments and Physics --
local Attach = Instance.new("Attachment")
Attach.Parent = HRP

local Velocity = Instance.new("LinearVelocity")
Velocity.MaxForce = math.huge
Velocity.Enabled = false
Velocity.Attachment0 = Attach
Velocity.Parent = HRP

-- Signal and RunService --
local Signal = script.Parent:WaitForChild("WallrunSignal")
local RS = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

-- State Variables --
local Wallrunning = false
local WallrunningNormal = Vector3.new(0, 0, 0)
local lastWallrun = 0

-- Wallrun Animations --
local rightWallrunAnim = Instance.new("Animation")
rightWallrunAnim.AnimationId = RightAnimId
local rightAnimTrack = hum:WaitForChild("Animator"):LoadAnimation(rightWallrunAnim)

local leftWallrunAnim = Instance.new("Animation")
leftWallrunAnim.AnimationId = LeftAnimId
local leftAnimTrack = hum:WaitForChild("Animator"):LoadAnimation(leftWallrunAnim)

-- Wallrun Request Handling --
Signal.OnServerEvent:Connect(function(plr, val)
	if hum:GetState() ~= Enum.HumanoidStateType.Freefall then return end
	if val then
		if tick() - lastWallrun < Cooldown then return end
		lastWallrun = tick()

		local right = workspace:Raycast(HRP.Position, HRP.CFrame.RightVector * MaxWallrunRadius, params)
		if right then
			Wallrunning = 1
			WallrunningNormal = Vector3.new(right.Normal.Z, 0, -right.Normal.X)
			Signal:FireClient(plr, CameraTiltAmount)
			rightAnimTrack:Play()
		else
			local left = workspace:Raycast(HRP.Position, -HRP.CFrame.RightVector * MaxWallrunRadius, params)
			if left then
				Wallrunning = -1
				WallrunningNormal = Vector3.new(left.Normal.Z, 0, -left.Normal.X)
				Signal:FireClient(plr, -CameraTiltAmount)
				leftAnimTrack:Play()
			end
		end
	elseif Wallrunning then
		Wallrunning = false
		Velocity.Enabled = false
		Signal:FireClient(plr, 0)
		Velocity.VectorVelocity = Vector3.new(0, 0, 0)
		rightAnimTrack:Stop()
		leftAnimTrack:Stop()
	end
end)

-- Frame Updates --
RS.Heartbeat:Connect(function(dt)
	if hum:GetState() ~= Enum.HumanoidStateType.Freefall and hum:GetState() ~= Enum.HumanoidStateType.FallingDown then
		Wallrunning = false
	end

	if Wallrunning then
		Velocity.Enabled = true
		local result = workspace:Raycast(HRP.Position, HRP.CFrame.RightVector * MaxWallrunRadius * Wallrunning, params)
		if result then
			local v = WallrunningNormal * Speed * -Wallrunning * dt
			Velocity.VectorVelocity = Vector3.new(v.X, -Gravity, v.Z)
		else
			Wallrunning = false
		end
	elseif Velocity.Enabled then
		Velocity.Enabled = false
		Signal:FireClient(plr, 0)
		Velocity.VectorVelocity = Vector3.new(0, 0, 0)
		rightAnimTrack:Stop()
		leftAnimTrack:Stop()
	end
end)

Wall Run Local Script:

-- Settings --
local TiltSpeed = 1
local JumpPower = 500

-- References --
local Signal = script.Parent:WaitForChild("WallrunSignal")
local UIS = game:GetService("UserInputService")
local RS = game:GetService("RunService")
local Goal = 0
local CurrentAngle = 0
local cam = workspace.CurrentCamera

local HRP: Part = script.Parent:WaitForChild("HumanoidRootPart")

-- Input Handling -- 
UIS.InputBegan:Connect(function(key, p)
	if not p then
		if key.KeyCode == Enum.KeyCode.T then
			Signal:FireServer(true) -- Start wallrunning
		elseif key.KeyCode == Enum.KeyCode.R then
			Signal:FireServer(false) -- Stop wallrunning
		end
	end
end)

UIS.InputEnded:Connect(function(key, p)
	if not p and key.KeyCode == Enum.KeyCode.T then
		Signal:FireServer(false) -- Stop wallrunning when T is released
	end
end)

-- Wallrun Signal --
Signal.OnClientEvent:Connect(function(angle)
	Goal = angle
	if angle == 0 then
		HRP:ApplyImpulse(Vector3.new(0, JumpPower, 0)) -- Jump off the wall when wallrunning ends
	end
end)

-- Camera Tilt Update --
RS.RenderStepped:Connect(function()
	local sign = Goal / math.abs(Goal) -- Determine direction of tilt
	if CurrentAngle * sign < Goal * sign then
		CurrentAngle += sign * TiltSpeed
	elseif CurrentAngle ~= 0 then
		sign = CurrentAngle / math.abs(CurrentAngle)
		CurrentAngle -= sign * TiltSpeed
	end
	if math.abs(CurrentAngle - Goal) <= TiltSpeed then 
		CurrentAngle = Goal 
	end
	cam.CFrame *= CFrame.Angles(0, 0, math.rad(CurrentAngle))
end)

Thanks again!

Try lowering your max force, from my experience having it really high causes it to spazz out like this on impact of walls

1 Like

make raycast to detect if there’s wall infront maybe idk

Wow, it works flawlessly. Thanks for the tip!

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.