Touched Event Still Fires Even When Player is Still Inside the Zone

The Touched event is firing multiple times even when the character has not exited and re-entered the zone. This creates false triggers that should only happen once per entry.

Steps to Reproduce:
Kill a player inside the zone

Touch the player body parts after he died and try to move the fallen body parts

Observe that Touched events continues to trigger even though the player hasn’t moved out from the zone.

The Touched event keeps triggering repeatedly while the character is still inside the zone

Reproduce video

Expected behavior

The Touched event should only fire once upon initial contact unless the touching part leaves and re-enters the zone because the player is still inside the zone and hasnt go out

Touch Script

local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local Zone = script.Parent
local Tool = ReplicatedStorage.Shared.Classes.CombatSystem.CombatTool

script.Parent.Touched:Connect(function(hit :BasePart)
	if hit.Name ~= "HumanoidRootPart" then return end
	
	local char = hit.Parent
	local plr = game.Players:FindFirstChild(char.Name)
	if not plr then return end
	
	local hum = char:FindFirstChildOfClass("Humanoid")
	if hum.Health == 0 then return end
	
	local tool = char:FindFirstChildOfClass("Tool") or plr.Backpack:FindFirstChild(Tool.Name)
	if tool then return end
	
	print("Touching",char.Name)
	
	local tool = Tool:Clone()
	hum:EquipTool(tool)
end)

script.Parent.TouchEnded:Connect(function(hit :BasePart)
	if hit.Name ~= "HumanoidRootPart" then return end
	
	local char = hit.Parent
	
	print("Untouched", char.Name)
	
	local plr = game.Players:GetPlayerFromCharacter(char)
	if not plr then return end

	local tool = char:FindFirstChildOfClass("Tool") or plr.Backpack:FindFirstChild(Tool.Name)
	if tool then tool:Destroy() end
end)

This is actually expected behavior according to Roblox’s engine design. The BasePart.Touched event will fire multiple times while parts are in contact due to continuous physics simulation, and doesn’t guarantee a single fire per entry. This includes cases where ragdoll or detached parts jitter within the zone, which can retrigger the event even if the player hasn’t truly left and re-entered.

This behavior has been noted in multiple past discussions and is not considered a bug by Roblox’s standards.

If you’re looking for precise zone detection that only fires once per entry and exit, use ZonePlus, which is a community module designed specifically to handle these cases with more control and accuracy than the raw .Touched API allows.

If the behavior of Touched is really intended to be this unreliable due to Roblox’s physics simulation, then I honestly don’t have much ground to argue. I have actually used ZonePlus before, and while it does offer more control, I did run into occasional bugs and errors. On top of that, the module’s creator hasn’t been very active in maintaining or responding to issues on the forum, which made long-term support a bit uncertain for me.

Thanks again for pointing this out.

1 Like