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

286 lines
8.9 KiB
Lua

function SWEP:GetMuzzleOrigin()
if !IsValid(self:GetOwner()) then
return self:GetPos()
end
if self:GetOwner():IsNPC() then
return SERVER and self:GetOwner():GetShootPos() or self:GetOwner():EyePos()
end
local pos = self:GetOwner():EyePos()
if self:GetBlindFire() then
local eyeang = self:GetOwner():EyeAngles()
local testpos = pos + eyeang:Up() * 24
if self:GetBlindFireLeft() or self:GetBlindFireRight() then
testpos = pos + eyeang:Forward() * 24
end
local tr = util.TraceLine({
start = pos,
endpos = testpos,
filter = self:GetOwner()
})
pos = tr.HitPos
end
local offset = self:GetValue("ShootOffset")
if offset.x != 0 then
pos = pos + self:GetOwner():GetRight() * offset.x
end
if offset.y != 0 then
pos = pos + self:GetOwner():GetForward() * offset.y
end
if offset.z != 0 then
pos = pos + self:GetOwner():GetUp() * offset.z
end
return pos
end
/*
ValveBiped.Bip01_Spine
ValveBiped.Bip01_Spine1
ValveBiped.Bip01_Spine2
ValveBiped.Bip01_Spine4
ValveBiped.Bip01_Neck1
ValveBiped.Bip01_Head1
ValveBiped.forward
ValveBiped.Bip01_R_Clavicle
ValveBiped.Bip01_R_UpperArm
ValveBiped.Bip01_R_Forearm
ValveBiped.Bip01_R_Hand
ValveBiped.Anim_Attachment_RH
ValveBiped.Bip01_L_Clavicle
ValveBiped.Bip01_L_UpperArm
ValveBiped.Bip01_L_Forearm
ValveBiped.Bip01_L_Hand
ValveBiped.Anim_Attachment_LH
ValveBiped.Bip01_R_Thigh
ValveBiped.Bip01_R_Calf
ValveBiped.Bip01_R_Foot
ValveBiped.Bip01_R_Toe0
ValveBiped.Bip01_L_Thigh
ValveBiped.Bip01_L_Calf
ValveBiped.Bip01_L_Foot
ValveBiped.Bip01_L_Toe0
ValveBiped.Bip01_L_Finger4
ValveBiped.Bip01_L_Finger41
ValveBiped.Bip01_L_Finger42
ValveBiped.Bip01_L_Finger3
ValveBiped.Bip01_L_Finger31
ValveBiped.Bip01_L_Finger32
ValveBiped.Bip01_L_Finger2
ValveBiped.Bip01_L_Finger21
ValveBiped.Bip01_L_Finger22
ValveBiped.Bip01_L_Finger1
ValveBiped.Bip01_L_Finger11
ValveBiped.Bip01_L_Finger12
ValveBiped.Bip01_L_Finger0
ValveBiped.Bip01_L_Finger01
ValveBiped.Bip01_L_Finger02
ValveBiped.Bip01_R_Finger4
ValveBiped.Bip01_R_Finger41
ValveBiped.Bip01_R_Finger42
ValveBiped.Bip01_R_Finger3
ValveBiped.Bip01_R_Finger31
ValveBiped.Bip01_R_Finger32
ValveBiped.Bip01_R_Finger2
ValveBiped.Bip01_R_Finger21
ValveBiped.Bip01_R_Finger22
ValveBiped.Bip01_R_Finger1
ValveBiped.Bip01_R_Finger11
ValveBiped.Bip01_R_Finger12
ValveBiped.Bip01_R_Finger0
ValveBiped.Bip01_R_Finger01
ValveBiped.Bip01_R_Finger02
*/
local bone_list = {
"ValveBiped.Bip01_R_UpperArm",
"ValveBiped.Bip01_R_Forearm",
"ValveBiped.Bip01_R_Hand",
"ValveBiped.Bip01_L_UpperArm",
"ValveBiped.Bip01_L_Forearm",
"ValveBiped.Bip01_L_Hand",
}
local bone_mods = {
-- ["ValveBiped.Bip01_R_UpperArm"] = Angle(0, -70, 0),
-- ["ValveBiped.Bip01_R_Hand"] = Angle(-55, 45, -90),
["ValveBiped.Bip01_R_UpperArm"] = Angle(45, -90, 0),
["ValveBiped.Bip01_R_Hand"] = Angle(-90, 0, 0),
}
local bone_mods_left = {
-- ["ValveBiped.Bip01_R_UpperArm"] = Angle(0, -70, 0),
-- ["ValveBiped.Bip01_R_Hand"] = Angle(-55, 45, -90),
["ValveBiped.Bip01_R_UpperArm"] = Angle(45, 0, 0),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, 0, 0),
["ValveBiped.Bip01_R_Hand"] = Angle(0, -75, 0),
}
local bone_mods_right = {
["ValveBiped.Bip01_R_UpperArm"] = Angle(-45, 0, 0),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, 0, 0),
["ValveBiped.Bip01_R_Hand"] = Angle(35, 75, 0),
}
local bone_mods_kys = {
["ValveBiped.Bip01_R_UpperArm"] = Angle(5, 0, 0),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, -5, 0),
["ValveBiped.Bip01_R_Hand"] = Angle(0, -165, 0),
}
local bone_mods_kys_pistol = {
["ValveBiped.Bip01_R_UpperArm"] = Angle(55, 0, 0),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, -75, 5),
["ValveBiped.Bip01_R_Hand"] = Angle(45, -75, 0),
}
local bone_mods_kys_dual = {
["ValveBiped.Bip01_L_UpperArm"] = Angle(-60, 0, -45),
["ValveBiped.Bip01_L_Forearm"] = Angle(0, -60, -30),
["ValveBiped.Bip01_L_Hand"] = Angle(-30, -45, -90),
["ValveBiped.Bip01_R_UpperArm"] = Angle(55, 0, 30),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, -60, 30),
["ValveBiped.Bip01_R_Hand"] = Angle(45, -75, 90),
}
local bone_mods_index = {
[TacRP.BLINDFIRE_UP] = bone_mods,
[TacRP.BLINDFIRE_LEFT] = bone_mods_left,
[TacRP.BLINDFIRE_RIGHT] = bone_mods_right,
[TacRP.BLINDFIRE_KYS] = bone_mods_kys,
}
function SWEP:ToggleBoneMods(on)
if !IsValid(self:GetOwner()) then return end
if on == TacRP.BLINDFIRE_NONE or on == false or on == nil then
for _, i in ipairs(bone_list) do
local boneindex = self:GetOwner():LookupBone(i)
if !boneindex then continue end
self:GetOwner():ManipulateBoneAngles(boneindex, Angle(0, 0, 0))
-- self:GetOwner():ManipulateBonePosition(boneindex, Vector(0, 0, 0))
end
else
local tbl = bone_mods_index[on]
if on == TacRP.BLINDFIRE_KYS and self:GetValue("HoldTypeSuicide") == "duel" then
tbl = bone_mods_kys_dual
elseif on == TacRP.BLINDFIRE_KYS and self:GetValue("HoldType") == "revolver" then
tbl = bone_mods_kys_pistol
end
for i, k in pairs(tbl) do
local boneindex = self:GetOwner():LookupBone(i)
if !boneindex then continue end
self:GetOwner():ManipulateBoneAngles(boneindex, k)
end
-- for i, k in pairs(tbl[2]) do
-- local boneindex = self:GetOwner():LookupBone(i)
-- if !boneindex then continue end
-- self:GetOwner():ManipulateBonePosition(boneindex, k)
-- end
end
end
function SWEP:GetBlindFireMode()
if !self:GetBlindFire() then
return TacRP.BLINDFIRE_NONE
elseif self:GetBlindFireLeft() and self:GetBlindFireRight() then
return TacRP.BLINDFIRE_KYS
elseif self:GetBlindFireLeft() then
return TacRP.BLINDFIRE_LEFT
elseif self:GetBlindFireRight() then
return TacRP.BLINDFIRE_RIGHT
else
return TacRP.BLINDFIRE_UP
end
end
local bfmode = {
[TacRP.BLINDFIRE_NONE] = {false, false, false},
[TacRP.BLINDFIRE_UP] = {true, false, false},
[TacRP.BLINDFIRE_LEFT] = {true, true, false},
[TacRP.BLINDFIRE_RIGHT] = {true, false, true},
[TacRP.BLINDFIRE_KYS] = {true, true, true},
}
function SWEP:SetBlindFireMode(mode)
if !bfmode[mode] then
print("[TacRP] WARNING! Trying to set invalid blindfire mode: " .. tostring(mode))
mode = 0
end
self:SetBlindFire(bfmode[mode][1])
self:SetBlindFireLeft(bfmode[mode][2])
self:SetBlindFireRight(bfmode[mode][3])
end
function SWEP:CheckBlindFire(suicide)
if !self:GetValue("CanBlindFire") and (!suicide or !self:GetValue("CanSuicide")) then return false end
if (self:GetIsSprinting()
or self:GetAnimLockTime() > CurTime()
or self:GetPrimedGrenade()
or self:IsInScope()
or self:GetSafe()) then
return false
end
return true
end
function SWEP:ToggleBlindFire(bf)
local kms = bf == TacRP.BLINDFIRE_KYS or bf == TacRP.BLINDFIRE_NONE
if bf != TacRP.BLINDFIRE_NONE and (!self:CheckBlindFire(kms) or bf == self:GetBlindFireMode()) then return end
local diff = bf != self:GetBlindFireMode()
if diff then
self:ToggleCustomize(false)
self:ScopeToggle(0)
self:SetBlindFireFinishTime(CurTime() + (bf == TacRP.BLINDFIRE_KYS and 1 or 0.3))
end
self:SetBlindFireMode(bf)
self:ToggleBoneMods(bf)
self:SetShouldHoldType()
if bf == TacRP.BLINDFIRE_KYS and TacRP.ShouldWeFunny() then
self:GetOwner():EmitSound("tacrp/low-tier-god.mp3", 80, 100)
end
if diff then
if self:StillWaiting(true) then
self:IdleAtEndOfAnimation()
else
self:Idle()
end
end
end
function SWEP:ThinkBlindFire()
if (self:GetOwner():KeyDown(IN_ZOOM) or self:GetOwner().TacRPBlindFireDown) and !tobool(self:GetOwner():GetInfo("tacrp_blindfiremenu")) then
if CLIENT then self.LastHintLife = CurTime() end
if self:GetOwner():KeyDown(IN_FORWARD) then
self:ToggleBlindFire(TacRP.BLINDFIRE_UP)
elseif self:GetOwner():KeyDown(IN_MOVELEFT) and !self:GetOwner():KeyDown(IN_MOVERIGHT) then
self:ToggleBlindFire(TacRP.BLINDFIRE_LEFT)
elseif self:GetOwner():KeyDown(IN_MOVERIGHT) and !self:GetOwner():KeyDown(IN_MOVELEFT) then
self:ToggleBlindFire(TacRP.BLINDFIRE_RIGHT)
elseif self:GetOwner():KeyDown(IN_SPEED) and self:GetOwner():KeyDown(IN_WALK) and !tobool(self:GetOwner():GetInfo("tacrp_idunwannadie")) then
self:ToggleBlindFire(TacRP.BLINDFIRE_KYS)
elseif self:GetOwner():KeyDown(IN_BACK) then
self:ToggleBlindFire(TacRP.BLINDFIRE_NONE)
end
elseif (self:GetOwner():KeyDown(IN_ZOOM) or self:GetOwner().TacRPBlindFireDown) and self:GetOwner():GetInfo("tacrp_blindfiremenu") and self:GetOwner():GetCanZoom() then
self:GetOwner():SetCanZoom(false)
end
end