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

303 lines
12 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 size = 0
local clump_inner = Material("arccw/hud/clump_inner.png", "mips smooth")
local clump_outer = Material("arccw/hud/clump_outer.png", "mips smooth")
local aimtr_result = {}
local aimtr = {}
local square_mat = Material("color")
function SWEP:ShouldDrawCrosshair()
if ArcCW.ConVars["override_crosshair_off"]:GetBool() then return false end
if !ArcCW.ConVars["crosshair"]:GetBool() then return false end
if self:GetReloading() then return false end
if self:BarrelHitWall() > 0 then return false end
local asight = self:GetActiveSights()
if !self:GetOwner():ShouldDrawLocalPlayer()
and self:GetState() == ArcCW.STATE_SIGHTS and !asight.CrosshairInSights then
return false
end
if self:GetNWState() == ArcCW.STATE_SPRINT and !self:CanShootWhileSprint() then return false end
if self:GetCurrentFiremode().Mode == 0 then return false end
if self:GetBuff_Hook("Hook_ShouldNotFire") then return false end
if self:GetNWState() == ArcCW.STATE_CUSTOMIZE then return false end
if self:GetNWState() == ArcCW.STATE_DISABLE then return false end
return true
end
local cr_main = Color( 0, 255, 0 )
local cr_shad = Color( 0, 0, 0, 127 )
local gaA = 0
local gaD = 0
function SWEP:GetFOVAcc( acc, disp )
cam.Start3D()
local lool = ( EyePos() + ( EyeAngles():Forward() ) + ( ( ArcCW.MOAToAcc * (acc or self:GetBuff("AccuracyMOA")) ) * EyeAngles():Up() ) ):ToScreen()
local lool2 = ( EyePos() + ( EyeAngles():Forward() ) + ( ( (disp or self:GetDispersion()) * ArcCW.MOAToAcc / 10 ) * EyeAngles():Up() ) ):ToScreen()
cam.End3D()
local gau = 0
gau = ( (ScrH() / 2) - lool.y )
gaA = math.Approach(gaA, gau, (ScrH() / 2) * FrameTime())
gau = 0
gau = ( (ScrH() / 2) - lool2.y )
gaD = math.Approach(gaD, gau, (ScrH() / 2) * FrameTime())
return gaA, gaD
end
function SWEP:DrawDevCrosshair(x, y)
surface.SetDrawColor(255, 50, 50, 255)
surface.DrawLine(x, y - 256, x, y + 256)
surface.DrawLine(x - 256, y, x + 256, y)
local gA, gD = self:GetFOVAcc( self:GetBuff("AccuracyMOA"), self:GetDispersion() )
surface.DrawCircle(x, y, gA + gD, 255, 255, 255, 155)
surface.DrawCircle(x, y, gA, 255, 255, 0, 55)
draw.SimpleTextOutlined(math.Round(self:GetDispersion(), 1) .. " MOA", "ArcCW_24_Unscaled", x - gA - gD - 16, y, color_white, TEXT_ALIGN_RIGHT, TEXT_ALIGN_BOTTOM, 1, Color(0, 0, 0))
draw.SimpleTextOutlined(math.Round(self:GetBuff("AccuracyMOA"), 1) .. " MOA", "ArcCW_24_Unscaled", x - gA - gD - 16, y, Color(255, 255, 0), TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP, 1, Color(0, 0, 0))
local dist = self:GetOwner():GetEyeTrace().HitPos:Distance(self:GetOwner():GetShootPos()) * ArcCW.HUToM
local rf = self:GetRangeFraction(dist)
local dmg = math.floor(self:GetDamage(dist))
draw.SimpleTextOutlined(dmg .. " damage", "ArcCW_24_Unscaled", x + 256, y, color_white, TEXT_ALIGN_RIGHT, TEXT_ALIGN_BOTTOM, 1, Color(0, 0, 0))
draw.SimpleTextOutlined(math.Round(dist, 1) .. "m", "ArcCW_24_Unscaled", x + 256 - 64, y, color_white, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP, 1, Color(0, 0, 0))
draw.SimpleTextOutlined(math.Round(rf * 100) .. "%", "ArcCW_24_Unscaled", x + 256, y, color_white, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP, 1, Color(0, 0, 0))
end
function SWEP:DoDrawCrosshair(x, y)
local ply = LocalPlayer()
local pos = ply:EyePos()
local ang = ply:EyeAngles() - self:GetOurViewPunchAngles() + self:GetFreeAimOffset()
if self:GetBuff_Hook("Hook_PreDrawCrosshair") then return end
local static = ArcCW.ConVars["crosshair_static"]:GetBool()
local prong_dot = ArcCW.ConVars["crosshair_dot"]:GetBool()
local prong_top = ArcCW.ConVars["crosshair_prong_top"]:GetBool()
local prong_left = ArcCW.ConVars["crosshair_prong_left"]:GetBool()
local prong_right = ArcCW.ConVars["crosshair_prong_right"]:GetBool()
local prong_down = ArcCW.ConVars["crosshair_prong_bottom"]:GetBool()
local prong_len = ArcCW.ConVars["crosshair_length"]:GetFloat()
local prong_wid = ArcCW.ConVars["crosshair_thickness"]:GetFloat()
local prong_out = ArcCW.ConVars["crosshair_outline"]:GetInt()
local prong_tilt = ArcCW.ConVars["crosshair_tilt"]:GetBool()
local clr = Color(ArcCW.ConVars["crosshair_clr_r"]:GetInt(),
ArcCW.ConVars["crosshair_clr_g"]:GetInt(),
ArcCW.ConVars["crosshair_clr_b"]:GetInt())
if ArcCW.ConVars["ttt_rolecrosshair"] and ArcCW.ConVars["ttt_rolecrosshair"]:GetBool() then
if GetRoundState() == ROUND_PREP or GetRoundState() == ROUND_POST then
clr = Color(255, 255, 255)
elseif ply.GetRoleColor and ply:GetRoleColor() then
clr = ply:GetRoleColor() -- TTT2 feature
elseif ply:IsActiveTraitor() then
clr = Color(255, 50, 50)
elseif ply:IsActiveDetective() then
clr = Color(50, 50, 255)
else
clr = Color(50, 255, 50)
end
end
if ArcCW.ConVars["crosshair_aa"]:GetBool() and ply.ArcCW_AATarget != nil and ArcCW.ConVars["aimassist"]:GetBool() and ArcCW.ConVars["aimassist_cl"]:GetBool() then
-- whooie
clr = Color(255, 0, 0)
end
clr.a = ArcCW.ConVars["crosshair_clr_a"]:GetInt()
local outlineClr = Color(ArcCW.ConVars["crosshair_outline_r"]:GetInt(),
ArcCW.ConVars["crosshair_outline_g"]:GetInt(),
ArcCW.ConVars["crosshair_outline_b"]:GetInt(),
ArcCW.ConVars["crosshair_outline_a"]:GetInt())
local gA, gD = self:GetFOVAcc( self:GetBuff("AccuracyMOA"), self:GetDispersion() )
local gap = (static and 8 or gA + gD) * ArcCW.ConVars["crosshair_gap"]:GetFloat()
gap = gap + ( ScreenScale(8) * math.Clamp(self.RecoilAmount, 0, 1) )
local prong = ScreenScale(prong_len)
local p_w = ScreenScale(prong_wid)
local p_w2 = p_w + prong_out
local sp
if self:GetOwner():ShouldDrawLocalPlayer() then
local tr = util.GetPlayerTrace(self:GetOwner())
local trace = util.TraceLine( tr )
cam.Start3D()
local coords = trace.HitPos:ToScreen()
coords.x = math.Round(coords.x)
coords.y = math.Round(coords.y)
cam.End3D()
sp = { visible = true, x = coords.x, y = coords.y }
end
cam.Start3D()
sp = (pos + (ang:Forward() * 3200)):ToScreen()
cam.End3D()
if ArcCW.ConVars["crosshair_trueaim"]:GetBool() then
aimtr.start = self:GetShootSrc()
else
aimtr.start = pos
end
aimtr.endpos = aimtr.start + ((ply:EyeAngles() + self:GetFreeAimOffset()):Forward() * 100000)
aimtr.filter = {ply}
aimtr.output = aimtr_result
table.Add(aimtr.filter, ArcCW:GetVehicleFilter(ply) or {})
util.TraceLine(aimtr)
cam.Start3D()
local w2s = aimtr_result.HitPos:ToScreen()
w2s.x = math.Round(w2s.x)
w2s.y = math.Round(w2s.y)
cam.End3D()
sp.x = w2s.x sp.y = w2s.y
x, y = sp.x, sp.y
if ArcCW.ConVars["dev_crosshair"]:GetBool() and LocalPlayer():IsAdmin() then
self:DrawDevCrosshair(x, y)
end
local st = self:GetSightTime() / 2
if self:ShouldDrawCrosshair() then
self.CrosshairDelta = math.Approach(self.CrosshairDelta or 0, 1, FrameTime() * 1 / st)
else
self.CrosshairDelta = math.Approach(self.CrosshairDelta or 0, 0, FrameTime() * 1 / st)
end
if ArcCW.ConVars["crosshair_equip"]:GetBool() and (self:GetBuff("ShootEntity", true) or self.PrimaryBash) then
prong = ScreenScale(prong_wid)
p_w = ScreenScale(prong_wid)
p_w2 = p_w + prong_out
end
if prong_dot then
surface.SetDrawColor(outlineClr.r, outlineClr.g, outlineClr.b, outlineClr.a * self.CrosshairDelta)
surface.DrawRect(x - p_w2 / 2, y - p_w2 / 2, p_w2, p_w2)
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a * self.CrosshairDelta)
surface.DrawRect(x - p_w / 2, y - p_w / 2, p_w, p_w)
end
size = math.Approach(size, gap, FrameTime() * 32 * gap)
gap = size
if !static then gap = gap * self.CrosshairDelta end
gap = math.max(4, gap)
local num = self:GetBuff("Num")
if ArcCW.ConVars["crosshair_shotgun"]:GetBool() and num > 1 then
prong = ScreenScale(prong_wid)
p_w = ScreenScale(prong_len)
p_w2 = p_w + prong_out
end
local prong2 = prong + prong_out
if prong_tilt then
local angle = (prong_left and prong_top and prong_right and prong_down) and 45 or 30
local rad = math.rad(angle)
local dx = gap * math.cos(rad) + prong * math.cos(rad) / 2
local dy = gap * math.sin(rad) + prong * math.sin(rad) / 2
surface.SetMaterial(square_mat)
-- Shade
surface.SetDrawColor(outlineClr.r, outlineClr.g, outlineClr.b, outlineClr.a * self.CrosshairDelta)
if prong_left and prong_top then
surface.DrawTexturedRectRotated(x - dx, y - dy, prong2, p_w2, -angle)
surface.DrawTexturedRectRotated(x + dx, y - dy, prong2, p_w2, angle)
elseif prong_left or prong_top then
surface.DrawRect(x - p_w2 / 2, y - gap - prong2 + prong_out / 2, p_w2, prong2)
end
if prong_right and prong_down then
surface.DrawTexturedRectRotated(x + dx, y + dy, prong2, p_w2, -angle)
surface.DrawTexturedRectRotated(x - dx, y + dy, prong2, p_w2, angle)
elseif prong_right or prong_down then
surface.DrawRect(x - p_w2 / 2, y + gap - prong_out / 2, p_w2, prong2)
end
-- Fill
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a * self.CrosshairDelta)
if prong_left and prong_top then
surface.DrawTexturedRectRotated(x - dx, y - dy, prong, p_w, -angle)
surface.DrawTexturedRectRotated(x + dx, y - dy, prong, p_w, angle)
elseif prong_left or prong_top then
surface.DrawRect(x - p_w / 2, y - gap - prong, p_w, prong)
end
if prong_right and prong_down then
surface.DrawTexturedRectRotated(x + dx, y + dy, prong, p_w, -angle)
surface.DrawTexturedRectRotated(x - dx, y + dy, prong, p_w, angle)
elseif prong_right or prong_down then
surface.DrawRect(x - p_w / 2, y + gap, p_w, prong)
end
else
-- Shade
surface.SetDrawColor(outlineClr.r, outlineClr.g, outlineClr.b, outlineClr.a * self.CrosshairDelta)
if prong_left then
surface.DrawRect(x - gap - prong2 + prong_out / 2, y - p_w2 / 2, prong2, p_w2)
end
if prong_right then
surface.DrawRect(x + gap - prong_out / 2, y - p_w2 / 2, prong2, p_w2)
end
if prong_top then
surface.DrawRect(x - p_w2 / 2, y - gap - prong2 + prong_out / 2, p_w2, prong2)
end
if prong_down then
surface.DrawRect(x - p_w2 / 2, y + gap - prong_out / 2, p_w2, prong2)
end
-- Fill
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a * self.CrosshairDelta)
if prong_left then
surface.DrawRect(x - gap - prong, y - p_w / 2, prong, p_w)
end
if prong_right then
surface.DrawRect(x + gap, y - p_w / 2, prong, p_w)
end
if prong_top then
surface.DrawRect(x - p_w / 2, y - gap - prong, p_w, prong)
end
if prong_down then
surface.DrawRect(x - p_w / 2, y + gap, p_w, prong)
end
end
if ArcCW.ConVars["crosshair_clump"]:GetBool() and (ArcCW.ConVars["crosshair_clump_always"]:GetBool() or num > 1) then
local acc = math.max(1, gA)
if ArcCW.ConVars["crosshair_clump_outline"]:GetBool() then
surface.SetMaterial(clump_outer)
for i=1, prong_out do
surface.DrawCircle(x-1, y-0, acc + math.ceil(i*0.5) * (i % 2 == 1 and 1 or -1), outlineClr.r, outlineClr.g, outlineClr.b, outlineClr.a * self.CrosshairDelta)
end
surface.DrawCircle(x-1, y-0, acc, outlineClr.r, outlineClr.g, outlineClr.b, outlineClr.a * self.CrosshairDelta)
end
surface.DrawCircle(x-1, y-0, acc, clr.r, clr.g, clr.b, clr.a * self.CrosshairDelta)
end
self:GetBuff_Hook("Hook_PostDrawCrosshair", w2s)
return true
end