I've recently been making a custom tool pick up script, however, I've noticed that touch ended can be very buggy in which it can activate even when the player is still inside the part. The player is supposed to pick up the object when pressing "e" however if the player were to walk across the part, if the script does not have touchended, the player would still be able to pick up the object after walking pass it with the press of "e". Thus, I needed a touchended to create a variable to stop this from happening. Though it does solve the previous problem, it created a new one in which touchended would fire even when the player is still touching the object, continuously activating my touch ended variable and breaking my script. Can anyone help with this?
equipped = false
--Remote event that fires when touched
Prompt.onClientEvent:connect(function(player)
HasTouched = true
end
game:GetService("UserInputService").InputBegan:connect(function(inputObject, gameProcessedEvent)
-- check if E is pressed
if inputObject.KeyCode == Enum.KeyCode.E then
if not Equipped and HasTouched then
equipped = true
HasTouched = false
elseif Equipped then
equipped = false
HasTouched = true
end
end
end)
--Buggy Part that causes HasTouched to be false, thus not entering into both of the ifs above
--Remote event that fires when touchended
Prompt2.onClientEvent:connect(function()
HasTouched = false
print("Touched Ended")
end)

5 comments
You could try magnitude http://wiki.roblox.com/index.php?title=Magnitude
Could you give me an example? The wiki can really be complicated sometimes.
Whoops, Part:GetTouchingParts() could be used, though it wouldnt be the most efficient thing you could do.
Thanks for your help guys! Vulkarin's answer works.
Region3s are also very helpful, they allow for a more precise detection