Sometime there're error while I'm using Pathfinding that i take it from this site: http://lessons.lualearners.org/lesson?id=77
Here's a script i make it for Zombie
local larm = script.Parent:FindFirstChild("Left Arm")
local rarm = script.Parent:FindFirstChild("Right Arm")
local waitTimer = 0
nodesTraced = {}
nodes = Workspace:FindFirstChild("Nodes")
function mapNodes()
if nodes == nil then
message = Instance.new("Message", Workspace)
message.Text = "The model \"Nodes\" does not exist in Workspace. This should contain all your nodes."
else
local nodesChildren = nodes:getChildren()
for _, node in pairs(nodesChildren) do
for _, targetNode in pairs(nodesChildren) do
--wait()
if targetNode ~= node then
local ray = castRay(node.Position, targetNode.Position)
local hit,_ = Workspace:FindPartOnRay(ray, node)
if hit == targetNode then
if nodesTraced[node] == nil then
nodesTraced[node] = {}
end
nodesTraced[node][targetNode] = true
end
end
end
end
end
end
function castRay(start, target)
local ray = Ray.new(start, (target - start).unit*300)
return ray
end
function pathFind(startNode, endNode)
local openList = {}
local closedList = {}
openList[startNode] = {startNode, 0, 0}
local endFound = false
local currentNode = nil
while endFound == false do
--wait()
local lowestF = math.huge
local openListNotEmptyCheck = 0
for key, value in pairs(openList) do
--wait()
openListNotEmptyCheck = openListNotEmptyCheck+1
if value[2] < lowestF then
lowestF = value[2]
currentNode = key
end
end
if openListNotEmptyCheck == 0 then
return false
end
closedList[currentNode] = {openList[currentNode][1],openList[currentNode][3]}
openList[currentNode] = nil
if currentNode == endNode then
endFound = true
end
for key, value in pairs(nodesTraced[currentNode]) do --Here's a error that i can't fix.
--wait()
if closedList[key] == nil then
local g = closedList[currentNode][2] + (key.Position - currentNode.Position).magnitude
local h = (key.Position - endNode.Position).magnitude
local f = g + h
if openList[key] and openList[key][3] > g then
openList[key] = {currentNode, f, g}
elseif openList[key] == nil then
openList[key] = {currentNode, f, g}
end
end
end
end
local backPath = {}
backPathDone = false
table.insert(backPath, endNode)
while backPathDone == false do
wait()
table.insert(backPath, closedList[currentNode][1])
currentNode = closedList[currentNode][1]
if currentNode == startNode then
backPathDone = true
end
end
local path = {}
for i = #backPath, 1, -1 do
table.insert(path, backPath[i])
end
return path
end
function findNearestTorso(pos)
local list = game.Workspace:children()
local torso = nil
local dist = 1000
local temp = nil
local human = nil
local temp2 = nil
for x = 1, #list do
temp2 = list[x]
if (temp2.className == "Model") and (temp2 ~= script.Parent) and (temp2.Name ~= "Floating Fortress") then
temp = temp2:findFirstChild("Torso")
human = temp2:findFirstChild("Humanoid")
if (temp ~= nil) and (human ~= nil) and (human.Health > 0) and (temp2.Name ~= "Zombie") and (temp2.Torso.Position.Y < 20) then
if (temp.Position - pos).magnitude < dist then
torso = temp
script.Parent.Target.Value = temp
dist = (temp.Position - pos).magnitude
if human.Health >= 1 then
script.Parent.Range.Value = true
else
script.Parent.Range.Value = false
end
end
end
if dist < 50 then
script.Parent.Attack.Value = true
else
script.Parent.Attack.Value = false
end
end
end
return torso
end
function Hit(hit)
local human = hit.Parent:FindFirstChild("Humanoid")
if human ~= nil and waitTimer <= 0 and hit.Parent.Name ~= "Zombie" then
human:TakeDamage(20)
script.Parent.Humanoid.Health = script.Parent.Humanoid.Health + 5
script.Parent.Head.Bite:play()
waitTimer = 2
end
end
function Sit()
if script.Parent.Humanoid.Sit == true then
script.Parent.Humanoid.Jump = true
print("Anti Seat Putter!!!")
end
end
script.Parent.Humanoid.Changed:connect(Sit)
for _, Child in pairs(script.Parent:GetChildren()) do
if Child:IsA("Part") then
Child.Touched:connect(Hit)
end
end
while true do
wait(0.1)
mapNodes()
--[[while script.Parent.HoldAttack.Value == true do
script.Parent.Range.Value = false
script.Parent.Attack.Value = false
wait()
end
waitTimer = waitTimer - 1
local target = findNearestTorso(script.Parent.Torso.Position)
if target ~= nil then
rx = math.random(-15,15)/10
ry = math.random(0,0)
rz = math.random(-15,15)/10
script.Parent.Humanoid:MoveTo(target.Position+Vector3.new(rx,ry,rz), target)
else
script.Parent.Range.Value = false
script.Parent.Attack.Value = false
end]]
pathFind(nodes.Start, nodes.End)
end
Error I've found using output:
20:43:44.578 - Workspace.Zombie.ChaseScript:75: bad argument #1 to 'pairs' (table expected, got nil) 20:43:44.609 - Script 'Workspace.Zombie.ChaseScript', Line 75 - global pathFind 20:43:44.609 - Script 'Workspace.Zombie.ChaseScript', Line 192 20:43:44.609 - stack end
Please tell me a way to fix this. Thanks
