242 lines
6.5 KiB
Lua
242 lines
6.5 KiB
Lua
function SWEP:ViewModelDrawn()
|
|
if IsValid(self.QuickNadeModel) then
|
|
self.QuickNadeModel:DrawModel()
|
|
end
|
|
|
|
self:DrawCustomModel(false)
|
|
self:DrawLasers()
|
|
|
|
local newactiveeffects = {}
|
|
for _, effect in ipairs(self.ActiveEffects) do
|
|
if !IsValid(effect) then continue end
|
|
if !effect.VMContext then continue end
|
|
|
|
effect:DrawModel()
|
|
|
|
table.insert(newactiveeffects, effect)
|
|
end
|
|
|
|
self.ActiveEffects = newactiveeffects
|
|
end
|
|
|
|
function SWEP:DrawCustomModel(wm, custom_wm)
|
|
|
|
if !wm and !IsValid(self:GetOwner()) then return end
|
|
if !wm and self:GetOwner():IsNPC() then return end
|
|
|
|
local mdl = self.VModel
|
|
|
|
if wm then
|
|
mdl = self.WModel
|
|
end
|
|
|
|
if !mdl then
|
|
self:SetupModel(wm, custom_wm)
|
|
|
|
mdl = self.VModel
|
|
|
|
if wm then
|
|
mdl = self.WModel
|
|
end
|
|
end
|
|
|
|
local parentmdl = self
|
|
|
|
if !wm then
|
|
parentmdl = self:GetVM()
|
|
elseif custom_wm then
|
|
parentmdl = custom_wm
|
|
end
|
|
|
|
if !mdl then return end
|
|
|
|
for _, model in pairs(mdl) do
|
|
if !IsValid(model) then continue end
|
|
local offset_pos = model.Pos
|
|
local offset_ang = model.Ang
|
|
local bone = model.Bone
|
|
local atttbl = {}
|
|
local slottbl = {}
|
|
|
|
if model.WMBase then
|
|
parentmdl = self:GetOwner()
|
|
end
|
|
|
|
parentmdl:SetupBones()
|
|
parentmdl:InvalidateBoneCache()
|
|
|
|
if !offset_pos or !offset_ang then
|
|
local slot = model.Slot
|
|
slottbl = self.Attachments[slot]
|
|
atttbl = TacRP.GetAttTable(self.Attachments[slot].Installed)
|
|
|
|
bone = slottbl.Bone
|
|
|
|
if wm then
|
|
bone = slottbl.WMBone or "ValveBiped.Bip01_R_Hand"
|
|
end
|
|
|
|
offset_pos = slottbl.Pos_VM
|
|
offset_ang = slottbl.Ang_VM
|
|
|
|
if wm then
|
|
offset_pos = slottbl.Pos_WM
|
|
offset_ang = slottbl.Ang_WM
|
|
end
|
|
|
|
for _, ele in ipairs(self:GetElements()) do
|
|
if !ele.AttPosMods or !ele.AttPosMods[slot] then continue end
|
|
if wm then
|
|
if ele.AttPosMods[slot].Pos_WM then
|
|
offset_pos = ele.AttPosMods[slot].Pos_WM
|
|
end
|
|
if ele.AttPosMods[slot].Ang_WM then
|
|
offset_ang = ele.AttPosMods[slot].Ang_WM
|
|
end
|
|
if ele.AttPosMods[slot].WMBone then
|
|
bone = ele.AttPosMods[slot].WMBone
|
|
end
|
|
else
|
|
if ele.AttPosMods[slot].Pos_VM then
|
|
offset_pos = ele.AttPosMods[slot].Pos_VM
|
|
end
|
|
if ele.AttPosMods[slot].Ang_VM then
|
|
offset_ang = ele.AttPosMods[slot].Ang_VM
|
|
end
|
|
if ele.AttPosMods[slot].Bone then
|
|
bone = ele.AttPosMods[slot].Bone
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if !bone then continue end
|
|
|
|
local boneindex = parentmdl:LookupBone(bone)
|
|
if !boneindex then continue end
|
|
|
|
local bonemat = parentmdl:GetBoneMatrix(boneindex)
|
|
if !bonemat then continue end
|
|
|
|
local bpos, bang
|
|
bpos = bonemat:GetTranslation()
|
|
bang = bonemat:GetAngles()
|
|
|
|
local apos, aang = bpos, bang
|
|
|
|
if offset_pos then
|
|
apos:Add(bang:Forward() * offset_pos.x)
|
|
apos:Add(bang:Right() * offset_pos.y)
|
|
apos:Add(bang:Up() * offset_pos.z)
|
|
end
|
|
|
|
if offset_ang then
|
|
aang:RotateAroundAxis(aang:Right(), offset_ang.p)
|
|
aang:RotateAroundAxis(aang:Up(), offset_ang.y)
|
|
aang:RotateAroundAxis(aang:Forward(), offset_ang.r)
|
|
end
|
|
|
|
local moffset = (atttbl.ModelOffset or Vector(0, 0, 0))
|
|
if wm then
|
|
moffset = moffset * (slottbl.WMScale or 1)
|
|
else
|
|
moffset = moffset * (slottbl.VMScale or 1)
|
|
end
|
|
|
|
apos:Add(aang:Forward() * moffset.x)
|
|
apos:Add(aang:Right() * moffset.y)
|
|
apos:Add(aang:Up() * moffset.z)
|
|
|
|
model:SetPos(apos)
|
|
model:SetAngles(aang)
|
|
model:SetRenderOrigin(apos)
|
|
model:SetRenderAngles(aang)
|
|
|
|
if model.IsHolosight and !wm then
|
|
cam.Start3D(EyePos(), EyeAngles(), self.ViewModelFOV, 0, 0, nil, nil, 1, 10000)
|
|
render.DepthRange(0.0, 0.1)
|
|
self:DoHolosight(model)
|
|
cam.End3D()
|
|
render.DepthRange(0.0, 0.1)
|
|
end
|
|
|
|
if !model.NoDraw then
|
|
model:DrawModel()
|
|
end
|
|
end
|
|
|
|
if !wm then
|
|
self:DrawFlashlightsVM()
|
|
end
|
|
end
|
|
|
|
function SWEP:PreDrawViewModel()
|
|
if self:GetValue("ScopeHideWeapon") and self:IsInScope() then
|
|
render.SetBlend(0)
|
|
end
|
|
|
|
-- Apparently setting this will fix the viewmodel position and angle going all over the place in benchgun.
|
|
if TacRP.ConVars["dev_benchgun"]:GetBool() then
|
|
if self.OriginalViewModelFOV == nil then
|
|
self.OriginalViewModelFOV = self.ViewModelFOV
|
|
end
|
|
self.ViewModelFOV = self:GetOwner():GetFOV()
|
|
elseif self.OriginalViewModelFOV then
|
|
self.ViewModelFOV = self.OriginalViewModelFOV
|
|
self.OriginalViewModelFOV = nil
|
|
end
|
|
-- self.ViewModelFOV = self:GetViewModelFOV()
|
|
|
|
render.DepthRange(0.0, 0.1)
|
|
end
|
|
|
|
function SWEP:PostDrawViewModel()
|
|
cam.IgnoreZ(false)
|
|
|
|
if self:GetValue("ScopeHideWeapon") and self:IsInScope() then
|
|
render.SetBlend(1)
|
|
end
|
|
|
|
cam.Start3D()
|
|
cam.IgnoreZ(false)
|
|
local newpcfs = {}
|
|
|
|
for _, pcf in ipairs(self.PCFs) do
|
|
if IsValid(pcf) then
|
|
pcf:Render()
|
|
table.insert(newpcfs, pcf)
|
|
end
|
|
end
|
|
|
|
if !inrt then self.PCFs = newpcfs end
|
|
|
|
local newmzpcfs = {}
|
|
|
|
for _, pcf in ipairs(self.MuzzPCFs) do
|
|
if IsValid(pcf) then
|
|
pcf:Render()
|
|
table.insert(newmzpcfs, pcf)
|
|
end
|
|
end
|
|
|
|
if !inrt then self.MuzzPCFs = newmzpcfs end
|
|
cam.End3D()
|
|
end
|
|
|
|
--[[
|
|
SWEP.SmoothedViewModelFOV = nil
|
|
function SWEP:GetViewModelFOV()
|
|
local target = self.ViewModelFOV
|
|
|
|
if TacRP.ConVars["dev_benchgun"]:GetBool() then
|
|
target = self:GetOwner():GetFOV()
|
|
end
|
|
|
|
self.SmoothedViewModelFOV = self.SmoothedViewModelFOV or target
|
|
local diff = math.abs(target - self.SmoothedViewModelFOV)
|
|
self.SmoothedViewModelFOV = math.Approach(self.SmoothedViewModelFOV, target, diff * FrameTime() / 0.25)
|
|
|
|
return self.SmoothedViewModelFOV
|
|
end
|
|
]]
|