Tested and Working. Includes Movement Fix and Movement Clamp. 
// pCircleStrafe BOI! GET YOU SOME!
local CSBOI = {}
CSBOI.CircleStrafeVal = 0
CSBOI._G = table.Copy(_G)
CSBOI.localply = CSBOI._G.LocalPlayer()
CSBOI.cl_forwardspeed_cvar = CSBOI._G.GetConVar("cl_forwardspeed")
CSBOI.cl_forwardspeed_value = 10000
if (CSBOI.cl_forwardspeed_cvar) then
CSBOI.cl_forwardspeed_value = CSBOI.cl_forwardspeed_cvar:GetFloat()
end
CSBOI.cl_sidespeed_cvar = CSBOI._G.GetConVar("cl_sidespeed")
CSBOI.cl_sidespeed_value = 10000
if (CSBOI.cl_sidespeed_cvar) then
CSBOI.cl_sidespeed_value = CSBOI.cl_sidespeed_cvar:GetFloat()
end
function CSBOI.ClampMove(cmd)
if (cmd:GetForwardMove() > CSBOI.cl_forwardspeed_value) then
cmd:SetForwardMove(CSBOI.cl_forwardspeed_value)
end
if (cmd:GetSideMove() > CSBOI.cl_sidespeed_value) then
cmd:SetSideMove(CSBOI.cl_sidespeed_value)
end
end
function CSBOI.FixMove(cmd, rotation)
local rot_cos = CSBOI._G.math.cos(rotation)
local rot_sin = CSBOI._G.math.sin(rotation)
local cur_forwardmove = cmd:GetForwardMove()
local cur_sidemove = cmd:GetSideMove()
cmd:SetForwardMove(((rot_cos * cur_forwardmove) - (rot_sin * cur_sidemove)))
cmd:SetSideMove(((rot_sin * cur_forwardmove) + (rot_cos * cur_sidemove)))
end
CSBOI.CircleStrafeSpeed = 3
function CSBOI.CircleStrafe(cmd)
if (CSBOI._G.input.IsKeyDown(KEY_F)) then
CSBOI.CircleStrafeVal = CSBOI.CircleStrafeVal + CSBOI.CircleStrafeSpeed
if ((CSBOI.CircleStrafeVal > 0) and ((CSBOI.CircleStrafeVal / CSBOI.CircleStrafeSpeed) > 361)) then
CSBOI.CircleStrafeVal = 0
end
CSBOI.FixMove(cmd, CSBOI._G.math.rad((CSBOI.CircleStrafeVal - CSBOI._G.engine.TickInterval())))
return false
else
CSBOI.CircleStrafeVal = 0
end
return true
end
function CSBOI.RunIt(cmd)
if (CSBOI.localply) then
if (cmd:KeyDown(IN_JUMP)) then
local local_velocity = CSBOI.localply:GetVelocity()
if (local_velocity:Length2D() < 50) then
cmd:SetForwardMove(CSBOI.cl_forwardspeed_value)
end
local shouldautostrafe = CSBOI.CircleStrafe(cmd)
if (!CSBOI.localply:OnGround()) then
if (shouldautostrafe) then
// Do your AutoStrafe Here
end
cmd:SetButtons(cmd:GetButtons() - IN_JUMP)
end
else
CSBOI.CircleStrafeVal = 0
end
end
CSBOI.ClampMove(cmd)
end
CSBOI._G.hook.Add("CreateMove", "CSBOI", CSBOI.RunIt)

function ok.AutoGain(cmd) if !ok.vars["misc"]["autogain"]:GetBool() or cmd:CommandNumber() == 0 then return end local min = ok.vars["misc"]["autogainmin"]:GetFloat() local max = ok.vars["misc"]["autogainmax"]:GetFloat() local mult = ok.vars["misc"]["autogainmult"]:GetFloat() ok.ga_y = ok.ga_y + math.Clamp((me:GetVelocity():Length2D() * mult), min, max) math.NormalizeAngle(ok.ga_y) local key = _G["KEY_" .. string.upper(ok.vars["misc"]["autogainkey"]:GetString())] or KEY_F if input.IsKeyDown(key) then cmd:SetForwardMove(10^4) cmd:SetSideMove(0) ok.FixMove(cmd, Angle(ok.fa.p, ok.ga_y, 0)) end end
local function pCircle(x, y, diameter, col)
local circle = {}
local centre = Vector(x, y, 0)
local scale = Vector(diameter, diameter, 0)
local segmentdist = 360 / (2 * math.pi * math.max(scale.x, scale.y) * .5)
for i = 0, 360 - segmentdist, segmentdist do
circle[#circle + 1] = {x = centre.x + math.cos(math.rad(i)) * scale.x, y = centre.y - math.sin(math.rad(i)) * scale.y}
end
surface.SetDrawColor(col)
surface.DrawPoly(circle)
end