Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

My door keeps spinning, and won't stop at the 90 degree angle mark. What's wrong with it?

For some reason, this door doesn't stop rotating at 90 degrees; it just keeps spinning and spinning. I think it has something to do with heartbeat, but what I was trying to do was make the door lerp smoothly using heartbeat, to the 90 degree mark. Here's a GIF of what it looks like:

https://gyazo.com/3633367499479c724ec662fe3ce17896

Here's the script:

local Can = true
local Open = false

script.Parent.Event.OnServerEvent:connect(function(Player)
	local Mag = (script.Parent.Center.Position-Player.Character.HumanoidRootPart.Position).magnitude
	if Mag <= script.Parent.Range.Value then
		if Can then
			Can = false
			if Open == false then
				game:GetService('RunService').Heartbeat:Connect(function(d)
				local finish = script.Parent.PrimaryPart.CFrame*CFrame.Angles(0,math.rad(90),0)
					local cfm = script.Parent.PrimaryPart.CFrame:lerp(finish,d*2)
					script.Parent:SetPrimaryPartCFrame(cfm)
					wait()
					end)
				Open = true
			else
				Open = false
				game:GetService('RunService').Heartbeat:Connect(function(d)
				local finish = script.Parent.PrimaryPart.CFrame*CFrame.Angles(0,-math.rad(90),0)
					local cfm = script.Parent.PrimaryPart.CFrame:lerp(finish,d*2)
					script.Parent:SetPrimaryPartCFrame(cfm)
					wait()
				end)
			end
			Can = true
		end
	end
	end)

Can someone tell me what's wrong? I'll fix it; but I just need to know what to fix first.

2 comments

0

How long do you want the opening to last?

0

if it doesn't work, try using my model for help or something --> https://www.roblox.com/library/4559559581/Door

1 answer

✓ Accepted answer

Lerp stands for Linear intERPolation. CFrame:lerp(new, d) is defined as a new CFrame that is d of the distance between the current CFrame and new. d is usually between 0 and 1 but it can be larger to go past new. Heartbeat event passes the time since the last Heartbeat in seconds. It does not give you the time since you connected your listener to the event. In addition, finish is constantly being recalculated to be 90 degrees ahead of where the door is now. I've fixed all of these problems here.

local debounce = true
local Open = false

script.Parent.Event.OnServerEvent:Connect(function(Player)
	local Mag = (script.Parent.Center.Position-Player.Character.HumanoidRootPart.Position).magnitude
	if Mag <= script.Parent.Range.Value then
		if debounce then
			debounce = false
			if Open == false then
				local ellapedTime = 0
				local finish = script.Parent.PrimaryPart.CFrame * CFrame.Angles(0,math.rad(90),0)
				local connection -- this syntax is necessary
				connection = game:GetService('RunService').Heartbeat:Connect(function(lastBeat)
					ellapsedTime = ellapsedTime + lastBeat
					local d = ellapsedTime / TIME_TO_OPEN -- how long you want it to take to open
					local cfm = script.Parent.PrimaryPart.CFrame:lerp(finish, math.clamp(d, 0, 1))
					script.Parent:SetPrimaryPartCFrame(cfm)
					if d >= 1 then 
						connection:Disconnect()
					end
				end)
				Open = true
			else
				local ellapedTime = 0
				local finish = script.Parent.PrimaryPart.CFrame * CFrame.Angles(0,-math.rad(90),0)
				local connection -- this syntax is necessary
				connection = game:GetService('RunService').Heartbeat:Connect(function(lastBeat)
					ellapsedTime = ellapsedTime + lastBeat
					local d = ellapsedTime / TIME_TO_CLOSE -- how long you want it to take to close
					local cfm = script.Parent.PrimaryPart.CFrame:lerp(finish, math.clamp(d, 0, 1))
					script.Parent:SetPrimaryPartCFrame(cfm)
					if d >= 1 then 
						connection:Disconnect()
					end
				end)
				Open = false
			end
			debounce = true
		end
	end
end)

2 comments

0

Wow! It's awesome that you fixed my script and everything, but there was one error. In my output, I got this: 18:47:44.198 - Workspace.Doors.Model.DoorMain:16: attempt to perform arithmetic on global 'ellapsedTime' (a nil value) 18:47:44.198 - Stack Begin 18:47:44.199 - Script 'Workspace.Doors.Model.DoorMain', Line 16

0

Nvm I solved the problem, but thanks for your help @compUcomp and @NSMascot

This discussion is preserved as it was. New answers, comments, and votes are closed.