mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
467 lines
15 KiB
Lua
467 lines
15 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
AddCSLuaFile()
|
|
|
|
pk_pills.register("hunter_chopper", {
|
|
printName = "Hunter-Chopper",
|
|
side = "hl_combine",
|
|
type = "phys",
|
|
model = "models/Combine_Helicopter.mdl",
|
|
default_rp_cost = 20000,
|
|
spawnOffset = Vector(0, 0, 200),
|
|
camera = {
|
|
offset = Vector(80, 0, 0),
|
|
dist = 1000
|
|
},
|
|
driveType = "fly",
|
|
driveOptions = {
|
|
speed = 20,
|
|
tilt = 20
|
|
},
|
|
seqInit = "idle",
|
|
aim = {
|
|
xPose = "weapon_yaw",
|
|
yPose = "weapon_pitch",
|
|
yInvert = true,
|
|
attachment = "Muzzle"
|
|
},
|
|
attack = {
|
|
mode = "auto",
|
|
func = pk_pills.common.shoot,
|
|
delay = .02,
|
|
damage = 10,
|
|
spread = .05,
|
|
tracer = "HelicopterTracer"
|
|
},
|
|
attack2 = {
|
|
mode = "auto",
|
|
func = function(ply, ent)
|
|
ent:PillSound("dropBomb")
|
|
local bomb = ents.Create("grenade_helicopter")
|
|
bomb:SetPos(ent:LocalToWorld(Vector(-60, 0, -60)))
|
|
bomb:SetAngles(Angle(math.Rand(-180, 180), math.Rand(-180, 180), math.Rand(-180, 180)))
|
|
bomb:Spawn()
|
|
bomb:SetPhysicsAttacker(ply)
|
|
local randVec = VectorRand()
|
|
randVec.z = 0
|
|
bomb:GetPhysicsObject():AddVelocity(ent:GetVelocity() + randVec * 100)
|
|
end,
|
|
delay = .5
|
|
},
|
|
reload = function(ply, ent)
|
|
if ent.lastrocket and ent.lastrocket + 1 > CurTime() then return end
|
|
ent:PillSound("rocket")
|
|
local rocket = ents.Create("rpg_missile")
|
|
rocket:SetPos(ent:LocalToWorld(Vector(0, 80, -80)))
|
|
rocket:SetAngles(ply:EyeAngles())
|
|
rocket:SetSaveValue("m_flDamage", 200)
|
|
rocket:SetOwner(ply)
|
|
rocket:SetVelocity(ent:GetVelocity())
|
|
rocket:Spawn()
|
|
rocket = ents.Create("rpg_missile")
|
|
rocket:SetPos(ent:LocalToWorld(Vector(0, -80, -80)))
|
|
rocket:SetAngles(ply:EyeAngles())
|
|
rocket:SetSaveValue("m_flDamage", 200)
|
|
rocket:SetOwner(ply)
|
|
rocket:SetVelocity(ent:GetVelocity())
|
|
rocket:Spawn()
|
|
ent.lastrocket = CurTime()
|
|
end,
|
|
health = 5600,
|
|
damageFromWater = -1,
|
|
sounds = {
|
|
loop_move = "npc/attack_helicopter/aheli_rotor_loop1.wav",
|
|
loop_attack = "npc/attack_helicopter/aheli_weapon_fire_loop3.wav",
|
|
dropBomb = "npc/attack_helicopter/aheli_mine_drop1.wav",
|
|
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9),
|
|
rocket = "weapons/grenade_launcher1.wav"
|
|
}
|
|
})
|
|
|
|
pk_pills.register("gunship", {
|
|
printName = "Combine Gunship",
|
|
side = "hl_combine",
|
|
type = "phys",
|
|
model = "models/gunship.mdl",
|
|
default_rp_cost = 20000,
|
|
spawnOffset = Vector(0, 0, 200),
|
|
camera = {
|
|
offset = Vector(80, 0, 0),
|
|
dist = 1000
|
|
},
|
|
driveType = "fly",
|
|
driveOptions = {
|
|
speed = 20,
|
|
tilt = 20
|
|
},
|
|
seqInit = "prop_turn",
|
|
aim = {
|
|
xPose = "flex_horz",
|
|
yPose = "flex_vert",
|
|
attachment = "Muzzle"
|
|
},
|
|
attack = {
|
|
mode = "auto",
|
|
func = pk_pills.common.shoot,
|
|
delay = .1,
|
|
damage = 10,
|
|
spread = .02,
|
|
tracer = "HelicopterTracer"
|
|
},
|
|
attack2 = {
|
|
mode = "trigger",
|
|
func = function(ply, ent)
|
|
if ent.usingWarpCannon then return end
|
|
local fireAngs = ent:GetAngles()
|
|
fireAngs.p = 45
|
|
fireAngs.r = 0
|
|
local tr = util.QuickTrace(ent:GetPos(), ent:GetPos() + fireAngs:Forward() * 99999, ent)
|
|
local effectdata = EffectData()
|
|
effectdata:SetEntity(ent)
|
|
effectdata:SetOrigin(tr.HitPos)
|
|
util.Effect("warp_cannon", effectdata, true, true)
|
|
ent:PillSound("warp_charge") --belly_cannon
|
|
|
|
timer.Simple(1.2, function()
|
|
if not IsValid(ent) then return end
|
|
ent:PillSound("warp_fire")
|
|
util.BlastDamage(ent, ply, tr.HitPos, 200, 1000)
|
|
|
|
if IsValid(tr.Entity) then
|
|
local phys = tr.Entity:GetPhysicsObject()
|
|
|
|
if IsValid(phys) then
|
|
phys:ApplyForceCenter(ply:EyeAngles():Forward() * 9 ^ 7)
|
|
end
|
|
end
|
|
end)
|
|
|
|
ent.usingWarpCannon = true
|
|
|
|
timer.Simple(2.4, function()
|
|
if not IsValid(ent) then return end
|
|
ent.usingWarpCannon = nil
|
|
end)
|
|
end
|
|
},
|
|
pose = {
|
|
fin_accel = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return vel.x / 800
|
|
end,
|
|
fin_sway = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return -vel.y / 800
|
|
end,
|
|
antenna_accel = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return vel.x / 2000
|
|
end,
|
|
antenna_sway = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return -vel.y / 2000
|
|
end
|
|
},
|
|
health = 5,
|
|
onlyTakesExplosiveDamage = true,
|
|
damageFromWater = -1,
|
|
sounds = {
|
|
loop_move = "npc/combine_gunship/engine_whine_loop1.wav",
|
|
loop_attack = "npc/combine_gunship/gunship_weapon_fire_loop6.wav",
|
|
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9),
|
|
warp_charge = "npc/strider/charging.wav",
|
|
warp_fire = "npc/strider/fire.wav"
|
|
}
|
|
})
|
|
|
|
pk_pills.register("dropship", {
|
|
printName = "Combine Dropship",
|
|
side = "hl_combine",
|
|
type = "phys",
|
|
model = "models/Combine_dropship.mdl",
|
|
default_rp_cost = 10000,
|
|
spawnOffset = Vector(0, 0, 200),
|
|
camera = {
|
|
offset = Vector(0, 0, 200),
|
|
dist = 1000
|
|
},
|
|
driveType = "fly",
|
|
driveOptions = {
|
|
speed = 30,
|
|
tilt = 20
|
|
},
|
|
aim = {
|
|
xPose = "weapon_yaw",
|
|
yPose = "weapon_pitch",
|
|
yInvert = true,
|
|
attachment = "Muzzle",
|
|
usesSecondaryEnt = true
|
|
},
|
|
attack = {
|
|
mode = "trigger",
|
|
func = function(ply, ent)
|
|
if IsValid(ent.container) then
|
|
ent.container:Deploy()
|
|
end
|
|
end
|
|
},
|
|
attack2 = {
|
|
mode = "auto",
|
|
func = pk_pills.common.shoot,
|
|
delay = .1,
|
|
damage = 4,
|
|
spread = .01,
|
|
tracer = "HelicopterTracer"
|
|
},
|
|
reload = function(ply, ent)
|
|
if IsValid(ent.container) then
|
|
ent.container:SetParent()
|
|
ent.container:PhysicsInit(SOLID_VPHYSICS)
|
|
ent.container:SetMoveType(MOVETYPE_VPHYSICS)
|
|
ent.container:SetSolid(SOLID_VPHYSICS)
|
|
ent.container:SetPos(ent:GetPos())
|
|
ent.container:SetAngles(ent:GetAngles())
|
|
ent.container:GetPhysicsObject():Wake()
|
|
ent:SetPillAimEnt(nil)
|
|
ent:PillSound("drop")
|
|
ent:PillLoopStop("deploy")
|
|
ent.container = nil
|
|
else
|
|
local tr = util.TraceHull({
|
|
start = ent:GetPos(),
|
|
endpos = ent:GetPos() + Vector(0, 0, -200),
|
|
filter = {ent},
|
|
mins = Vector(-50, -50, -50),
|
|
maxs = Vector(50, 50, 50)
|
|
})
|
|
|
|
local grabent = tr.Entity
|
|
|
|
if IsValid(grabent) then
|
|
if (grabent:GetClass() == "pill_dropship_container") then
|
|
grabent:SetPos(ent:GetPos())
|
|
grabent:SetAngles(ent:GetAngles())
|
|
grabent:SetParent(ent)
|
|
grabent:Fire("setparentattachment", "cargo_anim")
|
|
ent:SetPillAimEnt(grabent)
|
|
ent:PillFilterCam(grabent)
|
|
ent:PillSound("grab")
|
|
ent.container = grabent
|
|
elseif (grabent:GetClass() == "pill_dropship_strider" and not grabent.droppedfrom) then
|
|
grabent:SetPos(ent:GetPos())
|
|
grabent:SetAngles(ent:GetAngles())
|
|
grabent:SetParent(ent)
|
|
grabent:Fire("setparentattachment", "cargo_anim")
|
|
ent:PillFilterCam(grabent)
|
|
ent:PillSound("grab")
|
|
ent.container = grabent
|
|
elseif (grabent:GetClass() == "npc_strider") then
|
|
local strider_grabbed = ents.Create("pill_dropship_strider")
|
|
strider_grabbed:SetPos(ent:GetPos())
|
|
strider_grabbed:SetAngles(ent:GetAngles())
|
|
strider_grabbed:Spawn()
|
|
strider_grabbed:SetParent(ent)
|
|
strider_grabbed:Fire("setparentattachment", "cargo_anim")
|
|
ent:PillFilterCam(strider_grabbed)
|
|
ent:PillSound("grab")
|
|
ent.container = strider_grabbed
|
|
grabent:Remove()
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
seqInit = "idle",
|
|
pose = {
|
|
body_accel = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return vel.x / 800
|
|
end,
|
|
body_sway = function(ply, ent, old)
|
|
local vel = WorldToLocal(ent:GetVelocity(), Angle(), Vector(0, 0, 0), ent:GetAngles())
|
|
|
|
return -vel.y / 800
|
|
end
|
|
},
|
|
damageFromWater = -1,
|
|
sounds = {
|
|
loop_move = "npc/combine_gunship/dropship_engine_near_loop1.wav",
|
|
loop_attack2 = "npc/combine_gunship/gunship_fire_loop1.wav",
|
|
loop_deploy = "npc/combine_gunship/dropship_dropping_pod_loop1.wav",
|
|
alert_empty = "npc/attack_helicopter/aheli_damaged_alarm1.wav",
|
|
grab = "vehicles/Crane/crane_magnet_switchon.wav",
|
|
drop = "vehicles/Crane/crane_magnet_release.wav",
|
|
die = pk_pills.helpers.makeList("ambient/explosions/explode_#.wav", 9)
|
|
}
|
|
})
|
|
|
|
pk_pills.register("advisor", {
|
|
printName = "Advisor",
|
|
side = "hl_combine",
|
|
type = "phys",
|
|
model = "models/advisor.mdl",
|
|
default_rp_cost = 8000,
|
|
camera = {
|
|
dist = 250
|
|
},
|
|
seqInit = "Idle01",
|
|
sphericalPhysics = 50,
|
|
driveType = "fly",
|
|
driveOptions = {
|
|
speed = 10
|
|
},
|
|
attack = {
|
|
mode = "trigger",
|
|
func = function(ply, ent)
|
|
if ent:GetSequence() ~= ent:LookupSequence("Idle01") then return end
|
|
ent:PillAnim("attackL", true)
|
|
|
|
local tr = util.TraceHull({
|
|
start = ent:GetPos(),
|
|
endpos = ent:GetPos() + ent:GetAngles():Forward() * 200,
|
|
filter = {ent},
|
|
mins = Vector(-25, -25, -25),
|
|
maxs = Vector(25, 25, 25)
|
|
})
|
|
|
|
if IsValid(tr.Entity) then
|
|
local dmg = DamageInfo()
|
|
dmg:SetAttacker(ply)
|
|
dmg:SetInflictor(ent)
|
|
dmg:SetDamageType(DMG_SLASH)
|
|
dmg:SetDamage(50)
|
|
tr.Entity:TakeDamageInfo(dmg)
|
|
ent:PillSound("hit")
|
|
end
|
|
|
|
timer.Simple(.5, function()
|
|
if not IsValid(ent) then return end
|
|
ent:PillAnim("Idle01", true)
|
|
end)
|
|
end
|
|
},
|
|
attack2 = {
|
|
mode = "trigger",
|
|
func = function(ply, ent)
|
|
if ent:GetSequence() ~= ent:LookupSequence("Idle01") then return end
|
|
ent:PillAnim("attackR", true)
|
|
|
|
local tr = util.TraceHull({
|
|
start = ent:GetPos(),
|
|
endpos = ent:GetPos() + ent:GetAngles():Forward() * 200,
|
|
filter = {ent},
|
|
mins = Vector(-25, -25, -25),
|
|
maxs = Vector(25, 25, 25)
|
|
})
|
|
|
|
if IsValid(tr.Entity) then
|
|
local dmg = DamageInfo()
|
|
dmg:SetAttacker(ply)
|
|
dmg:SetInflictor(ent)
|
|
dmg:SetDamageType(DMG_SLASH)
|
|
dmg:SetDamage(50)
|
|
tr.Entity:TakeDamageInfo(dmg)
|
|
ent:PillSound("hit")
|
|
end
|
|
|
|
timer.Simple(.5, function()
|
|
if not IsValid(ent) then return end
|
|
ent:PillAnim("Idle01", true)
|
|
end)
|
|
end
|
|
},
|
|
health = 1000,
|
|
sounds = {
|
|
loop_move = "ambient/levels/citadel/citadel_ambient_voices1.wav",
|
|
hit = pk_pills.helpers.makeList("npc/zombie/claw_strike#.wav", 3)
|
|
}
|
|
})
|
|
|
|
pk_pills.register("strider", {
|
|
printName = "Strider",
|
|
side = "hl_combine",
|
|
type = "phys",
|
|
model = "models/combine_strider.mdl",
|
|
default_rp_cost = 20000,
|
|
camera = {
|
|
dist = 750
|
|
},
|
|
seqInit = "Idle01",
|
|
driveType = "strider",
|
|
aim = {
|
|
xInvert = true,
|
|
xPose = "minigunYaw",
|
|
yPose = "minigunPitch",
|
|
attachment = "MiniGun",
|
|
fixTracers = true,
|
|
simple = true,
|
|
overrideStart = Vector(80, 0, -40)
|
|
},
|
|
attack = {
|
|
mode = "auto",
|
|
func = pk_pills.common.shoot,
|
|
delay = .2,
|
|
damage = 30,
|
|
spread = .02,
|
|
tracer = "HelicopterTracer"
|
|
},
|
|
attack2 = {
|
|
mode = "trigger",
|
|
func = function(ply, ent)
|
|
if ent.usingWarpCannon then return end
|
|
local tr = util.QuickTrace(ent:LocalToWorld(Vector(80, 0, -40)), ply:EyeAngles():Forward() * 99999, ent)
|
|
local effectdata = EffectData()
|
|
effectdata:SetEntity(ent)
|
|
effectdata:SetOrigin(tr.HitPos)
|
|
util.Effect("warp_cannon", effectdata, true, true)
|
|
ent:PillSound("warp_charge")
|
|
|
|
timer.Simple(1.2, function()
|
|
if not IsValid(ent) then return end
|
|
ent:PillSound("warp_fire")
|
|
util.BlastDamage(ent, ply, tr.HitPos, 200, 1000)
|
|
|
|
if IsValid(tr.Entity) then
|
|
local phys = tr.Entity:GetPhysicsObject()
|
|
|
|
if IsValid(phys) then
|
|
phys:ApplyForceCenter(ply:EyeAngles():Forward() * 9 ^ 7)
|
|
end
|
|
end
|
|
end)
|
|
|
|
ent.usingWarpCannon = true
|
|
|
|
timer.Simple(2.4, function()
|
|
if not IsValid(ent) then return end
|
|
ent.usingWarpCannon = nil
|
|
end)
|
|
end
|
|
},
|
|
renderOffset = function(ply, ent)
|
|
local h = ent:GetPoseParameter("body_height") * 500
|
|
|
|
return Vector(0, 0, 500 - h)
|
|
end,
|
|
health = 7,
|
|
onlyTakesExplosiveDamage = true,
|
|
sounds = {
|
|
step = pk_pills.helpers.makeList("npc/strider/strider_step#.wav", 6),
|
|
shoot = "npc/strider/strider_minigun.wav",
|
|
warp_charge = "npc/strider/charging.wav",
|
|
warp_fire = "npc/strider/fire.wav"
|
|
}
|
|
})
|