add sborka
This commit is contained in:
95
garrysmod/addons/tacrp/lua/weapons/tacrp_base/sh_autoaim.lua
Normal file
95
garrysmod/addons/tacrp/lua/weapons/tacrp_base/sh_autoaim.lua
Normal file
@@ -0,0 +1,95 @@
|
||||
SWEP.LockOnEntity = NULL
|
||||
|
||||
SWEP.LastSearchTime = 0
|
||||
|
||||
SWEP.PlayedLockOnSound = false
|
||||
|
||||
function SWEP:ThinkLockOn()
|
||||
local owner = self:GetOwner()
|
||||
local lastlockonentity = self:GetLockOnEntity()
|
||||
|
||||
if CLIENT then
|
||||
if !IsValid(self:GetLockOnEntity()) then
|
||||
self.PlayedLockOnSound = false
|
||||
end
|
||||
end
|
||||
|
||||
if not ((self:GetSightAmount() >= 1 and self:GetValue("LockOnInSights")) or (self:GetSightAmount() < 1 and self:GetValue("LockOnOutOfSights"))) then
|
||||
self:SetLockOnEntity(nil)
|
||||
self:SetLockOnStartTime(CurTime())
|
||||
else
|
||||
local lockontarget = nil
|
||||
|
||||
if lastlockonentity and IsValid(lastlockonentity) then
|
||||
// check if it remains within seeker cage
|
||||
|
||||
local player_aim_vector = owner:GetAimVector()
|
||||
local target_angle = math.deg(math.acos(player_aim_vector:Dot((lastlockonentity:WorldSpaceCenter() - owner:GetShootPos()):GetNormalized())))
|
||||
|
||||
local dist = (lastlockonentity:WorldSpaceCenter() - owner:GetShootPos()):Length()
|
||||
|
||||
if target_angle < self:GetValue("LockOnTrackAngle") and dist < self:GetValue("LockOnRange") then
|
||||
lockontarget = lastlockonentity
|
||||
end
|
||||
else
|
||||
local tr = util.TraceLine(
|
||||
{
|
||||
start = owner:GetShootPos(),
|
||||
endpos = owner:GetShootPos() + owner:GetAimVector() * self:GetValue("LockOnRange"),
|
||||
ignoreworld = true,
|
||||
filter = function(target)
|
||||
if target == owner then return false end
|
||||
if target:IsPlayer() then return true end
|
||||
if (target:IsNPC() or target:IsNextBot()) then return true end
|
||||
if (target.LVS and target:GetHP() > 0) or target.Targetable then return true end
|
||||
if target.IsGlideVehicle then return true end
|
||||
if TacRP.LockableEntities[target:GetClass()] then return true end
|
||||
if TacRP.FlareEntities[target:GetClass()] or target.IsTacRPFlare then return true end
|
||||
end
|
||||
}
|
||||
)
|
||||
|
||||
lockontarget = tr.Entity
|
||||
end
|
||||
|
||||
if lockontarget and IsValid(lockontarget) then
|
||||
local occlusion_tr = util.TraceLine({
|
||||
start = owner:GetShootPos(),
|
||||
endpos = lockontarget:WorldSpaceCenter(),
|
||||
mask = MASK_SHOT,
|
||||
filter = function(ent)
|
||||
if ent == lockontarget or ent == owner or ent:GetOwner() == lockontarget then return false end
|
||||
if ent:IsVehicle() and ent:GetDriver() == owner then return false end
|
||||
if ent:GetClass() == "lvs_wheeldrive_wheel" or scripted_ents.IsBasedOn(ent:GetClass(), "tacrp_proj_base") then return false end
|
||||
return true
|
||||
end
|
||||
})
|
||||
if occlusion_tr.Hit then lockontarget = nil end
|
||||
end
|
||||
|
||||
if lockontarget and IsValid(lockontarget) then
|
||||
if lastlockonentity != lockontarget then
|
||||
self:SetLockOnStartTime(CurTime())
|
||||
if CLIENT and (IsFirstTimePredicted() or game.SinglePlayer()) then
|
||||
self:EmitSound(self:GetValue("Sound_StartLockOn"))
|
||||
end
|
||||
elseif not self.PlayedLockOnSound and CurTime() > self:GetLockOnStartTime() + self:GetValue("LockOnTime") then
|
||||
if CLIENT and (IsFirstTimePredicted() or game.SinglePlayer()) then
|
||||
self:EmitSound(self:GetValue("Sound_FinishLockOn"))
|
||||
self.PlayedLockOnSound = true
|
||||
end
|
||||
end
|
||||
self:SetLockOnEntity(lockontarget)
|
||||
self.LockOnEntity = lockontarget
|
||||
else
|
||||
self:SetLockOnEntity(nil)
|
||||
self.PlayedLockOnSound = false
|
||||
self:SetLockOnStartTime(CurTime())
|
||||
end
|
||||
end
|
||||
|
||||
if not IsValid(self:GetLockOnEntity()) then
|
||||
self:SetLockOnEntity(nil)
|
||||
self:SetLockOnStartTime(CurTime())
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user