From 541c9cf66e1b66ae15917d249512d8809c3525c9 Mon Sep 17 00:00:00 2001 From: Darsu <95997959+dar-su@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:53:37 +0700 Subject: [PATCH] IR lasers & flashlights in mw, arctic, jmod nvgs --- lua/weapons/arc9_base/cl_laser.lua | 54 ++++++++++++++++++++++++++---- lua/weapons/arc9_base/cl_light.lua | 48 ++++++++++++++++++++++++-- 2 files changed, 93 insertions(+), 9 deletions(-) diff --git a/lua/weapons/arc9_base/cl_laser.lua b/lua/weapons/arc9_base/cl_laser.lua index 4673bdce..18ebdf15 100644 --- a/lua/weapons/arc9_base/cl_laser.lua +++ b/lua/weapons/arc9_base/cl_laser.lua @@ -2,12 +2,38 @@ local defaulttracemat = Material("arc9/laser2") local defaultflaremat = Material("sprites/light_glow02_add", "mips smooth") local lasercolorred = Color(255, 0, 0) local lasercolor200 = Color(200, 200, 200) +local irlasercolor = Color(106, 255, 218) + +local function checknvg(wpn) + local lp = LocalPlayer() + if lp.quadnodsonlight or lp:GetNWBool("nvg_on", false) then return true end -- arctic nvgs and mw nvgs + if lp.EZarmor and lp.EZarmor.effects and lp.EZarmor.effects.nightVision then return true end -- jmod + local sight = wpn:GetSight() + if sight and wpn:GetSightAmount() > 0.8 and !wpn.Peeking and sight.atttbl and sight.atttbl.RTScopeNightVision then return true end + + return false +end + function SWEP:DrawLaser(pos, dir, atttbl, behav) behav = behav or false local strength = atttbl.LaserStrength or 1 local flaremat = atttbl.LaserFlareMat or defaultflaremat local lasermat = atttbl.LaserTraceMat or defaulttracemat + + local width = math.Rand(0.1, 0.5) * strength + + local nvgon + if atttbl.LaserIR then + nvgon = checknvg(self) + if nvgon then + width = width + 0.25 + strength = strength + 1 + end + end + + if strength == 0 then return end + local owner = self:GetOwner() local dist = 5000 @@ -21,8 +47,6 @@ function SWEP:DrawLaser(pos, dir, atttbl, behav) if tr.StartSolid then return end - local width = math.Rand(0.1, 0.5) * strength - local hit = tr.Hit local hitpos = tr.HitPos @@ -75,6 +99,10 @@ function SWEP:DrawLaser(pos, dir, atttbl, behav) if (atttbl.LaserColorPlayer or atttbl.LaserPlayerColor) then color = colorplayer or color end + if nvgon and atttbl.LaserIR then + color = irlasercolor + end + if !behav then render.SetMaterial(lasermat) render.DrawBeam(pos, laspos, width * 0.2, 0, fraction, lasercolor200) @@ -122,6 +150,7 @@ function SWEP:DrawLasers(wm, behav) end local wmnotdrawn = wm and self.LastWMDrawn != UnPredictedCurTime() and owner != lp + local nvgon = checknvg(self) for _, model in ipairs(mdl) do local slottbl = model.slottbl @@ -135,8 +164,14 @@ function SWEP:DrawLasers(wm, behav) model:SetAngles(ang) local a - - if atttbl.LaserAttachment then + if wmnotdrawn then + a = { + Pos = pos, + Ang = ang + } + + a.Ang:RotateAroundAxis(a.Ang:Up(), -90) + elseif atttbl.LaserAttachment then a = model:GetAttachment(atttbl.LaserAttachment) else a = { @@ -148,7 +183,6 @@ function SWEP:DrawLasers(wm, behav) end if !a then return end - if wmnotdrawn then a.Pos, a.Ang = pos, ang end local lasercorrectionangle = model.LaserCorrectionAngle local lasang = a.Ang @@ -165,8 +199,14 @@ function SWEP:DrawLasers(wm, behav) local colorplayer = !owner:IsNPC() and owner:GetWeaponColor():ToColor() if (atttbl.LaserColorPlayer or atttbl.LaserPlayerColor) then color = colorplayer or color end + + local flaresize = 0.075 + if atttbl.LaserIR then + flaresize = 0 + if nvgon then flaresize = 0.2 color = irlasercolor end + end - self:DrawLightFlare(a.Pos, lasang, color, 0.075, !wm, false, -lasang:Right()) + self:DrawLightFlare(a.Pos, lasang, color, flaresize, !wm, false, -lasang:Right()) if !wm or owner == lp or wm and owner:IsNPC() then if behav then @@ -175,7 +215,7 @@ function SWEP:DrawLasers(wm, behav) self:DrawLaser(a.Pos, -lasang:Right(), atttbl, behav) end else - self:DrawLaser(a.Pos, self:GetShootDir():Forward(), atttbl, behav) + self:DrawLaser(a.Pos, -lasang:Right(), atttbl, behav) end end end diff --git a/lua/weapons/arc9_base/cl_light.lua b/lua/weapons/arc9_base/cl_light.lua index 82339a4d..7ebe7417 100644 --- a/lua/weapons/arc9_base/cl_light.lua +++ b/lua/weapons/arc9_base/cl_light.lua @@ -11,14 +11,29 @@ function SWEP:GetHasFlashlights() return false end +local nvgon = false +local function checknvg(wpn) -- this func a bit different than what in cl_laser + local lp = LocalPlayer() + if lp.quadnodsonlight or lp:GetNWBool("nvg_on", false) then return true end -- arctic nvgs and mw nvgs + if lp.EZarmor and lp.EZarmor.effects and lp.EZarmor.effects.nightVision then return true end -- jmod + local sight = wpn:GetSight() + if sight and wpn:GetSightAmount() > 0.8 and !wpn.Peeking and sight.atttbl and sight.atttbl.RTScopeNightVision and ARC9.RTScopeRender then return true end + + return false +end + local arc9_allflash = GetConVar("arc9_allflash") +local irflashcolor = Color(106, 255, 218) + function SWEP:CreateFlashlights() self:KillFlashlights() self.Flashlights = {} local total_lights = 0 - + local lp = LocalPlayer() + nvgon = checknvg(self) + for _, k in ipairs(self:GetSubSlotList()) do if !k.Installed then continue end local atttbl = self:GetFinalAttTable(k) @@ -33,6 +48,11 @@ function SWEP:CreateFlashlights() nodotter = atttbl.Flashlight360 } + if nvgon and atttbl.FlashlightIR then + newlight.col = irflashcolor + newlight.br = 1 + end + total_lights = total_lights + 1 local l = newlight.light @@ -52,6 +72,16 @@ function SWEP:CreateFlashlights() l:SetColor(atttbl.FlashlightColor or color_white) l:SetTexture(atttbl.FlashlightMaterial or "effects/flashlight001") l:SetBrightness(atttbl.FlashlightBrightness or 3) + + + if nvgon and atttbl.FlashlightIR then + l:SetFOV((atttbl.FlashlightFOV or 50) * 1.5) + l:SetFarZ(2048) + l:SetColor(irflashcolor) + -- l:SetTexture(atttbl.FlashlightMaterial or "effects/flashlight001") + l:SetBrightness(1) + end + l:SetEnableShadows(true) l:Update() @@ -64,7 +94,7 @@ function SWEP:CreateFlashlights() end end - if total_lights > 1 or (arc9_allflash:GetBool() and self:GetOwner() != LocalPlayer()) then -- you are a madman + if total_lights > 1 or (arc9_allflash:GetBool() and self:GetOwner() != lp) then -- you are a madman for i, k in ipairs(self.Flashlights) do if k.light:IsValid() then k.light:SetEnableShadows(false) end end @@ -101,10 +131,13 @@ function SWEP:DrawFlashlightsWM() if isotherplayer and lp:EyePos():DistToSqr(owner:EyePos()) > 2048^2 then self:KillFlashlights() return end local wmnotdrawn = self.LastWMDrawn != UnPredictedCurTime() and isotherplayer + local anydrawn = false for i, k in ipairs(self.Flashlights) do local model = (k.slottbl or {}).WModel -- if !IsValid(model) then continue end + anydrawn = true + if k.br == 0 then continue end local pos, ang @@ -148,6 +181,10 @@ function SWEP:DrawFlashlightsWM() k.light:SetAngles(ang) k.light:Update() end + + if anydrawn and nvgon != checknvg(self) then + self:CreateFlashlights() + end end function SWEP:DrawFlashlightsVM() @@ -159,10 +196,13 @@ function SWEP:DrawFlashlightsVM() local lp = LocalPlayer() local eyepos = owner:EyePos() + local anydrawn = false for i, k in ipairs(self.Flashlights) do local model = (k.slottbl or {}).VModel if !IsValid(model) then continue end + anydrawn = true + if k.br == 0 then continue end local pos, ang @@ -210,6 +250,10 @@ function SWEP:DrawFlashlightsVM() k.light:SetAngles(ang) k.light:Update() end + + if anydrawn and nvgon != checknvg(self) then + self:CreateFlashlights() + end end local flaremat = Material("effects/arc9_lensflare", "mips smooth")