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

Check If Multiple Players Are In A Part?

So I have a Tornado Survival game, and have a feature where if you are in the map surviving, you are gaining a leaderstat point every second. This is done with a large Part named 'gain' that covers the whole map, and the script is placed inside of it. The main problem I have is that the script has it only apply to one player at a time, so if me and my friends play, I am the only one gaining points.

So I was wondering if anybody knew how to check if multiple people are colliding with a Part, and how that script would look? Thanks!

local waittime = 1
	local debounce = true
	-- This debounce variable prevents the script from spamming points
	 
	function OnTouched(hit)
	    if hit and hit.Parent and debounce then
	        -- Make sure hit is isn't nil and debounce is ready
	        debounce = false
	        local player = game.Players:GetPlayerFromCharacter(hit.Parent)
	        -- Get the player from whatever bodypart hit the brick.
	        if player then
	            -- Make sure a player hit the brick
	            local leaderstats = player:FindFirstChild("leaderstats")
	            -- Make sure they have the leaderstats Value.
	            local level = leaderstats and leaderstats:FindFirstChild("Money")	            
-- Make sure they have the level Value in leaderstats.
	            if level then
	                level.Value = level.Value + 1
	                wait(waittime)
	            end
	        end
	        debounce = true
	    end
	end
	 
	script.Parent.Touched:Connect(OnTouched)

2 answers

You have to keep track of who touches and untouches the part and run through them with a loop.

local part=--part
local touching={}
local waittime=1

local running=false
function has()
    if running==false then running=true
        while #touching>0 do
            for i,v in pairs(touching) do
		if v and v:FindFirstChild("Humanoid") then
                	local plr=game.Players:GetPlayerFromCharacter(v)
			if plr then
				plr.leaderstats.Money.Value=plr.leaderstats.Money.Value+1
			end
		else
			touching[i]=nil
		end
            end
            wait(waittime)
        end
        running=false
    end
end
part.Touched:Connect(function(hit)
    if hit.Parent:FindFirstChild("Humanoid") then
        local good=true
        for _,v in pairs(touching) do
            if v==hit.Parent then
                good=false
            end
        end
        if good then
            table.insert(touching,hit.Parent)
            has()
        end
    end
end)
part.TouchEnded:Connect(function(hit)
    for i,v in pairs(touching) do
        if v==hit.Parent then
            table.remove(touching,i)
        end
    end
end)

2 comments

0

I have one problem with that, when I use that script, once 1 player dies, nobody else is gaining points.

0

@puppyfriend edited answer

wait(3)
local t = 1 --Time of Match
local match = false
while wait() do
	match = true
	local allplrs = game.Players:GetChildren()
	for i = 1,#allplrs do
		allplrs[i].Character.Parent = workspace.Survivors --when the player dies he will leave the folder
	end
	t = 1
	repeat
		t = t-1
	until t <= 0
	local allsv = workspace.Survivors:GetChildren()
	local plr
	for i2 = 1,#allsv do
		if #allsv > 1 then
		plr = allsv[i2].Name..","..allsv[i2].Name
		elseif #allsv == 1 then
			plr = allsv[i2].Name
		end
	end
	print("Survivors: "..plr)
	wait(3)
		for i2 = 1,#allsv do
		allsv[i2].Parent = workspace
	end
	local match = false
end

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