Spawn function not working as espected?

Hello, im scripting an NPC. After setting the pathfinding functions, i’ve connected it in a While loop inside a spawn. There are 2 loops playing in spawns, one for constantly checking if there is a player neaby, other checking if the character is attacking someone or it can move around for a random position.

To know when the NPC is attacking or not, I crate this variable called “attacking”. It is suposed to be set to 5 in the second loop everywhen a player is detected nearby, and then the first loop stops moving the NPC to random positions and wait until the attacking goes down from 5 to 0. With this, i want the NPC to remain in “attacking” state for 5 seconds after it stops detecting a player, and want it not to move randomly while attacking. The second loop though keeps moving the NPC to the nearest sensed player constantly.

The problem is: the attacking variable seems to stop being set to 5 when the loop “while attacking > 0 do” is running. I dont want this to happen and dont expect it sinse they are in 2 separate threads. When printing the attacking variable constantly, it starts to go down until 0 instead of keep constantly in 5 while following the player, and when it reaches 0, it goes to 5 again. Weird. With a print right after “attacking = 5” i checked that it really sets to 5 on that loop, but then looks like that 5 does not became the global variable “attacking”, the output goes (nearly) like this:

5
4.9
5
4.8
5
4.7
5
4.6
5
4.5
...

The code:

local attacking = 0
local ViewAngle = 90

spawn(function()
	while wait(math.random(3,8)) do
		if attacking <= 0 then
			followPath(center + Vector3.new(math.random(-30,30), 0 , math.random(-30,30)))
		else
			while attacking > 0 do
				print(attacking)
				attacking = attacking - wait()
			end
			ViewAngle = 90
		end
	end
end)

spawn(function()
	while wait() do
		local plrs = GetPlayersInFront(Root, ViewAngle, 40)
		if plrs then
			closer = getCloser(plrs)
			if closer then
				attacking = 5
				ViewAngle = 360
				followPath(closer.Position)
			end
		end
	end
end)

First, why did you put two arguments into the wait?

Secondly, I just want to ask, why are you subtracting a variable by wait()? I don’t know, but this may be the source of your problem.

Also, Roblox has a better function compared to spawn(), which is more efficient and more handy. It’s coroutine.wrap(), it’s faster, efficient and also works in protected mode.

Coroutines

the wait function also returns the time that has passed waiting in seconds, so I can precisely subtract by the time passed. You can do print(wait()) to check.

the two arguments were supposed to be a math.random that I have fogotten lol, ill test with it

– no difference in the problem :c

The same problem happens when I use coroutines :\

I removed the attacking - wait() and used attacked -= 0.03 and it worked normally, this was the problem, thanks for the idea!