Files
2026-03-30 10:39:52 +03:00

1091 lines
35 KiB
Lua

local pl = FindMetaTable("Player")
util.AddNetworkString("COD.UAVStart")
util.AddNetworkString("COD.CounterUAVStart")
util.AddNetworkString("COD.KillstreaksHUD2")
util.AddNetworkString("COD.NukeEffect")
util.AddNetworkString("COD.AirPatrol")
function pl:SelectKillStreaks(first, second, third)
local max = #COD.Killstreaks
if first < 0 or first > max then
first = 0
end
if second < 0 or second > max then
second = 0
end
if third < 0 or third > max then
third = 0
end
self:SetNWFloat('KillStreak1', first)
self:SetNWFloat('KillStreak2', second)
self:SetNWFloat('KillStreak3', third)
end
function pl:SelectKillstreaksRandom()
if self:IsBot() then
local tab = {}
local tab2 = {}
for i=1,14 do
table.insert(tab2, i)
end
local num1 = math.random(1,#tab2)
tab[1] = tab2[num1]
table.remove(tab2, num1)
local num2 = math.random(1,#tab2)
tab[2] = tab2[num2]
table.remove(tab2, num2)
local num3 = math.random(1,#tab2)
tab[3] = tab2[num3]
table.sort(tab, function(a, b) return a < b end)
self:SelectKillStreaks(tab[1], tab[2], tab[3])
else
self:SelectKillStreaks(1, 7, 13)
end
end
function pl:CheckKillstreaks()
local tab = COD.Killstreaks
local ks1, ks2, ks3 = self:GetNWFloat('KillStreak1'), self:GetNWFloat('KillStreak2'), self:GetNWFloat('KillStreak3')
local frags = self:GetNWFloat('KillsP')
if ks1 > 0 then
if tab[ks1].kills <= frags and not self:GetNWBool('KillStreak1_Gave') and not self:GetNWBool('KillStreak1_Used') then
self:SetNWBool('KillStreak1_Gave', true)
net.Start("COD.KillstreaksHUD")
net.WriteFloat(ks1)
net.Send(self)
end
end
if ks2 > 0 then
if tab[ks2].kills <= frags and not self:GetNWBool('KillStreak2_Gave') and not self:GetNWBool('KillStreak2_Used') then
self:SetNWBool('KillStreak2_Gave', true)
net.Start("COD.KillstreaksHUD")
net.WriteFloat(ks2)
net.Send(self)
end
end
if ks3 > 0 then
if tab[ks3].kills <= frags and not self:GetNWBool('KillStreak3_Gave') and not self:GetNWBool('KillStreak3_Used') then
self:SetNWBool('KillStreak3_Gave', true)
net.Start("COD.KillstreaksHUD")
net.WriteFloat(ks3)
net.Send(self)
end
end
end
function pl:UseKillstreak(type)
local tab = COD.Killstreaks
local ks1, ks2, ks3, ks4 = self:GetNWFloat('KillStreak1'), self:GetNWFloat('KillStreak2'), self:GetNWFloat('KillStreak3'), self.KillstreakOthers
if self:GetNWBool('KillStreak1_Gave') and not self:GetNWBool('KillStreak1_Used') and type == 1 then
self:SetNWBool('KillStreak1_Used', true)
self:SetNWBool('KillStreak1_Gave', false)
tab[ks1].func(self)
elseif self:GetNWBool('KillStreak2_Gave') and not self:GetNWBool('KillStreak2_Used') and type == 2 then
self:SetNWBool('KillStreak2_Used', true)
self:SetNWBool('KillStreak2_Gave', false)
tab[ks2].func(self)
elseif self:GetNWBool('KillStreak3_Gave') and not self:GetNWBool('KillStreak3_Used') and type == 3 then
self:SetNWBool('KillStreak3_Used', true)
self:SetNWBool('KillStreak3_Gave', false)
tab[ks3].func(self)
elseif istable(ks4) and #ks4 > 0 and type == 4 then
ks4 = ks4[#ks4]
tab[ks4].func(self)
COD:KillstreakAddOther(self, true)
end
end
function pl:GiveRadioWep(str)
local wep = self:Give("tdm_radio")
wep.Killstreak = str
if str == "strating_run" then
wep.ManyTimes = true
wep.EndAfter = 3
end
self:SelectWeapon("tdm_radio")
local aw = self:GetActiveWeapon()
if IsValid(aw) then
self.RadioBeforeWep = aw:GetClass()
else
self.RadioBeforeWep = ""
end
end
function COD:GiveKSAnn(float, ply)
net.Start("COD.KillstreaksHUD2")
net.WriteFloat(float)
net.WriteEntity(ply)
net.Broadcast()
end
function COD:ChooseKillstreakRadio(ply, weapon, pos)
local str = weapon.Killstreak
if str == "package" then
COD:DropPackage(pos, ply)
elseif str == "airstrike" then
COD:AirstrikeCall(ply, pos)
elseif str == "mortar" then
COD:MortarCall(ply, pos)
elseif str == "airstrike_line" then
COD:LineAirstrikeCall(ply, pos)
elseif str == "emergencypackage" then
COD:DropEmergencyPackage(pos, ply)
elseif str == "helicopterrun" then
COD:HelicopterRun(ply, pos)
elseif str == "helicopter" then
COD:SpawnHelicopter(ply, pos)
elseif str == "strating_run" then
COD:StratingRun(ply, pos)
elseif str == "harrier" then
COD:SpawnHarrier(ply, pos)
end
end
function COD:CheckSky(ent)
local tr = ent
if !isvector(ent) then
tr = tr:GetPos()
end
local tr2 = util.TraceLine({
start = tr,
endpos = tr+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
})
return tr2.HitSky
end
-------------------------------------------------------------------------------------------------------------
function COD:AirPatrol(ply)
local team = ply:Team()
local pos = ply:GetPos()
COD:GiveKSAnn(10, ply)
local tr2 = util.TraceLine({
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
})
local height = math.Clamp(tr2.HitPos:Distance(pos), 100, 600)
for i = 1,3 do
timer.Simple(i, function()
local airm = ents.Create('prop_dynamic')
airm:SetModel('models/tdmg/a10.mdl')
airm:SetPos(ply:GetPos()+Vector(0,0,height))
airm:SetAngles(Angle(0,rnd,0))
airm:Spawn()
airm:ResetSequence('strafing run')
if i == 3 then
sound.Play("ambient/explosions/exp1.wav", pos, 0)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() != ply:Team() then
net.Start("COD.AirPatrol")
net.WriteBool(true)
net.Send(pl)
else
net.Start("COD.AirPatrol")
net.WriteBool(false)
net.Send(pl)
end
end
for _, p in ipairs(ents.GetAll()) do
if p.KillstreakModel and p.Team and p.Team != ply:Team() then
p:EmitSound("ambient/explosions/explode_1.wav")
ParticleEffect("explosion_huge_h", p:GetPos(), Angle(0,0,0))
p:Remove()
end
if (p:GetClass() == "tdm_ah64" or p:GetClass() == "tdm_mi24" or p:GetClass() == "tdm_harrier") and team != p.Team then
p:DestroyHeli(true)
end
end
end
timer.Simple(6, function()
if !IsValid(airm) then return end
sound.Play("tdmg/a10.wav", pos, 0)
end)
timer.Simple(15, function()
if !IsValid(airm) then return end
airm:Remove()
end)
end)
end
sound.Play("ambient/machines/aircraft_distant_flyby3.wav", pos, 0)
end
function COD:StratingRun(ply, pos)
if istable(pos) then
COD:GiveKSAnn(12, ply)
local ang = Angle(0,rnd,0)
for k, v in ipairs(pos) do
local airm = ents.Create('prop_dynamic')
timer.Simple(4+k, function()
airm:SetModel('models/tdmg/saebomber.mdl')
airm:SetPos(v)
airm:SetAngles(ang)
airm:Spawn()
airm:ResetSequence('fly')
airm.Team = ply:Team()
airm.KillstreakModel = true
airm:EmitSound("ambient/machines/aircraft_distant_flyby3.wav")
end)
timer.Simple(5.5+k/2, function()
if !IsValid(airm) then return end
util.ScreenShake( v, 5, 2, 2, 5000 )
local explosion = ents.Create("env_explosion")
explosion:SetPos(v)
explosion:Spawn()
explosion:SetCreator(airm)
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "300")
explosion:Fire("Explode", 0, 0)
ParticleEffect("explosion_huge_h", v, Angle(0,0,0))
sound.Play("tdmg/a10_explosion.wav", v, 0)
end)
timer.Simple(7+k/2, function()
if !IsValid(airm) then return end
airm:Remove()
end)
end
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_enemy.wav')]])
end
end
end
end
function COD:CallReinforcment(ply)
local pos, dist = nil, 999999
local team = ply:Team()
local tab = COD.DataTable["backup_Spawns"]
COD:GiveKSAnn(15, ply)
for _, v in ipairs(tab) do
if isvector(pos) then
local dis1 = v:Distance(ply:GetPos())
if dis1 <= dist then
pos, dist = v, dis1
end
else
pos = v
end
end
if isvector(pos) then
local heli = ents.Create("tdm_infil")
heli:SetPos(pos)
heli.Team2Team = ply:Team() == 2
heli:Spawn()
heli.Team = ply:Team()
heli:SetNWFloat('Team', heli.Team)
heli.KillstreakModel = true
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/cover_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/cover_enemy.wav')]])
end
end
end
end
function COD:SpawnSentry(ply)
local team = ply:Team()
local pos = ply:GetForward()*56+ply:GetPos()
COD:GiveKSAnn(9, ply)
if pos then
local sen = ents.Create("tdm_sentry")
sen:SetPos(pos)
sen:SetAngles(ply:GetAngles())
sen:Spawn()
sen.Team = ply:Team()
sen:SetNWFloat('Team', sen.Team)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/turret_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/turret_enemy.wav')]])
end
end
end
end
function COD:SpawnHelicopter(ply, pos)
local team = ply:Team()
if pos then
COD:GiveKSAnn(13, ply)
local mi = ents.Create("tdm_mi24")
mi:SetPos(pos)
mi:SetAngles(Angle(0,math.random(0,360),0))
mi:Spawn()
mi.Team = ply:Team()
mi:SetNWFloat('Team', mi.Team)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/heli_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/heli_friendly.wav')]])
end
end
end
end
function COD:UAVCall(team, mobile)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == team then
net.Start("COD.UAVStart")
net.WriteBool(mobile)
net.Send(ply)
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/uav_friendly.wav')]])
else
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/uav_enemy.wav')]])
end
end
end
function COD:CounterUAVCall(plys)
COD:GiveKSAnn(5, plys)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == plys:Team() then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/counter_uav_friendly.wav')]])
else
net.Start("COD.CounterUAVStart")
net.Send(ply)
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/counter_uav_enemy.wav')]])
end
end
end
function COD:CallAC130(pl)
local team = pl:Team()
local ac = ents.Create("prop_dynamic")
ac:SetModel("models/tdmg/ac130hipienfly.mdl")
ac:SetPos(pl:GetPos())
ac.KillstreakModel = true
ac.Team = pl:Team()
ac:Spawn()
ac:SetMaterial("phoenix_storms/grey_steel")
ac:ResetSequence("fly")
ac:SetPlaybackRate(0.5)
ac.PenetrationPower = 25
local plane = ac
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == team then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/ac130_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/ac130_enemy.wav')]])
end
end
local bulletdelay = CurTime()+math.random(5,10)
local rocketdelay = CurTime()+math.random(10,20)
local rnd = math.random(1,666666666)
hook.Add("Think", "AC130"..rnd, function()
local targets = {}
if !IsValid(ac) then
hook.Remove("Think", "AC130"..rnd)
end
if bulletdelay < CurTime() then
bulletdelay = CurTime()+math.random(5,10)
for _, ply in ipairs(player.GetAll()) do
if ply:Alive() and ply:Team() != team and COD:CheckSky(ply) and ply:GetNWFloat('Perk2') != 4 then
table.insert(targets, ply)
end
end
if #targets > 0 then
local target = targets[math.random(1,#targets)]
for i=1,75 do
timer.Simple(i/30, function()
if !IsValid(plane) then return end
local pos = target:GetPos()
util.ScreenShake(pos, 1, 2, 2, 5000)
plane.CurrentPenetrationPower = plane.PenetrationPower
plane:FireBullets({
Damage = 250,
Src = pos+Vector(0,0,64),
Dir = Vector(0,0,-1),
Spread = VectorRand(-0.5,0.5),
Force = 50,
Attacker = ply,
Tracer = 0,
})
if i == 1 then
sound.Play("tdmg/killstreaks/ac130_gun.wav", pos, 0)
end
end)
end
end
elseif rocketdelay < CurTime() then
rocketdelay = CurTime()+math.random(10,20)
for _, ply in ipairs(player.GetAll()) do
if ply:Alive() and ply:Team() != team and COD:CheckSky(ply) then
table.insert(targets, ply)
end
end
if #targets > 0 then
local target = targets[math.random(1,#targets)]
for i=1,math.random(2,4) do
timer.Simple(i/2, function()
if !IsValid(plane) then return end
local pos2 = target:GetPos() + Vector(math.random(-200,200),math.random(-200,200),0)
util.ScreenShake(pos2, 5, 2, 2, 5000)
util.BlastDamage(plane, plane, pos2, 512, 256)
ParticleEffect("explosion_huge_h", pos2, Angle(0,0,0))
util.Decal("ExplosiveGunshot", pos2, pos2-Vector(0,0,4))
sound.Play("tdmg/killstreaks/ac130_rocket.wav", pos2, 0)
end)
end
end
end
end)
timer.Simple(60, function()
if IsValid(ac) then
ac:Remove()
end
end)
end
function COD:SpawnHarrier(plys, pos)
if pos then
COD:GiveKSAnn(14, plys)
local h = ents.Create("tdm_harrier")
h:SetPos(pos)
h:SetAngles(Angle(0,math.random(0,360),0))
h:Spawn()
h.Team = plys:Team()
h:SetNWFloat('Team', h.Team)
timer.Simple(2.5, function()
if !IsValid(h) then return end
util.ScreenShake( pos, 5, 2, 2, 5000 )
local explosion = ents.Create("env_explosion")
explosion:SetCreator(h)
explosion:SetPos(pos)
explosion:Spawn()
explosion.Team = plys:Team()
explosion:SetKeyValue("iMagnitude", "300")
explosion:Fire("Explode", 0, 0)
ParticleEffect("explosion_huge_h", pos, Angle(0,0,0))
sound.Play("tdmg/a10_explosion.wav", pos, 0)
end)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == plys:Team() then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/harrier_friendly.wav')]])
else
net.Start("COD.CounterUAVStart")
net.Send(ply)
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/harrier_enemy.wav')]])
end
end
end
end
function COD:DropPackage(pos, ply)
local tr2 = util.TraceLine( {
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
} )
if not tr2.HitSky then return end
COD:GiveKSAnn(4, ply)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_enemy.wav')]])
end
end
local height = math.Clamp(tr2.HitPos:Distance(pos), 100, 600)
local heli = ents.Create("prop_dynamic")
heli:SetModel("models/tdmg/heli.mdl")
heli:SetPos(pos+Vector(0,0,4))
heli:SetAngles(Angle(0,math.random(0,360),0))
heli:Spawn()
heli:ResetSequence("spawn")
heli:SetBodygroup(3, 1)
heli.Team = ply:Team()
heli.KillstreakModel = true
timer.Simple(1, function()
for i=1,10 do
local sproxy = ents.Create("tdm_infil_soundproxy")
sproxy:SetOwner(heli:GetOwner())
sproxy:SetPos(heli:GetPos())
sproxy:SetAngles(heli:GetAngles())
sproxy:SetParent(heli)
sproxy.Sound = "tdmg/sas1_veh1_int_quad_front_stat.wav"
sproxy.Bone = "tag_main_rotor_static"
sproxy.Vol = 100
sproxy:Spawn()
end
end)
timer.Simple(12, function()
if !IsValid(heli) then return end
local care = ents.Create("tdm_package")
care:SetPos(pos+Vector(0,0,height-64))
care:Spawn()
care:SetNWEntity('Owner', ply)
care:SetAngles(heli:GetAngles())
end)
timer.Simple(30, function()
if IsValid(heli) then
heli:Remove()
end
end)
end
function COD:DropEmergencyPackage(pos, ply)
local tr2 = util.TraceLine( {
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
} )
if not tr2.HitSky then return end
COD:GiveKSAnn(19, ply)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_enemy.wav')]])
end
end
local height = math.Clamp(tr2.HitPos:Distance(pos), 100, 600)
local heli = ents.Create("prop_dynamic")
heli:SetModel("models/tdmg/heli.mdl")
heli:SetPos(pos+Vector(0,0,4))
heli:SetAngles(Angle(0,math.random(0,360),0))
heli:Spawn()
heli:ResetSequence("spawn")
heli:SetBodygroup(3, 1)
heli.Team = ply:Team()
heli.KillstreakModel = true
timer.Simple(1, function()
for i=1,10 do
local sproxy = ents.Create("tdm_infil_soundproxy")
sproxy:SetOwner(heli:GetOwner())
sproxy:SetPos(heli:GetPos())
sproxy:SetAngles(heli:GetAngles())
sproxy:SetParent(heli)
sproxy.Sound = "tdmg/sas1_veh1_int_quad_front_stat.wav"
sproxy.Bone = "tag_main_rotor_static"
sproxy.Vol = 100
sproxy:Spawn()
end
end)
for i=1,3 do
timer.Simple(10+(i*1.5), function()
if !IsValid(heli) then return end
local care = ents.Create("tdm_package")
care:SetPos(pos+Vector(math.random(-64,64),math.random(-64,64),height-64))
care:Spawn()
care:SetNWEntity('Owner', ply)
care:SetAngles(heli:GetAngles())
end)
end
timer.Simple(30, function()
if IsValid(heli) then
heli:Remove()
end
end)
end
function COD:SpawnCMine(ply)
COD:GiveKSAnn(6, ply)
local mine = ents.Create('tdm_cmine')
mine:SetPos(ply:EyePos())
mine.Team = ply:Team()
mine:Spawn()
mine:GetPhysicsObject():SetVelocity(ply:GetAimVector()*256)
end
function COD:DroneSpawn(ply)
local team = ply:Team()
COD:GiveKSAnn(2, ply)
if not ply:IsBot() then
local ch = ents.Create("tdm_drone")
ch:SetPos(ply:EyePos()+Vector(0,0,16))
ch:SetCreator(ply)
ch:SetAngles(ply:GetAngles())
ch:Spawn()
ch.Team = ply:Team()
ch:SetNWFloat('Team', ch.Team)
return
end
end
function COD:HelicopterRun(ply, pos)
local team = ply:Team()
COD:GiveKSAnn(17, ply)
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() and pl != ply then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/heli_friendly.wav')]])
elseif pl:Team() != ply:Team() and pl != ply then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/heli_enemy.wav')]])
end
end
if COD.DataTable["Enable_ManualControl_ChopperGunner"] and not ply:IsBot() then
local pos = table.Random(COD.DataTable["ChopperGunner_Spawns"])
local ch = ents.Create("tdm_ah64")
ch:SetPos(pos)
ch:SetCreator(ply)
ch.Team = ply:Team()
ch:SetNWFloat('Team', ch.Team)
ch:Spawn()
return
end
local tr2 = util.TraceLine({
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
})
local height = math.Clamp(tr2.HitPos:Distance(pos), 0, 600)
local airm = ents.Create('prop_dynamic')
airm:SetModel('models/tdmg/ah64.mdl')
airm:SetPos(pos+Vector(0,0,height))
airm:SetAngles(Angle(0,math.random(0,360),0))
airm:Spawn()
airm:ResetSequence('action')
airm:SetPlaybackRate(0.5)
airm.Attacking = false
airm.Team = ply:Team()
airm.KillstreakModel = true
sound.Play("tdmg/killstreaks/ah64_flyby.ogg", pos, 0)
timer.Simple(6, function()
if !IsValid(airm) then return end
timer.Create("TargetChecker"..airm:EntIndex(), 1, 24, function()
if !IsValid(airm) then return end
if not airm.Attacking then
for _, ent in ipairs(ents.FindInSphere(pos, 1500)) do
if ent:IsPlayer() and ent:Alive() and ent:Team() != airm.Team and COD:CheckSky(ent) and ent:GetNWFloat('Perk2') != 4 then
local max = math.random(4,8)
for i=1, max do
timer.Simple(i/5, function()
if !IsValid(airm) then return end
local pos2 = ent:GetPos()+Vector(math.random(-64,64), math.random(-64,64),0)
sound.Play("tdmg/killstreaks/apache_cannon.wav", pos, 0)
timer.Simple(0.2, function()
local explosion = ents.Create("env_explosion")
explosion:SetCreator(airm)
explosion:SetPos(pos2)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "75")
explosion:Fire("Explode", 0, 0)
end)
airm.Attacking = true
if i == max then
timer.Simple(1, function()
if !IsValid(airm) then return end
airm.Attacking = false
end)
end
end)
end
end
end
end
end)
end)
timer.Simple(42, function()
if !IsValid(airm) then return end
airm:Remove()
end)
end
function COD:MortarCall(ply, pos)
local team = ply:Team()
local tr2 = util.TraceLine( {
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
} )
if not tr2.HitSky then return end
COD:GiveKSAnn(11, ply)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == team then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_friendly.wav')]])
else
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_enemy.wav')]])
end
end
local height = math.Clamp(tr2.HitPos:Distance(pos)-100, 512, 4096)
local rnd = math.random(0,360)
sound.Play("ambient/explosions/exp3.wav", pos, 0)
local cooldown = 6
for i=1,16 do
if i == 5 or i == 9 or i == 13 then
cooldown = cooldown + 4
end
timer.Simple(cooldown+i, function()
local pos2 = pos + Vector(math.random(-300,300),math.random(-300,300),0)
sound.Play("weapons/mortar/mortar_shell_incomming1.wav", pos2, 0)
timer.Simple(0.8, function()
util.ScreenShake( pos2, 5, 2, 2, 5000 )
local explosion = ents.Create("env_explosion")
explosion:SetCreator(game.GetWorld())
explosion:SetPos(pos2)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "250")
explosion:Fire("Explode", 0, 0)
ParticleEffect("explosion_huge_h", pos2, Angle(0,0,0))
sound.Play("tdmg/a10_explosion.wav", pos2, 0)
end)
end)
end
timer.Simple(15, function()
if !IsValid(airm) then return end
airm:Remove()
airm2:Remove()
end)
end
function COD:LineAirstrikeCall(ply, pos)
local team = ply:Team()
COD:GiveKSAnn(16, ply)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == team then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_friendly.wav') COD:SpeakerSay('tdmg/killstreaks/airstrike_siren.wav')]])
else
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_enemy.wav') COD:SpeakerSay('tdmg/killstreaks/airstrike_siren.wav')]])
end
end
local rnd = math.random(0,360)
local airm = ents.Create('prop_dynamic')
airm:SetModel('models/tdmg/b2.mdl')
airm:SetPos(pos)
airm:SetAngles(Angle(0,rnd,0))
airm:Spawn()
airm:ResetSequence('action')
airm:SetPlaybackRate(0.25)
airm.Team = ply:Team()
airm.KillstreakModel = true
sound.Play("ambient/machines/aircraft_distant_flyby3.wav", pos, 0)
local offset = 3000
timer.Simple(8, function()
if !IsValid(airm) then return end
for i=1,100 do
timer.Simple(0.1*i, function()
if !IsValid(airm) then return end
offset = offset - 60
local pos2 = pos+airm:GetForward()*(offset)
if COD:CheckSky(pos2) then
local explosion = ents.Create("env_explosion")
explosion:SetCreator(airm)
explosion:SetPos(pos2+airm:GetRight()*32)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "300")
explosion:Fire("Explode", 0, 0)
local explosion = ents.Create("env_explosion")
explosion:SetCreator(airm)
explosion:SetPos(pos2-airm:GetRight()*32)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "300")
explosion:Fire("Explode", 0, 0)
ParticleEffect("explosion_huge_h", pos2-airm:GetRight()*32, Angle(0,0,0))
ParticleEffect("explosion_huge_h", pos2+airm:GetRight()*32, Angle(0,0,0))
util.ScreenShake( pos2, 5, 2, 2, 5000 )
sound.Play("tdmg/a10_explosion.wav", pos2, 0)
end
end)
end
end)
timer.Simple(20, function()
if !IsValid(airm) then return end
airm:Remove()
end)
end
function COD:AirstrikeCall(ply, pos)
local team = ply:Team()
local tr2 = util.TraceLine( {
start = pos,
endpos = pos+Vector(0,0,99999),
filter = function( ent ) return ( ent:GetClass() == "prop_static" ) end,
} )
--if not tr2.HitSky then return end
COD:GiveKSAnn(7, ply)
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == team then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_friendly.wav')]])
else
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/airstrike_enemy.wav')]])
end
end
local height = math.Clamp(tr2.HitPos:Distance(pos)-100, 512, 4096)
local rnd = math.random(0,360)
local airm = ents.Create('prop_dynamic')
airm:SetModel('models/tdmg/a10.mdl')
airm:SetPos(pos)
airm:SetAngles(Angle(0,rnd,0))
airm:Spawn()
airm:ResetSequence('strafing run')
airm.Team = ply:Team()
airm.KillstreakModel = true
airm.PenetrationPower = 25
local airm2 = ents.Create('prop_dynamic')
airm2:SetModel('models/tdmg/a10.mdl')
airm2:SetPos(pos)
airm2:SetAngles(Angle(0,rnd,0))
airm2:Spawn()
airm2:SetNoDraw(true)
airm2.Team = ply:Team()
airm2.KillstreakModel = true
airm2.PenetrationPower = 25
timer.Simple(3, function()
if !IsValid(airm2) then return end
airm2:ResetSequence('strafing run')
airm2:SetNoDraw(false)
end)
sound.Play("ambient/machines/aircraft_distant_flyby3.wav", pos, 0)
timer.Simple(6, function()
if !IsValid(airm) then return end
sound.Play("tdmg/a10.wav", pos, 0)
end)
timer.Simple(9, function()
if !IsValid(airm2) then return end
sound.Play("tdmg/a10.wav", pos, 0)
end)
for i=1,1000 do
timer.Simple(6+(i/500), function()
if !IsValid(airm) then return end
util.ScreenShake( pos, 1, 2, 2, 5000 )
airm.CurrentPenetrationPower = airm.PenetrationPower
local add = Vector(math.random(-256,256),math.random(-256,256),0)
airm:FireBullets({
Damage = 500,
Src = add+tr2.HitPos-Vector(0,0,4),
Dir = Vector(0,0,-1),
Spread = VectorRand(-1,1),
Force = 50,
Tracer = 0,
})
if math.random(1,100) <= 1 then
local explosion = ents.Create("env_explosion")
explosion:SetCreator(airm)
local vec = VectorRand(-128,128)
vec.z = 0
explosion:SetPos(pos+vec)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "100")
explosion:Fire("Explode", 0, 0)
end
if i == 1 then
sound.Play("tdmg/a10_shooting.wav", pos, 0)
end
end)
timer.Simple(9+(i/500), function()
if !IsValid(airm2) then return end
util.ScreenShake( pos, 1, 2, 2, 5000 )
airm2.CurrentPenetrationPower = airm2.PenetrationPower
local add = Vector(math.random(-256,256),math.random(-256,256),0)
airm2:FireBullets({
Damage = 500,
Src = add+tr2.HitPos-Vector(0,0,4),
Dir = Vector(0,0,-1),
Spread = VectorRand(-1,1),
Force = 50,
Tracer = 0,
})
if math.random(1,100) <= 1 then
local explosion = ents.Create("env_explosion")
explosion:SetCreator(airm)
local vec = VectorRand(-128,128)
vec.z = 0
explosion:SetPos(pos+vec)
explosion:Spawn()
explosion.Team = ply:Team()
explosion:SetKeyValue("iMagnitude", "100")
explosion:Fire("Explode", 0, 0)
end
if i == 1 then
sound.Play("tdmg/a10_shooting.wav", pos, 0)
end
end)
end
timer.Simple(15, function()
if !IsValid(airm) then return end
airm:Remove()
airm2:Remove()
end)
end
function COD:GiveJuggernaut(ply)
ply:SetModel('models/tfusion/playermodels/mw3/mp_fullbody_ally_juggernaut.mdl')
ply:SetWalkSpeed(80)
ply:SetRunSpeed(160)
ply:SetMaxArmor(2500)
ply:SetArmor(2500)
ply:SetNWBool('jugger', true)
local wep = ply:Give('mg_dblmg')
wep:SetClip1(2000)
ply:SelectWeapon('mg_dblmg')
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_enemy.wav')]])
end
end
end
function COD:CallK9(ply)
local team = ply:Team()
local pos = ply:GetForward()*48+ply:GetPos()
if pos then
local dog = ents.Create("vj_tdm_k9")
dog:SetPos(pos)
dog.Team = ply:Team()
dog:Spawn()
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/cover_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/cover_enemy.wav')]])
end
end
end
end
function COD:GiveWeaponKillstreak(ply, class)
local wep = ply:Give(class)
ply:SelectWeapon(wep)
function wep:Reload() end
for k, pl in ipairs(player.GetAll()) do
if pl:Team() == ply:Team() then
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_friendly.wav')]])
else
pl:SendLua([[COD:SpeakerSay('tdmg/killstreaks/care_enemy.wav')]])
end
end
local rnd = math.random(0,1000000)
hook.Add("Think", "WK"..rnd, function()
if !IsValid(wep) then
hook.Remove("Think", "WK"..rnd)
else
local owner = wep:GetOwner()
if !IsValid(owner) then
wep:Remove()
else
local clip = wep:Clip1()
if clip == 0 then
wep:Remove()
end
end
end
end)
end
function COD:Nuke(team)
if COD.TimeBeforeEnd < CurTime()+30 then return end
net.Start("COD.NukeEffect")
net.Broadcast()
for k, ply in ipairs(player.GetAll()) do
if ply:Team() == team then
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/nuke_friendly.wav')]])
else
ply:SendLua([[COD:SpeakerSay('tdmg/killstreaks/nuke_enemy.wav')]])
end
end
timer.Simple(15, function()
util.ScreenShake(Vector(0,0,0), 10, 5, 15, 50000)
timer.Simple(7, function()
if team == 1 then
COD.DataTable["Team1_Kills"] = COD.DataTable["MaxKills"]
else
COD.DataTable["Team2_Kills"] = COD.DataTable["MaxKills"]
end
end)
end)
end