Files
wnsrc/lua/entities/npc_vj_overwatch_soldier_z/init.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

428 lines
18 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("shared.lua")
include("shared.lua")
ENT.Model = {"models/Combine_Soldier.mdl"}
ENT.StartHealth = 60
ENT.VJ_NPC_Class = {"CLASS_COMBINE"}
ENT.BloodColor = "Red"
ENT.CallForHelpDistance = 10000
ENT.InvestigateSoundDistance = 18
ENT.CanFlinch = 1 -- 0 = Don't flinch | 1 = Flinch at any damage | 2 = Flinch only from certain damages
ENT.FlinchChance = 4 -- Chance of it flinching from 1 to x | 1 will make it always flinch
ENT.FootStepTimeRun = 0.3
ENT.FootStepTimeWalk = 0.5
ENT.HasItemDropsOnDeath = true
ENT.ItemDropsOnDeathChance = 2
ENT.ItemDropsOnDeath_EntityList = {
"item_ammo_smg1_grenade",
"item_battery",
"item_healthvial",
"weapon_frag",
}
ENT.Soldier_SniperSpread = 0.75
ENT.Soldier_WeaponSpread = 1.5
ENT.HasGrenadeAttack = true -- Should the SNPC have a grenade attack?
ENT.GrenadeAttackEntity = "obj_vj_extractor_z" -- The entity that the SNPC throws | Half Life 2 Grenade: "npc_grenade_frag"
ENT.ThrowGrenadeChance = 2 -- Chance that it will throw the grenade | Set to 1 to throw all the time
ENT.CanBeMedic = true
ENT.CanHaveTurret = true
ENT.TurretDeployDist = 2000
ENT.FootStepSoundLevel = 80
ENT.IdleSoundLevel = 85
ENT.IdleDialogueSoundLevel = 85
ENT.IdleDialogueAnswerSoundLevel = 85
ENT.CombatIdleSoundLevel = 90
ENT.InvestigateSoundLevel = 90
ENT.LostEnemySoundLevel = 85
ENT.AlertSoundLevel = 90
ENT.WeaponReloadSoundLevel = 90
ENT.GrenadeAttackSoundLevel = 90
ENT.OnGrenadeSightSoundLevel = 90
ENT.OnDangerSightSoundLevel = 90
ENT.OnKilledEnemySoundLevel = 90
ENT.AllyDeathSoundLevel = 90
ENT.PainSoundLevel = 90
ENT.DeathSoundLevel = 90
local DefaultSoundTbl_MedicAfterHeal = {"items/smallmedkit1.wav"}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:OnPlayCreateSound(sdData, sdFile)
if !( (VJ_HasValue(self.SoundTbl_Pain, sdFile) && !VJ_HasValue(self.SoundTbl_Hurt, sdFile)) or VJ_HasValue(DefaultSoundTbl_MedicAfterHeal, sdFile) or VJ_HasValue(self.DefaultSoundTbl_MeleeAttack, sdFile) or VJ_HasValue(self.SoundTbl_NovaProspektIdle, sdFile) ) then
self:EmitSound(table.Random(self.SoundTbl_RadioOn),90,math.random(85, 115))
timer.Simple(SoundDuration(sdFile), function() if IsValid(self) && sdData:IsPlaying() then self:EmitSound(table.Random(self.SoundTbl_RadioOff),70,math.random(85, 115)) end end)
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:SoldierInit() end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnInitialize()
-- if !self.IsBeingDroppedByDropship then
-- timer.Simple(0, function() if IsValid(self) then self:Give( table.Random( ZippyCombines_NPC_Weapons[self:GetClass()] ) ) end end)
-- end
self.SoundTbl_FootStep = {
"npc/combine_soldier/gear1.wav",
"npc/combine_soldier/gear2.wav",
"npc/combine_soldier/gear3.wav",
"npc/combine_soldier/gear4.wav",
"npc/combine_soldier/gear5.wav",
"npc/combine_soldier/gear6.wav",
}
self.SoundTbl_Idle = {
"npc/combine_soldier/vo/gridsundown46.wav",
"npc/combine_soldier/vo/noviscon.wav",
"npc/combine_soldier/vo/ovewatchorders3ccstimboost.wav",
"npc/combine_soldier/vo/reportallpositionsclear.wav",
"npc/combine_soldier/vo/reportallradialsfree.wav",
"npc/combine_soldier/vo/reportingclear.wav",
"npc/combine_soldier/vo/sectorissecurenovison.wav",
"npc/combine_soldier/vo/sightlineisclear.wav",
"npc/combine_soldier/vo/stabilizationteamhassector.wav",
"npc/combine_soldier/vo/stabilizationteamholding.wav",
"npc/combine_soldier/vo/teamdeployedandscanning.wav",
"npc/combine_soldier/vo/unitisclosing.wav",
"npc/combine_soldier/vo/wehavenontaggedviromes.wav",
}
self.SoundTbl_IdleDialogue = self.SoundTbl_Idle
self.SoundTbl_IdleDialogueAnswer = {
"npc/combine_soldier/vo/copy.wav",
"npc/combine_soldier/vo/copythat.wav",
}
self.SoundTbl_Investigate = {
"npc/combine_soldier/vo/motioncheckallradials.wav",
"npc/combine_soldier/vo/overwatchreportspossiblehostiles.wav",
"npc/combine_soldier/vo/prepforcontact.wav",
"npc/combine_soldier/vo/readycharges.wav",
"npc/combine_soldier/vo/readyextractors.wav",
"npc/combine_soldier/vo/readyweapons.wav",
"npc/combine_soldier/vo/readyweaponshostilesinbound.wav",
"npc/combine_soldier/vo/stayalert.wav",
"npc/combine_soldier/vo/stayalertreportsightlines.wav",
"npc/combine_soldier/vo/weaponsoffsafeprepforcontact.wav",
"npc/combine_soldier/vo/confirmsectornotsterile.wav",
}
self.SoundTbl_CombatIdle = {
"npc/combine_soldier/vo/thatsitwrapitup.wav",
"npc/combine_soldier/vo/gosharp.wav",
"npc/combine_soldier/vo/hardenthatposition.wav",
"npc/combine_soldier/vo/gosharpgosharp.wav",
"npc/combine_soldier/vo/targetmyradial.wav",
"npc/combine_soldier/vo/goactiveintercept.wav",
"npc/combine_soldier/vo/unitisinbound.wav",
"npc/combine_soldier/vo/unitismovingin.wav",
"npc/combine_soldier/vo/sweepingin.wav",
"npc/combine_soldier/vo/executingfullresponse.wav",
"npc/combine_soldier/vo/containmentproceeding.wav",
"npc/combine_soldier/vo/callhotpoint.wav",
"npc/combine_soldier/vo/callcontacttarget1.wav",
"npc/combine_soldier/vo/prosecuting.wav",
}
self.SoundTbl_Alert = {
"npc/combine_soldier/vo/contact.wav",
"npc/combine_soldier/vo/viscon.wav",
"npc/combine_soldier/vo/alert1.wav",
"npc/combine_soldier/vo/contactconfirmprosecuting.wav",
"npc/combine_soldier/vo/contactconfim.wav",
"npc/combine_soldier/vo/outbreak.wav",
"npc/combine_soldier/vo/fixsightlinesmovein.wav",
}
self.SoundTbl_WeaponReload = {
"npc/combine_soldier/vo/cover.wav",
"npc/combine_soldier/vo/coverme.wav",
}
self.SoundTbl_GrenadeAttack = {
"npc/combine_soldier/vo/extractoraway.wav",
"npc/combine_soldier/vo/extractorislive.wav",
}
self.SoundTbl_OnDangerSight = {
"npc/combine_soldier/vo/ripcordripcord.wav",
"npc/combine_soldier/vo/displace.wav",
"npc/combine_soldier/vo/displace2.wav",
}
self.SoundTbl_OnGrenadeSight = {
"npc/combine_soldier/vo/flaredown.wav",
"npc/combine_soldier/vo/bouncerbouncer.wav",
}
self.SoundTbl_OnKilledEnemy = {
"npc/combine_soldier/vo/targetcompromisedmovein.wav",
"npc/combine_soldier/vo/targetblackout.wav",
"npc/combine_soldier/vo/affirmativewegothimnow.wav",
"npc/combine_soldier/vo/overwatchconfirmhvtcontained.wav",
"npc/combine_soldier/vo/overwatchtargetcontained.wav",
"npc/combine_soldier/vo/overwatchtarget1sterilized.wav",
"npc/combine_soldier/vo/onecontained.wav",
"npc/combine_soldier/vo/payback.wav",
}
self.SoundTbl_AllyDeath = {
"npc/combine_soldier/vo/heavyresistance.wav",
"npc/combine_soldier/vo/overwatchrequestreinforcement.wav",
"npc/combine_soldier/vo/overwatchrequestreserveactivation.wav",
"npc/combine_soldier/vo/overwatchrequestskyshield.wav",
"npc/combine_soldier/vo/overwatchrequestwinder.wav",
"npc/combine_soldier/vo/overwatchsectoroverrun.wav",
"npc/combine_soldier/vo/onedutyvacated.wav",
"npc/combine_soldier/vo/sectorisnotsecure.wav",
"npc/combine_soldier/vo/onedown.wav",
}
self.SoundTbl_Hurt = {
"npc/combine_soldier/vo/requestmedical.wav",
"npc/combine_soldier/vo/requeststimdose.wav",
"npc/combine_soldier/vo/coverhurt.wav",
}
self.SoundTbl_Pain = {
"npc/combine_soldier/pain1.wav",
"npc/combine_soldier/pain2.wav",
"npc/combine_soldier/pain3.wav",
"npc/combine_soldier/vo/requestmedical.wav",
"npc/combine_soldier/vo/requeststimdose.wav",
"npc/combine_soldier/vo/coverhurt.wav",
}
self.SoundTbl_LostEnemy = {
"npc/combine_soldier/vo/skyshieldreportslostcontact.wav",
"npc/combine_soldier/vo/lostcontact.wav",
}
self.SoundTbl_Death = {
"npc/combine_soldier/die1.wav",
"npc/combine_soldier/die2.wav",
"npc/combine_soldier/die3.wav",
}
self.SoundTbl_RadioOn = {
"npc/combine_soldier/episodic_vo/on1.wav",
"npc/combine_soldier/episodic_vo/on2.wav",
}
self.SoundTbl_RadioOff = {
"npc/combine_soldier/episodic_vo/off1.wav",
"npc/combine_soldier/episodic_vo/off2.wav",
"npc/combine_soldier/episodic_vo/off2.wav",
}
if math.random(1, 4) == 1 && self.CanBeMedic then
self.IsMedicSNPC = true -- Is this SNPC a medic? Does it heal other friendly friendly SNPCs, and players(If friendly)
end
local turretchance = GetConVar("vj_zippycombines_soldier_turretchance"):GetInt()
if turretchance != 0 then
if self.CanHaveTurret && math.random(1, turretchance) == 1 then
self.TurretProp = ents.Create("prop_dynamic")
self.TurretProp:SetModel("models/combine_turrets/floor_turret.mdl")
self.TurretProp:SetPos(self:GetAttachment(2).Pos - Vector(0,0,45) - self:GetForward()*8)
self.TurretProp:SetAngles(self:GetAngles() + Angle(0,90,8))
self.TurretProp:SetParent(self,2)
self.TurretProp:Spawn()
self.TurretProp:ResetSequence("carry_pose")
self.TurretProp:AddEFlags(EFL_DONTBLOCKLOS)
if GetConVar("vj_zippycombines_soldier_showturret"):GetInt() < 1 then
self.TurretProp:SetNoDraw(true)
end
end
end
timer.Simple(0, function()
local wep = self:GetActiveWeapon()
if IsValid(wep) && wep:GetClass() == "weapon_vj_ar2" && self:GetModel() != "models/combine_super_soldier.mdl" then
self.CanUseSecondaryOnWeaponAttack = false
end
end)
self:SoldierInit()
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:SoldierThink() end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink()
self:SoldierThink()
local wep = self:GetActiveWeapon()
if IsValid(wep) then
if self.WeaponSpread != self.Soldier_SniperSpread && wep:GetClass() == "weapon_vj_combine_sniper_rifle_z" then
self.WeaponSpread = self.Soldier_SniperSpread
--print("sniper spread")
elseif self.WeaponSpread != self.Soldier_WeaponSpread && wep:GetClass() != "weapon_vj_combine_sniper_rifle_z" then
self.WeaponSpread = self.Soldier_WeaponSpread
--print("normal spread")
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local turretdistfromself = 65
function ENT:CanDeployTurret()
local enemy = self:GetEnemy()
if !IsValid(enemy) then return end
local dist = enemy:GetPos():Distance(self:GetPos())
if self:Visible(enemy) && dist > turretdistfromself+35 && dist < self.TurretDeployDist then
local tr = util.TraceHull({
start = self:GetPos(),
endpos = self:GetPos()+self:GetForward()*(turretdistfromself+35),
filter = self,
mins = self:OBBMins(),
maxs = self:OBBMaxs(),
})
if !tr.Hit then
return true
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:Controller_IntMsg(ply, controlEnt)
ply:ChatPrint("ALT (walk key): Deploy Turret (if available)")
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:DeployTurret()
if self.DeployingTurret then return end
self.DeployingTurret = true
local timeuntildeploy = 1
self:VJ_ACT_PLAYACTIVITY("turret_drop",true,timeuntildeploy,true)
self.TurretProp:Remove()
self.TurretProp = ents.Create("prop_dynamic")
self.TurretProp:SetModel("models/combine_turrets/floor_turret.mdl")
self.TurretProp:SetPos(self:GetPos())
self.TurretProp:SetAngles(self:GetAngles())
self.TurretProp:SetParent(self,5)
self.TurretProp:Spawn()
self.TurretProp:AddEFlags(EFL_DONTBLOCKLOS)
if GetConVar("vj_zippycombines_soldier_showturret"):GetInt() < 1 then
self.TurretProp:SetNoDraw(true)
end
timer.Simple(timeuntildeploy, function() if IsValid(self) then
self.TurretProp:Remove()
local turret = ents.Create("npc_vj_combine_turret_z")
turret:SetPos(self:GetPos()+self:GetForward()*turretdistfromself)
turret:SetAngles(self:GetAngles())
turret:Spawn()
turret.VJ_NPC_Class = self.VJ_NPC_Class
self.DeployingTurret = false
end end)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:IsNearDropshipDropPoint()
for _,dropship in pairs(ents.FindByClass("npc_vj_dropship_z")) do
if dropship.DropshipDropPoint && dropship.DropshipDropPoint:Distance(self:GetPos()) < 450 then
return true
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink_AIEnabled()
if IsValid(self.TurretProp) then
if self.VJ_IsBeingControlled then
if self.VJ_TheController:KeyDown(IN_WALK) then
self:DeployTurret()
end
else
if IsValid(self:GetEnemy()) && self:CanDeployTurret() && !self:IsNearDropshipDropPoint() then
self:DeployTurret()
end
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnPriorToKilled(dmginfo, hitgroup)
if IsValid(self.TurretProp) && GetConVar("vj_zippycombines_soldier_showturret"):GetInt() > 0 then
self:CreateGibEntity("obj_vj_gib",self.TurretProp:GetModel(),{BloodType = "", CollideSound = {"SolidMetal.ImpactSoft"}})
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:SetUpGibesOnDeath(dmginfo,hitgroup)
if self.HasGibDeathParticles == true then -- Taken from black mesa SNPCs I think Xdddddd
local bloodeffect = EffectData()
bloodeffect:SetOrigin(self:GetPos() + self:OBBCenter())
bloodeffect:SetColor(VJ_Color2Byte(Color(130,19,10)))
bloodeffect:SetScale(120)
util.Effect("VJ_Blood1",bloodeffect)
end
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/eye_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,55)),Ang = self:GetAngles() + Angle(0,-90,0),Vel = self:GetRight() * math.Rand(50,50) + self:GetForward() * math.Rand(-200,200)})
if self:GetModel() != "models/combine_super_soldier.mdl" && self:GetModel() != "models/vj_fassassin_z.mdl" then
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/eye_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,55)),Ang = self:GetAngles() + Angle(0,-90,0),Vel = self:GetRight() * math.Rand(50,50) + self:GetForward() * math.Rand(-200,200)})
end
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/brain_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,60)),Ang = self:GetAngles() + Angle(0,-90,0)})
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/heart_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/lung_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/lung_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","models/gibs/humans/liver_gib.mdl",{Pos = self:LocalToWorld(Vector(0,0,35))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Small",{Pos = self:LocalToWorld(Vector(0,0,30))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Small",{Pos = self:LocalToWorld(Vector(0,0,30))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Small",{Pos = self:LocalToWorld(Vector(0,0,30))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,35))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,35))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,35))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,40))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,35))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,30))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,30))})
self:CreateGibEntity("obj_vj_gib","UseHuman_Big",{Pos = self:LocalToWorld(Vector(0,0,30))})
return true
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------