This is supposed to make a boat move in the direction that's facing, even if you turn while you're going forward. However, the lookvector of the boat's primarypart changes, but the velocity of the bodymover does not, despite being set to move based on the part's lookvector.
local re = game.ReplicatedStorage:WaitForChild("re") local boat = script.Parent local bounce = false function goForward(move, speed) move.Parent = boat.basepart1 move.MaxForce = Vector3.new(math.huge,0,math.huge) move.Velocity = speed boat.basepart1.Velocity = speed boat.stats.acceleration.Value = 1 bounce = true while boat.stats.forward.Value == true do wait(0.5) if boat.stats.acceleration.Value <= 4.6 and boat.basepart1.Velocity.magnitude < 36 then move.Velocity = move.Velocity + (Vector3.new(boat.basepart1.CFrame.lookVector.x,boat.basepart1.CFrame.lookVector.y,boat.basepart1.CFrame.lookVector.z))*boat.stats.acceleration.Value boat.stats.acceleration.Value = boat.stats.acceleration.Value + 0.3 end end bounce = false boat.stats.acceleration.Value = 1 while boat.stats.forward.Value == false and boat.basepart1.Velocity.magnitude > 2.9 do wait(0.5) print(boat.basepart1.Velocity.magnitude," ",boat.stats.acceleration.Value) move.Velocity = move.Velocity - Vector3.new(boat.basepart1.CFrame.lookVector.x, 0, boat.basepart1.CFrame.lookVector.z)*boat.stats.acceleration.Value if boat.stats.acceleration.Value <=5 then boat.stats.acceleration.Value = boat.stats.acceleration.Value + 1 end end if boat.basepart1.Velocity.magnitude < 4.6 then move.Velocity = Vector3.new(0,0,0) end end function turn(move, direction) if direction == "a" then while direction == "a" and boat.stats.turning.Value == true do wait() boat:SetPrimaryPartCFrame(boat.PrimaryPart.CFrame * CFrame.Angles(0,0.004,0)) end elseif direction == "d" then while direction == "d" and boat.stats.turning.Value == true do wait() boat:SetPrimaryPartCFrame(boat.PrimaryPart.CFrame * CFrame.Angles(0,-0.004,0)) end end end re.OnServerEvent:connect(function(player, input, stroke) if boat.stats.driver.Value == "" then boat.stats.driver.Value = tostring(player) end if (tostring(player)) == boat.stats.driver.Value then if input and stroke then if input == "w" and stroke == "press" and bounce == false then bounce = true boat.stats.lastSpeed.Value = boat.basepart1.BodyVelocity.Velocity boat.stats.forward.Value = true goForward(boat.basepart1.BodyVelocity, boat.basepart1.BodyVelocity.Velocity) elseif input == "w" and stroke == "release" then boat.stats.lastSpeed.Value = boat.basepart1.BodyVelocity.Velocity boat.stats.forward.Value = false elseif input == "a" and stroke == "press" then boat.stats.turning.Value = true turn(boat.basepart1.turn, "a") elseif input == "d" and stroke == "press" then boat.stats.turning.Value = true turn(boat.basepart1.turn, "d") elseif input == "a" and stroke == "release" then boat.stats.turning.Value = false --stopTurn(boat.basepart1.turn) elseif input == "d" and stroke == "release" then boat.stats.turning.Value = false --stopTurn(boat.basepart1.turn) end end end end)
The part that the problem occurs in is most likely the first while loop, since that's where the acceleration/forward movement of the boat occurs. The second while loop is only there to de-accelerate the boat after you've let go of the W key.