mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
413 lines
26 KiB
Lua
413 lines
26 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/hl1/garg.mdl"} -- The game will pick a random model from the table when the SNPC is spawned | Add as many as you want
|
|
ENT.StartHealth = 1000
|
|
ENT.HullType = HULL_HUMAN
|
|
ENT.VJ_IsHugeMonster = true -- Is this a huge monster?
|
|
ENT.VJC_Data = {
|
|
ThirdP_Offset = Vector(-50, 0, -45), -- 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(7, 0, -12), -- The offset for the controller when the camera is in first person
|
|
}
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
ENT.VJ_NPC_Class = {"CLASS_XEN"} -- NPCs with the same class with be allied to each other
|
|
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.HasMeleeAttack = true -- Should the SNPC have a melee attack?
|
|
ENT.TimeUntilMeleeAttackDamage = false -- This counted in seconds | This calculates the time until it hits something
|
|
ENT.MeleeAttackDamage = 30 -- How close does it have to be until it attacks?
|
|
ENT.MeleeAttackDamageType = DMG_CRUSH -- How close does it have to be until it attacks?
|
|
ENT.MeleeAttackDistance = 65 -- How close does it have to be until it attacks?
|
|
ENT.MeleeAttackDamageDistance = 165 -- How far does the damage go?
|
|
|
|
ENT.HasRangeAttack = true -- Should the SNPC have a range attack?
|
|
ENT.RangeAttackEntityToSpawn = "obj_vj_hlr1_garg_stomp" -- The entity that is spawned when range attacking
|
|
ENT.RangeDistance = 2000 -- This is how far away it can shoot
|
|
ENT.RangeToMeleeDistance = 80 -- How close does it have to be until it uses melee?
|
|
ENT.NextRangeAttackTime = 2 -- How much time until it can use a range attack?
|
|
ENT.TimeUntilRangeAttackProjectileRelease = false -- How much time until the projectile code is ran?
|
|
ENT.RangeAttackPos_Up = 10 -- Up/Down spawning position for range attack
|
|
ENT.RangeAttackPos_Forward = 50 -- Forward/Backward spawning position for range attack
|
|
ENT.RangeAttackPos_Right = -20 -- Right/Left spawning position for range attack
|
|
|
|
ENT.HasWorldShakeOnMove = true -- Should the world shake when it's moving?
|
|
ENT.HasExtraMeleeAttackSounds = true -- Set to true to use the extra melee attack sounds
|
|
ENT.DisableFootStepSoundTimer = true -- If set to true, it will disable the time system for the footstep sound code, allowing you to use other ways like model events
|
|
ENT.GibOnDeathDamagesTable = {"All"} -- Damages that it gibs from | "UseDefault" = Uses default damage types | "All" = Gib from any damage
|
|
ENT.HasDeathAnimation = true -- Does it play an animation when it dies?
|
|
ENT.DeathAnimationTime = 3.7 -- Time until the SNPC spawns its corpse and gets removed
|
|
ENT.AnimTbl_Death = {ACT_DIESIMPLE} -- Death Animations
|
|
-- ====== Flinching Variables ====== --
|
|
ENT.CanFlinch = 2 -- 0 = Don't flinch | 1 = Flinch at any damage | 2 = Flinch only from certain damages
|
|
ENT.FlinchDamageTypes = {DMG_BLAST} -- If it uses damage-based flinching, which types of damages should it flinch from?
|
|
ENT.FlinchChance = 2 -- Chance of it flinching from 1 to x | 1 will make it always flinch
|
|
ENT.AnimTbl_Flinch = {ACT_BIG_FLINCH} -- If it uses normal based animation, use this
|
|
-- ====== Sound File Paths ====== --
|
|
-- Leave blank if you don't want any sounds to play
|
|
ENT.SoundTbl_FootStep = {"vj_hlr/hl1_npc/garg/gar_step1.wav","vj_hlr/hl1_npc/garg/gar_step2.wav"}
|
|
ENT.SoundTbl_Breath = {"vj_hlr/hl1_npc/garg/gar_breathe1.wav","vj_hlr/hl1_npc/garg/gar_breathe2.wav","vj_hlr/hl1_npc/garg/gar_breathe3.wav"}
|
|
ENT.SoundTbl_Idle = {"vj_hlr/hl1_npc/garg/gar_idle1.wav","vj_hlr/hl1_npc/garg/gar_idle2.wav","vj_hlr/hl1_npc/garg/gar_idle3.wav","vj_hlr/hl1_npc/garg/gar_idle4.wav","vj_hlr/hl1_npc/garg/gar_idle5.wav"}
|
|
ENT.SoundTbl_Alert = {"vj_hlr/hl1_npc/garg/gar_alert1.wav","vj_hlr/hl1_npc/garg/gar_alert2.wav","vj_hlr/hl1_npc/garg/gar_alert3.wav"}
|
|
ENT.SoundTbl_BeforeMeleeAttack = {"vj_hlr/hl1_npc/garg/gar_attack1.wav","vj_hlr/hl1_npc/garg/gar_attack2.wav","vj_hlr/hl1_npc/garg/gar_attack3.wav"}
|
|
ENT.SoundTbl_MeleeAttackExtra = {"vj_hlr/hl1_npc/zombie/claw_strike1.wav","vj_hlr/hl1_npc/zombie/claw_strike2.wav","vj_hlr/hl1_npc/zombie/claw_strike3.wav"}
|
|
ENT.SoundTbl_MeleeAttackMiss = {"vj_hlr/hl1_npc/zombie/claw_miss1.wav","vj_hlr/hl1_npc/zombie/claw_miss2.wav"}
|
|
ENT.SoundTbl_Pain = {"vj_hlr/hl1_npc/garg/gar_pain1.wav","vj_hlr/hl1_npc/garg/gar_pain2.wav","vj_hlr/hl1_npc/garg/gar_pain3.wav"}
|
|
ENT.SoundTbl_Death = {"vj_hlr/hl1_npc/garg/gar_die1.wav","vj_hlr/hl1_npc/garg/gar_die2.wav"}
|
|
|
|
ENT.GeneralSoundPitch1 = 100
|
|
ENT.ExtraMeleeSoundPitch = VJ_Set(80, 80)
|
|
|
|
-- Custom
|
|
ENT.Garg_Type = 0
|
|
-- 0 = Default Garg
|
|
-- 1 = Baby Garg
|
|
-- 2 = Custom (Not immune to bullets)
|
|
ENT.Garg_AttackType = -1
|
|
ENT.Garg_AbleToFlame = false
|
|
ENT.Garg_NextAbleToFlameT = 0
|
|
ENT.Garg_NextStompAttackT = 0
|
|
ENT.Garg_MeleeLargeKnockback = false
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnPreInitialize()
|
|
if GetConVar("vj_hlr_hd"):GetInt() == 1 && VJ.HLR_HD_INSTALLED then
|
|
if self:GetClass() == "npc_vj_hlr1_garg" then
|
|
self.Model = "models/vj_hlr/hl_hd/garg.mdl"
|
|
elseif self:GetClass() == "npc_vj_hlrsv_garg_baby" then
|
|
self.Model = "models/vj_hlr/hl_hd/babygarg.mdl"
|
|
end
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnInitialize()
|
|
if self.Garg_Type == 0 then -- Adult garg
|
|
self:SetCollisionBounds(Vector(70,70,210), Vector(-70,-70,0))
|
|
elseif self.Garg_Type == 1 then -- Baby garg
|
|
self:SetCollisionBounds(Vector(32,32,105), Vector(-32,-32,0))
|
|
end
|
|
|
|
local glow1 = ents.Create("env_sprite")
|
|
glow1:SetKeyValue("model","vj_hl/sprites/gargeye1.vmt")
|
|
glow1:SetKeyValue("GlowProxySize","2.0") -- Size of the glow to be rendered for visibility testing.
|
|
glow1:SetKeyValue("renderfx","14")
|
|
glow1:SetKeyValue("rendermode","3") -- Set the render mode to "3" (Glow)
|
|
glow1:SetKeyValue("disablereceiveshadows","0") -- Disable receiving shadows
|
|
glow1:SetKeyValue("spawnflags","0")
|
|
glow1:SetParent(self)
|
|
glow1:Fire("SetParentAttachment","eyes")
|
|
glow1:Spawn()
|
|
glow1:Activate()
|
|
self:DeleteOnRemove(glow1)
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnAcceptInput(key, activator, caller, data)
|
|
//print(key)
|
|
if key == "step" then
|
|
self:FootStepSoundCode()
|
|
end
|
|
if key == "melee" then
|
|
self:MeleeAttackCode()
|
|
end
|
|
if key == "laser" then
|
|
self:RangeAttackCode()
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:Garg_ResetFlame()
|
|
self.Garg_AbleToFlame = false
|
|
self.Garg_AttackType = -1
|
|
self.AnimTbl_IdleStand = {ACT_IDLE}
|
|
self.NextIdleStandTime = 0
|
|
self.DisableChasingEnemy = false
|
|
VJ_STOPSOUND(self.Garg_FlameSd)
|
|
self:StopParticles()
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnThink()
|
|
if self.Garg_AbleToFlame == false or self.AttackType != VJ_ATTACK_RANGE or !IsValid(self:GetEnemy()) then
|
|
self:Garg_ResetFlame()
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnThink_AIEnabled()
|
|
-- If the controller (player) not range attacking, then end the timer!
|
|
if self.VJ_IsBeingControlled && !self.VJ_TheController:KeyDown(IN_ATTACK2) then timer.Adjust("timer_range_start"..self:EntIndex(), 0) return end
|
|
|
|
if IsValid(self:GetEnemy()) && (self.NearestPointToEnemyDistance <= (self.VJ_IsBeingControlled and 999999 or (self.Garg_Type == 1 and 250) or 400) && self.NearestPointToEnemyDistance > self.MeleeAttackDistance) && self.Garg_AbleToFlame == true && self.Garg_NextAbleToFlameT < CurTime() && self.Garg_AttackType == 0 && timer.Exists("timer_range_start"..self:EntIndex()) then
|
|
//if IsValid(self:GetEnemy()) && self.Garg_AbleToFlame == true && (self.NearestPointToEnemyDistance <= 400 && self.NearestPointToEnemyDistance > self.MeleeAttackDistance) then
|
|
local range = (self.Garg_Type == 1 and 280) or 460
|
|
self.Garg_NextAbleToFlameT = CurTime() + 0.2
|
|
self.DisableChasingEnemy = true
|
|
self.AnimTbl_IdleStand = {ACT_RANGE_ATTACK1}
|
|
self.NextIdleStandTime = 0
|
|
self:StopMoving()
|
|
util.VJ_SphereDamage(self, self, self:GetPos() + self:OBBCenter() + self:GetForward()*50, range, 3, DMG_BURN, true, true, {UseCone=true, UseConeDegree=30}, function(ent) if !ent:IsOnFire() && (ent:IsPlayer() or ent:IsNPC()) then ent:Ignite(2) end end)
|
|
-- COSMETICS: Sound, particle and decal
|
|
self.Garg_FlameSd = VJ_CreateSound(self, "vj_hlr/hl1_npc/garg/gar_flamerun1.wav")
|
|
self:StopParticles()
|
|
if self.Garg_Type == 1 then -- Baby Garg
|
|
ParticleEffectAttach("vj_hlr_garg_flame_small", PATTACH_POINT_FOLLOW,self, 2)
|
|
ParticleEffectAttach("vj_hlr_garg_flame_small", PATTACH_POINT_FOLLOW,self, 3)
|
|
else
|
|
ParticleEffectAttach("vj_hlr_garg_flame", PATTACH_POINT_FOLLOW,self, 2)
|
|
ParticleEffectAttach("vj_hlr_garg_flame", PATTACH_POINT_FOLLOW,self, 3)
|
|
end
|
|
local startPos1 = self:GetAttachment(2).Pos
|
|
local startPos2 = self:GetAttachment(3).Pos
|
|
local tr1 = util.TraceLine({start = startPos1, endpos = startPos1 + self:GetForward()*range, filter = self})
|
|
local tr2 = util.TraceLine({start = startPos2, endpos = startPos2 + self:GetForward()*range, filter = self})
|
|
local hitPos1 = tr1.HitPos
|
|
local hitPos2 = tr2.HitPos
|
|
sound.EmitHint(SOUND_DANGER, (hitPos1 + startPos1) / 2, 300, 1, self) -- Pos: Midpoint of start and hit pos, same as Vector((hitPos1.x + startPos1.x ) / 2, (hitPos1.y + startPos1.y ) / 2, (hitPos1.z + startPos1.z ) / 2)
|
|
sound.EmitHint(SOUND_DANGER, (hitPos2 + startPos2) / 2, 300, 1, self)
|
|
util.Decal("VJ_HLR_Scorch", hitPos1 + tr1.HitNormal, hitPos1 - tr1.HitNormal)
|
|
util.Decal("VJ_HLR_Scorch", hitPos2 + tr2.HitNormal, hitPos2 - tr2.HitNormal)
|
|
-- Make it constantly delay the range attack timer by 1 second (Which will also successfully play the flame-end sound)
|
|
timer.Adjust("timer_range_start"..self:EntIndex(), 1, 0, function()
|
|
self:RangeAttackCode()
|
|
self:Garg_ResetFlame()
|
|
timer.Remove("timer_range_start"..self:EntIndex())
|
|
end)
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:MeleeAttackKnockbackVelocity(hitEnt)
|
|
return self:GetForward()*500 + self:GetUp()*(self.Garg_MeleeLargeKnockback and 300 or 10)
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:MultipleMeleeAttacks()
|
|
local r = math.random(1, 3)
|
|
if r == 1 then
|
|
self.AnimTbl_MeleeAttack = {"vjseq_smash"}
|
|
self.HasMeleeAttackKnockBack = false
|
|
self.Garg_MeleeLargeKnockback = false
|
|
elseif r == 2 then
|
|
self.AnimTbl_MeleeAttack = {"vjseq_attack"}
|
|
self.HasMeleeAttackKnockBack = true
|
|
self.Garg_MeleeLargeKnockback = false
|
|
elseif r == 3 then
|
|
self.AnimTbl_MeleeAttack = {"vjseq_kickcar"}
|
|
self.HasMeleeAttackKnockBack = true
|
|
self.Garg_MeleeLargeKnockback = true
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:Controller_IntMsg(ply, controlEnt)
|
|
if self.Garg_Type == 1 then return end
|
|
ply:ChatPrint("Right Mouse + CTRL: Preform Stomp attack")
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:MultipleRangeAttacks()
|
|
local range = (self.Garg_Type == 1 and 250) or 400
|
|
if self.VJ_IsBeingControlled then
|
|
-- If it's being controlled then if the player is crouching then use stomp attack
|
|
range = self.Garg_Type == 1 and 999999 or (self.VJ_TheController:KeyDown(IN_DUCK) and 1 or 999999)
|
|
end
|
|
if self.NearestPointToEnemyDistance <= range then -- Flame attack
|
|
self.Garg_AttackType = 0
|
|
self.Garg_AbleToFlame = true
|
|
self.RangeDistance = range
|
|
self.AnimTbl_RangeAttack = {ACT_RANGE_ATTACK1}
|
|
self.TimeUntilRangeAttackProjectileRelease = 0.1
|
|
self.DisableRangeAttackAnimation = true
|
|
self.DisableDefaultRangeAttackCode = true
|
|
self.SoundTbl_BeforeRangeAttack = {"vj_hlr/hl1_npc/garg/gar_flameon1.wav"}
|
|
self.SoundTbl_RangeAttack = {"vj_hlr/hl1_npc/garg/gar_flameoff1.wav"}
|
|
self.NextIdleStandTime = 0 -- Reset the idle animation
|
|
elseif self.Garg_NextStompAttackT < CurTime() && self.Garg_Type != 1 then -- Laser stomp attack
|
|
self.Garg_AttackType = 1
|
|
self.Garg_AbleToFlame = false
|
|
self.RangeDistance = 2000
|
|
self.AnimTbl_RangeAttack = {ACT_RANGE_ATTACK2}
|
|
self.TimeUntilRangeAttackProjectileRelease = false
|
|
self.DisableRangeAttackAnimation = false
|
|
self.DisableDefaultRangeAttackCode = false
|
|
self.SoundTbl_BeforeRangeAttack = {}
|
|
self.SoundTbl_RangeAttack = {"vj_hlr/hl1_npc/garg/gar_stomp1.wav"}
|
|
else
|
|
self.Garg_AttackType = -1
|
|
self.Garg_AbleToFlame = false
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomAttackCheck_RangeAttack()
|
|
if self.Garg_AttackType == -1 then return false end -- If it's -1 then don't range attack!
|
|
return true
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:RangeAttackCode_GetShootPos(projectile)
|
|
-- For stomp attack only!
|
|
return self:CalculateProjectile("Line", self:GetPos(), self:GetEnemy():GetPos() + self:GetEnemy():OBBCenter(), 200)
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomRangeAttackCode_AfterProjectileSpawn(projectile)
|
|
-- For stomp attack only!
|
|
self.Garg_NextStompAttackT = CurTime() + math.Rand(10,13) -- Set a delay for the next stomp attack
|
|
util.Decal("VJ_HLR_Gargantua_Stomp", self:GetPos() + self:GetRight()*-20 + self:GetForward()*50, self:GetPos() + self:GetRight()*-20 + self:GetForward()*50 + self:GetUp()*-100, self)
|
|
if IsValid(self:GetEnemy()) then
|
|
projectile.Track_Enemy = self:GetEnemy()
|
|
projectile:SetAngles(Angle(self:GetAngles().p, 0, 0))
|
|
timer.Simple(10,function() if IsValid(projectile) then projectile:Remove() end end)
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
local vec = Vector(0, 0, 0)
|
|
--
|
|
function ENT:CustomOnTakeDamage_BeforeImmuneChecks(dmginfo, hitgroup)
|
|
-- Make a metal ricochet effect
|
|
if dmginfo:GetDamagePosition() != vec then
|
|
local rico = EffectData()
|
|
rico:SetOrigin(dmginfo:GetDamagePosition())
|
|
rico:SetScale(5) -- Size
|
|
rico:SetMagnitude(math.random(1,2)) -- Effect type | 1 = Animated | 2 = Basic
|
|
util.Effect("VJ_HLR_Rico", rico)
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnTakeDamage_BeforeDamage(dmginfo, hitgroup)
|
|
if dmginfo:IsBulletDamage() == true then
|
|
if self.Garg_Type == 1 then -- Make babies take half damage for bullets
|
|
dmginfo:ScaleDamage(0.5)
|
|
elseif self.Garg_Type == 2 then -- Custom Gargantua
|
|
dmginfo:ScaleDamage(1)
|
|
else -- Make regular Gargantua take no bullet damage
|
|
dmginfo:ScaleDamage(0)
|
|
end
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnPriorToKilled(dmginfo, hitgroup)
|
|
-- Death sequence (With explosions)
|
|
for i = 0.3, 3.5, 0.5 do
|
|
timer.Simple(i, function()
|
|
if IsValid(self) then
|
|
local spr = ents.Create("env_sprite")
|
|
spr:SetKeyValue("model","vj_hl/sprites/zerogxplode.vmt")
|
|
spr:SetKeyValue("GlowProxySize","2.0")
|
|
spr:SetKeyValue("HDRColorScale","1.0")
|
|
spr:SetKeyValue("renderfx","14")
|
|
spr:SetKeyValue("rendermode","5")
|
|
spr:SetKeyValue("renderamt","255")
|
|
spr:SetKeyValue("disablereceiveshadows","0")
|
|
spr:SetKeyValue("mindxlevel","0")
|
|
spr:SetKeyValue("maxdxlevel","0")
|
|
spr:SetKeyValue("framerate","15.0")
|
|
spr:SetKeyValue("spawnflags","0")
|
|
spr:SetKeyValue("scale","6")
|
|
spr:SetPos(self:GetPos() + self:GetUp()*math.random(120,200))
|
|
spr:Spawn()
|
|
spr:Fire("Kill","",0.9)
|
|
|
|
util.BlastDamage(self,self,self:GetPos(),150,50)
|
|
util.ScreenShake(self:GetPos(),100,200,1,2500)
|
|
VJ_EmitSound(self, {"vj_hlr/hl1_weapon/explosion/explode3.wav","vj_hlr/hl1_weapon/explosion/explode4.wav","vj_hlr/hl1_weapon/explosion/explode5.wav"}, 90, 100)
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:SetUpGibesOnDeath(dmginfo, hitgroup)
|
|
timer.Simple(3.6,function()
|
|
if IsValid(self) then
|
|
if self.HasGibDeathParticles == true then
|
|
local effectBlood = EffectData()
|
|
effectBlood:SetOrigin(self:GetPos() + self:OBBCenter())
|
|
effectBlood:SetColor(VJ_Color2Byte(Color(255,221,35)))
|
|
effectBlood:SetScale(120)
|
|
util.Effect("VJ_Blood1",effectBlood)
|
|
|
|
local bloodspray = EffectData()
|
|
bloodspray:SetOrigin(self:GetPos() + self:OBBCenter())
|
|
bloodspray:SetScale(8)
|
|
bloodspray:SetFlags(3)
|
|
bloodspray:SetColor(1)
|
|
util.Effect("bloodspray",bloodspray)
|
|
util.Effect("bloodspray",bloodspray)
|
|
|
|
local spr = ents.Create("env_sprite")
|
|
spr:SetKeyValue("model","vj_hl/sprites/zerogxplode.vmt")
|
|
spr:SetKeyValue("GlowProxySize","2.0")
|
|
spr:SetKeyValue("HDRColorScale","1.0")
|
|
spr:SetKeyValue("renderfx","14")
|
|
spr:SetKeyValue("rendermode","5")
|
|
spr:SetKeyValue("renderamt","255")
|
|
spr:SetKeyValue("disablereceiveshadows","0")
|
|
spr:SetKeyValue("mindxlevel","0")
|
|
spr:SetKeyValue("maxdxlevel","0")
|
|
spr:SetKeyValue("framerate","15.0")
|
|
spr:SetKeyValue("spawnflags","0")
|
|
spr:SetKeyValue("scale","6")
|
|
spr:SetPos(self:GetPos() + self:GetUp()*150)
|
|
spr:Spawn()
|
|
spr:Fire("Kill","",0.9)
|
|
timer.Simple(0.9,function() if IsValid(spr) then spr:Remove() end end)
|
|
end
|
|
|
|
util.BlastDamage(self,self,self:GetPos(),150,80)
|
|
util.ScreenShake(self:GetPos(),100,200,1,2500)
|
|
|
|
VJ_EmitSound(self,{"vj_hlr/hl1_weapon/explosion/explode3.wav","vj_hlr/hl1_weapon/explosion/explode4.wav","vj_hlr/hl1_weapon/explosion/explode5.wav"}, 90, 100)
|
|
VJ_EmitSound(self, "vj_gib/default_gib_splat.wav", 90, 100)
|
|
|
|
util.Decal("VJ_HLR_Scorch", self:GetPos(), self:GetPos() + self:GetUp()*-100, self)
|
|
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib1.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,1,40))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib2.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(1,0,20))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib3.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,2,30))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib4.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(2,0,35))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib1.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,3,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib2.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(3,0,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib3.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,4,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib4.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(4,0,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib1.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,5,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib2.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(5,0,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib3.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,6,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib4.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(6,0,100))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib5.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,7,50))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib6.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(7,0,55))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib7.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,8,40))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib8.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(8,0,45))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib9.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(0,1,25))})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/agib10.mdl",{BloodType="Yellow",BloodDecal="VJ_HLR_Blood_Yellow",Pos=self:LocalToWorld(Vector(1,0,15))})
|
|
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p1.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,40)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p2.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,41)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p3.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,50)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p4.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,42)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p5.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,43)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p6.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,100)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p7.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,101)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p8.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,102)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p9.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,103)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p10.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,104)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
self:CreateGibEntity("obj_vj_gib","models/vj_hlr/gibs/metalgib_p11.mdl",{BloodDecal="",Pos=self:LocalToWorld(Vector(0,0,105)),CollideSound={"vj_hlr/fx/metal1.wav","vj_hlr/fx/metal2.wav","vj_hlr/fx/metal3.wav","vj_hlr/fx/metal4.wav","vj_hlr/fx/metal5.wav"}})
|
|
util.BlastDamage(self,self,self:GetPos(),150,20) -- To make the gibs FLY
|
|
end
|
|
end)
|
|
return true, {DeathAnim=true}-- Return to true if it gibbed!
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomGibOnDeathSounds(dmginfo, hitgroup)
|
|
return false
|
|
end
|
|
---------------------------------------------------------------------------------------------------------------------------------------------
|
|
function ENT:CustomOnRemove()
|
|
VJ_STOPSOUND(self.Garg_FlameSd)
|
|
end |