Files
2026-03-31 10:27:04 +03:00

162 lines
4.1 KiB
Lua

SWEP.AutoSightSlot = nil
SWEP.AutoSightPos = nil
SWEP.AutoSightAng = nil
SWEP.ClientProxyModel = nil
function SWEP:GenerateAutoSight()
local slot
self.AutoSightPos = nil
self.AutoSightAng = nil
for i, k in ipairs(self.Attachments) do
if !k.Installed then continue end
local atttbl = TacRP.GetAttTable(k.Installed)
if atttbl.SightPos and atttbl.SightAng then
slot = i
break
end
end
if !slot then return end
local slottbl = self.Attachments[slot]
if !slottbl.Installed then return end
local bone = slottbl.Bone
local offset_pos = slottbl.Pos_VM
local offset_ang = slottbl.Ang_VM
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
if !bone then return end
local atttbl = TacRP.GetAttTable(slottbl.Installed)
local mdl = ClientsideModel(self.ViewModel)
mdl:SetPos(Vector(0, 0, 0))
mdl:SetAngles(Angle(0, 0, 0))
mdl:SetNoDraw(true)
local anim = self:TranslateSequence("idle")
local seq = mdl:LookupSequence(anim)
mdl:ResetSequence(seq)
mdl:SetupBones()
if !IsValid(mdl) then return end
local boneid = mdl:LookupBone(bone)
local bpos = mdl:GetBoneMatrix(boneid):GetTranslation()
local bang = self.CorrectiveBoneAng and Angle(self.CorrectiveBoneAng) or mdl:GetBoneMatrix(boneid):GetAngles()
SafeRemoveEntity(mdl)
local apos, aang = bpos, bang
apos:Add(bang:Forward() * offset_pos.x)
apos:Add(bang:Right() * offset_pos.y)
apos:Add(bang:Up() * offset_pos.z)
aang:RotateAroundAxis(aang:Right(), offset_ang.p)
aang:RotateAroundAxis(aang:Up(), offset_ang.y)
aang:RotateAroundAxis(aang:Forward(), offset_ang.r)
local moffset = (atttbl.ModelOffset or Vector(0, 0, 0)) * (slottbl.VMScale or 1)
apos:Add(aang:Forward() * moffset.x)
apos:Add(aang:Right() * moffset.y)
apos:Add(aang:Up() * moffset.z)
local vpos, vang = WorldToLocal(apos, aang, Vector(0, 0, 0), Angle(0, 0, 0))
local x = vpos.x
local y = vpos.y
local z = vpos.z
vpos.x = -y
vpos.y = x
vpos.z = z
vpos = vpos + (self.CorrectivePos or Vector(0, 0, 0))
vang = vang + (self.CorrectiveAng or Angle(0, 0, 0))
self.AutoSightPos, self.AutoSightAng = -vpos, -vang
end
function SWEP:GetSightPositions()
local apos, aang = self.AutoSightPos, self.AutoSightAng
if apos and aang then
return apos, aang
elseif self:GetOwner() != LocalPlayer() then
self:GenerateAutoSight() -- Not generated for spectators so must be done here
return self.AutoSightPos or self.SightPos, self.AutoSightAng or self.SightAng
else
return self.SightPos, self.SightAng
end
end
function SWEP:GetExtraSightPosition()
local epos
local eang
local scale = 1
for i, k in ipairs(self.Attachments) do
if !k.Installed then continue end
local atttbl = TacRP.GetAttTable(k.Installed)
if atttbl.SightPos and atttbl.SightAng then
epos = atttbl.SightPos
eang = atttbl.SightAng
scale = k.VMScale or 1
break
end
end
local pos = Vector(0, 0, 0)
local ang = Angle(0, 0, 0)
if epos then
pos:Set(epos)
end
if eang then
ang:Set(eang)
end
pos = pos * scale
return pos, ang
end