I admittedly got this code from a youtube video ( link ) and it was made in 2016 meaning it's a bit outdated, but I thought it was still useful to try and get the C* algorithm, except when I tested it, the NPC did not move, at all. It produces no errors and still prints "Connected". I have no idea what is causing this. If anybody knows the solutions PLEASE help
Workspace Script:
local workSpace = game:GetService("Workspace") local nodes = workSpace:WaitForChild("Nodes") local Table = nodes:GetChildren() function Connect() print("Connected") for _,A in ipairs(Table) do if #A:GetChildren() <= 0 then for _,B in ipairs(Table) do if B ~= A then local P = workSpace:FindPartOnRay(Ray.new(A.Position), B.Position - A.Position) if P == B then local neigbor = Instance.new("ObjectValue") neigbor.Value = B neigbor.Name = "Neighbor" neigbor.Parent = A end end end end end end Connect()
Script inside of NPC:
local pathfinder = require(game:GetService("ReplicatedStorage"):WaitForChild("A*")) local torso = script.Parent:WaitForChild("HumanoidRootPart") local humanoid = script.Parent:WaitForChild("Humanoid") function follow_path(goal) if not goal then return end local path = pathfinder(torso.Position, goal) for _,node in ipairs(path) do repeat wait() humanoid:MoveTo(node) until (node - torso.Position).Magnitude <= 4 end end function getClosestPlayer(to) local distance = math.huge local output = nil for _,player in ipairs(game:GetService("Players"):GetPlayers()) do local diff = player:DistanceFromCharacter(to) if diff < distance and player.Character then distance = diff output = player.Character end end return output end while wait() do local player = getClosestPlayer(torso.Position) if player and player:FindFirstChild("Torso") then follow_path(player.Torso.Position) end end
script inside of replicated storage:
local Nodes = workspace:WaitForChild("Nodes") local Table = Nodes:GetChildren() local index = {} local Parent = {} local gScore = {} local fScore = {} function Dec(Number) local Ceil = math.ceil(Number) if Ceil - Number <= .5 then return Ceil else return math.floor(Number) end end function SortUp(Table, Index) while true do local parentIndex = Dec((Index-1) / 2) if parentIndex == 0 then return Table end if fScore[Table[parentIndex]] > fScore[Table[Index]] then Table[parentIndex], Table[Index] = Table[Index], Table[parentIndex] Index = parentIndex else return Table end end end function Length(A, B) if not A or not B then return math.huge end return (A.Position - B.Position).Magnitude end function ClosestNode(Coord) local Output = nil local Cap = math.huge for _,v in ipairs(Table)do local Distance = (v.Position - Coord).Magnitude if Distance < Cap then Output = v Cap = Distance end end return Output end function FindIndexOf(Value, In) local Directory = index[In] if not Directory then index[In] = {} -- No reason to look for it if the table doesn't even exist. return index[In] end return Directory end function A_Star(A, B) local A = ClosestNode(A) local B = ClosestNode(B) local ClosedList = {} local OpenList = {A} local Current Parent = {} gScore = {} fScore = {} gScore[A] = 0 fScore[A] = Length(A, B) Parent[A] = A repeat Current = OpenList[1] if Current == B then break end table.remove(OpenList, 1) ClosedList[Current] = Parent[Current] for _,v in ipairs(Current:GetChildren())do if v:IsA("ObjectValue") then local Node = v.Value local H = Length(Node, B) local G = gScore[Current] + Length(Current, Node) local F = G + H if not Parent[Node] and not ClosedList[Node] then Parent[Node] = Current fScore[Node] = F gScore[Node] = G table.insert(OpenList, Node) OpenList = SortUp(OpenList, #OpenList) end if G < gScore[Node] then Parent[Node] = Current gScore[Node] = G fScore[Node] = F end end end until #OpenList <= 0 if #OpenList <= 0 then -- No path. return {} end -- Retrace path. local Path = {Current} Current = Parent[Current] repeat if Current then table.insert(Path, Current) if Parent[Current] == Current then break end Current = Parent[Current] end until not Current local Output = {} -- Reverse path. for i = #Path, 1, -1 do table.insert(Output, Path[i].Position) end if Current then return Output end end return A_Star