Files
wnsrc/lua/entities/npc_vj_hlrof_geneworm/init.lua
lifestorm ba1fc01b16 Upload
2024-08-04 23:12:27 +03:00

511 lines
23 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')
/*-----------------------------------------------
*** Copyright (c) 2012-2023 by DrVrej, All rights reserved. ***
No parts of this code or any of its contents may be reproduced, copied, modified or adapted,
without the prior written consent of the author, unless otherwise indicated for stand-alone materials.
-----------------------------------------------*/
ENT.Model = {"models/vj_hlr/opfor/geneworm.mdl"} -- The game will pick a random model from the table when the SNPC is spawned | Add as many as you want
ENT.StartHealth = 1080
ENT.SightAngle = 120 -- The sight angle | Example: 180 would make the it see all around it | Measured in degrees and then converted to radians
ENT.HullType = HULL_LARGE
ENT.VJ_IsHugeMonster = true -- Is this a huge monster?
ENT.MovementType = VJ_MOVETYPE_STATIONARY -- How does the SNPC move?
ENT.CanTurnWhileStationary = false -- If set to true, the SNPC will be able to turn while it's a stationary SNPC
ENT.VJC_Data = {
ThirdP_Offset = Vector(0, 0, -150), -- The offset for the controller when the camera is in third person
FirstP_Bone = "Bone96", -- 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
}
---------------------------------------------------------------------------------------------------------------------------------------------
ENT.BloodColor = "Yellow" -- The blood type, this will determine what it should use (decal, particle, etc.)
ENT.CustomBlood_Particle = {"vj_hlr_blood_yellow_large"}
ENT.CustomBlood_Decal = {"VJ_HLR_Blood_Yellow"} -- Decals to spawn when it's damaged
ENT.HasBloodPool = false -- Does it have a blood pool?
ENT.VJ_NPC_Class = {"CLASS_RACE_X"} -- NPCs with the same class with be allied to each other
ENT.HasMeleeAttack = true -- Should the SNPC have a melee attack?
ENT.MeleeAttackDamage = 60
ENT.AnimTbl_MeleeAttack = {ACT_MELEE_ATTACK1} -- Melee Attack Animations
ENT.MeleeAttackAnimationFaceEnemy = true -- Should it face the enemy while playing the melee attack animation?
ENT.MeleeAttackDistance = 250 -- How close does it have to be until it attacks?
ENT.MeleeAttackDamageDistance = 500 -- How far does the damage go?
ENT.TimeUntilMeleeAttackDamage = false -- This counted in seconds | This calculates the time until it hits something
ENT.HasMeleeAttackKnockBack = true -- If true, it will cause a knockback to its enemy
ENT.HasRangeAttack = true -- Should the SNPC have a range attack?
ENT.RangeAttackEntityToSpawn = "obj_vj_hlrof_gw_biotoxin" -- The entity that is spawned when range attacking
ENT.AnimTbl_RangeAttack = {ACT_RANGE_ATTACK1} -- Range Attack Animations
ENT.RangeDistance = 8000 -- This is how far away it can shoot
ENT.RangeToMeleeDistance = 500 -- How close does it have to be until it uses melee?
ENT.TimeUntilRangeAttackProjectileRelease = 2.1 -- How much time until the projectile code is ran?
ENT.RangeAttackExtraTimers = {2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3} -- Extra range attack timers | it will run the projectile code after the given amount of seconds
ENT.NextRangeAttackTime = 2 -- How much time until it can use a range attack?
ENT.NextRangeAttackTime_DoRand = 4 -- False = Don't use random time | Number = Picks a random number between the regular timer and this timer
ENT.RangeUseAttachmentForPos = true -- Should the projectile spawn on a attachment?
ENT.RangeUseAttachmentForPosID = "mouth" -- The attachment used on the range attack if RangeUseAttachmentForPos is set to true
ENT.HasDeathAnimation = true -- Does it play an animation when it dies?
ENT.AnimTbl_Death = {"death"} -- Death Animations
ENT.HasExtraMeleeAttackSounds = true -- Set to true to use the extra melee attack sounds
-- ====== Sound File Paths ====== --
-- Leave blank if you don't want any sounds to play
ENT.SoundTbl_Idle = {"vj_hlr/hl1_npc/geneworm/geneworm_idle1.wav","vj_hlr/hl1_npc/geneworm/geneworm_idle2.wav","vj_hlr/hl1_npc/geneworm/geneworm_idle3.wav","vj_hlr/hl1_npc/geneworm/geneworm_idle4.wav"}
ENT.SoundTbl_Death = {"vj_hlr/hl1_npc/geneworm/geneworm_death.wav"}
ENT.BreathSoundLevel = 100
ENT.IdleSoundLevel = 100
ENT.AlertSoundLevel = 100
ENT.BeforeMeleeAttackSoundLevel = 100
ENT.BeforeRangeAttackSoundLevel = 100
ENT.PainSoundLevel = 100
ENT.DeathSoundLevel = 100
-- Custom
ENT.GW_Fade = 0 -- 0 = No fade | 1 = Fade in | 2 = Fade out
ENT.GW_EyeHealth = {}
ENT.GW_OrbOpen = false
ENT.GW_OrbHealth = 100
ENT.GW_MeleeNegKnockback = false
local maxEyeHealth = 100
local maxOrbHealth = 100
local vecPortalSpawn = Vector(0, 0, 100)
local colorPortal = Color(153, 6, 159, 255)
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnInitialize()
self:AddFlags(FL_NOTARGET) -- They are going to target the bullseye only, so don't let other NPCs see the actual gene worm!
self:SetCollisionBounds(Vector(400, 400, 350), Vector(-400, -400, -240))
self:SetRenderMode(RENDERMODE_TRANSALPHA)
self.GW_EyeHealth = {r=maxEyeHealth, l=maxEyeHealth}
self.GW_OrbHealth = maxOrbHealth
-- Bulleyes for both eyes & the core
self.GW_BE_EyeR = ents.Create("obj_vj_bullseye")
self.GW_BE_EyeR:SetModel("models/hunter/plates/plate.mdl")
self.GW_BE_EyeR:SetParent(self)
self.GW_BE_EyeR:Fire("SetParentAttachment", "eyeRight")
self.GW_BE_EyeR:Spawn()
self.GW_BE_EyeR:SetNoDraw(true)
self.GW_BE_EyeR:DrawShadow(false)
self.GW_BE_EyeR.VJ_NPC_Class = self.VJ_NPC_Class
table.insert(self.VJ_AddCertainEntityAsFriendly, self.GW_BE_EyeR) -- In case relation class is changed dynamically!
self:DeleteOnRemove(self.GW_BE_EyeR)
self.GW_BE_EyeL = ents.Create("obj_vj_bullseye")
self.GW_BE_EyeL:SetModel("models/hunter/plates/plate.mdl")
self.GW_BE_EyeL:SetParent(self)
self.GW_BE_EyeL:Fire("SetParentAttachment", "eyeLeft")
self.GW_BE_EyeL:Spawn()
self.GW_BE_EyeL:SetNoDraw(true)
self.GW_BE_EyeL:DrawShadow(false)
self.GW_BE_EyeL.VJ_NPC_Class = self.VJ_NPC_Class
table.insert(self.VJ_AddCertainEntityAsFriendly, self.GW_BE_EyeL) -- In case relation class is changed dynamically!
self:DeleteOnRemove(self.GW_BE_EyeL)
self.GW_BE_Orb = ents.Create("obj_vj_bullseye")
self.GW_BE_Orb:SetModel("models/hunter/plates/plate.mdl")
self.GW_BE_Orb:SetParent(self)
self.GW_BE_Orb:Fire("SetParentAttachment", "orb")
self.GW_BE_Orb:Spawn()
self.GW_BE_Orb:SetNoDraw(true)
self.GW_BE_Orb:DrawShadow(false)
self.GW_BE_Orb.VJ_NPC_Class = self.VJ_NPC_Class
table.insert(self.VJ_AddCertainEntityAsFriendly, self.GW_BE_Orb) -- In case relation class is changed dynamically!
self.GW_BE_Orb:AddFlags(FL_NOTARGET)
self:DeleteOnRemove(self.GW_BE_Orb)
-- Eye Lights
self.GW_EyeLightL = ents.Create("light_dynamic")
self.GW_EyeLightL:SetKeyValue("brightness", 1)
self.GW_EyeLightL:SetKeyValue("distance", 400)
self.GW_EyeLightL:Fire("Color", "143 213 163")
self.GW_EyeLightL:SetParent(self)
self.GW_EyeLightL:Fire("SetParentAttachment", "eyeLeft")
self.GW_EyeLightL:Spawn()
self.GW_EyeLightL:Activate()
self.GW_EyeLightL:Fire("TurnOn")
self:DeleteOnRemove(self.GW_EyeLightL)
self.GW_EyeLightR = ents.Create("light_dynamic")
self.GW_EyeLightR:SetKeyValue("brightness", 1)
self.GW_EyeLightR:SetKeyValue("distance", 400)
self.GW_EyeLightR:Fire("Color", "143 213 163")
self.GW_EyeLightR:SetParent(self)
self.GW_EyeLightR:Fire("SetParentAttachment", "eyeRight")
self.GW_EyeLightR:Spawn()
self.GW_EyeLightR:Activate()
self.GW_EyeLightR:Fire("TurnOn")
self:DeleteOnRemove(self.GW_EyeLightR)
-- Stomach Orb (core)
self.GW_OrbSprite = ents.Create("env_sprite")
self.GW_OrbSprite:SetKeyValue("model","vj_hl/sprites/boss_glow.vmt")
//self.GW_OrbSprite:SetKeyValue("rendercolor","255 128 0")
self.GW_OrbSprite:SetKeyValue("GlowProxySize","2.0")
self.GW_OrbSprite:SetKeyValue("HDRColorScale","1.0")
self.GW_OrbSprite:SetKeyValue("renderfx","14")
self.GW_OrbSprite:SetKeyValue("rendermode","3")
self.GW_OrbSprite:SetKeyValue("renderamt","255")
self.GW_OrbSprite:SetKeyValue("disablereceiveshadows","0")
self.GW_OrbSprite:SetKeyValue("mindxlevel","0")
self.GW_OrbSprite:SetKeyValue("maxdxlevel","0")
self.GW_OrbSprite:SetKeyValue("framerate","10.0")
self.GW_OrbSprite:SetKeyValue("spawnflags","0")
self.GW_OrbSprite:SetKeyValue("scale","1.5")
self.GW_OrbSprite:SetParent(self)
self.GW_OrbSprite:Fire("SetParentAttachment", "orb")
self.GW_OrbSprite:Fire("HideSprite")
self.GW_OrbSprite:Spawn()
self:DeleteOnRemove(self.GW_OrbSprite)
-- The purple portal
self.GW_Portal = ents.Create("prop_vj_animatable")
self.GW_Portal:SetModel("models/vj_hlr/opfor/effects/geneportal.mdl")
self.GW_Portal:SetPos(self:GetPos() + self:GetForward()*-507)
self.GW_Portal:SetAngles(self:GetAngles())
self.GW_Portal:SetParent(self)
self.GW_Portal:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE)
self.GW_Portal:Spawn()
self.GW_Portal:Activate()
self:DeleteOnRemove(self.GW_Portal)
-- Portal ambient sounds
self.GW_Portal.MoveLP = CreateSound(self.GW_Portal, "vj_hlr/fx/alien_zonerator.wav")
self.GW_Portal.MoveLP:SetSoundLevel(100)
self.GW_Portal.IdleLP = CreateSound(self.GW_Portal, "vj_hlr/fx/alien_creeper.wav")
self.GW_Portal.IdleLP:SetSoundLevel(100)
-- Fade in on spawn (Only if AI is enabled!)
if GetConVar("ai_disabled"):GetInt() == 0 then
self.GW_Portal:ResetSequence("open")
local sprParticles = ents.Create("info_particle_system")
sprParticles:SetKeyValue("effect_name", "vj_hlr_geneworm_sprites")
sprParticles:SetPos(self.GW_Portal:GetPos() + self.GW_Portal:OBBCenter() + vecPortalSpawn)
sprParticles:SetAngles(self.GW_Portal:GetAngles())
sprParticles:SetParent(self.GW_Portal)
sprParticles:Spawn()
sprParticles:Activate()
sprParticles:Fire("Start", "", 0)
sprParticles:Fire("Kill", "", 10)
self:DeleteOnRemove(sprParticles)
self.GW_Portal.MoveLP:Play()
self.GW_Portal.IdleLP:Stop()
timer.Simple(12, function()
if IsValid(self) && IsValid(self.GW_Portal) && self.GW_Portal:GetSequenceName(self.GW_Portal:GetSequence()) == "open" then
self.GW_Portal:ResetSequence("idle")
self.GW_Portal.MoveLP:Stop()
self.GW_Portal.IdleLP:Play()
end
end)
self:SetColor(Color(255, 255, 255, 0))
self.GW_Fade = 1
timer.Simple(0.01, function()
if IsValid(self) then
self:PlaySoundSystem("Alert", "vj_hlr/hl1_npc/geneworm/geneworm_entry.wav")
self:VJ_ACT_PLAYACTIVITY(ACT_ARM, true, false)
end
end)
else
self.GW_Portal:ResetSequence("idle")
self.GW_Portal.MoveLP:Stop()
self.GW_Portal.IdleLP:Play()
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnAcceptInput(key, activator, caller, data)
//print(key)
if key == "melee" or key == "shakeworld" then
self:MeleeAttackCode()
//elseif key == "spit_start" then
//self:RangeAttackCode()
elseif key == "open_botheyes" then
self.GW_EyeLightL:Fire("TurnOn")
self.GW_EyeLightR:Fire("TurnOn")
self.GW_BE_EyeL:RemoveFlags(FL_NOTARGET)
self.GW_BE_EyeR:RemoveFlags(FL_NOTARGET)
elseif key == "spawn_portal" then
self.GW_OrbSprite:Fire("HideSprite")
self.GW_BE_Orb:AddFlags(FL_NOTARGET)
-- Shock trooper spawner
local at = self:GetAttachment(self:LookupAttachment("orb"))
sprite = ents.Create("obj_vj_hlrof_gw_spawner")
sprite:SetPos(at.Pos)
sprite:SetAngles(at.Ang)
sprite:SetOwner(self)
sprite:Spawn()
sprite:Activate()
local phys = sprite:GetPhysicsObject()
if IsValid(phys) then
phys:Wake()
phys:EnableGravity(false)
phys:EnableDrag(false)
phys:SetVelocity(self:CalculateProjectile("Line", sprite:GetPos(), at.Pos + self:GetForward()*400, 300))
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink()
local a = self:GetColor().a
-- Fade in animation (On Spawn)
if self.GW_Fade == 1 && a < 255 then
self:SetColor(Color(255, 255, 255, a >= 180 && a + 25 or a + 2))
if self:GetColor().a >= 255 then
self.GW_Fade = 0
end
-- Fade out animation (On Death)
elseif self.GW_Fade == 2 && a > 0 then
self:SetColor(Color(255, 255, 255, math.Clamp(a - 2, 0, 255)))
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:GetDynamicOrigin()
return self:GetPos() + self:GetForward()*200 -- Override this to use a different position
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:GetMeleeAttackDamageOrigin()
return self:GetPos() + self:GetForward()*200 -- Override this to use a different position
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:MeleeAttackKnockbackVelocity(hitEnt)
return self:GetForward()*math.random(400, 500) + self:GetUp()*(self.GW_MeleeNegKnockback and math.random(-100, -150) or math.random(1000, 1200))
end
---------------------------------------------------------------------------------------------------------------------------------------------
local meleeAngCos = math.cos(math.rad(40))
--
function ENT:CustomOnMeleeAttack_BeforeStartTimer()
local ene = self:GetEnemy()
if !IsValid(ene) then return end
local myPos = self:GetPos()
local enePos = ene:GetPos()
local posR = myPos + self:GetForward()*200 + self:GetRight()*300
local posL = myPos + self:GetForward()*200 + self:GetRight()*-300
if math.random(1, 2) == 1 then
self.AnimTbl_MeleeAttack = {ACT_SPECIAL_ATTACK1}
self.GW_MeleeNegKnockback = false
self.SoundTbl_BeforeMeleeAttack = {"vj_hlr/hl1_npc/geneworm/geneworm_big_attack_forward.wav"}
else
self.GW_MeleeNegKnockback = true
self.SoundTbl_BeforeMeleeAttack = {"vj_hlr/hl1_npc/geneworm/geneworm_attack_mounted_gun.wav", "vj_hlr/hl1_npc/geneworm/geneworm_attack_mounted_rocket.wav"}
if self:GetForward():Dot((enePos - myPos):GetNormalized()) > meleeAngCos then
//print("center")
self.AnimTbl_MeleeAttack = {ACT_MELEE_ATTACK1}
else
if posR:Distance(enePos) > posL:Distance(enePos) then
//print("left")
self.AnimTbl_MeleeAttack = {"melee1"}
else
//print("right")
self.AnimTbl_MeleeAttack = {"melee2"}
end
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnRangeAttack_BeforeStartTimer()
self:PlaySoundSystem("BeforeMeleeAttack", "vj_hlr/hl1_npc/geneworm/geneworm_beam_attack.wav", VJ_EmitSound)
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:RangeAttackCode_GetShootPos(projectile)
local enePos = self:GetEnemy():GetPos() + self:GetEnemy():OBBCenter()
local attachPos = self:GetAttachment(1).Pos
local vel = self:CalculateProjectile("Line", self:GetAttachment(1).Pos, enePos, 2000)
projectile.Track_Enemy = self:GetEnemy()
projectile.Track_OrgPosition = enePos
projectile.Track_TrackTime = CurTime() + (enePos:Distance(attachPos) / vel:Length()) -- Stops chasing the enemy after this time
return vel
end
/*
pain_1 = Start animation when both eyes break
pain_2 = Idle animation when orb is open
pain_3 = When orb is destroyed -- Play this then pain_4
pain_4 = Spawns shocktrooper -- Can be triggered if it runs out of time or orb is destroyed
*/
---------------------------------------------------------------------------------------------------------------------------------------------
-- Resets everything, including the eye & stomach health, idle animation and NPC state
function ENT:GW_OrbOpenReset()
if self.Dead then return end
timer.Remove("gw_closestomach"..self:EntIndex())
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_final_pain4.wav")
self.SoundTbl_Breath = {}
VJ_STOPSOUND(self.CurrentBreathSound)
self.GW_OrbOpen = false
self.GW_EyeHealth = {r=maxEyeHealth, l=maxEyeHealth}
self.GW_OrbHealth = maxOrbHealth
self:SetSkin(0)
self.AnimTbl_IdleStand = {ACT_IDLE}
self:VJ_ACT_PLAYACTIVITY("pain_4", true, false, false, 0, {}, function(vsched)
vsched.RunCode_OnFinish = function() -- Just a backup in case event fails
self.GW_OrbSprite:Fire("HideSprite")
self.GW_BE_Orb:AddFlags(FL_NOTARGET)
self.GW_EyeLightL:Fire("TurnOn")
self.GW_EyeLightR:Fire("TurnOn")
self.GW_BE_EyeL:RemoveFlags(FL_NOTARGET)
self.GW_BE_EyeR:RemoveFlags(FL_NOTARGET)
end
end)
self:SetState()
end
---------------------------------------------------------------------------------------------------------------------------------------------
-- Checks to the health of each eye and sets the skin
-- If both are broken, then it will open its stomach
function ENT:GW_EyeHealthCheck()
local r = self.GW_EyeHealth.r
local l = self.GW_EyeHealth.l
if r <= 0 && l <= 0 then -- If both eyes have health below 1 then open stomach!
self:SetSkin(3)
if self.GW_OrbOpen == false then
self.GW_EyeLightL:Fire("TurnOff")
self.GW_EyeLightR:Fire("TurnOff")
self.GW_BE_EyeL:AddFlags(FL_NOTARGET)
self.GW_BE_EyeR:AddFlags(FL_NOTARGET)
self.GW_OrbSprite:Fire("ShowSprite")
self.GW_BE_Orb:RemoveFlags(FL_NOTARGET)
self.GW_OrbOpen = true
self:SetState(VJ_STATE_ONLY_ANIMATION_NOATTACK)
self.AnimTbl_IdleStand = {ACT_IDLE_STIMULATED}
self:VJ_ACT_PLAYACTIVITY("pain_1", true, false)
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_final_pain1.wav")
self.SoundTbl_Breath = {"vj_hlr/hl1_npc/geneworm/geneworm_final_pain2.wav"}
/*timer.Simple(VJ_GetSequenceDuration(self, "pain_1"),function()
if IsValid(self) then
self:VJ_ACT_PLAYACTIVITY("pain_2", true, false)
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_final_pain2.wav")
end
end)*/
-- Update the class tables for all the bullseyes in case it changed
self.GW_BE_EyeL.VJ_NPC_Class = self.VJ_NPC_Class
self.GW_BE_EyeR.VJ_NPC_Class = self.VJ_NPC_Class
self.GW_BE_Orb.VJ_NPC_Class = self.VJ_NPC_Class
timer.Create("gw_closestomach"..self:EntIndex(), 20, 1, function()
if IsValid(self) && self.GW_OrbOpen == true then
self:GW_OrbOpenReset()
-- Update the class tables for all the bullseyes in case it changed (AGAIN)
self.GW_BE_EyeL.VJ_NPC_Class = self.VJ_NPC_Class
self.GW_BE_EyeR.VJ_NPC_Class = self.VJ_NPC_Class
self.GW_BE_Orb.VJ_NPC_Class = self.VJ_NPC_Class
end
end)
end
elseif r <= 0 then
self.GW_EyeLightR:Fire("TurnOff")
self.GW_BE_EyeR:AddFlags(FL_NOTARGET)
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_shot_in_eye.wav")
self:SetSkin(2)
elseif l <= 0 then
self.GW_EyeLightL:Fire("TurnOff")
self.GW_BE_EyeL:AddFlags(FL_NOTARGET)
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_shot_in_eye.wav")
self:SetSkin(1)
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnTakeDamage_BeforeDamage(dmginfo, hitgroup)
if self.GW_Fade == 1 or self:GetSequenceName(self:GetSequence()) == "pain_4" then dmginfo:SetDamage(0) end -- If it's fading in, then don't take damage!
-- Left eye
if hitgroup == 14 && self.GW_EyeHealth.l > 0 then
self:SpawnBloodParticles(dmginfo, hitgroup)
self.GW_EyeHealth.l = self.GW_EyeHealth.l - dmginfo:GetDamage()
//print("Left hit!", self.GW_EyeHealth.l)
if self.GW_EyeHealth.l <= 0 then
self:VJ_ACT_PLAYACTIVITY(ACT_SMALL_FLINCH, true, false)
self:GW_EyeHealthCheck()
end
dmginfo:SetDamage(0)
-- Right eye
elseif hitgroup == 15 && self.GW_EyeHealth.r > 0 then
self:SpawnBloodParticles(dmginfo, hitgroup)
self.GW_EyeHealth.r = self.GW_EyeHealth.r - dmginfo:GetDamage()
//print("Right hit!", self.GW_EyeHealth.r)
if self.GW_EyeHealth.r <= 0 then
self:VJ_ACT_PLAYACTIVITY(ACT_BIG_FLINCH, true, false)
self:GW_EyeHealthCheck()
end
dmginfo:SetDamage(0)
-- Stomach Orb
elseif hitgroup == 69 && self.GW_OrbOpen == true && self.GW_OrbHealth > 0 then
self.GW_OrbHealth = self.GW_OrbHealth - dmginfo:GetDamage()
if self.GW_OrbHealth <= 0 then
timer.Remove("gw_closestomach"..self:EntIndex())
self.SoundTbl_Breath = {}
VJ_STOPSOUND(self.CurrentBreathSound)
self.PainSoundT = 0 -- Otherwise it won't play the sound because it played another pain sound right before this!
self:PlaySoundSystem("Pain", "vj_hlr/hl1_npc/geneworm/geneworm_final_pain3.wav")
self:VJ_ACT_PLAYACTIVITY("pain_3", true, false)
timer.Simple(VJ_GetSequenceDuration(self, "pain_3"),function()
if IsValid(self) then
self:GW_OrbOpenReset()
end
end)
end
else
dmginfo:SetDamage(0)
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:GW_CleanUp()
timer.Remove("gw_closestomach"..self:EntIndex())
if IsValid(self.GW_EyeLightR) then self.GW_EyeLightR:Remove() end
if IsValid(self.GW_EyeLightL) then self.GW_EyeLightL:Remove() end
if IsValid(self.GW_BE_EyeR) then self.GW_BE_EyeR:Remove() end
if IsValid(self.GW_BE_EyeL) then self.GW_BE_EyeL:Remove() end
if IsValid(self.GW_BE_Orb) then self.GW_BE_Orb:Remove() end
if IsValid(self.GW_OrbSprite) then self.GW_OrbSprite:Remove() end
end
---------------------------------------------------------------------------------------------------------------------------------------------
local deathParticlePos = Vector(0, 0, -25)
--
function ENT:CustomDeathAnimationCode(dmginfo, hitgroup)
self:GW_CleanUp()
if IsValid(self.GW_Portal) then
self.GW_Portal:ResetSequence("close")
local sprParticles = ents.Create("info_particle_system")
sprParticles:SetKeyValue("effect_name","vj_hlr_geneworm_sprites_death")
sprParticles:SetPos(self.GW_Portal:GetPos() + self.GW_Portal:OBBCenter() + deathParticlePos)
sprParticles:SetAngles(self.GW_Portal:GetAngles())
sprParticles:SetParent(self.GW_Portal)
sprParticles:Spawn()
sprParticles:Activate()
sprParticles:Fire("Start", "", 0)
sprParticles:Fire("Kill", "", 18)
self:DeleteOnRemove(sprParticles)
-- Not Gene Worm effects
/*for i = 1, math.random(12, 20) do
timer.Simple(i * math.Rand(0.5, 1), function()
if IsValid(self) then
VJ_HLR_Effect_Explosion(self:GetAttachment(2).Pos + Vector(math.Rand(-100, 100), math.Rand(-100, 100), math.Rand(-100, 100)), 2, math.Rand(2.5, 5), "50 255 50")
end
end)
end*/
self.GW_Portal.MoveLP:Play()
self.GW_Portal.IdleLP:Stop()
end
self.GW_Fade = 2
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnKilled(dmginfo, hitgroup)
-- Screen flash effect for all the players
for _,v in ipairs(player.GetHumans()) do
v:ScreenFade(SCREENFADE.IN, colorPortal, 1, 0)
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnRemove()
self:GW_CleanUp()
if IsValid(self.GW_Portal) then
self.GW_Portal.MoveLP:Stop()
self.GW_Portal.IdleLP:Stop()
end
end