:MoveTo() doesn't work with Touched if player was seated originally

If you were sitting, and you moved to a part, then went to a part that uses the touched logic, it will not do anything under that touched logic. This is for ANY touched logic. Here’s my move to script, it’s client sided.

local button = script.Parent
local frame = script.Parent.Parent.Parent.Parent
local char = game.Players.LocalPlayer.Character

function onClicked()
	frame.Visible = false
	button:FindFirstChild("clickfast.wav"):Play()
	char:MoveTo(game.Workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position)
end

button.MouseButton1Click:Connect(onClicked)
1 Like

Seats are kind of weird when trying to move the character when they’re seated.

Usually you either have the character jump (Humanoid.Jump = true) or you delete the seat weld.

If I do either of those it still does the same think.

So something like this? local button = script.Parent
local frame = script.Parent.Parent.Parent.Parent
local char = game.Players.LocalPlayer.Character

function onClicked()
local hum = char:FindFirstChild(“Humanoid”)
if hum and hum:IsA(“Humanoid”) then
hum.Jump = true
print(“Jumped!”)
end
frame.Visible = false
button:FindFirstChild(“clickfast.wav”):Play()
char:MoveTo(game.Workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position)
end

button.MouseButton1Click:Connect(onClicked)

Destroy the weld on the HumanoidRootPart or set Humanoid Sit to false, then move them.
Jumping works but it looks sloppy.. The other way done fast enough will not even show itself.

The jumping doesn’t work for some reason. However, I’ll try and give you a confirmation if the other way works or not.

None of these ways work, can you atleast show an example from the code to make sure I’m right. This is what I did:

local button = script.Parent
local frame = script.Parent.Parent.Parent.Parent
local char = game.Players.LocalPlayer.Character

function onClicked()
	local hum = char:FindFirstChild("Humanoid")
	if hum and hum:IsA("Humanoid") then
		hum.Sit = false
	end
	frame.Visible = false
	button:FindFirstChild("clickfast.wav"):Play()
	char:MoveTo(game.Workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position)
end

button.MouseButton1Click:Connect(onClicked)

Also there isn’t a weld on the HumanoidRootPart

It’s in the seat when they sit down as SeatWeld, it’s welded to the HumanoidRootPart.

so I just destroy it? because it destroys even when the player gets off the seat

local button = script.Parent
local frame = script.Parent.Parent.Parent.Parent
local char = game.Players.LocalPlayer.Character

function onClicked()
	local hum = char:FindFirstChild("Humanoid")
	if hum and hum:IsA("Humanoid") then
		local weld = hum.SeatPart:FindFirstChild("SeatWeld")
		if weld and weld:IsA("Weld") then
			weld:Destroy()
		end
	end
	frame.Visible = false
	button:FindFirstChild("clickfast.wav"):Play()
	char:MoveTo(game.Workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position)
end

button.MouseButton1Click:Connect(onClicked)

Yeah I tried this and it doesn’t work.

I’m not sure how you’re looking to trigger this.. that is why I’m not posting a script.
This will wait 2 seconds and stand them up.. maybe you can figure it out from that.

local seat = script.Parent
seat:GetPropertyChangedSignal("Occupant"):Connect(function()
	local humanoid = seat.Occupant
	if humanoid then task.wait(2)
		for _, weld in pairs(seat:GetChildren()) do
			if weld:IsA("Weld") then
				weld:Destroy()
			end
		end
	end
end)

So would this.

local seat = script.Parent
seat:GetPropertyChangedSignal("Occupant"):Connect(function()
	local humanoid = seat.Occupant
	if humanoid then task.wait(2)
		
		seat:FindFirstChild("SeatWeld"):Destroy()
		
	end
end)

If you can get seat even just this would work

seat:FindFirstChild("SeatWeld"):Destroy()

or

seat.SeatWeld:Destroy()

I’m triggering this as a teleport to spawn button. You teleport to the spawn which is client sided of course. Now this does work if I put the first script inside the seat. But how do I make it so when the player clicks the button, it removes the SeatWeld, basically doing the same thing like the first script except not waiting two seconds.

Now you see my problem posting this. You click it, get the seat, and seat:FindFirstChild(“SeatWeld”):Destroy()… Teleport.

im a beginner at coding so im sorry if im making things confusing for you, and also i just started using devforums again so yeah

No problem at all really, but it is harder to explain things like this. You’re fine, I need to get better at it.

so make player jump off the seat?

Basically yeah, but it doesn’t work for me when I do it. That’s because the player is already getting jumped off when it’s being teleported.

:puzzle_piece: Why it happens

1. :MoveTo() on the client doesn’t replicate physics

When you call:

char:MoveTo(workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position)

from a LocalScript, you’re moving the character only visually on the client, but:

  • The server still thinks the character is in its previous position.
  • Because Touched events are server-side physics events, the server’s copy of the character never actually touched the new part.

So:

On your screen you moved, but on the server, your HumanoidRootPart never left the chair.

That’s why .Touched events don’t trigger.


2. Why it happens for “ANY touched logic”

This isn’t specific to your code — any Touched event won’t fire when movement happens client-only, because physics are simulated on the server.

Even if the part is set to CanTouch = true, the event runs where physics happen, i.e., the server.


:white_check_mark: Solutions

Option 1: Move the character on the server

Make your LocalScript ask the server to teleport the character.

:light_bulb: Example:

LocalScript:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local moveEvent = ReplicatedStorage:WaitForChild("MoveEvent")

local button = script.Parent
local frame = script.Parent.Parent.Parent.Parent
local player = game.Players.LocalPlayer

button.MouseButton1Click:Connect(function()
	frame.Visible = false
	button:FindFirstChild("clickfast.wav"):Play()
	moveEvent:FireServer()
end)

ServerScript (in ServerScriptService):

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local moveEvent = Instance.new("RemoteEvent")
moveEvent.Name = "MoveEvent"
moveEvent.Parent = ReplicatedStorage

moveEvent.OnServerEvent:Connect(function(player)
	local char = player.Character
	if not char then return end
	local spawnPos = workspace.MainGame.BuildStuff.Lobby.SpawnLocation.Position
	char:MoveTo(spawnPos)
end)

:white_check_mark: Now the server teleports the character, and the touched events will fire normally.


Option 2: Force server-side sync after MoveTo (less ideal)

If you must move locally (e.g. for fast visual teleports), you can send a small RemoteEvent to tell the server to update the character’s position right after:

-- After char:MoveTo(...)
game.ReplicatedStorage.SyncPosition:FireServer(char.HumanoidRootPart.Position)

Server script:

game.ReplicatedStorage.SyncPosition.OnServerEvent:Connect(function(player, pos)
	local char = player.Character
	if char then
		char:MoveTo(pos)
	end
end)

This makes sure the server’s physics state matches what you see.


Option 3: Simulate the touched behavior locally

If your touch logic is purely cosmetic (like lights or UI triggers), you can run it on the client with a simple magnitude check:

local hrp = char:WaitForChild("HumanoidRootPart")
local trigger = workspace.SomePart

if (hrp.Position - trigger.Position).Magnitude < 5 then
    -- Run local touched logic
end

But this won’t fire real .Touched events — only visual/sound logic.

I knew it was something about that. Thank’s for letting me know and I’ll add a solution to the post once I get to it. Currently I’m working on another game.