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

Vector.3 and wait help?

So Im a really new scripter and I was having some trouble. When I did this function, the first line of the fuction worked, but the 3rd line never was executed to return the brick to its original location. So, can someone help me fix this?

function open()
workspace.Door.Position = Vector3.new(-27.5, 17.7, 21.3)
wait(3)
workspace.Door.Position = Vector3.new(-27.5, 12.8, 21.3)
end

script.Parent.ClickDetector.MouseClick:connect(open)

1 answer

This should work, with a few nuances.

First, you should use CFrame instead of Position.

When you set Position of an object, it makes sure there's open space for it. If not, it sets the object where there is open space (looking upward).

CFrame ignores that requirement and moves the object anyway.

You can make a CFrame using a Vector3, or just by giving it the x, y, and z coordinates.

However since CFrame also describes rotation, it would be better to make this all relative.

First, your script using a variable to make it relative to where the door starts (no more having to know exactly the position of the door!)

local home = workspace.Door.Position
function open()
	workspace.Door.Position = home + Vector3.new(0, 4.9, 0)
	wait(3)
	workspace.Door.Position = home
end

script.Parent.ClickDetector.MouseClick:connect(open)

And now with CFrame:

local home = workspace.Door.CFrame
function open()
	workspace.Door.CFrame = home + Vector3.new(0, 4.9, 0)
	wait(3)
	workspace.Door.CFrame = home
end

script.Parent.ClickDetector.MouseClick:connect(open)

Now there's just the small detail of open being called repeatedly because of multiple clicks. It will shut according to the first click, rather than the most recent one. We can implement something that sort of looks like a debounce to fix this.

local home = workspace.Door.CFrame
local lastPress = nil
function open()
	unique = {}; -- or `math.random()` if that makes more sense
	lastPress = unique
	workspace.Door.CFrame = home + Vector3.new(0, 4.9, 0)
	wait(3)
	if lastPress == unique then
		-- ONLY do this if the last press was MINE
		-- Otherwise, its THEIR job to clean it up
		workspace.Door.CFrame = home
	end
end

script.Parent.ClickDetector.MouseClick:connect(open)

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