Normally when you go on a vehicle seat, the engine automatically creates a weld called SeatWeld where the C0 Position’s Y value is half the height of vehicle seat part to offset the character correctly.
However, if you dynamically scale the model with ScaleTo in runtime while the player is currently already in the vehicle seat, the previously mentioned Y position doesn’t dynamically update accordingly, thus making the character sink or rise above the vehicle seat.
Currently this can be avoided to listening both to the Model being resized and when the SeatWeld exists, but it requires a somewhat awkward fix as you need to yield for the seatweld to exist and checking for the Model being resized is not very optimized at the moment wrt relying on the Changed rbxsignal.
Here’s a generalized view of the needed workaround
local Connection1 = Model.Changed:Connect(function(param)
if param == "ScaleFactor" then
SeatWeld.C0 = SeatWeld.C0.Rotation + Vector3.new(0, VehicleSeat.Size.Y / 2, 0)
end
end)
local Connection2;
Connection2 = SeatWeld.AncestryChanged:Connect(function(_, newParent)
if newParent == nil then
Connection1 :Disconnect()
Connection2 :Disconnect()
end
end)