mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
511
lua/entities/npc_vj_hlrof_geneworm/init.lua
Normal file
511
lua/entities/npc_vj_hlrof_geneworm/init.lua
Normal file
@@ -0,0 +1,511 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user