This is the first time that I've attempted to make a vehicle on my own, so it might be a little iffy.
My issue is that when the network owner is changed, the boat will go back to the last position that the occupant was at when they had last driven it.
Example:
The first player could drive the boat for a bit and leave. The boat will then return to it's initial position before the ownership was set.
Let's say that the first player then waited till about 10 others used the same boat.
Once this player then jumps back on to drive the boat, it will return to the position that they exited it.
It happens at the exact moment that the NetworkOwnership is switched to nil, or to another player.
Video of problem;
https://www.youtube.com/watch?v=XptL4AZY4DE&ab_channel=AllMight
ServerScript for when the boats driver changes:
local boat = script.Parent
local vehicleSeat = boat:WaitForChild("VehicleSeat")
local engine = boat:WaitForChild("Engine")
local bodyGyro = engine:WaitForChild("BodyGyro")
local bodyPosition = engine:WaitForChild("BodyPosition")
local controlClient = script:WaitForChild("ControlClient")
local players = game:GetService("Players")
local newControl = nil
local origin = boat:GetPivot()
local currentPosition = bodyPosition.Position
local currentGyro = bodyGyro.CFrame
local function clearSettings()
if newControl ~= nil then
newControl.Disabled = true
newControl:Destroy()
end
for _, v in pairs(boat:GetChildren()) do
if v:IsA("BasePart") and v.Anchored == false then
v:SetNetworkOwner(nil)
end
end
end
vehicleSeat:GetPropertyChangedSignal("Occupant"):Connect(function()
local driver = vehicleSeat.Occupant
origin = boat:GetPivot()
currentPosition = bodyPosition.Position
currentGyro = bodyGyro.CFrame
if driver ~= nil then
if newControl ~= nil then
newControl:Destroy()
end
local character = driver.Parent
local player = players:GetPlayerFromCharacter(character)
if player ~= nil then
newControl = controlClient:Clone()
for _, v in pairs(boat:GetChildren()) do
if v:IsA("BasePart") and v.Anchored == false then
v:SetNetworkOwner(player)
end
end
newControl.Parent = character
newControl.Disabled = false
end
elseif driver == nil then
clearSettings()
end
end)
LocalScript which is placed inside the player's character so they can control the boat.
local isBoat = script:WaitForChild("IsBoat")
local boat = (isBoat.Value)
local vehicleSeat = boat:WaitForChild("VehicleSeat")
local engine = boat:WaitForChild("Engine")
local bodyGyro = engine:WaitForChild("BodyGyro")
local bodyPosition = engine:WaitForChild("BodyPosition")
while true do
if vehicleSeat.Throttle == 1 then
local currentPosition = boat:GetPivot() * CFrame.new(-5, 0, 0)
local newVectors = Vector3.new(currentPosition.X, 51, currentPosition.Z)
bodyPosition.Position = newVectors
elseif vehicleSeat.Throttle == -1 then
local currentPosition = boat:GetPivot() * CFrame.new(15, 0, 0)
local newVectors = Vector3.new(currentPosition.X, 51, currentPosition.Z)
bodyPosition.Position = newVectors
end
if vehicleSeat.Steer == 1 then
bodyGyro.CFrame = boat:GetPivot() * CFrame.Angles(math.rad(-15), 0, 0)
elseif vehicleSeat.Steer == -1 then
bodyGyro.CFrame = boat:GetPivot() * CFrame.Angles(math.rad(15), 0, 0)
elseif vehicleSeat.Steer == 0 then
bodyGyro.CFrame = boat:GetPivot() * CFrame.lookAt(boat:GetPivot().Position, boat:GetPivot().LookVector * 15)
end
wait(0.05)
end
