Advertisement
HowToRoblox

NPCHandler

Jan 23rd, 2023
2,091
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.72 KB | None | 0 0
  1. local numNPCs = 50
  2.  
  3. local npcTypes = game:GetService("ServerStorage"):WaitForChild("NPCTypes")
  4. local npcAnimations = game:GetService("ServerStorage"):WaitForChild("NPCAnimations")
  5.  
  6. local pathPoints = workspace:WaitForChild("PathPoints")
  7.  
  8. local npcFolder = Instance.new("Folder")
  9. npcFolder.Name = "NPCs"
  10. npcFolder.Parent = workspace
  11.  
  12. local rnd = Random.new()
  13.  
  14. local ps = game:GetService("PhysicsService")
  15. local npcCG = "NPCs"
  16. ps:RegisterCollisionGroup(npcCG)
  17. ps:CollisionGroupSetCollidable(npcCG, npcCG, false)
  18.  
  19.  
  20.  
  21. function spawnNPC()
  22.    
  23.     local allNPCs = npcTypes:GetChildren()
  24.    
  25.     local newNPC = allNPCs[rnd:NextInteger(1, #allNPCs)]:Clone()
  26.    
  27.     for _, d in pairs(newNPC:GetDescendants()) do
  28.         if d:IsA("BasePart") then
  29.             d.CollisionGroup = npcCG
  30.         end
  31.     end
  32.    
  33.     local pathList = pathPoints:GetChildren()
  34.  
  35.     local randomPoint = pathList[rnd:NextInteger(1, #pathList)]
  36.     newNPC.HumanoidRootPart.CFrame = randomPoint.CFrame
  37.    
  38.     newNPC.Parent = npcFolder
  39.    
  40.    
  41.     local allIdleAnims = npcAnimations:WaitForChild("IdleAnimations"):GetChildren()
  42.     local randomIdleAnim = allIdleAnims[rnd:NextInteger(1, #allIdleAnims)]
  43.     local idleAnim = newNPC.Humanoid:LoadAnimation(randomIdleAnim)
  44.    
  45.     local allWalkAnims = npcAnimations:WaitForChild("WalkAnimations"):GetChildren()
  46.     local randomWalkAnim = allWalkAnims[rnd:NextInteger(1, #allWalkAnims)]
  47.     local walkAnim = newNPC.Humanoid:LoadAnimation(randomWalkAnim)
  48.    
  49.    
  50.     local currentPoint = randomPoint
  51.    
  52.     local lastPoint = nil
  53.    
  54.     while true do
  55.        
  56.         task.wait(rnd:NextNumber(0, 3))
  57.        
  58.         idleAnim:Stop()
  59.         walkAnim:Play()
  60.        
  61.        
  62.         local relativePoints = currentPoint:GetChildren()
  63.        
  64.         local targetPointValue = relativePoints[rnd:NextInteger(1, #relativePoints)]
  65.        
  66.         while targetPointValue.Value == lastPoint do
  67.             table.remove(relativePoints, table.find(relativePoints, targetPointValue))
  68.             targetPointValue = relativePoints[rnd:NextInteger(1, #relativePoints)]
  69.         end
  70.        
  71.         local targetPoint = targetPointValue.Value
  72.        
  73.         local rndX = rnd:NextNumber(-0.2, 0.2)
  74.         local rndZ = rnd:NextNumber(-0.2, 0.2)
  75.         local rndOffset = Vector3.new(rndX, 0, rndZ)
  76.        
  77.         local goalPos = targetPoint.Position + rndOffset
  78.            
  79.         newNPC.Humanoid:MoveTo(goalPos)
  80.        
  81.        
  82.         local targetReached = false
  83.        
  84.         local moveToConnection
  85.         moveToConnection = newNPC.Humanoid.MoveToFinished:Connect(function(reached)
  86.            
  87.             targetReached = reached
  88.            
  89.             if targetReached then
  90.                 moveToConnection:Disconnect()
  91.                
  92.                 walkAnim:Stop()
  93.                 idleAnim:Play()
  94.                
  95.             else
  96.                 newNPC.Humanoid:MoveTo(goalPos)
  97.             end
  98.         end)
  99.        
  100.        
  101.         repeat
  102.             task.wait(0.2)
  103.         until targetReached
  104.        
  105.         lastPoint = currentPoint
  106.         currentPoint = targetPoint
  107.     end
  108. end
  109.  
  110.  
  111. for i = 1, numNPCs do
  112.     task.spawn(spawnNPC)
  113. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement