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

Every 3 second random player gets random effect. Instead it happens once. How to fix?

eventss = {"smoke","fire","sparkles"}



game.Players.PlayerAdded:connect(function(player)
while true do
for i,v in pairs (eventss) do
	player.CharacterAdded:wait()
local randomPlayer = game.Players:GetPlayers()
[math.random(1,#game.Players:GetPlayers())]
print(randomPlayer)
	print(i,v)
	if v == "smoke" then
		local a = Instance.new("Smoke",randomPlayer.Character.Head)
		wait(3)
		a:Destroy()
	elseif
		v == "sparkles" then
		local b = Instance.new("Sparkles",randomPlayer.Character.Head)
		wait(3)
		b:Destroy()
		elseif
		v == "fire" then
		local c = Instance.new("Fire",randomPlayer.Character.Head)
		wait(3)
		c:Destroy()
	end
	end
end
end)

3 comments

0

pstt

0

game:GetService("Debris"):AddItem()

0

might wanna look it up ;)

2 answers

✓ Accepted answer

You're executing this for every player wich you shouldn't be doing. This script should work:

while wait(3) do --loops every 3 seconds
	pcall(function() -- acts as safe guard so if an error occors it wont break
		while wait() do -- repeats until it finds an alive character
			local randomnumber = math.random(1,#game:GetService'Players':GetChildren()) --selects random player
			local plr = game:GetService'Players':GetChildren()[randomnumber] -- converts number to player
			if plr.Character then
				if plr.Character.Head then
					local randomnumber2 = math.random(1,3) -- generates a random particle
					if randomnumber2 == 1 then
						local c = Instance.new('Smoke', plr.Character.Head)
						game:GetService'Debris':AddItem(c, 3) --request to remove after 3 seconds
						elseif randomnumber2 == 2 then
						local c = Instance.new('Fire', plr.Character.Head)
						game:GetService'Debris':AddItem(c, 3) --request to remove after 3 seconds
						elseif randomnumber2 == 3 then
						local c = Instance.new('ParticleEmitter', plr.Character.Head)
						game:GetService'Debris':AddItem(c, 3) --request to remove after 3 seconds
					end
					break--stops the while loop since it successfully added the particle
				end
			end
		end
	end)
end

3 comments

0

Just why.

0

What exactly did i do wrong?

0

There is no reason to use pcall in this code at all.

You are overcomplicating this all you need in the loop is to check if the Player has a character remove old effects if there is one then add a random one.

Your code is an infinate loop inside the player added event which is bad on its own. You also do not use the Player and instead randoly get a playe from the game to change the effect on. These are tow differnt things one if for the playre who joined and the other is getting all the players?

Just use a loop for all player in the game.

Example:-

local itms = {"Smoke","Fire","Sparkles"}
local function getEffect(head)

	-- remove all items in the list
	for i=1, #itms do
		local tmpItm = head:FindFirstChild(itms[i])
		if tmpItm  then
			tmpItm:Destroy()
		end
	end
	
	-- add random item
	Instance.new(itms[math.random(1, #itms)], head)
end

-- main  loop
while true do
	wait(3)
	
	-- check each player in the game
	for _, plr in pairs(game.Players:GetPlayers()) do
		if plr.Character and plr.Character.Head then
			getEffect(plr.Character.Head)
		end
	end
end

I hope this helps.

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