Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Why does my zombie stand still for a few seconds?

I made a script that checks if players are nearby, and which one is closest. Then it sees if the player is close enough to attack. If not, then it sees if the player is within line of sight of the zombie and if it is, it walks straight there, but if it isn't, it uses path finding service to get there

My problem is that occasionally, the zombie will just stand still for a few seconds. I believe that the issue happens when the nearest player goes in/out of the line of sight. Any ideas as to why this could be happening? Thank you for your time! This is the section which I believe is giving me the issue:

--Do Zombie Stuff
local function DoZombStuff()
	NearestPlr=nil
	NearestDist=1000
	NearestLoc=nil
	--Check if players are nearby/Closest player
	for i,v in pairs(game.Players:getChildren()) do
		if v.Character~=nil and v.Character:findFirstChild("HumanoidRootPart") and v.Character:findFirstChild("Humanoid") and v.Character.Humanoid.Health>0 then
			if (v.Character.HumanoidRootPart.Position-HRP.Position).magnitude<NearestDist then
				NearestPlr=v.Character
				NearestDist=(v.Character.HumanoidRootPart.Position-HRP.Position).magnitude
				NearestLoc=NearestPlr.HumanoidRootPart.Position
			end
		end
	end
	--Create ray
	if NearestPlr~=nil then
		local Hit
		local raycastParams = RaycastParams.new()
		raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
		raycastParams.FilterDescendantsInstances = {script.Parent.Parent,workspace:WaitForChild("Explosions")}
		raycastParams.IgnoreWater = true
		local Ray=workspace:Raycast(HRP.Position, (NearestPlr.HumanoidRootPart.Position-HRP.Position).Unit*200, raycastParams)
		if Ray and Ray.Instance then
			Hit=Ray.Instance
		end
		--Attack
		if (NearestLoc-HRP.Position).magnitude<=AttDist+1 and ADB==false and Humanoid.Health>0 then
			ADB=true
			Humanoid:MoveTo(HRP.Position,NearestPlr.HumanoidRootPart)
			wait(.1)
			HRP.CFrame=CFrame.new(HRP.Position,Vector3.new(NearestLoc.X,HRP.Position.Y,NearestLoc.Z))
			if NearestPlr:findFirstChild("Humanoid") then
				NearestPlr.Humanoid.Health=NearestPlr.Humanoid.Health-dmg
			end
			ThrowAnimationTrack:Play()
			wait(AttackCoolDown)
			ADB=false
			--In LoS
		elseif Hit~=nil and (Hit.Parent==NearestPlr or Hit.Parent.Parent==NearestPlr) and (NearestLoc-HRP.Position).magnitude>=AttDist then
			Humanoid:MoveTo(NearestLoc)
			--Pathfind
		elseif (NearestLoc-HRP.Position).magnitude<=1000 and (NearestLoc-HRP.Position).magnitude>=AttDist then
			local path=game:GetService("PathfindingService"):findPathAsync(HRP.Position,NearestPlr.HumanoidRootPart.Position)
			local points=path:GetWaypoints()
			--Walk to target
			for i,v in pairs(points) do
				--Blocked
				local isBlocked=false
				path.Blocked:Connect(function()
					isBlocked=true
				end)
				if isBlocked==true then
					return
				end
				--Jump
				if v.Action==Enum.PathWaypointAction.Jump  then
					Humanoid.Jump=true
				end
				--Move to Next position
				Humanoid:MoveTo(v.Position)
				if NearestPlr~=nil and NearestPlr:findFirstChild("HumanoidRootPart") and (points[#points-1].Position-NearestPlr.HumanoidRootPart.Position).magnitude>=4 then
					if points[i+1] then
						Humanoid:MoveTo(points[i+1].Position)
					else
						Humanoid:MoveTo(NearestLoc)
					end
					return
				end
				Humanoid.MoveToFinished:Wait()
			end
		end
	end
end
while wait() do
	DoZombStuff()
end

1 answer

At the last part of your code you have a

while wait() do
end

these arent very reliable, try

while true do
doZombStuff()
wait(0.1)
end

This discussion is preserved as it was. New answers, comments, and votes are closed.