-
What do you want to achieve? I want to create an NPC Line System
-
What solutions have you tried so far?
Searched all over the devforum but can’t find a simple answer -
Any support will be great, thanks!
Are you referring to dialogue, pathfinding, or something else? Sorry if it comes across as nitpicky, but the term ‘line’ doesn’t really click to anything for me.
So like a line system, where an npc comes to pay at a till and then another npc comes and goes behind the one who’s paying and then another goes behind the other and then it goes on and on.
If you want to line a bunch of NPCs up, using Humanoid:MoveTo with relative destination values on several humanoids should do the trick.
Here’s an annotated script that pretty much covers everything:
local debris = game:GetService'Debris'; local npc = game.ServerStorage:WaitForChild'Rig'; --can be chosen at random instead local origin = Vector3.new(20, 0, 20); --place in which our npcs will spawn at local exit = -origin; --place in which our npcs leave to local line = { --storage of all our variables that have to do with the line, i find the script to be more readable with this start = Vector3.new(0, 0, 0); --value that represents the location of the start of the line spacing = 2; --value that represents the distance between each participant of the queue direction = Vector3.new(1, 0, 0); --value that represents the direction of the line. in this case the line extrudes out in the x-axis queue = {}; --table of humanoids in our line (not the model, the actual humanoid object) }; local function update() for i, attendant in line.queue do attendant:MoveTo(line.start + line.direction * line.spacing * (i - 1)); --calculate the physical destination of our npc end end task.defer(function() --handle removing npcs from the line while task.wait(10 / math.max(#line.queue, 1)) do --deletion accelerates based on the queue size (so as to not make it infinitely grow) local departer = table.remove(line.queue, 1); --remove the person in the front of the line, table.remove returns that person if they exist if not departer then continue; end --escape this iteration if there was nobody in the front of the line departer:MoveTo(exit); --make the npc walk to our exit update(); --update the humanoid's positions debris:AddItem(departer.Parent, (exit - line.start).Magnitude / departer.WalkSpeed); end end) while task.wait(2) do --handle adding npcs to the line local addition = npc:Clone(); --make a new npc local hum = addition:WaitForChild'Humanoid'; addition.Parent = workspace; addition:PivotTo(CFrame.new(origin + Vector3.new(0, hum.HipHeight))); --spawn our npc at the origin and translate him/her upwards according to their height line.queue[#line.queue + 1] = hum; --add our humanoid to the queue update(); --update the humanoid's positions end If something doesn’t make sense, I can probably explain it. Here’s what my product looked like:
This is exactly what i want, Thanks, Let me try to implement this system into my game!
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.