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

How would I check when an array gets a value then wait and remove it?

Hey guys,

I have a table in my script where it's a cooldown where every userId is placed in it. I want to detect when a value is added to it then wait a certain amount and then remove the user.

I know how to achieve that but my issue here is I only get to wait for the first value in the table.

Here is my attempted code.

local CooldownList = {}

--I insert values in the table elsewhere

coroutine.wrap(function()
	print("Running coroutine")
	while true do
		wait()
		if #CooldownList >= 1 then
			coroutine.wrap(function()
				repeat
					print("Waiting and trying to remove user from array")
					wait(45)
					table.remove(CooldownList, 1)
					print("Successfully removed user from array")
				until #CooldownList < 1
			end)()
		end
	end
end)()

Tbh, I just went with coroutines because I thought that was best.

Have a great day everybody ;)

1 answer

✓ Accepted answer

I think I understand what you're trying to do, but I think polling (using a coroutine enclosed in a while loop that constantly runs) is the wrong answer. Plus, you've got a coroutine inside of a coroutine; that can get messy!

You can either use metatables or a function-based approach, but the former is generally over-engineering. Opting for the latter choice, here's what I would do:

local userIds = {}

local function addUserId(id)
	table.insert(userIds, id) -- insert the id into the table
	print("Added", id, "to userIds.")
	delay(45, function() -- operate on a separate thread so this function does not yield any code it's used in
		local index = table.find(userIds, id) -- locate where our userId async is via table.find's return argument
		if index then -- ensure the index is legitimate
			table.remove(userIds, index) -- remove the userId from the index
			print("Removed", id, "from userIds index", index)
		end
	end)
end

You can use this example code to test it:

for i = 1, 5 do
	addUserId(Random.new():NextInteger(100000, 1000000))
end

I would stress you remove the prints after you can ensure it's working properly. Hope this helps out, and please mark this as a solution if it does!!! Happy scripting.

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