add sborka
This commit is contained in:
140
garrysmod/addons/tacrp/lua/weapons/tacrp_base/cl_laser.lua
Normal file
140
garrysmod/addons/tacrp/lua/weapons/tacrp_base/cl_laser.lua
Normal file
@@ -0,0 +1,140 @@
|
||||
local lasermat = Material("effects/laser1")
|
||||
local flaremat = Material("effects/whiteflare")
|
||||
|
||||
function SWEP:DrawLaser(pos, ang, strength, thirdperson)
|
||||
strength = strength or 1
|
||||
|
||||
local alwaysacc = self:GetValue("LaserAlwaysAccurate")
|
||||
local behavior = (self:GetValue("ScopeHideWeapon") and self:IsInScope())
|
||||
local vm = self:GetOwner():IsPlayer() and self:GetOwner():GetViewModel()
|
||||
local curr_seq = IsValid(vm) and vm:GetSequenceName(vm:GetSequence())
|
||||
|
||||
local delta = behavior and 1 or 0
|
||||
|
||||
if IsValid(vm) and (alwaysacc or TacRP.ConVars["true_laser"]:GetBool()) and (self:GetBlindFireMode() <= 1) and !self:GetCustomize() and !behavior then
|
||||
local d1 = (CurTime() - self:GetNextSecondaryFire()) / 1
|
||||
if alwaysacc then
|
||||
d1 = 1
|
||||
elseif TacRP.ConVars["laser_beam"]:GetBool() then
|
||||
d1 = math.min((CurTime() - self:GetNextPrimaryFire()) / 2, (CurTime() - self:GetNextSecondaryFire()) / 1)
|
||||
elseif self:GetValue("RPM") < 120 then
|
||||
d1 = math.min((CurTime() - self:GetNextPrimaryFire()) / 0.5, (CurTime() - self:GetNextSecondaryFire()) / 1)
|
||||
end
|
||||
|
||||
local d2 = (curr_seq == "reload_start") and 0 or 1
|
||||
local d3 = (1 - math.min(self:GetAnimLockTime() - CurTime()) / vm:SequenceDuration(vm:GetSequence()))
|
||||
local d4 = self:CanShootInSprint() and 1 or (1 - self:GetSprintDelta()) ^ 2
|
||||
if self:DoForceSightsBehavior() then d4 = self:GetSprintDelta() * self:GetSightDelta() end
|
||||
local cutoff = 0.85
|
||||
d3 = math.max(d3 - cutoff, 0) / (1 - cutoff)
|
||||
|
||||
delta = math.Clamp(self:GetReloading() and 0 or math.min(d1, d2, d3, d4), 0, 1)
|
||||
|
||||
end
|
||||
|
||||
local pos_tr = self:GetMuzzleOrigin()
|
||||
|
||||
if behavior then
|
||||
ang = self:GetShootDir()
|
||||
else
|
||||
ang = LerpAngle(delta, ang, self:GetShootDir())
|
||||
end
|
||||
|
||||
local tr = util.TraceLine({
|
||||
start = pos_tr,
|
||||
endpos = pos_tr + (ang:Forward() * 30000),
|
||||
mask = MASK_OPAQUE,
|
||||
filter = self:GetOwner()
|
||||
})
|
||||
|
||||
if tr.StartSolid then return end
|
||||
local laser_pos = tr.HitPos + tr.HitNormal
|
||||
local adjusted_pos = thirdperson and laser_pos or TacRP.FormatViewModelAttachment(self.ViewModelFOV, laser_pos, false)
|
||||
laser_pos = LerpVector(delta, laser_pos, adjusted_pos)
|
||||
|
||||
if behavior then
|
||||
cam.Start3D()
|
||||
pos = pos - (ang:Forward() * 256)
|
||||
end
|
||||
|
||||
local col = self:GetValue("LaserColor")
|
||||
|
||||
if TacRP.ConVars["laser_beam"]:GetBool() then
|
||||
local width = math.Rand(0.1, 0.2) * strength
|
||||
render.SetMaterial(lasermat)
|
||||
render.DrawBeam(pos, laser_pos, width * 0.3, 0, 1, Color(200, 200, 200))
|
||||
render.DrawBeam(pos, laser_pos, width, 0, 1, col)
|
||||
end
|
||||
|
||||
if tr.Hit and !tr.HitSky then
|
||||
local mul = strength
|
||||
local rad = math.Rand(4, 6) * mul
|
||||
|
||||
render.SetMaterial(flaremat)
|
||||
render.DrawSprite(laser_pos, rad, rad, col)
|
||||
render.DrawSprite(laser_pos, rad * 0.3, rad * 0.3, Color(200, 200, 200))
|
||||
|
||||
debugoverlay.Cross(tr.HitPos, 4, FrameTime() * 2, col)
|
||||
end
|
||||
|
||||
if behavior then
|
||||
cam.End3D()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:DrawLasers(wm)
|
||||
wm = wm or false
|
||||
|
||||
if self.Laser and self:GetTactical() then
|
||||
local power = self.LaserPower or 2
|
||||
if wm and self.LaserQCAttachmentWM then
|
||||
local att = self:GetAttachment(self.LaserQCAttachmentWM)
|
||||
if att then
|
||||
self:DrawLaser(att.Pos, att.Ang, power, true)
|
||||
end
|
||||
elseif IsValid(self:GetOwner():GetViewModel()) and self.LaserQCAttachmentVM then
|
||||
local vm = self:GetOwner():GetViewModel()
|
||||
local att = vm:GetAttachment(self.LaserQCAttachmentVM)
|
||||
if att then
|
||||
local pos = TacRP.FormatViewModelAttachment(self.ViewModelFOV, att.Pos, false)
|
||||
self:DrawLaser(pos, att.Ang, power)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i, k in pairs(self.Attachments) do
|
||||
if !k.Installed then continue end
|
||||
|
||||
local atttbl = TacRP.GetAttTable(k.Installed)
|
||||
|
||||
local power = atttbl.LaserPower or 2
|
||||
|
||||
if atttbl.Laser and self:GetTactical() then
|
||||
if wm then
|
||||
if atttbl.LaserQCAttachmentWM then
|
||||
local att = self:GetAttachment(atttbl.LaserQCAttachmentWM)
|
||||
if att then
|
||||
self:DrawLaser(att.Pos, self:GetOwner():IsPlayer() and self:GetShootDir() or att.Ang, power, true)
|
||||
end
|
||||
elseif IsValid(k.WModel) then
|
||||
if self:GetOwner():IsPlayer() then
|
||||
self:DrawLaser(k.WModel:GetPos(), self:GetShootDir(), power, true)
|
||||
else
|
||||
self:DrawLaser(k.WModel:GetPos(), k.WModel:GetAngles(), power, true)
|
||||
end
|
||||
end
|
||||
else
|
||||
if IsValid(self:GetOwner():GetViewModel()) and atttbl.LaserQCAttachmentVM then
|
||||
local vm = self:GetOwner():GetViewModel()
|
||||
local att = vm:GetAttachment(atttbl.LaserQCAttachmentVM)
|
||||
if att then
|
||||
local pos = TacRP.FormatViewModelAttachment(self.ViewModelFOV, att.Pos, false)
|
||||
self:DrawLaser(pos, att.Ang, power)
|
||||
end
|
||||
elseif IsValid(k.VModel) then
|
||||
self:DrawLaser(k.VModel:GetPos() + (k.VModel:GetAngles():Up() * 0.75), k.VModel:GetAngles(), power)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user