159 lines
4.6 KiB
Lua
159 lines
4.6 KiB
Lua
AddCSLuaFile("shared.lua")
|
|
AddCSLuaFile("cl_init.lua")
|
|
include("shared.lua")
|
|
AddCSLuaFile("autorun/mur_drone_fx.lua")
|
|
|
|
if SERVER then
|
|
|
|
function ENT:Initialize()
|
|
self:SetModel("models/shtormer/sania.mdl")
|
|
self:PhysicsInit(SOLID_VPHYSICS)
|
|
self:SetMoveType(MOVETYPE_VPHYSICS)
|
|
self:SetSolid(SOLID_VPHYSICS)
|
|
self:SetNWBool("JamEnabled", true)
|
|
|
|
local phys = self:GetPhysicsObject()
|
|
if IsValid(phys) then phys:Wake() end
|
|
|
|
self.HP = self.HP or 500
|
|
end
|
|
|
|
function ENT:OnTakeDamage(dmginfo)
|
|
local dmg = dmginfo:GetDamage()
|
|
self.HP = self.HP - dmg
|
|
if self.HP <= 0 then
|
|
self:Remove()
|
|
end
|
|
end
|
|
|
|
-- Глушение дронов
|
|
function ENT:JamDrone(drone)
|
|
if not IsValid(drone) then return end
|
|
|
|
local dist = drone:GetPos():Distance(self:GetPos())
|
|
local jammed = dist <= self.JamDistance
|
|
|
|
drone:SetNWBool("Jammed", jammed)
|
|
|
|
if jammed then
|
|
drone:SetNWFloat("JamStrength", 1 - dist / self.JamDistance)
|
|
else
|
|
drone:SetNWFloat("JamStrength", 0)
|
|
end
|
|
end
|
|
|
|
hook.Add("KeyPress", "SaniaToggle", function(ply, key)
|
|
if key ~= IN_USE then return end
|
|
|
|
local tr = ply:GetEyeTrace()
|
|
local ent = tr.Entity
|
|
|
|
if not IsValid(ent) then return end
|
|
if ent:GetClass() ~= "sw_sania" then return end
|
|
if tr.HitPos:Distance(ply:GetPos()) > 150 then return end
|
|
|
|
local newState = not ent:GetNWBool("JamEnabled")
|
|
ent:SetNWBool("JamEnabled", newState)
|
|
|
|
if newState then
|
|
ply:ChatPrint("РЭБ: ВКЛЮЧЕНА")
|
|
ent:EmitSound("buttons/button3.wav", 75, 120)
|
|
else
|
|
ply:ChatPrint("РЭБ: ВЫКЛЮЧЕНА")
|
|
ent:EmitSound("buttons/button19.wav", 75, 80)
|
|
end
|
|
end)
|
|
|
|
|
|
|
|
function ENT:Think()
|
|
local sph = ents.FindInSphere(self:GetPos(), self.JamDistance)
|
|
if not self:GetNWBool("JamEnabled") then
|
|
for drone, _ in pairs(self.JammedDrones or {}) do
|
|
if IsValid(drone) then
|
|
drone:SetNWBool("Jammed", false)
|
|
drone:SetNWFloat("JamStrength", 0)
|
|
end
|
|
end
|
|
self.JammedDrones = {}
|
|
self:NextThink(CurTime() + 0.1)
|
|
return true
|
|
end
|
|
self.JammedDrones = self.JammedDrones or {}
|
|
|
|
-- временная таблица для отметки "кто сейчас в зоне"
|
|
local inZone = {}
|
|
|
|
for i = 1, #sph do
|
|
local ent = sph[i]
|
|
if not IsValid(ent) then continue end
|
|
|
|
local class = ent:GetClass()
|
|
|
|
-- 1) Игрок в UAV
|
|
if ent:IsPlayer() then
|
|
local veh = ent:lvsGetVehicle()
|
|
if IsValid(veh) then
|
|
local uav = veh:GetNWEntity("UAVControl")
|
|
if IsValid(uav) then
|
|
local dist = veh:GetPos():Distance(self:GetPos())
|
|
|
|
if dist < self.JamDistance then
|
|
if not self._savedRates then
|
|
self._savedRates = {
|
|
pitch = veh.TurnRatePitch,
|
|
yaw = veh.TurnRateYaw,
|
|
roll = veh.TurnRateRoll
|
|
}
|
|
end
|
|
|
|
local mul = math.max(0.1, dist / self.FullJamDistance)
|
|
|
|
veh.TurnRatePitch = self._savedRates.pitch * mul
|
|
veh.TurnRateYaw = self._savedRates.yaw * mul
|
|
veh.TurnRateRoll = self._savedRates.roll * mul
|
|
else
|
|
if self._savedRates then
|
|
veh.TurnRatePitch = self._savedRates.pitch
|
|
veh.TurnRateYaw = self._savedRates.yaw
|
|
veh.TurnRateRoll = self._savedRates.roll
|
|
self._savedRates = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 2) Дроны
|
|
if class == "mur_drone_entity"
|
|
or class == "mur_drone_grenade"
|
|
or class == "mur_drone_spy" then
|
|
|
|
inZone[ent] = true
|
|
self.JammedDrones[ent] = true
|
|
|
|
local dist = ent:GetPos():Distance(self:GetPos())
|
|
ent:SetNWBool("Jammed", true)
|
|
ent:SetNWFloat("JamStrength", 1 - dist / self.JamDistance)
|
|
end
|
|
end
|
|
|
|
for drone, _ in pairs(self.JammedDrones) do
|
|
if not IsValid(drone) then
|
|
self.JammedDrones[drone] = nil
|
|
continue
|
|
end
|
|
|
|
if not inZone[drone] then
|
|
drone:SetNWBool("Jammed", false)
|
|
drone:SetNWFloat("JamStrength", 0)
|
|
self.JammedDrones[drone] = nil
|
|
end
|
|
end
|
|
|
|
self:NextThink(CurTime() + 0.1)
|
|
return true
|
|
end
|
|
|
|
end
|