-
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.