Files
wnsrc/lua/weapons/arccw_base/sh_freeaim.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

73 lines
2.3 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local ang0 = Angle(0, 0, 0)
SWEP.ClientFreeAimAng = Angle(ang0)
function SWEP:ShouldFreeAim()
if self:GetOwner():IsNPC() then return false end
if (ArcCW.ConVars["freeaim"]:GetInt() == 0 or self:GetBuff_Override("NeverFreeAim", self.NeverFreeAim)) and !self:GetBuff_Override("AlwaysFreeAim", self.AlwaysFreeAim) then return false end
return true
end
function SWEP:FreeAimMaxAngle()
local ang = self.FreeAimAngle and self:GetBuff("FreeAimAngle") or math.Clamp(self:GetBuff("HipDispersion") / 80, 3, 10)
return ang
end
function SWEP:ThinkFreeAim()
if self:ShouldFreeAim() then
local diff = self:GetOwner():EyeAngles() - self:GetLastAimAngle()
--diff = diff * 2
local freeaimang = Angle(self:GetFreeAimAngle())
local max = self:FreeAimMaxAngle()
local delta = math.min(self:GetSightDelta(),
self:CanShootWhileSprint() and 1 or (1 - self:GetSprintDelta()),
self:GetState() == ArcCW.STATE_CUSTOMIZE and 0 or 1)
max = max * delta
diff.p = math.NormalizeAngle(diff.p)
diff.y = math.NormalizeAngle(diff.y)
diff = diff * Lerp(delta, 1, 0.25)
freeaimang.p = math.Clamp(math.NormalizeAngle(freeaimang.p) + math.NormalizeAngle(diff.p), -max, max)
freeaimang.y = math.Clamp(math.NormalizeAngle(freeaimang.y) + math.NormalizeAngle(diff.y), -max, max)
local ang2d = math.atan2(freeaimang.p, freeaimang.y)
local mag2d = math.sqrt(math.pow(freeaimang.p, 2) + math.pow(freeaimang.y, 2))
mag2d = math.min(mag2d, max)
freeaimang.p = mag2d * math.sin(ang2d)
freeaimang.y = mag2d * math.cos(ang2d)
self:SetFreeAimAngle(freeaimang)
if CLIENT then
self.ClientFreeAimAng = freeaimang
end
end
self:SetLastAimAngle(self:GetOwner():EyeAngles())
end
function SWEP:GetFreeAimOffset()
if !self:ShouldFreeAim() then return ang0 end
if CLIENT then
return self.ClientFreeAimAng
else
return self:GetFreeAimAngle()
end
end