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

200 lines
5.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 mth = math
local m_log10 = mth.log10
local m_rand = mth.Rand
local rnd = render
local SetMat = rnd.SetMaterial
local DrawBeam = rnd.DrawBeam
local DrawSprite = rnd.DrawSprite
local cam = cam
local lasermat = Material("arccw/laser")
local flaremat = Material("effects/whiteflare")
local delta = 1
function SWEP:DoLaser(world, nocontext)
world = world or false
if !nocontext then
if world then
cam.Start3D()
else
cam.Start3D(EyePos(), EyeAngles(), self:QuickFOVix(self.CurrentViewModelFOV))
end
end
for slot, k in pairs(self.Attachments) do
if !k.Installed then continue end
local attach = ArcCW.AttachmentTable[k.Installed]
if self:GetBuff_Stat("Laser", slot) then
local color = self:GetBuff_Stat("LaserColor", slot) or attach.ColorOptionsTable[k.ColorOptionIndex or 1]
if world then
if !k.WElement then continue end
self:DrawLaser(attach, k.WElement.Model, color, true)
else
if !k.VElement then continue end
self:DrawLaser(attach, k.VElement.Model, color)
end
end
end
if self.Lasers then
if world then
for _, k in pairs(self.Lasers) do
self:DrawLaser(k, self.WMModel or self, k.LaserColor, true)
end
else
-- cam.Start3D(nil, nil, self.ViewmodelFOV)
for _, k in pairs(self.Lasers) do
self:DrawLaser(k, self:GetOwner():GetViewModel(), k.LaserColor)
end
-- cam.End3D()
end
end
if !nocontext then
cam.End3D()
end
end
function SWEP:DrawLaser(laser, model, color, world)
local owner = self:GetOwner()
local behav = ArcCW.LaserBehavior
if !owner then return end
if !IsValid(owner) then return end
if !model then return end
if !IsValid(model) then return end
local att = model:LookupAttachment(laser.LaserBone or "laser")
att = att == 0 and model:LookupAttachment("muzzle") or att
local pos, ang, dir
if att == 0 then
pos = model:GetPos()
ang = owner:EyeAngles() + self:GetFreeAimOffset()
dir = ang:Forward()
else
local attdata = model:GetAttachment(att)
pos, ang = attdata.Pos, attdata.Ang
dir = -ang:Right()
end
if world then
dir = owner:IsNPC() and (-ang:Right()) or dir
else
ang:RotateAroundAxis(ang:Up(), 90)
if self.LaserOffsetAngle then
ang:RotateAroundAxis(ang:Right(), self.LaserOffsetAngle[1])
ang:RotateAroundAxis(ang:Up(), self.LaserOffsetAngle[2])
ang:RotateAroundAxis(ang:Forward(), self.LaserOffsetAngle[3])
end
if self.LaserIronsAngle and self:GetActiveSights().IronSight then
local d = 1 - self:GetSightDelta()
ang:RotateAroundAxis(ang:Right(), d * self.LaserIronsAngle[1])
ang:RotateAroundAxis(ang:Up(), d * self.LaserIronsAngle[2])
ang:RotateAroundAxis(ang:Forward(), d * self.LaserIronsAngle[3])
end
dir = ang:Forward()
local eyeang = EyeAngles() - self:GetOurViewPunchAngles() + self:GetFreeAimOffset()
local canlaser = self:GetCurrentFiremode().Mode != 0 and !self:GetReloading() and self:BarrelHitWall() <= 0
delta = Lerp(0, delta, canlaser and self:GetSightDelta() or 1)
if self.GuaranteeLaser then
delta = 1
else
delta = self:GetSightDelta()
end
dir = Lerp(delta, eyeang:Forward(), dir)
end
local beamdir, tracepos = dir, pos
beamdir = world and (-ang:Right()) or beamdir
if behav and !world then
-- local cheap = ArcCW.ConVars["cheapscopes"]:GetBool()
local punch = self:GetOurViewPunchAngles()
ang = EyeAngles() - punch + self:GetFreeAimOffset()
tracepos = EyePos() - Vector(0, 0, 1)
pos, dir = tracepos, ang:Forward()
beamdir = dir
end
local dist = 128
local tl = {}
tl.start = tracepos
tl.endpos = tracepos + (dir * 33000)
tl.filter = owner
local tr = util.TraceLine(tl)
tl.endpos = tracepos + (beamdir * dist)
local btr = util.TraceLine(tl)
local hit = tr.Hit
local hitpos = tr.HitPos
local solid = tr.StartSolid
local strength = laser.LaserStrength or 1
local laserpos = solid and tr.StartPos or hitpos
laserpos = laserpos - ((EyeAngles() + self:GetFreeAimOffset()):Forward())
if solid then return end
local width = m_rand(0.05, 0.1) * strength * 1
if (!behav or world) and hit then
SetMat(lasermat)
local a = 200
DrawBeam(pos, btr.HitPos, width * 0.3, 1, 0, Color(a, a, a, a))
DrawBeam(pos, btr.HitPos, width, 1, 0, color)
end
if hit and !tr.HitSky then
local mul = 1 * strength
mul = m_log10((hitpos - EyePos()):Length()) * strength
local rad = m_rand(4, 6) * mul
local glr = rad * m_rand(0.2, 0.3)
SetMat(flaremat)
-- if !world then
-- cam.IgnoreZ(true)
-- end
DrawSprite(laserpos, rad, rad, color)
DrawSprite(laserpos, glr, glr, color_white)
-- if !world then
-- cam.IgnoreZ(false)
-- end
end
end