This is my first post and just started programming with Roblox, I have coded before but many years ago.
I am currently making my first game and having issues with the multi-player aspect of Roblox design, I have an NCP script which spawns R6 humanoids and for the first player that joins my game it works great and the NPC follows and tries to kill the player.
The problem is that any new players that join the game the NPC still only follows the first player.
I am using the find closest Humanoid and the NPC is in ReplicatedStorage but have also tried in the WorkSpace and many other things but can’t understand what is wrong.
local hum = script.Parent:FindFirstChild(“Humanoid”)
local torso = script.Parent:FindFirstChild(“HumanoidRootPart”)
Can anyone point me in the correct direction? I can post the code if it helps.
Make a part that detects how much studs the player is away from the player, if it is the studs you want it to be then script the npc’s walkto to where you want it to go.
So, you need to get your NPC model first. Define it in your script like you have done already.
local NPC = script.Parent
local Humanoid = script.Parent:FindFirstChild(“Humanoid”)
local HRP = script.Parent:FindFirstChild(“HumanoidRootPart”)
Next you want to make a function which gets the player closest to the NPC.
local function GetClosestPlayer(range)
local List = {}
local Target = nil
for i, v in pairs(game.Players:GetPlayers()) do
local dist = v:DistanceFromCharacter(HRP.position)
if dist <= range then
table.insert(List, {dist, v})
end
end
table.sort(List, function(A, B)
return A[1] < B[1]
end)
pcall(function()
Target = List[1][2]
end)
return Target
end
This will return the closest player within a range of whatever you choose. Now time to move the NPC.
local NPC = script.Parent
local Humanoid = script.Parent:FindFirstChild(“Humanoid”)
local HRP = script.Parent:FindFirstChild(“HumanoidRootPart”)
local function GetClosestPlayer(range)
local List = {}
local Target = nil
for i, v in pairs(game.Players:GetPlayers()) do
local dist = v:DistanceFromCharacter(HRP.position)
if dist <= range then
table.insert(List, {dist, v})
end
end
table.sort(List, function(A, B)
return A[1] < B[1]
end)
pcall(function()
Target = List[1][2]
end)
return Target
end
while true do
wait()
local Target = getClosestPlayer(30) -- // change 30 to the max distance
if Target == nil then return end
Humanoid:MoveTo(Target.PrimaryPart)
Humanoid.MoveToFinished:Wait()
end
Thanks for the quick reply and all the advice I think i am doing what you all have quoted my script is below that only works for the first player.
“```”
wait()
local hum = script.Parent:FindFirstChild(“Humanoid”)
local torso = script.Parent:FindFirstChild(“HumanoidRootPart”)
local max_dist = 200
function findNearestTorso()
for _, player in pairs(game.Players:GetPlayers()) do
if player.Character ~= nil then
local target_torso = player.Character:FindFirstChild(“HumanoidRootPart”)
if target_torso ~= nil then
if (target_torso.Position - torso.Position).magnitude < max_dist then
return target_torso
end
end
end
end
end
local old_pos = torso.Position
wait(math.random(0, 90)/100)
while hum ~= nil do
local target = findNearestTorso()
if target ~= nil then
while target ~= nil and target.Parent ~= nil and hum ~= nil do
if (target.Position - torso.Position).magnitude < max_dist then
hum:MoveTo(target.Position, target)
if target.Position.Y > torso.Position.Y + 3 then
hum.Jump = true
end
if (old_pos - torso.Position).magnitude < 0.5 then
if math.random(1, 3) == 1 then
torso.Velocity = torso.CFrame.lookVector * -40
hum:MoveTo(torso.Position + Vector3.new(math.random(-1, 1), 0, math.random(-1, 1))*20)
wait(1.2)
else
hum.Jump = true
hum:MoveTo(target.Position, target)
end
end
else break end
old_pos = torso.Position
wait(0.5)
end
end
wait(4)
end
“```”