The Spatial Query API is a better option to use for this than Touched & TouchEnded. Every time the seat occupant changes, check to see if the player got up. If they did then query with GetPartsInPart along the lines of this snippit:
-- first, make an array of CarDeckWeld parts to use as a filtered list
local FilterList = {ship.CarDeckWeld1, ship.CarDeckWeld2}
-- second, create OverlapParams object for the query
local params = OverlapParams.new()
params.FilterType = Enum.RaycastFilterType.Whitelist
params.FilterDescendantsInstances = FilterList
-- third, handle occupant changed
car.Seat:GetPropertyChangedSignal("Occupant"):Connect(function(plr)
if script.Parent.Occupant == nil then
local overlappingParts = workspace:GetPartsInPart(car.BoundingPart, params)
if #overlappingParts > 0 then
local Weld = Instance.new("WeldConstraint")
Weld.Name = "CarDeckWeld"
Weld.Part0 = car.BoundingPart
Weld.Part1 = overlappingParts[1]
end
end
end)
where car.BoundingPart
is a part in the car, sized so it contains the entire car. that will ensure any part of the car can be parked on a CarDeckWeld part and still trigger the weld.