Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How do I fire a function when someone walks near a part?

Asked by 6 years ago

So I have this part in my game and when someone walks near it, say 100 studs, the part is supposed to connect to a function. But I don't know how I am supposed to do this. Can someone please point me in the right direction?

2 answers

Log in to vote
0
Answered by 6 years ago
Edited 6 years ago

This should work for you. (Apologies for the complexity.)

NOTE: I goofed this at first (The inequality symbols were swapped (>= instead of <= and < instead of >). This should be fixed.

EDIT: this won't detect when the player leaves the radius wat? currently trying to fix

EDIT EDIT: Found out why it wouldn't work and fixed it; I was stupid enough to forget that variables connected to properties don't change when the corresponding property changes.

--[[
    This code will cause the code to fire whenever the player is 100 studs away from the part.
    It will then only fire again if the player has left the radius before re-entrance.
]]
local used = false -- we'll need this 
local BindableEvent = workspace.BindableEvent

wait(5)
while true do
    for _, player in pairs(game:GetService("Players"):GetPlayers()) do
        local distance = player:DistanceFromCharacter(script.Parent.Position) -- set up the distance
        local updateDistance = coroutine.create(function() -- this was the solution to the bug
            while true do -- y'know
                distance = player:DistanceFromCharacter(script.Parent.Position) -- update the distance
                wait() -- ayy no overflows here bro
            end
        end)
        coroutine.resume(updateDistance) -- tada issue solved
        if distance <= 100 and not used then -- detect when the player is within a 100-stud field of the part, and then make sure used is false
            used = true -- set used to true
            function() end -- put your function here. function() end is just so that you don't get lost in the code; remove it when you use this
            local HelperCoroutine = coroutine.create(function()-- couroutine to help update the "used" variable when the player leaves the 100-stud field
                while true do
                    if distance > 100 then -- when the distance is less than 100 studs (the player left the field)...
                        BindableEvent:Fire() -- fire the bindable event we created...
                        coroutine.yield() -- we don't need this anymore, so bye thingy
                    end
                wait() -- don't wanna overflow with while true do
                end
            end)
            coroutine.resume(HelperCoroutine) -- start up the coroutine
            BindableEvent.Event:Wait()
            used = false -- yey
        end
    end
    wait() -- nope, we ain't overflowin'
end
0
Thanks, I appreciate the effort! SweetNoodleSoup 14 — 6y
0
You're welcome! sweetkid01 176 — 6y
Ad
Log in to vote
0
Answered by 6 years ago
Edited 6 years ago

I would create a part, make it invisible, and make it go around the part. I would then use it as the sensor.

Answer this question