Client Touched event doesn't fire

Seen here, the dummy on the right, when hit, doesn’t seem to trigger the touched event

the dummy on the left who is closer, seems to trigger the touched event immediantly
It takes a while until the dummy on the right starts registering the touched events.

--Services
local runService = game:GetService("RunService")
local tweenService = game:GetService("TweenService")
local players = game:GetService("Players")
--Main Data
local localplayer = players.LocalPlayer

--Main Functions
local module = {
	fireAttack = function(attackData)
		local owner = attackData.Owner
		local mouseLocation = attackData.MouseLocation
		local originLocation = attackData.OriginLocation
		local weapon = attackData.Weapon
		local shot = Instance.new("Part")
		shot.Size = Vector3.new(1,1,1)
		shot.Anchored = true
		shot.CanCollide = false
		shot.Material = Enum.Material.Neon
		shot.CastShadow = false
		local shotAttachment1 = Instance.new("Attachment",shot)
		local shotAttachment2 = Instance.new("Attachment", shot)
		local shotTrail = Instance.new("Trail", shot)
		shotAttachment1.Position = Vector3.new(0.5,0,0)
		shotAttachment2.Position = Vector3.new(-0.5,0,0)
		shotTrail.Attachment0 = shotAttachment1
		shotTrail.Attachment1 = shotAttachment2
		shotTrail.WidthScale = NumberSequence.new(1,0)
		shotTrail.Lifetime = 1
		shot.CFrame = CFrame.new(originLocation, mouseLocation)
		shot.Parent = workspace
		local ignoreList = owner.Character:GetChildren()
		for i = 1, 150 do
			shot.Position = shot.Position + shot.CFrame.lookVector
			local hitRay = Ray.new(shot.Position, shot.CFrame.lookVector)
			local hitPart = workspace:FindPartOnRayWithIgnoreList(hitRay, ignoreList, false, false)
			if hitPart then
				if hitPart.CanCollide == true then
					break;
				else
					table.insert(ignoreList, #ignoreList + 1, hitPart)
				end
			end
			runService.Heartbeat:Wait()
		end
		local hitIgnoreList = {}
		shot.Touched:Connect(function(hitPart)
			if localplayer == owner then
				print("Hit!")
				local hitModel = hitPart.Parent
				if hitModel and hitModel:FindFirstChild("Humanoid") and hitIgnoreList[hitModel] == false then
					hitIgnoreList[hitModel] = true
					print("Dealt Damage!")
				end
			end
		end)
		shot.Size = Vector3.new(0,0,0)
		shot.CFrame = shot.CFrame * CFrame.Angles(math.random(-2,2),math.random(-2,2),math.random(-2,2))
		local shotExpandInfo = TweenInfo.new(0.5,Enum.EasingStyle.Exponential, Enum.EasingDirection.Out, 0, true)
		local shotExpand = tweenService:Create(shot, shotExpandInfo, {Size = Vector3.new(10,10,10), Transparency = 0.7})
		shotExpand:Play()
		shotExpand.Completed:Connect(function()
			shot:Destroy()
		end)
	end
}

return module

this is the script that handles the projectile, not sure what i am doing wrong for this to happen

You are using Accurate Play Solo (Visible because there is a blue border around the game area).

What do you see if you switch to the server view (green border)? Or host a 1-player server?

Same problem
This was done in a 1 player server

This is just a limitation of using the touched event on moving parts, which is why most people tend to avoid using it, to get around this either call GetTouchingParts every frame or use raycasting.

What does the server console say, when you hit the clientsided ragdoll?

shot.Touched:Connect(...) will only work for the Local Player since it was connected within a LocalScript. When the console printed out the hit, it registed you colliding with the shot part.

I figured out a quick fix, however, you may need to figure out another way for a collision detection since this script is executed on the player-side and not the server-side. Meaning, it may be prone to exploits, etc.

Remove the corresponding script:

shot.Touched:Connect(function(hitPart)
	if localplayer == owner then
		print("Hit!")
		local hitModel = hitPart.Parent
		if hitModel and hitModel:FindFirstChild("Humanoid") and hitIgnoreList[hitModel] == false then
			hitIgnoreList[hitModel] = true
			print("Dealt Damage!")
		end
	end
end)

Then, replace the line that contains the for i = 1, 150 do loop with this:

for i = 1, 150 do
	shot.Position = shot.Position + shot.CFrame.lookVector
	local hitRay = Ray.new(shot.Position, shot.CFrame.lookVector)
	local hitPart = workspace:FindPartOnRayWithIgnoreList(hitRay, ignoreList, false, false)
	if hitPart then
		if hitPart.CanCollide == true then
			print("Hit!")
			local hitModel = hitPart.Parent
			if hitModel and hitModel:FindFirstChild("Humanoid") then
				hitIgnoreList[hitModel] = true
				print("Dealt Damage!")
			end
			break;
		end
	end
	runService.Heartbeat:Wait()
end

so i did some research and it turns out that this problem has something to do with network ownership or something

I ended up switching to using region3s instead since i still needed the ability to handle explosions which raycasting doesn’t do well at