Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Why is Humanoid:MoveTo not functioning correctly?

I'm trying to make a smart NPC system in which enemies will try to move around the character, so what I've done is made them move randomly in front of my character, however, they all seem to act as if I'm using Model:MoveTo instead of Humanoid:MoveTo

TravelTarget = function(npc,dist,rot)
	local target = npc.Data.Target.Value
	local h = npc.Humanoid
	local nc = CFrame.new(
		npc.HumanoidRootPart.CFrame.Position,
		target.CFrame.Position
	)
	local rc = nc - nc.Position
	local x,y,z = rc:toOrientation()
		npc.HumanoidRootPart.CFrame = nc * CFrame.Angles(-x,0,-z)
	
	rot = math.random(unpack(rot)) or math.random(-90,90)
	local location = (
		(target.CFrame * CFrame.Angles(0,math.rad(rot),0)) * CFrame.new(0,0,-dist)
	)
	h:MoveTo(location.Position)
	wait(0.2)
	h:MoveTo(npc.HumanoidRootPart.CFrame.Position)
	h.MoveToFinished:Wait()
end

Visualization: https://gyazo.com/6e345fa5c606d1fca808860db1c6e6c6

I can confirm that the issue isn't ping or server lag as well.

3 comments

0

I can't see the gif.

0

It looks like you have too many NPCs trying to go to the same spot, so either increase their radius, if you're using the pathfinding service, or have them go to a spot near but not directly on top of each other.

0

It still happens when I have one NPC. No PFS by the way.

2 answers

Figured it out on my own, I had to rotate them using a BodyGyro instead of directly changing the CFrame of the character.

1 comment

0

Why CFrame.Position? Just keep CFrame,

Because you forgot to put the "part". Do this:

TravelTarget = function(npc,dist,rot)
    local target = npc.Data.Target.Value
    local h = npc.Humanoid
    local nc = CFrame.new(
        npc.HumanoidRootPart.CFrame.Position,
        target.CFrame.Position
    )
    local rc = nc - nc.Position
    local x,y,z = rc:toOrientation()
        npc.HumanoidRootPart.CFrame = nc * CFrame.Angles(-x,0,-z)

    rot = math.random(unpack(rot)) or math.random(-90,90)
    local location = (
        (target.CFrame * CFrame.Angles(0,math.rad(rot),0)) * CFrame.new(0,0,-dist)
    )
    h:MoveTo(location.Position, location)
    wait(0.2)
    h:MoveTo(npc.HumanoidRootPart.CFrame.Position, npc.HumanoidRootPart)
    h.MoveToFinished:Wait()
end

1 comment

0

The part parameter isn't necessary, besides, that brings an undesired effect.

This discussion is preserved as it was. New answers, comments, and votes are closed.