Files
wnsrc/gamemodes/helix/plugins/crosshair.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

121 lines
3.5 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 PLUGIN = PLUGIN
PLUGIN.name = "Crosshair"
PLUGIN.author = "Black Tea"
PLUGIN.description = "Réticule."
if (CLIENT) then
local function drawdot( pos, size, col )
local color = col[2]
surface.SetDrawColor(color.r, color.g, color.b, color.a)
surface.DrawRect(pos[1] - size/2, pos[2] - size/2, size, size)
color = col[1]
surface.SetDrawColor(color.r, color.g, color.b, color.a)
surface.DrawOutlinedRect(pos[1] - size/2, pos[2] - size/2 , size, size)
end
local aimVector, punchAngle, ft, screen, scaleFraction, distance
local math_round = math.Round
local curGap = 0
local curAlpha = 0
local maxDistance = 1000 ^ 2
local crossSize = 4
local crossGap = 0
local colors = {color_black}
local filter = {}
function PLUGIN:DrawCrosshair(x, y, trace)
local entity = trace.Entity
distance = trace.StartPos:DistToSqr(trace.HitPos)
scaleFraction = 1 - math.Clamp(distance / maxDistance, 0, .5)
crossSize = 4
crossGap = 25 * (scaleFraction - (LocalPlayer():IsWepRaised() and 0 or .1))
if (IsValid(entity) and entity:GetClass() == "ix_item" and
entity:GetPos():DistToSqr(trace.StartPos) <= 16384) then
crossGap = 0
crossSize = 5
end
curGap = Lerp(ft * 2, curGap, crossGap)
curAlpha = Lerp(ft * 2, curAlpha, !LocalPlayer():IsWepRaised() and 255 or 150)
curAlpha = hook.Run("GetCrosshairAlpha", curAlpha) or curAlpha
colors[2] = Color(255, curAlpha, curAlpha, curAlpha)
if (curAlpha > 1) then
drawdot( {math_round(screen.x), math_round(screen.y)}, crossSize, colors)
drawdot( {math_round(screen.x + curGap), math_round(screen.y)}, crossSize, colors)
drawdot( {math_round(screen.x - curGap), math_round(screen.y)}, crossSize, colors)
drawdot( {math_round(screen.x), math_round(screen.y + curGap * .8)}, crossSize, colors)
drawdot( {math_round(screen.x), math_round(screen.y - curGap * .8)}, crossSize, colors)
end
end
-- luacheck: globals g_ContextMenu
function PLUGIN:PostDrawHUD()
local client = LocalPlayer()
if (!client:GetCharacter() or !client:Alive()) then
return
end
local entity = Entity(client:GetLocalVar("ragdoll", 0))
if (entity:IsValid()) then
return
end
local wep = client:GetActiveWeapon()
local bShouldDraw = hook.Run("ShouldDrawCrosshair", client, wep)
if (bShouldDraw == false or !IsValid(wep) or wep.DrawCrosshair == false) then
return
end
if (bShouldDraw == false or g_ContextMenu:IsVisible() or
(IsValid(ix.gui.characterMenu) and !ix.gui.characterMenu:IsClosing())) then
return
end
aimVector = client:EyeAngles()
punchAngle = client:GetViewPunchAngles()
ft = FrameTime()
filter = {client}
local vehicle = client:GetVehicle()
if (vehicle and IsValid(vehicle)) then
aimVector = aimVector + vehicle:GetAngles()
table.insert(filter, vehicle)
end
local data = {}
data.start = client:GetShootPos()
data.endpos = data.start + (aimVector + punchAngle):Forward() * 65535
data.filter = filter
local trace = util.TraceLine(data)
local drawTarget = self
local drawFunction = self.DrawCrosshair
-- we'll manually call this since CHudCrosshair is never drawn; checks are already performed
if (wep.DoDrawCrosshair) then
drawTarget = wep
drawFunction = wep.DoDrawCrosshair
end
screen = trace.HitPos:ToScreen()
drawFunction(drawTarget, screen.x, screen.y, trace)
end
end