1091 lines
35 KiB
Lua
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 |