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

NPC only take away 5 health?

I have made a script that will take away 5 health when touched

function onTouched(hit)
	local human = hit.Parent:findFirstChild("Humanoid")
	if (human ~= nil) then
		human.Health = human.Health - 5  
	end
end


script.Parent.Touched:connect(onTouched) 

how do i make it so when touching it will only take away 5 per every 2 seconds?

2 answers

✓ Accepted answer

To add to Nexiterate - if you want the script (wait of 2 seconds) to be separate for every player who touches the brick.


local touchers = {}
local part = script.Parent


local function damage(player)
	local hum = player.Character:findFirstChild("Humanoid")
	if hum then
		hum:TakeDamage(5)
	end
	touchers[player.Name] = tick() -- Update the last time they were damaged
end

part.Touched:connect(function(hit)
	if hit and hit.Parent then 
		local player = game.Players:GetPlayerFromCharacter(hit.Parent)
		if player then 
			local index = touchers[player.Name] 
			if not index then 
				-- if player isn't even in the table yet, then damage them.
				damage(player)
			else -- if the player is in the table
				if tick() - index >= 2 then 
					-- If the last time they were damage was more than or equal to 2 seconds, then damage them.
					damage(player)
				end
			end
		end
	end
end)

You may achieve that using a debounce that the roblox wiki has some helpful and detailed info about what a debounce is and how to use it, you can check that out here

The code you could use is the following:

local debounce = false
function onTouched(hit)
    local human = hit.Parent:findFirstChild("Humanoid")
    if human and not debounce then
	debounce = true -- changing it to true so if the player touches it again before the two seconds have passed it would not run
        human.Health = human.Health - 5  
	wait(2) -- the function will only run if debounce is set to false, so here it waits two seconds then it reverts it back to being false
	debounce = false
    end
end

script.Parent.Touched:connect(onTouched) 

Hope it helped! If you have any questions please do not hesitate to let me know.

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