Weird dashing behavior

My dash is working perfectly fine when I move straight or turn on the ground, but when I’m turning in the air, it speeds up significantly and I can’t figure out why. Here is a video and my code:

local plrs = game:GetService("Players")
local debris = game:GetService("Debris")
local cas = game:GetService("ContextActionService")
local rs = game:GetService("RunService")

local plr = plrs.LocalPlayer
local char = plr.Character or plr.CharacterAdded:Wait()

local params = OverlapParams.new()
params.FilterType = Enum.RaycastFilterType.Exclude
params.FilterDescendantsInstances = {char, workspace.TestingFolder}

local physics = {}
physics.vi = 80
physics.v = 10
physics.t = 0.6
physics.x = 0.5 * (physics.vi + physics.v) * physics.t
physics.a = (2 * (physics.x - (physics.vi * physics.t)))/(physics.t * physics.t)

local colorStart = Color3.new(0, 0.760784, 0.12549)
local colorEnd = Color3.new(0.568627, 0, 0)

cas:BindAction("Dash", function(name, inputState)
	if inputState == Enum.UserInputState.Begin then
		local humrp:Part = char:FindFirstChild("HumanoidRootPart")

		if humrp and humrp:FindFirstChild("RootAttachment") then
			local start = os.clock()
			local watchlist = {}
			
			local startParams = RaycastParams.new()
			startParams.FilterDescendantsInstances = {char, workspace.TestingFolder}
			
			local checkParams = RaycastParams.new()
			checkParams.FilterDescendantsInstances = watchlist
			checkParams.FilterType = Enum.RaycastFilterType.Include
			
			local rootAttch = humrp.RootAttachment
			local mover = Instance.new("LinearVelocity")
			
			mover.Parent = char
			mover.Attachment0 = rootAttch
			mover.VelocityConstraintMode = Enum.VelocityConstraintMode.Line
			mover.RelativeTo = Enum.ActuatorRelativeTo.World
			mover.MaxForce = math.huge
			
			while os.clock() - start < physics.t do
				task.wait()

				local time = os.clock() - start
				local smallestDistance = math.huge
				local slower = 1
				
				local direction = (humrp.CFrame * humrp.CFrame.Rotation:Inverse() * CFrame.Angles(0, math.rad(humrp.Orientation.Y), 0)).LookVector
				local scalar = physics.vi * slower + physics.a * time * slower
				
				mover.LineDirection = direction
				mover.LineVelocity = scalar
				
				-- COLLISION CHECKING
				if workspace:Raycast(humrp.Position, humrp.CFrame.LookVector * 2, startParams) then
					mover.MaxForce = 1000
				end

				for i,v:Part in pairs(watchlist) do
					if v:IsA("BasePart") then
						for i = 0, math.pi * 2, (math.pi * 2)/360 do
							local ray = Ray.new(humrp.Position, (CFrame.new(humrp.Position) * CFrame.Angles(0,i,0)).LookVector * 8)

							local cast = workspace:Raycast(ray.Origin, ray.Direction, checkParams)

							if cast then
								if cast.Distance < smallestDistance then
									smallestDistance = cast.Distance
								end
							end
						end
					end
				end

				if smallestDistance < 4 then
					slower = math.clamp(smallestDistance/4, 0.2, 1)
				end
				
				local radiusCheck = Instance.new("Part")
				radiusCheck.Shape = Enum.PartType.Ball
				radiusCheck.Anchored = true
				radiusCheck.CanCollide = false
				radiusCheck.Transparency = 0.95
				radiusCheck.Size = Vector3.new(4,4,4)
				radiusCheck.Color = colorStart
				
				local futureTime = math.clamp(time + 0.2, 0, physics.t)
				local futurePos = (physics.vi * futureTime + 0.5 * physics.a * futureTime * futureTime)
				
				radiusCheck.CFrame = (humrp.CFrame + direction * (8 - 8 * time/physics.t)) * humrp.CFrame.Rotation
				
				local collisionCheck = workspace:GetPartsInPart(radiusCheck, params)
				
				if #collisionCheck ~= 0 then
					radiusCheck.Color = colorEnd
					
					for i,v in pairs(collisionCheck) do
						if table.find(watchlist, v) == nil then
							watchlist[#watchlist + 1] = v
							checkParams.FilterDescendantsInstances = watchlist
						end
					end
				end
				
				radiusCheck.Parent = workspace.TestingFolder
				
				debris:AddItem(radiusCheck, physics.t + 0.2)
			end
			
			mover:Destroy()
		end
	end	
end, false, Enum.KeyCode.Q)

plr.CharacterAdded:Connect(function(charModel)
	char = charModel
	params.FilterDescendantsInstances = {char, workspace.TestingFolder}
end)

I tried changing the max force of the linear velocity but the problem still shows up at lower limits

2 Likes

I’m using plane velocity as an alternative, works pretty much the same but without the bug.

1 Like

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