133 lines
3.6 KiB
Lua
133 lines
3.6 KiB
Lua
function SWEP:InBipod()
|
|
local bip = self:GetInBipod()
|
|
|
|
-- if !self:CanBipod() then
|
|
-- self:ExitBipod()
|
|
-- end
|
|
|
|
if IsValid(self:GetOwner()) and (self:GetOwner():GetVelocity():LengthSqr() >= 100 or self:GetSprintAmount() > 0) then
|
|
self:ExitBipod()
|
|
end
|
|
|
|
return bip
|
|
end
|
|
|
|
SWEP.CachedCanBipod = true
|
|
SWEP.CachedCanBipodTime = 0
|
|
SWEP.LastBipodTime = 0
|
|
local dist = 24
|
|
function SWEP:CanBipod()
|
|
if !self:GetValue("Bipod") then return false end
|
|
|
|
if self:GetOwner():InVehicle() then return false end
|
|
if self:GetSprintAmount() > 0 and !self:DoForceSightsBehavior() then return false end
|
|
|
|
if self.CachedCanBipodTime >= CurTime() then return tobool(self.CachedCanBipod), self.CachedCanBipod end
|
|
|
|
local pos = self:GetOwner():EyePos()
|
|
local angle = self:GetOwner():EyeAngles()
|
|
if math.abs(angle.p) <= 45 then
|
|
angle.p = 0
|
|
end
|
|
if self:GetOwner():GetVelocity():Length() > 0 then
|
|
return false
|
|
end
|
|
|
|
local rangemult = 2
|
|
if self:IsProne() then
|
|
rangemult = rangemult * 1.25
|
|
end
|
|
|
|
local tr = util.TraceLine({
|
|
start = pos,
|
|
endpos = pos + (angle:Forward() * dist * rangemult),
|
|
filter = self:GetOwner(),
|
|
mask = MASK_PLAYERSOLID
|
|
})
|
|
|
|
if tr.Hit then -- check for stuff in front of us
|
|
return false
|
|
end
|
|
|
|
local maxs = Vector(10, 10, 16)
|
|
local mins = Vector(-10, -10, 0)
|
|
|
|
angle.p = angle.p + 45
|
|
|
|
tr = util.TraceHull({
|
|
start = pos,
|
|
endpos = pos + (angle:Forward() * dist * rangemult),
|
|
filter = self:GetOwner(),
|
|
maxs = maxs,
|
|
mins = mins,
|
|
mask = MASK_PLAYERSOLID
|
|
})
|
|
|
|
self.CachedCanBipodTime = CurTime()
|
|
|
|
if tr.Hit then
|
|
local tr2 = util.TraceHull({
|
|
start = tr.HitPos,
|
|
endpos = tr.HitPos + Vector(0, 0, -dist),
|
|
filter = self:GetOwner(),
|
|
maxs = maxs,
|
|
mins = mins,
|
|
mask = MASK_PLAYERSOLID
|
|
})
|
|
if tr2.Hit then
|
|
self.CachedCanBipod = tr2
|
|
return true, tr2
|
|
end
|
|
end
|
|
|
|
self.CachedCanBipod = false
|
|
return false
|
|
end
|
|
|
|
function SWEP:EnterBipod(sp)
|
|
if !sp and self:GetInBipod() then return end
|
|
local can, tr = self:CanBipod()
|
|
if !sp and !can then return end
|
|
|
|
if SERVER and game.SinglePlayer() then self:CallOnClient("EnterBipod", "true") end
|
|
self.LastBipodTime = CurTime()
|
|
|
|
local owner = self:GetOwner()
|
|
|
|
local bipodang = tr.HitNormal:Cross(owner:EyeAngles():Right()):Angle()
|
|
-- bipodang.p = math.ApproachAngle(bipodang.p, owner:EyeAngles().p, 10)
|
|
|
|
debugoverlay.Axis(tr.HitPos, tr.HitNormal:Angle(), 16, 5, true)
|
|
debugoverlay.Line(tr.HitPos, tr.HitPos + bipodang:Forward() * 32, 5, color_white, true)
|
|
debugoverlay.Line(tr.HitPos, tr.HitPos + owner:EyeAngles():Forward() * 32, 5, Color(255, 255, 0), true)
|
|
|
|
self:SetBipodPos(owner:EyePos() + (owner:EyeAngles():Forward() * 4) - Vector(0, 0, 3))
|
|
self:SetBipodAngle(bipodang)
|
|
|
|
if game.SinglePlayer() and CLIENT then return end
|
|
|
|
self:EmitSound(self.Sound_BipodDown, 70, 100, 1, CHAN_ITEM)
|
|
self:SetInBipod(true)
|
|
self:DoBodygroups()
|
|
end
|
|
|
|
function SWEP:ExitBipod(sp)
|
|
if !sp and !self:GetInBipod() then return end
|
|
|
|
if SERVER and game.SinglePlayer() then self:CallOnClient("ExitBipod", "true") end
|
|
self.LastBipodTime = CurTime()
|
|
if game.SinglePlayer() and CLIENT then return end
|
|
|
|
self:EmitSound(self.Sound_BipodUp, 70, 100, 1, CHAN_ITEM)
|
|
self:SetInBipod(false)
|
|
self:DoBodygroups()
|
|
end
|
|
|
|
function SWEP:IsProne()
|
|
if PRONE_INPRONE then
|
|
return self:GetOwner().IsProne and self:GetOwner():IsProne()
|
|
else
|
|
return false
|
|
end
|
|
end
|