Can't Cancel Movement

So I have a while loop that causes an NPC to MoveTo a player while they’re in attack mode.
However, when they’re out of attack mode they still move towards the player.

I’ve tried doing :Move(Vector3.new(0,0,0)) when the mode changes, but that doesn’t cancel it. I’ve also tried usig MoveTo() again to make it move to it’s own posistion. But it still only moves towards the player it was attacking.

Any ideas on how I can cancel the movement?

have it move towards it’s own position. That should work.

Try doing MoveTo on the NPC position

Already tried it. :pensive: But ty for the suggestion.

It could be due to how your code is set up that setting it to its own position doens’t work, may we see your code

:pensive: Still, I’m glad you guys are trying to help. o7

Yeh. Sure. I’ll get the relevant parts. Gimme a moment.

script.Parent.AttributeChanged:Connect(function(attribute)
local list = {}
for i,v in pairs(script.Parent.Parent:GetChildren()) do
	if v:IsA("Model") then
		table.insert(list,#list + 1,v)
	end
end

local stage = script.Parent:GetAttribute("Stage")
if stage == 'Attacker' or stage == 'Attacker' then
	local is_attacking = stage == 'Attacker' or stage == 'Attacker'
	local targ = script.Parent.Target.Value
	local hrp = script.Parent.HumanoidRootPart
	while script.Parent.Target.Value ~= nil and is_attacking do
		wait()
		if stage == 'Attacker' or stage == 'Attacker' then
			local cooldownwait = math.random(atcdmin,atccmax)
			if (hrp.Position - targ.Position).magnitude >= 4 then
				local dest = (script.Parent.Target.Value.Position - (script.Parent.Head.CFrame.LookVector * 4))

				local path = pathfind:CreatePath()
				path:ComputeAsync(script.Parent.HumanoidRootPart.Position,dest)
				if stage == 'Attacker' or stage == 'QuickAttacker' then
					hum:MoveTo(dest)
				end

			end
			if (hrp.Position - targ.Position).magnitude <= 7 then
				hum:Move(Vector3.new(0,0,0))
				if cooldown == false then
					hum:Move(Vector3.new(0,0,0))
					if script.Parent:GetAttribute('Stage') == 'Attacker' then
						mod.Attack(char,anims,13,.75,char.Tool.Blade,.65,false)
					elseif script.Parent:GetAttribute('Stage') == 'QuickAttacker' then
						mod.Attack(char,anims,13,.75,char.Tool.Blade,.65,true)
					end

					cooldown = true
					delay(cooldownwait, function() cooldown = false end)
					hum:Move(Vector3.new(0,0,0))
					if script.Parent:GetAttribute('Stage') == 'Attacker' then
						local maxattackers = script.Parent.Parent.Parent:GetAttribute('MaxAttackers')
						if callcd == false and (mod.CountStages('Stage','QuickAttacker',list) + mod.CountStages('Stage','Standby',list)) < (maxattackers) then
							mod.CallForHelpAttack(script.Parent,1,list,script.Parent.Target.Value)
							callcd = true
							delay(10,function() callcd = false end)
						end
					end
					if stage == 'QuickAttacker' then
						if math.random(1,3) == 1 then
							local attackers = mod.GetNpcsOfStage('Attacker',list)

							for i,v in pairs(attackers) do
								--v:SetAttribute('Stage','QuickAttacker')
							end
							--script.Parent:SetAttribute('Stage','Attacker')
						end
					end
				end
			end
		end
	end

The next part is the attack function that chances the attribute after.

local function Swing()
	if char:GetAttribute('Stage','Attacker') or char:GetAttribute('Stage','QuickAttacker') then
		char:SetAttribute('Stage','Swinging')
		char.Head.AttackIndicator.Enabled = false 
		local hitbox = rayhitbox:Initialize(blade,{char,char.Parent:GetChildren()})
		hitbox:DebugMode(false)
		local function MoveForward()
			hum:Move(Vector3.new(0,0,0))
			hum.WalkSpeed = 3
			local movetopos = Vector3.new(0,0,-1)
			hum:Move(movetopos)
			delay(.3,function() loadanim:Play() end)
			delay(.65,function()hum:Move(Vector3.new(0,0,0))end)
			hum.WalkSpeed = speed
			if quick == true then
				char:SetAttribute('Stage','Triggered')
			elseif quick == false then
				char:SetAttribute('Stage','Attacker')


			end
		end

		coroutine.resume(coroutine.create(MoveForward))
		hitbox.OnHit:Connect(function(hit,humanoid)
			humanoid:TakeDamage(dmg)
		end)
		
	hitbox:HitStart()
	delay(swingtime,function() hitbox:HitStop() end)

	end
end

This is the part that runs when the attribute is changed to triggered

elseif stage == 'Triggered' then
	local anim = script.Parent.Anims.Idle
	local loadanim = hum:LoadAnimation(anim)
	loadanim.Looped = true
	loadanim:Play()
	script.Parent.Humanoid:MoveTo(script.Parent.HumanoidRootPart.Position)
	while stage == 'Triggered' do 
		wait(1)
		local hrp = script.Parent.HumanoidRootPart
		local targ = script.Parent.Target.Value
		if script.Parent.Target.Value ~= nil and (hrp.Position - targ.Position).magnitude >= npcdistance then
			script.Parent.Humanoid:MoveTo((targ.Position + Vector3.new(math.random((-1 * npcdistance),npcdistance),0,math.random((-1 * npcdistance),npcdistance)) - (script.Parent.Head.CFrame.LookVector * 5)))   
		end
		if script.Parent.Target.Value == nil then
			script.Parent:SetAttribute('Stage','Idle')
		end
		local list = {}
	end
end
end)

HumanoidRootPart.Position doesn’t work properly as far as I know, instead, use HumanoidRootPart.CFrame.Position

ohhhhh tysm. Lemme try this. C:

Didn’t work. :pensive: Any other ideas?

Sorry, I don’t have any idea how to stop this, but, I do recommend using humanoid.WalkToPoint() if this still causes problems. Also, I found another thread about this that might help

Oh I’ll try this. Send the link just in case. I’ll let you know if it works.

it’s a hyperlink on the word thread.

Thread wasn’t much help. :C Oh well.