Files
lifestorm 324f19217d Upload
2024-08-05 18:40:29 +03:00

732 lines
29 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/VJ_Combine_guard_Z.mdl"}
ENT.StartHealth = 290
ENT.TurningSpeed = 15 -- How fast it can turn
ENT.PoseParameterLooking_TurningSpeed = 20 -- How fast does the parameter turn?
ENT.VJ_NPC_Class = {"CLASS_COMBINE"}
ENT.BloodColor = "Red" -- The blood type, this will determine what it should use (decal, particle, etc.)
ENT.CallForHelpDistance = 10000
ENT.InvestigateSoundDistance = 18
ENT.HasItemDropsOnDeath = true
ENT.ItemDropsOnDeathChance = 1
ENT.ItemDropsOnDeath_EntityList = {
"item_battery",
"item_healthvial",
"weapon_frag",
"item_ammo_ar2_altfire",
}
ENT.AnimTbl_MeleeAttack = {"punch01","punch02"} -- Melee Attack Animations
ENT.TimeUntilMeleeAttackDamage = 0.3 -- This counted in seconds | This calculates the time until it hits something
ENT.MeleeAttackDamage = 30
ENT.HasMeleeAttackKnockBack = true -- If true, it will cause a knockback to its enemy
ENT.MeleeAttackKnockBack_Forward1 = 200 -- How far it will push you forward | First in math.random
ENT.MeleeAttackKnockBack_Forward2 = 300 -- How far it will push you forward | Second in math.random
ENT.MeleeAttackDistance = 30 -- How close does it have to be until it attacks?
ENT.MeleeAttackDamageDistance = 70 -- How far does the damage go?
ENT.FireGunDist = {
min = ENT.MeleeAttackDamageDistance,
max = 3000,
}
ENT.GuardAttackDelay = {
min = 3.5,
max = 5,
}
ENT.GrenadeAttackDelay = {
min = 6,
max = 8,
}
ENT.SoundTbl_MeleeAttack = {"NPC_Hunter.ChargeHitEnemy"}
ENT.GeneralSoundPitch1 = 80
ENT.GeneralSoundPitch2 = 85
ENT.Guard_Mech_Noises = {
"npc/vj_combine_guard_z/cguard_noise1.wav",
"npc/vj_combine_guard_z/cguard_noise2.wav",
"npc/vj_combine_guard_z/cguard_noise3.wav",
"npc/vj_combine_guard_z/cguard_noise4.wav",
"npc/vj_combine_guard_z/cguard_noise5.wav",
"npc/vj_combine_guard_z/cguard_noise6.wav",
}
ENT.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",
}
ENT.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",
}
ENT.SoundTbl_IdleDialogue = ENT.SoundTbl_Idle
ENT.SoundTbl_IdleDialogueAnswer = {
"npc/combine_soldier/vo/copy.wav",
"npc/combine_soldier/vo/copythat.wav",
}
ENT.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",
}
ENT.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",
}
ENT.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",
}
ENT.SoundTbl_GrenadeAttack = {
"npc/combine_soldier/vo/extractoraway.wav",
"npc/combine_soldier/vo/extractorislive.wav",
}
ENT.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",
}
ENT.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",
}
ENT.SoundTbl_Hurt = {
"npc/combine_soldier/vo/requestmedical.wav",
"npc/combine_soldier/vo/requeststimdose.wav",
"npc/combine_soldier/vo/coverhurt.wav",
}
ENT.SoundTbl_Pain = table.Add({"npc/combine_soldier/pain1.wav","npc/combine_soldier/pain2.wav","npc/combine_soldier/pain3.wav"},ENT.SoundTbl_Hurt)
ENT.SoundTbl_LostEnemy = {
"npc/combine_soldier/vo/skyshieldreportslostcontact.wav",
"npc/combine_soldier/vo/lostcontact.wav",
}
ENT.SoundTbl_Death = {
"npc/combine_soldier/die1.wav",
"npc/combine_soldier/die2.wav",
"npc/combine_soldier/die3.wav",
}
ENT.SoundTbl_RadioOn = {
"npc/combine_soldier/episodic_vo/on1.wav",
"npc/combine_soldier/episodic_vo/on2.wav",
}
ENT.SoundTbl_RadioOff = {
"npc/combine_soldier/episodic_vo/off1.wav",
"npc/combine_soldier/episodic_vo/off2.wav",
"npc/combine_soldier/episodic_vo/off2.wav",
}
ENT.FootStepTimeRun = 0.3
ENT.FootStepTimeWalk = 0.5
ENT.FootStepSoundLevel = 85
ENT.FootStepPitch = VJ_Set(false, false)
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
ENT.VJC_Data = {
CameraMode = 1, -- Sets the default camera mode | 1 = Third Person, 2 = First Person
ThirdP_Offset = Vector(0, 0, 0), -- The offset for the controller when the camera is in third person
FirstP_Bone = "Bip01 Head", -- If left empty, the base will attempt to calculate a position for first person
FirstP_Offset = Vector(0, 0, 0), -- The offset for the controller when the camera is in first person
FirstP_ShrinkBone = true, -- Should the bone shrink? Useful if the bone is obscuring the player's view
FirstP_CameraBoneAng = 0, -- Should the camera's angle be affected by the bone's angle? | 0 = No, 1 = Pitch, 2 = Yaw, 3 = Roll
FirstP_CameraBoneAng_Offset = 0, -- How much should the camera's angle be rotated by? | Useful for weird bone angles
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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:CustomOnInitialize()
self:SetBodygroup(1, 1)
self:SetCollisionBounds(Vector(-22,-22,0), Vector(22,22,80))
self.NextGuardAttackTime = CurTime()
self.NextGrenadeAttack = CurTime()
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnMeleeAttack_AfterStartTimer(seed)
--self:EmitSound(table.Random(self.Guard_Mech_Noises), 78, math.random(60, 70))
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnFootStepSound()
self:EmitSound("npc/vj_combine_guard_z/cguard_footstep_walk0" .. math.random(1, 9) .. ".wav", self.FootStepSoundLevel, math.random(90, 110))
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:UpdateFirePos()
local tr_EndPos = self:GetPos() + self:GetForward() * 200
if IsValid(self:GetEnemy()) then
tr_EndPos = self:GetEnemy():GetPos() + self:GetEnemy():OBBCenter()
-- if math.random(1, 2) == 1 then
-- tr_EndPos = tr_EndPos + self:GetEnemy():GetVelocity()*0.5
-- end
end
if self.FirePos then
tr_EndPos = self.FirePos
end
local tr = util.TraceLine({
start = self:GetAttachment(1).Pos,
endpos = tr_EndPos,
mask = MASK_SHOT,
filter = self,
})
self.FirePos = tr.HitPos
self:SetNWVector("VJCombGuardZFirePos", self.FirePos)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:ChargeGun()
self.GunCharging = true
self:SetNWBool("VJCombGuardZGunCharging", true)
self.HasPoseParameterLooking = false -- Start using manual poseparameters instead.
self:UpdateFirePos()
local assumed_time_until_fire = 0.92
timer.Simple(assumed_time_until_fire, function() if IsValid(self) then self.GunCharging = false self:SetNWBool("VJCombGuardZGunCharging", false) end end)
util.ScreenShake(self:GetAttachment(1).Pos, 4, 200, assumed_time_until_fire*3, 2000)
--self:EmitSound("npc/attack_helicopter/aheli_charge_up.wav", 100, math.random(110, 120))
self:EmitSound("weapons/cguard/charging.wav", 100, math.random(90, 100) , 1)
local light = ents.Create("light_dynamic")
light:SetKeyValue("brightness", "3")
light:SetKeyValue("distance", "250")
light:Fire("Color", "0 75 255")
light:SetPos(self:GetAttachment(1).Pos)
light:Spawn()
light:SetParent(self,1)
light:Fire("TurnOn", "", 0)
timer.Simple(assumed_time_until_fire,function() if IsValid(light) then light:Remove() end end)
self:DeleteOnRemove(light)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:DoGuardExplosion(pos)
ParticleEffect("Weapon_Combine_Ion_Cannon_Explosion", pos, Angle(0,0,0), nil)
sound.Play("beams/beamstart5.wav", pos, 130, math.random(90, 110))
local realisticRadius = true
local ExplodeDist = 150
local ExplodeDamage = 60
util.VJ_SphereDamage(self, self, pos, ExplodeDist, ExplodeDamage, bit.bor(DMG_BLAST, DMG_DISSOLVE, DMG_SHOCK), true, realisticRadius)
local expLight = ents.Create("light_dynamic")
expLight:SetKeyValue("brightness", "8")
expLight:SetKeyValue("distance", "650")
expLight:Fire("Color", "0 75 255")
expLight:SetPos(pos)
expLight:Spawn()
expLight:Fire("TurnOn", "", 0)
timer.Simple(0.2,function() if IsValid(expLight) then expLight:Remove() end end)
self:DeleteOnRemove(expLight)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:FireGun()
self:EmitSound("npc/vj_combine_guard_z/cguard_fire.wav", 140, math.random(80, 100))
local expLight = ents.Create("light_dynamic")
expLight:SetKeyValue("brightness", "5")
expLight:SetKeyValue("distance", "400")
expLight:Fire("Color", "0 75 255")
expLight:SetPos(self:GetAttachment(1).Pos)
expLight:Spawn()
expLight:SetParent(self,1)
expLight:Fire("TurnOn", "", 0)
timer.Simple(0.2,function() if IsValid(expLight) then expLight:Remove() end end)
self:DeleteOnRemove(expLight)
--self:UpdateFirePos()
ParticleEffect( "hunter_muzzle_flash",self:GetAttachment(1).Pos, self:GetAttachment(1).Ang, self )
util.ParticleTracerEx("Weapon_Combine_Ion_Cannon_Beam",self:GetAttachment(1).Pos,self.FirePos,false,self:EntIndex(),1)
self:DoGuardExplosion(self.FirePos)
self.FirePos = nil
self.HasPoseParameterLooking = true
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnHandleAnimEvent(ev, evTime, evCycle, evType, evOptions)
if ev == 13 then
self:ChargeGun()
elseif ev == 12 then
self:FireGun()
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:StartFiringGuardGun()
if self.GuardGunFiring then return end
self.GuardGunFiring = true
local firetime = 2.5
--self:EmitSound(table.Random(self.Guard_Mech_Noises), 78, math.random(60, 70))
self:VJ_ACT_PLAYACTIVITY("fire", true, firetime, false)
timer.Simple(firetime, function() if IsValid(self) then
self.GuardGunFiring = false
end end)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:EnemyIsInFireDist()
local enemydist = self:GetPos():Distance(self:GetEnemy():GetPos())
if enemydist > self.FireGunDist.min && enemydist < self.FireGunDist.max then
return true
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:GrenadeAttack()
if self.GrenadeAttacking then return end
self.GrenadeAttacking = true
local total_time = 1.5
local fire_time = 0.9
--self:EmitSound(table.Random(self.Guard_Mech_Noises), 80, math.random(60, 70))
self:EmitSound(table.Random(self.SoundTbl_GrenadeAttack), 80, math.random(self.GeneralSoundPitch1, self.GeneralSoundPitch2), 1, CHAN_VOICE )
self:VJ_ACT_PLAYACTIVITY("grenade", true, total_time, true)
timer.Simple(fire_time, function() if IsValid(self) then
local targetpos = self:GetPos() + self:GetForward() * 300
if IsValid(self:GetEnemy()) then
if self:Visible(self:GetEnemy()) then
targetpos = self:GetEnemy():GetPos()
-- if math.random(1, 2) == 1 then
-- targetpos = targetpos + self:GetEnemy():GetVelocity()
-- end
elseif self.PotentialGrenadePos then
targetpos = self.PotentialGrenadePos
end
end
self:EmitSound("weapons/mortar/mortar_fire1.wav",100,math.random(90, 110))
local grenade = ents.Create("obj_vj_extractor_z")
grenade:SetPos(self:GetAttachment(2).Pos)
grenade:Spawn()
grenade:GetPhysicsObject():SetVelocity(targetpos - self:GetPos() + Vector(0,0,200))
grenade:SetOwner(self)
end end)
timer.Simple(total_time, function() if IsValid(self) then
self.GrenadeAttacking = false
self.NextGrenadeAttack = CurTime() + math.Rand(self.GrenadeAttackDelay.min, self.GrenadeAttackDelay.max)
end end)
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:IsAlly(ent)
if !ent.VJ_NPC_Class then return end
for _,npcclass in pairs(ent.VJ_NPC_Class) do
for _,mynpcclass in pairs(self.VJ_NPC_Class) do
if npcclass == mynpcclass then
return true
end
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:BlackHole()
local suckradius = 125
if !self.BlackHoleLight then
self.BlackHoleLight = ents.Create("light_dynamic")
self.BlackHoleLight:SetKeyValue("brightness", "3")
self.BlackHoleLight:SetKeyValue("distance", "250")
self.BlackHoleLight:Fire("Color", "0 75 255")
self.BlackHoleLight:SetPos(self.FirePos)
self.BlackHoleLight:Spawn()
self.BlackHoleLight:Fire("TurnOn", "", 0)
self:DeleteOnRemove(self.BlackHoleLight)
local effectdata = EffectData()
effectdata:SetStart(self.FirePos)
effectdata:SetMagnitude(1)
effectdata:SetEntity(self)
effectdata:SetAttachment(0)
effectdata:SetScale(1.5)
util.Effect("cguard_warp", effectdata)
end
local effectdata = EffectData()
effectdata:SetStart(self.FirePos)
util.Effect("cguard_suck", effectdata)
for _,ent in pairs(ents.FindInSphere(self.FirePos, suckradius)) do
-- local tr = util.TraceLine({
-- start = self.FirePos,
-- endpos = ent:GetPos()+ent:OBBCenter(),
-- mask = MASK_NPCWORLDSTATIC,
-- })
if ent != self && ent:IsSolid() then
local dir = (self.FirePos - ent:GetPos()):GetNormalized()
if (ent:IsNPC() or ent:IsPlayer()) && !self:IsAlly(ent) && !ent.VJ_IsHugeMonster then
ent:SetVelocity(Vector(dir.x,dir.y,0) * 138)
end
if ent:GetMoveType() == MOVETYPE_VPHYSICS then
local physobj = ent:GetPhysicsObject()
if IsValid(physobj) then
physobj:ApplyForceCenter(dir * 3000)
end
end
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink()
if self.GunCharging then
if self.FirePos then
sound.EmitHint( SOUND_DANGER, self.FirePos, 300, 0.5, self )
end
self:BlackHole(self.FirePos)
ParticleEffectAttach("hunter_shield_impactglow", PATTACH_POINT_FOLLOW, self, 1)
else
if self.BlackHoleLight && IsValid(self.BlackHoleLight) then
self.BlackHoleLight:Remove()
self.BlackHoleLight = nil
end
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:Controller_IntMsg(ply, controlEnt)
ply:ChatPrint("MOUSE2 (secondary attack key): Fire Gun")
ply:ChatPrint("SPACE (jump key): Fire Grenade")
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink_AIEnabled()
local enemy = self:GetEnemy()
if self.VJ_IsBeingControlled then
if IsValid(enemy) then self.PotentialGrenadePos = enemy:GetPos() end
local controller = self.VJ_TheController
if self.NextGrenadeAttack < CurTime() && controller:KeyDown(IN_JUMP) && !self.GuardGunFiring then
self:GrenadeAttack()
end
if controller:KeyDown(IN_ATTACK2) && !self.GrenadeAttacking then
self:StartFiringGuardGun()
end
elseif IsValid(enemy) then
if self.NextGuardAttackTime < CurTime() && self:EnemyIsInFireDist() then
if self.NextGrenadeAttack < CurTime() && (math.random(1, 3) == 1 or !self:Visible(enemy)) && enemy:IsOnGround() then
self:GrenadeAttack()
end
if self:Visible(enemy) then
self.PotentialGrenadePos = enemy:GetPos()
if !self.GrenadeAttacking then
self:StartFiringGuardGun()
end
end
self.NextGuardAttackTime = CurTime() + math.Rand(self.GuardAttackDelay.min, self.GuardAttackDelay.max)
end
end
if self.FirePos then
local fireang = (self.FirePos - self:GetPos()):Angle()
self:SetIdealYawAndUpdate(fireang.y)
self:SetPoseParameter("aim_pitch",self:WorldToLocalAngles(fireang).x + 15 )
self:SetPoseParameter("aim_yaw",self:WorldToLocalAngles(fireang).y )
end
if self.GrenadeAttacking or self.GuardGunFiring then
self.HasMeleeAttack = false
else
self.HasMeleeAttack = true
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:DoSpark(pos,intensity)
intensity = intensity or 1
local spark = ents.Create("env_spark")
spark:SetKeyValue("Magnitude",tostring(intensity))
spark:SetKeyValue("Spark Trail Length",tostring(intensity))
spark:SetPos(pos)
spark:Spawn()
spark:Fire("StartSpark", "", 0)
timer.Simple(0.1, function() if IsValid(spark) then spark:Remove() end end)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnTakeDamage_BeforeDamage(dmginfo, hitgroup)
self.Bleeds = true
local infl = dmginfo:GetInflictor()
local comballdamage = false
if infl && IsValid(infl) then
if infl:GetClass() == "prop_combine_ball" then
infl:Fire("Explode")
comballdamage = true
end
if !infl.DamagedVJ_ZHunter && infl:GetClass() == "obj_vj_combineball" then
infl.DamagedVJ_ZHunter = true
infl:DeathEffects()
comballdamage = true
end
end
if !dmginfo:IsExplosionDamage() then
if dmginfo:IsBulletDamage() then
if math.random(1, 4) == 1 then
self:EmitSound("weapons/fx/rics/ric"..math.random(1,5)..".wav", 92, math.random(70, 90))
else
self.Bleeds = false
dmginfo:SetDamage(dmginfo:GetDamage()*0.1)
end
else
dmginfo:ScaleDamage(0.5)
end
if math.random(1, 4) == 1 then
self:EmitSound("physics/metal/metal_sheet_impact_bullet1.wav", 92, math.random(70, 90))
self.Spark1 = ents.Create("env_spark")
self.Spark1:SetPos(dmginfo:GetDamagePosition())
self.Spark1:Spawn()
self.Spark1:Fire("StartSpark", "", 0)
self.Spark1:Fire("StopSpark", "", 0.001)
self:DeleteOnRemove(self.Spark1)
end
else
self:DoSpark(dmginfo:GetDamagePosition(), 3)
if comballdamage then
dmginfo:SetDamage(150)
end
--self:EmitSound(table.Random(self.Guard_Mech_Noises), 80, math.random(60, 70))
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnPriorToKilled() self.Bleeds = true 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(200)
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)})
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)})
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))})
for i = 1, 2 do
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))})
end
return true
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnDeath_AfterCorpseSpawned(dmginfo, hitgroup, corpseEnt)
corpseEnt:SetBodygroup(1,0)
self:CreateGibEntity("obj_vj_gib","models/cguard_gun.mdl",{BloodType = "", CollideSound = {"SolidMetal.ImpactSoft"}})
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------