Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How can I keep 2 piece turret rotating and aiming in sync? Lerp is failing me...

Hello everyone,

I'm designing a turret that consists of two main components, the base of the turret that only needs to rotate on the Y axis and the barrel of the turret that I need to aim on the X and Z axis.

Posted below is the entire function I have setup for the aiming of the turret, currently I'm trying to keep them in sync through lerping, but the turret doesn't stay together perfectly the parts lag behind each other a bit. I have also tried tweening for this but the lag is even worse.

Another idea I had for this was using welds, but since the CFrame is based off of offset instead of realworld position I couldn't figure out how to rotate the bricks to face the correct way properly.

Does anyone have any idea how this problem could be solved?

Thanks for reading.

function aim(target)
	print("Aim function called")
	aiming = true
	
	repeat
		wait()
		local look = Vector3.new(target.Position.X,turretBase.Position.Y, target.Position.Z)
		local look2 = Vector3.new(target.Position.X,standBasePivot.Position.Y, target.Position.Z)

		local diff = (turretBase.CFrame.LookVector - CFrame.new(turretBase.CFrame.p,look).LookVector).Magnitude
		--print("turretBase diff:",diff)
		for i=0,1,0.01 do
			wait()
			
			local x,y,z = standBasePivot.CFrame:ToEulerAnglesXYZ()
			local x1,y1,z1 = standBase.CFrame:ToEulerAnglesXYZ()
			
			standBase.CFrame = standBase.CFrame:Lerp(CFrame.new(standBasePivot.CFrame.p, target.Position - Vector3.new(0,3,0)),i)
			
			turretBase.CFrame = CFrame.new(turretBase.CFrame.p) * CFrame.Angles(x1,y1,0)
			--turretBase.CFrame = turretBase.CFrame:Lerp(CFrame.new(turretBase.CFrame.p,look),i)

			--standBase.CFrame = standBase.CFrame:Lerp(CFrame.new(standBasePivot.CFrame.p) * CFrame.Angles(x1,y,z1),i)			
			if i > 0.3 then
				break
			end
		end
		local diff = (standBase.CFrame.LookVector - (CFrame.new(standBasePivot.CFrame.p, target.Position - Vector3.new(0,3,0))).LookVector).Magnitude
		--print("standBase diff:",diff)
		--[[for i=0,1,0.01/diff do
			wait()
			--turretBase.CFrame = turretBase.CFrame:Lerp(CFrame.new(turretBase.CFrame.p,look),i)
			standBase.CFrame = standBase.CFrame:Lerp(CFrame.new(standBasePivot.CFrame.p, target.Position - Vector3.new(0,3,0)),i)
			if i > 0.3 then
				break
			end
		end--]]
		local x,y,z = standBase.CFrame:ToEulerAnglesXYZ()
		print("X:",x,"Y",y,"Z",z)
		local dist = (myTorso.Position - target.Position).magnitude
	until target == nil or checkSight(target) == false or target.Parent.Humanoid.Health < 1 or dist < 10 or dist > searchRadius
	aiming = false
	print("Finished aiming...")
end

1 answer

The server side of it can be a little bit laggy it doesn't matter, what you are really doing is making a visual feature for the player. If you animate it on the client side you can allow it to update a lot faster without have the server's performance suffer. If you change the rotation/position of the two parts at the same time then you should theoretically get it to sync together by using this method.

This discussion is preserved as it was. New answers, comments, and votes are closed.