Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if table.getn(stats.weapons) then
- -- Aiming Reticle
- game:GetService("RunService").RenderStepped:connect(function()
- for i, weaponName in ipairs(stats.weapons) do
- local pos = rayCast(parts[weaponName].barrelBreach.Position, parts[weaponName].barrelTip.Position, 4999)
- local aimPart = parts.weapons:FindFirstChild(weaponName):FindFirstChild("AimPart")
- if aimPart ~= nil then
- aimPart.CFrame = aimPart.CFrame:Lerp(CFrame.new(pos), .5)
- --aimPart.CFrame = CFrame.new(pos)
- end
- end
- end)
- -- Turret controls
- while true do
- -- If not flipped
- if parts.base.Orientation.Z < 170 and parts.base.Orientation.Z > -170 then
- -- Table of weld updates to send to server
- local weldTable = {}
- -- Vector3 position where the mouse currently is pointing at, ignoring the vehicle model itself
- local mousePos = rayCast(camera.CFrame.Position , mouse.Hit.p, 4999)
- -- For each weapon
- for i, weaponName in ipairs(stats.weapons) do
- --- Weapon References
- local weapon = parts.weapons:FindFirstChild(weaponName)
- local barrelBreach = parts[weaponName].barrelBreach
- local barrelTip = parts[weaponName].barrelTip
- local traversalWeld = weapon:FindFirstChild("TraversalWeld")
- local elevationWeld = weapon:FindFirstChild("ElevationWeld")
- local weaponStats = stats[weaponName]
- --- Aiming Variables
- -- Where the turret is currently aiming
- local currentAimPos = rayCastIgnoreAll(barrelBreach.Position, barrelTip.Position, 500);
- -- Where the turret needs to aim
- local targetAimPos = rayCastIgnoreAll(barrelBreach.Position, mousePos, 500);
- ---- Traversal Calculations
- -- Angle of curent turret aim traversal
- local traversalAngle = ((- math.atan2((currentAimPos.z - parts.base.Position.z ) , (currentAimPos.x - parts.base.Position.x)) * 57.2958)) % 360
- -- Angle of target turret aim traversal
- local mouseAngle = ((- math.atan2((targetAimPos.z - parts.base.Position.z ) , (targetAimPos.x - parts.base.Position.x)) * 57.2958)) % 360
- -- Traversal angle difference of the barrel aim and the mouse aim
- local angleDif = ((mouseAngle - traversalAngle) % 360)
- if angleDif > 180 then
- angleDif = angleDif - 360
- end
- ---- Elevation Calculations
- -- Verticle stud difference of the barrel aim and the mouse aim
- local distDif = targetAimPos.y - currentAimPos.y
- -- C in triangle of A B C Law of Cosines
- local c = (currentAimPos - Vector3.new(currentAimPos.x, targetAimPos.y, currentAimPos.z) ).magnitude
- -- Elevation angle difference of the barrel aim and the mouse aim
- local changeAngle = math.deg(math.acos((800-(c*c))/800))
- -- Current Elevation and Traversal Angles relative to base
- local currentElevation = math.deg(elevationWeld.C0.LookVector.Y)
- local cfx, cfy, cfz = traversalWeld.C0:ToEulerAnglesYXZ()
- local currentTraversal = math.deg(cfy)
- ---- Traversal Changes
- -- One unit of traversal
- if math.abs(angleDif) > (weaponStats.traversalSpeed/stats.smoothness) then
- -- Aim Left
- if angleDif > 0 and (currentTraversal < weaponStats.maxTraversal or weaponStats.maxTraversal == 180) then
- traversalWeld.C0 = traversalWeld.C0 * CFrame.Angles(0,math.rad(weaponStats.traversalSpeed/stats.smoothness),0)
- -- Aim Right
- elseif angleDif < 0 and ( currentTraversal > -weaponStats.maxTraversal or weaponStats.maxTraversal == 180) then
- traversalWeld.C0 = traversalWeld.C0 * CFrame.Angles(0,-math.rad(weaponStats.traversalSpeed/stats.smoothness),0)
- end
- -- Smaller than one unit of traversal, aim directly at aim position
- elseif (cfy*57.2958 < weaponStats.maxTraversal and currentTraversal > -weaponStats.maxTraversal) or weaponStats.MaxTraversal == 180 then
- traversalWeld.C0 = traversalWeld.C0 * CFrame.Angles(0,math.rad(angleDif),0)
- end
- ---- Elevation Changes
- -- If the change needs to be at standard
- local elevationChange = 0
- -- Aim Up
- if distDif > 0 and currentElevation < weaponStats.maxElevation then
- elevationChange = -math.min( (weaponStats.elevationSpeed / stats.smoothness), (changeAngle / stats.smoothness) )
- -- Aim Down
- elseif distDif < 0 and currentElevation > weaponStats.minElevation then
- elevationChange = math.min( (weaponStats.elevationSpeed / stats.smoothness), (changeAngle / stats.smoothness) )
- end
- elevationWeld.C0 = elevationWeld.C0 * CFrame.Angles(0, math.rad(elevationChange),0)
- ---- Inserting server updates
- -- Send to server new weld positions for elevation and traversal
- if counter == stats.smoothness then
- table.insert(weldTable, {elevationWeld, elevationWeld.C0})
- table.insert(weldTable, {traversalWeld, traversalWeld.C0})
- end
- if weaponStats.isMain then
- gui.Frame.TurretHealth.Rotation = -math.deg(cfy)
- end
- end
- -- Send updates to server every second
- counter = counter + 1
- if counter == stats.smoothness then
- counter = 0
- event:FireServer("UpdateWelds", {weldTable} )
- end
- -- Elevation Calculation
- --print("Elevation Weld Angle = " .. math.deg(parts.elevationWeld.C0.LookVector.Y))
- -- Traversal Calculation
- --local cfx, cfy, cfz = parts.traversalWeld.C0:ToEulerAnglesYXZ()
- -- Update GUI with main gun
- --gui.Frame.TurretHealth.Rotation = -math.deg(cfy)
- counter = counter + 1
- wait(1.0/stats.smoothness)
- else
- -- Wait longer if flipped
- wait(3.0/stats.smoothness)
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement