A zombie ai that i made

One of the biggest scripts I’ve made.

Script
local myHuman = script.Parent:WaitForChild("Humanoid")
local myRoot = script.Parent:WaitForChild("HumanoidRootPart")

while true do
	local target
	local dist = 200
	
	for i, plr in pairs(game.Players:GetPlayers()) do
		local v = workspace:FindFirstChild(plr.Name)
		if v then
			local human = v:FindFirstChild("Humanoid")
			local rootPart = v:FindFirstChild("HumanoidRootPart")
			if human and rootPart and v ~= script.Parent then
				if (myRoot.Position - rootPart.Position).magnitude <= dist and human.Health > 0 then
					dist = (myRoot.Position - rootPart.Position).magnitude
					target = rootPart
				end
			end
		end
	end
	
	if target then
		local damageDebounce = true
		
		local damageCor = coroutine.wrap(function()
			while true do
				wait()
				repeat wait() until (myRoot.Position - target.Position).magnitude <= 3
				myHuman.WalkSpeed = 0
				wait(.5)
				
				local human2 = target.Parent:FindFirstChild("Humanoid")
				if human2 and damageDebounce == true then
					damageDebounce = false
					human2:TakeDamage(10)
					wait(1)
					damageDebounce = true
				end
				myHuman.WalkSpeed = 16
			end
		end)
		damageCor()
		
		local ray = Ray.new(myRoot.Position, (target.Position - myRoot.Position).Unit * 200)
		local hit, position = workspace:FindPartOnRayWithIgnoreList(ray, {script.Parent}, false, true)
		
		if hit then
			if hit.Parent:IsDescendantOf(target.Parent) then
				myHuman:MoveTo(target.Position)
			else -- Pathfinder script starts
				local path = game:GetService("PathfindingService"):CreatePath()
				path:ComputeAsync(myRoot.Position, target.Position)
				
				if path.Status == Enum.PathStatus.Success then
					for i,v in pairs(path:GetWaypoints()) do
						myHuman:MoveTo(v.Position)
						
						if v.Action == Enum.PathWaypointAction.Jump then
							myHuman.Jump = true
						end
						
						myHuman.MoveToFinished:Wait(2)
					end
				else
					warn(script.Parent.Name.." cannot reach destination.")
					myHuman.Jump = true
				end
			end
		end
	else
		local x = math.random(-100, 100)
		local z = math.random(-100, 100)
		
		local pos = Vector3.new(x, 0 ,z)
		
		local path = game:GetService("PathfindingService"):CreatePath()
		path:ComputeAsync(myRoot.Position, pos)
		
		if path.Status == Enum.PathStatus.Success then
			for i,v in pairs(path:GetWaypoints()) do
				myHuman:MoveTo(v.Position)
				
				if v.Action == Enum.PathWaypointAction.Jump then
					myHuman.Jump = true
				end
				
				myHuman.MoveToFinished:Wait(2)
			end
		else
			myHuman.Jump = true
		end
	end
	
	wait()
end

Video of the zombie:

Video

robloxapp-20200920-1124176.wmv (5.1 MB)

4 Likes

Perhaps you could think about adding animation to the zombie.

I don’t know how to do that though.

Do a search from animation of models or non humanoids.

To add animations, you need to get the state of the humanoid (running, jumping, etc) and load an animation into the humanoid via a script (there are plenty of tutorials on YouTube on how to do that), then you play the animations when the zombie is running, jumping, etc…