Higher pings = Higher delay time in controls such as steering. Works perfectly fine and smooth in studio.
local seat = script.Parent.VehicleSeat local engine = script.Parent.Body:WaitForChild("Engine") local motors = script.Parent.Motors:GetChildren() local servos = script.Parent.Servos wait(1) engine.Anchored = false local speed = 0 ---//Main while wait() do if seat.Throttle == 0 then if speed > 1 then speed = speed - 1 elseif speed > 0 then speed = 0 elseif speed < -1 then speed = speed + 1 elseif speed < 0 then speed = 0 end else speed = speed + seat.Throttle speed = speed > seat.MaxSpeed and seat.MaxSpeed or speed < -seat.MaxSpeed and -seat.MaxSpeed or speed end for _, motor in pairs(motors) do motor.AngularVelocity = -seat.Throttle * 110 end servos.Right.TargetAngle = -seat.Steer * 20 servos.Left.TargetAngle = -seat.Steer * 20 end local VehicleSeat = script.Parent:WaitForChild("VehicleSeat") VehicleSeat.Changed:Connect(function(prop) if prop == "Occupant" then local humanoid = VehicleSeat.Occupant if humanoid then local player = game:GetService("Players"):GetPlayerFromCharacter(humanoid.Parent) if player then VehicleSeat:SetNetworkOwner(player) end else VehicleSeat:SetNetworkOwnershipAuto() end end end)
I'm assuming you're talking of special animations (such as tyre rotation) rather than the actual movement of the vehicle, as the movement should be fine considering the controller is the network owner of the vehicle -- unless you set otherwise.
In your current setup, the server is looking for user input. When a user presses the D key, the client updates the VehicleSeat's Steer property which is automatically replicated to the server -- yes, another undocumented behaviour but you had that figured out. This update has to be sent to the server, and as data takes time to travel, it also takes time for the server to receive this change.
The way you've set up your networking is quite bad.
The controlling client should be performing the animation itself, immediately when it notices that the user wants to steer. It should then send a status update to the server, telling whether it is turning left or right. The server can listen to changes within the Steer property if you don't want to go the remote route.
When the server then receives this status update, it should inform other clients of it rather than doing the animation itself (unless it's very important for the server to know the rotation of the servos). The other clients then do the animation themselves.
This is considered the proper way to do networking related to purely visual effects. You can also optimize performance -- what's the point of doing the animation if the client is nowhere near enough to see it?