I know how to use the touch event and tell when a player touches a block but I need to know how to tell if a player is still standing on the block or not
COMMUNITY QUESTION
how can I tell if a player is actively touching a block?
2 answers
you can use the touched event:
local brick = script.Parent --getting variables for the brick
brick.Touched:Connect(function(hit) --Checking if the brick is touched
if hit.Parent:FindFirstChild("Humanoid") then --Checking if touched part has a humanoid (player)
hit.Parent.Humanoid.Health = 0 --player dies
end
end)
So there is no easy solution for this I am afraid. Once players stops moving, touched events are not fired anymore and using PartsInRegion3 is very costly.
IMHO the best way is to use periodic check of magnitude of vector3 to tell how far character is from the block combined with touch event that will initialize such checks. Once player leaves the block, the check loop will cease.
Make sure that this is a server script.
local part = script.Parent
local PlayersNearThePart = {}
local approxPartRadius = (part.Size.X/2 + part.Size.Z/2)/1.5
part.Touched:Connect(function(hit)
local root = hit.Parent:FindFirstChild("HumanoidRootPart")
if not root then return end -- not a humanoid
local plr = game.Players:GetPlayerFromCharacter(hit.Parent)
if not plr then return end -- could be an NPC, or the player left
if PlayersNearThePart[plr] then return end -- player has already been registered
PlayersNearThePart[plr] = true
--do something when player entered
-- you can check at anytime
--if PlayersNearThePart[plr] is set to see if player is still on the part
--periodic check to see if player left the part
while root.Parent.Parent and (root.Position - part.Position).Magnitude < approxPartRadius then
task.wait(1)
end
--player left, clear the register
PlayersNearThePart[plr] = nil
end)
I hope this helps.
This discussion is preserved as it was. New answers, comments, and votes are closed.
