Try adding the rotation specifically not combining 2 CFrames
local TweenService = game:GetService("TweenService")
local part = script.Parent
local rotationGoal = 360 * 4 -- Rotate 4 times (360 degrees per rotation)
local tweenInfo = TweenInfo.new(
-- Duration of the tween in seconds
10,
Enum.EasingStyle.Linear,
Enum.EasingDirection.InOut,
-- Number of times to repeat
0, -- -1 means infinite
false,
0
)
local rotationTween = TweenService:Create(
part,
tweenInfo,
{Rotation = part.Rotation + Vector3.new(0, 0, rotationGoal)}
)
-- Start the tween
rotationTween:Play()
-- Stop the tween after it completes 4 rotations
rotationTween.Completed:Connect(function()
rotationTween:Cancel()
end)
This is because of the way CFrame math works. When you do StartCFrame * CFrame.Angles(math.rad(1440),0,0), it isn’t stored as “a 1440 degree rotation.” Yes, you’re rotating it by 1440 degrees, but the final CFrame will have a rotation between -180 and 180 on that particular axis, and that’s what you’re passing to the tween.
To achieve something like this, you’ll want to use a custom tween implementation. I recommend Tween.lua by Sleitnick, but there are plenty out there to use.