Files
wnsrc/lua/entities/npc_vj_hla_antlion/init.lua

798 lines
33 KiB
Lua
Raw Normal View History

2024-08-04 23:12:27 +03:00
--[[
| 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')
include('entities/dodgefunc.lua')
/*-----------------------------------------------
*** Copyright (c) 2012-2021 by Mayhem, 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/npc/creatures/antlion/antlion.mdl"}
ENT.StartHealth = 100
ENT.HullType = HULL_MEDIUM
ENT.MaxJumpLegalDistance = VJ_Set(1000,1000) -- The max distance the NPC can jump (Usually from one node to another) | ( UP, DOWN )
ENT.VJ_NPC_Class = {"CLASS_ANTLION"} -- NPCs with the same class with be allied to each other
ENT.Burrowing = false
ENT.BurrowDelay = 0
ENT.Drowning = false
ENT.Flipped = false
---------------------------------------------------------------------------------------------------------------------------------------------
-- ====== Blood-Related Variables ====== --
ENT.Bleeds = true
ENT.BloodColor = "Orange"
-- ====== Melee Attack ====== --
ENT.HasMeleeAttack = true
ENT.MeleeAttackDistance = 300
ENT.MeleeAttackAngleRadius = 20
ENT.MeleeAttackDamageType = DMG_SLASH
ENT.TimeUntilMeleeAttackDamage = false
ENT.NextAnyAttackTime_Melee = false
-- ====== Death Animations ====== --
ENT.HasDeathAnimation = true
ENT.AnimTbl_Death = {"ACT_ANTLION_WORKER_EXPLODE"}
ENT.DeathAnimationTime = 10
ENT.HasDeathRagdoll = false
ENT.SoundTbl_Events = {
------------------------------------------------------
-- Footsteps -----------------------------------------
------------------------------------------------------
["Foot_Rear"] = {
"npc/creatures/antlion/step/rear_01.mp3",
"npc/creatures/antlion/step/rear_02.mp3",
"npc/creatures/antlion/step/rear_03.mp3",
"npc/creatures/antlion/step/rear_04.mp3",
"npc/creatures/antlion/step/rear_05.mp3",
"npc/creatures/antlion/step/rear_06.mp3",
"npc/creatures/antlion/step/rear_07.mp3",
},
["Foot_Front"] = {
"npc/creatures/antlion/step/front_01.mp3",
"npc/creatures/antlion/step/front_02.mp3",
"npc/creatures/antlion/step/front_03.mp3",
"npc/creatures/antlion/step/front_04.mp3",
"npc/creatures/antlion/step/front_05.mp3",
"npc/creatures/antlion/step/front_06.mp3",
"npc/creatures/antlion/step/front_07.mp3",
},
["Stomp"] = {
"npc/creatures/antlion/step/stomp_01.mp3",
"npc/creatures/antlion/step/stomp_02.mp3",
"npc/creatures/antlion/step/stomp_03",
},
------------------------------------------------------
-- Foley ---------------------------------------------
------------------------------------------------------
["MeleeWhoosh"] = {
"npc/creatures/antlion/foley/attack_whoosh_01.mp3",
"npc/creatures/antlion/foley/attack_whoosh_02.mp3",
"npc/creatures/antlion/foley/attack_whoosh_03.mp3",
"npc/creatures/antlion/foley/attack_whoosh_04.mp3",
},
["Body_Hard"] = {
"npc/creatures/antlion/foley/body_impact_hard_01.mp3",
"npc/creatures/antlion/foley/body_impact_hard_02.mp3",
"npc/creatures/antlion/foley/body_impact_hard_03.mp3",
},
["Body_Soft"] = {
"npc/creatures/antlion/foley/body_impact_soft_01.mp3",
"npc/creatures/antlion/foley/body_impact_soft_02.mp3",
"npc/creatures/antlion/foley/body_impact_soft_03.mp3",
},
["Body_VerySoft"] = {
"npc/creatures/antlion/foley/body_impact_very_soft_01.mp3",
"npc/creatures/antlion/foley/body_impact_very_soft_02.mp3",
"npc/creatures/antlion/foley/body_impact_very_soft_03.mp3",
},
["Body_Slide"] = {
"npc/creatures/antlion/foley/body_slide_01.mp3",
"npc/creatures/antlion/foley/body_slide_02.mp3",
"npc/creatures/antlion/foley/body_slide_03.mp3",
"npc/creatures/antlion/foley/body_slide_04.mp3",
},
["Body_Slide_Short"] = {
"npc/creatures/antlion/foley/body_slide_short_01.mp3",
"npc/creatures/antlion/foley/body_slide_short_02.mp3",
"npc/creatures/antlion/foley/body_slide_short_03.mp3",
"npc/creatures/antlion/foley/body_slide_short_04.mp3",
"npc/creatures/antlion/foley/body_slide_short_05.mp3",
"npc/creatures/antlion/foley/body_slide_short_06.mp3",
"npc/creatures/antlion/foley/body_slide_short_07.mp3",
},
--[[["Walk"] = {
"npc/creatures/antlion/foley/walk_01.mp3",
"npc/creatures/antlion/foley/walk_02.mp3",
"npc/creatures/antlion/foley/walk_03.mp3",
"npc/creatures/antlion/foley/walk_04.mp3",
"npc/creatures/antlion/foley/walk_05.mp3",
"npc/creatures/antlion/foley/walk_06.mp3",
"npc/creatures/antlion/foley/walk_07.mp3",
"npc/creatures/antlion/foley/walk_08.mp3",
"npc/creatures/antlion/foley/walk_09.mp3",
"npc/creatures/antlion/foley/walk_010.mp3",
},]]--
["Wings_Buzz"] = {
"npc/creatures/antlion/wings/buzz_01.mp3",
"npc/creatures/antlion/wings/buzz_02.mp3",
"npc/creatures/antlion/wings/buzz_03.mp3",
"npc/creatures/antlion/wings/buzz_04.mp3",
"npc/creatures/antlion/wings/buzz_05.mp3",
"npc/creatures/antlion/wings/buzz_06.mp3",
"npc/creatures/antlion/wings/buzz_07.mp3",
"npc/creatures/antlion/wings/buzz_08.mp3",
},
["Wings_Buzz_Quiet"] = {
"npc/creatures/antlion/wings/buzz_soft_01.mp3",
"npc/creatures/antlion/wings/buzz_soft_02.mp3",
"npc/creatures/antlion/wings/buzz_soft_03.mp3",
"npc/creatures/antlion/wings/buzz_soft_04.mp3",
"npc/creatures/antlion/wings/buzz_soft_05.mp3",
"npc/creatures/antlion/wings/buzz_soft_06.mp3",
"npc/creatures/antlion/wings/buzz_soft_07.mp3",
"npc/creatures/antlion/wings/buzz_soft_08.mp3",
},
["Wings_Fly_End"] = {
"npc/creatures/antlion/wings/fly_end_01.mp3",
"npc/creatures/antlion/wings/fly_end_02.mp3",
"npc/creatures/antlion/wings/fly_end_03.mp3",
},
["Wings_Fly_Start"] = {
"npc/creatures/antlion/wings/jump_01.mp3",
"npc/creatures/antlion/wings/jump_02.mp3",
"npc/creatures/antlion/wings/jump_03.mp3",
},
["Wings_Single"] = {
"npc/creatures/antlion/wings/single_01.mp3",
"npc/creatures/antlion/wings/single_02.mp3",
"npc/creatures/antlion/wings/single_03.mp3",
"npc/creatures/antlion/wings/single_04.mp3",
"npc/creatures/antlion/wings/single_05.mp3",
},
------------------------------------------------------
-- Vocal/Vox -----------------------------------------
------------------------------------------------------
["Vox_Attack"] = {
"npc/creatures/antlion/vox/attack_01.mp3",
"npc/creatures/antlion/vox/attack_02.mp3",
"npc/creatures/antlion/vox/attack_03.mp3",
"npc/creatures/antlion/vox/attack_04.mp3",
"npc/creatures/antlion/vox/attack_05.mp3",
"npc/creatures/antlion/vox/attack_06.mp3",
"npc/creatures/antlion/vox/attack_07.mp3",
},
["Vox_Attack_Tell"] = {
"npc/creatures/antlion/vox/attack_tell_01.mp3",
"npc/creatures/antlion/vox/attack_tell_02.mp3",
},
["Vox_Pain"] = {
"npc/creatures/antlion/vox/pain_01.mp3",
"npc/creatures/antlion/vox/pain_02.mp3",
"npc/creatures/antlion/vox/pain_03.mp3",
"npc/creatures/antlion/vox/pain_04.mp3",
"npc/creatures/antlion/vox/pain_05.mp3",
"npc/creatures/antlion/vox/pain_06.mp3",
"npc/creatures/antlion/vox/pain_07.mp3",
"npc/creatures/antlion/vox/pain_08.mp3",
},
["Vox_Grunt_Hard"] = {
"npc/creatures/antlion/vox/grunt_01.mp3",
"npc/creatures/antlion/vox/grunt_02.mp3",
"npc/creatures/antlion/vox/grunt_03.mp3",
"npc/creatures/antlion/vox/grunt_04.mp3",
"npc/creatures/antlion/vox/grunt_05.mp3",
"npc/creatures/antlion/vox/grunt_06.mp3",
},
["Vox_Grunt_Soft"] = {
"npc/creatures/antlion/vox/grunt_soft_01.mp3",
"npc/creatures/antlion/vox/grunt_soft_02.mp3",
"npc/creatures/antlion/vox/grunt_soft_03.mp3",
"npc/creatures/antlion/vox/grunt_soft_04.mp3",
"npc/creatures/antlion/vox/grunt_soft_05.mp3",
"npc/creatures/antlion/vox/grunt_soft_06.mp3",
"npc/creatures/antlion/vox/grunt_soft_07.mp3",
"npc/creatures/antlion/vox/grunt_soft_08.mp3",
"npc/creatures/antlion/vox/grunt_soft_09.mp3",
},
["Vox_Grunt_Soft_Quiet"] = {
"npc/creatures/antlion/vox/grunt_soft_01.mp3",
"npc/creatures/antlion/vox/grunt_soft_02.mp3",
"npc/creatures/antlion/vox/grunt_soft_03.mp3",
"npc/creatures/antlion/vox/grunt_soft_04.mp3",
"npc/creatures/antlion/vox/grunt_soft_05.mp3",
"npc/creatures/antlion/vox/grunt_soft_06.mp3",
"npc/creatures/antlion/vox/grunt_soft_07.mp3",
"npc/creatures/antlion/vox/grunt_soft_08.mp3",
"npc/creatures/antlion/vox/grunt_soft_09.mp3",
},
["Vox_Spawn"] = {
"npc/creatures/antlion/vox/spawn_01.mp3",
"npc/creatures/antlion/vox/spawn_02.mp3",
"npc/creatures/antlion/vox/spawn_03.mp3",
},
["Vox_Warning"] = {
"npc/creatures/antlion/vox/warning_01.mp3",
"npc/creatures/antlion/vox/warning_02.mp3",
"npc/creatures/antlion/vox/warning_03.mp3",
"npc/creatures/antlion/vox/warning_04.mp3",
"npc/creatures/antlion/vox/warning_05.mp3",
"npc/creatures/antlion/vox/warning_06.mp3",
},
["Vox_Click"] = {
"npc/creatures/antlion/clicks/click_01.mp3",
"npc/creatures/antlion/clicks/click_02.mp3",
"npc/creatures/antlion/clicks/click_03.mp3",
"npc/creatures/antlion/clicks/click_04.mp3",
"npc/creatures/antlion/clicks/click_05.mp3",
"npc/creatures/antlion/clicks/click_06.mp3",
"npc/creatures/antlion/clicks/click_07.mp3",
"npc/creatures/antlion/clicks/click_08.mp3",
"npc/creatures/antlion/clicks/click_09.mp3",
"npc/creatures/antlion/clicks/click_010.mp3",
},
["Death"] = {
"npc/creatures/antlion/vox/death_01.mp3",
"npc/creatures/antlion/vox/death_02.mp3",
"npc/creatures/antlion/vox/death_03.mp3",
"npc/creatures/antlion/vox/death_04.mp3",
},
}
ENT.SoundTbl_Impact = {"player/damage/claw_01.mp3", "player/damage/claw_02.mp3", "player/damage/claw_03.mp3"}
ENT.SoundTbl_DamageByPlayer = {"npc/damage/bullet_damage_npc_01.mp3", "npc/damage/bullet_damage_npc_02.mp3", "npc/damage/bullet_damage_npc_03.mp3", "npc/damage/bullet_damage_npc_04.mp3", "npc/damage/bullet_damage_npc_04.mp3", "npc/damage/bullet_damage_npc_06.mp3", "npc/damage/bullet_damage_npc_07.mp3"}
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:IsDirt(pos)
local tr = util.TraceLine({
start = pos,
endpos = pos -Vector(0,0,40),
filter = self,
mask = MASK_NPCWORLDSTATIC
})
local mat = tr.MatType
return tr.HitWorld && (mat == MAT_SAND || mat == MAT_DIRT || mat == MAT_FOLIAGE || mat == MAT_SLOSH || mat == 85)
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:Dig(forceRemove)
if self:IsDirt(self:GetPos()) then
ParticleEffectAttach("AntlionFX_UndGroundMov",PATTACH_POINT_FOLLOW,self,0)
self.CanInvestigate = false
self:SetNoDraw(true)
self:DrawShadow(false)
self.IsDigging = true
self:DoChangeMovementType(VJ_MOVETYPE_STATIONARY)
timer.Simple(0.02,function()
if IsValid(self) then
VJ_CreateSound(self,"npc/creatures/antlion/dig/rumble_0"..math.random(1,2)..".mp3",80,100)
local act = VJ_PICK({"UnBurrow01", "UnBurrow02", "UnBurrow03", "UnBurrow04"})
self:VJ_ACT_PLAYACTIVITY(act,true,VJ_GetSequenceDuration(self,act),true)
self.HasMeleeAttack = false
timer.Simple(0.15,function() if IsValid(self) then self:SetNoDraw(false) end end)
timer.Simple(VJ_GetSequenceDuration(self,act),function() if IsValid(self) then self.CanInvestigate = true self.HasMeleeAttack = true self.IsDigging = false self:DoChangeMovementType(VJ_MOVETYPE_GROUND) end end)
end
end)
else
if forceRemove then self:Remove() end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
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 = "Antlion.NewHead_Bone", -- 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
}
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnInitialize()
self:SetCollisionBounds(Vector(20, 20, 64), Vector(-20, -20, 0))
self:SetCondition(51)
WingSFX = CreateSound(self, "npc/creatures/antlion/wings/loop_0"..math.random(1,2)..".wav")
WingSFX:SetSoundLevel(70)
self.LeftFlinchType = {"Flinch_Front_Left_01", "Flinch_Front_Left_02", "Flinch_Front_Left_03"}
self.RightFlinchType = {"Flinch_Front_Right_01", "Flinch_Front_Right_02", "Flinch_Front_Right_03"}
self.FrontLeftLeg_LimbHealth = (self.StartHealth*0.1)
self.FrontRightLeg_LimbHealth = (self.StartHealth*0.1)
self.BackLeftLeg_LimbHealth = (self.StartHealth*0.05)
self.BackRightLeg_LimbHealth = (self.StartHealth*0.05)
-- Dig Variables --
self.IsDigging = false
self:Dig()
-- Attack Var --
self.NextFlyAttackT = math.random(4,8)
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnRemove()
WingSFX:Stop()
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnInitialKilled(dmginfo, hitgroup)
WingSFX:Stop()
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:MultipleMeleeAttacks()
local FrontLeftLeg = self:GetBodygroup(2)
local FrontRightLeg = self:GetBodygroup(3)
local BackLeftLeg = self:GetBodygroup(4)
local BackRightLeg = self:GetBodygroup(5)
if FrontRightLeg != 1 && FrontLeftLeg != 1 then
self.MeleeAttackDistance = 75
self.AnimTbl_MeleeAttack = {"attack1", "attack2", "attack3", "attack4", "attack5", "attack6", "attack7", "attack8", "attack9", "Evade_back", "evade_left", "evade_right", "pounce", "pounce2"}
self.MeleeAttackDamageDistance = 80
self.MeleeAttackDamage = 13
elseif FrontRightLeg != 1 && FrontLeftLeg == 1 then
self.MeleeAttackDistance = 75
self.AnimTbl_MeleeAttack = {"attack1", "attack1_fl", "attack5", "attack8", "Evade_back", "evade_left", "evade_right", "pounce", "pounce2", "pounce_fl"}
self.MeleeAttackDamageDistance = 80
self.MeleeAttackDamage = 13
elseif FrontRightLeg == 1 && FrontLeftLeg != 1 then
self.MeleeAttackDistance = 75
self.AnimTbl_MeleeAttack = {"attack1_fr", "attack3", "attack4", "attack9", "Evade_back", "evade_left", "evade_right", "pounce", "pounce2", "pounce_fr"}
self.MeleeAttackDamageDistance = 80
self.MeleeAttackDamage = 13
elseif FrontRightLeg == 1 && FrontLeftLeg == 1 then
self.MeleeAttackDistance = 75
self.AnimTbl_MeleeAttack = {"Evade_back", "evade_left", "evade_right", "pounce", "pounce2", "pounce", "pounce2", "pounce", "pounce2", "attack1_FR_FL", "attack1_FR_FL_02", "attack1_FR_FL_03"}
self.MeleeAttackDamageDistance = 80
self.MeleeAttackDamage = 13
end
if CurTime() > self.NextFlyAttackT then
if ((FrontRightLeg != 1 && FrontLeftLeg != 1) or (FrontRightLeg != 1 && FrontLeftLeg == 1) or (FrontRightLeg == 1 && FrontLeftLeg != 1)) then
self.MeleeAttackDistance = 300
self.MeleeAttackDamageDistance = 65
self.MeleeAttackDamage = 17
self.AnimTbl_MeleeAttack = {"Flyattack01All", "Flyattack02All", "Flyattack03All", "Flyattack04All", "Flyattack05All"}
self.NextFlyAttackT = CurTime() +VJ_GetSequenceDuration(self,self.CurrentAttackAnimation)+math.random(3,6)
elseif FrontRightLeg == 1 && FrontLeftLeg == 1 then
self.MeleeAttackDistance = 300
self.MeleeAttackDamageDistance = 65
self.MeleeAttackDamage = 17
self.AnimTbl_MeleeAttack = {"Flyattack01All", "Flyattack02All", "Flyattack05All"}
self.NextFlyAttackT = CurTime() +VJ_GetSequenceDuration(self,self.CurrentAttackAnimation)+math.random(3,6)
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnTakeDamage_BeforeDamage(dmginfo,hitgroup)
if !self.IsDigging && dmginfo:IsDamageType(8388608) then
if self.Flipped == false then
self.Flipped = true
self:VJ_ACT_PLAYACTIVITY("ZapFlip",true,false,true)
timer.Simple(VJ_GetSequenceDuration(self,"ZapFlip"),function() if IsValid(self) then self.Flipped = false end end)
end
self:SetGroundEntity(NULL)
self:SetVelocity(dmginfo:GetDamageForce() *150 +(Vector(0,0,150)+(dmginfo:GetDamagePosition()-dmginfo:GetAttacker():GetPos())))
end
local FrontLeftLeg = self:GetBodygroup(2)
local FrontRightLeg = self:GetBodygroup(3)
local BackLeftLeg = self:GetBodygroup(4)
local BackRightLeg = self:GetBodygroup(5)
if hitgroup == 11 then dmginfo:SetDamage(0) end
if hitgroup == 6 then
if dmginfo:GetDamage() <= self.FrontLeftLeg_LimbHealth && self.FrontLeftLeg_LimbHealth > 0 && FrontLeftLeg != 1 then
self.FrontLeftLeg_LimbHealth = (self.FrontLeftLeg_LimbHealth-dmginfo:GetDamage())
else
if FrontLeftLeg != 1 then
self:SetBodygroup(2, 1)
self:EmitSound("npc/damage/antlion_leg_dismember_0"..math.random(1,5)..".mp3", 80, 100, 1)
ParticleEffect("spit_impact_orange",self:GetAttachment(6).Pos,Angle( 0, 0, 0 ),nil)
self:VJ_ACT_PLAYACTIVITY(self.LeftFlinchType,true,false,true)
if FrontRightLeg != 1 && BackLeftLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_1}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_1}
self:SetHitboxSet(1)
elseif FrontRightLeg == 1 && BackLeftLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(4)
elseif FrontRightLeg != 1 && BackLeftLeg == 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FL_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_2}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_2}
self:SetHitboxSet(2)
elseif FrontRightLeg != 1 && BackLeftLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(14)
elseif FrontRightLeg == 1 && BackLeftLeg != 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(13)
elseif FrontRightLeg == 1 && BackLeftLeg == 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(12)
elseif FrontRightLeg == 1 && BackLeftLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(11)
end
end
end
elseif hitgroup == 7 then
if dmginfo:GetDamage() <= self.FrontRightLeg_LimbHealth && self.FrontRightLeg_LimbHealth > 0 && FrontRightLeg != 1 then
self.FrontRightLeg_LimbHealth = (self.FrontRightLeg_LimbHealth-dmginfo:GetDamage())
else
if FrontRightLeg != 1 then
self:SetBodygroup(3, 1)
self:EmitSound("npc/damage/antlion_leg_dismember_0"..math.random(1,5)..".mp3", 80, 100, 1)
ParticleEffect("spit_impact_orange",self:GetAttachment(7).Pos,Angle( 0, 0, 0 ),nil)
self:VJ_ACT_PLAYACTIVITY(self.RightFlinchType,true,false,true)
if FrontLeftLeg != 1 && BackLeftLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_3}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_3}
self:SetHitboxSet(3)
elseif FrontLeftLeg == 1 && BackLeftLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(4)
elseif FrontLeftLeg != 1 && BackLeftLeg != 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_RR"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_5}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_5}
self:SetHitboxSet(5)
elseif FrontLeftLeg != 1 && BackLeftLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(15)
elseif FrontLeftLeg == 1 && BackLeftLeg != 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(13)
elseif FrontLeftLeg == 1 && BackLeftLeg == 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(12)
elseif FrontLeftLeg == 1 && BackLeftLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(11)
end
end
end
elseif hitgroup == 12 then
if dmginfo:GetDamage() <= self.BackLeftLeg_LimbHealth && self.BackLeftLeg_LimbHealth > 0 && BackLeftLeg != 1 then
self.BackLeftLeg_LimbHealth = (self.BackLeftLeg_LimbHealth-dmginfo:GetDamage())
else
if BackLeftLeg != 1 then
self:SetBodygroup(4, 1)
if FrontLeftLeg != 1 && FrontRightLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_6}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_6}
self:SetHitboxSet(6)
elseif FrontLeftLeg != 1 && FrontRightLeg != 1 && BackRightLeg == 1 then
self:VJ_ACT_PLAYACTIVITY("Flinch_Rear_Legs",true,false,true)
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(8)
elseif FrontLeftLeg == 1 && FrontRightLeg != 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FL_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_2}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_2}
self:SetHitboxSet(2)
elseif FrontLeftLeg != 1 && FrontRightLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(15)
elseif FrontLeftLeg == 1 && FrontRightLeg != 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(14)
elseif FrontLeftLeg == 1 && FrontRightLeg == 1 && BackRightLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(12)
elseif FrontLeftLeg == 1 && FrontRightLeg == 1 && BackRightLeg == 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(11)
end
end
end
elseif hitgroup == 13 then
if dmginfo:GetDamage() <= self.BackRightLeg_LimbHealth && self.BackRightLeg_LimbHealth > 0 && BackRightLeg != 1 then
self.BackRightLeg_LimbHealth = (self.BackRightLeg_LimbHealth-dmginfo:GetDamage())
else
if BackRightLeg != 1 then
self:SetBodygroup(5, 1)
if FrontLeftLeg != 1 && FrontRightLeg != 1 && BackLeftLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_RR"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_7}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_7}
self:SetHitboxSet(7)
elseif FrontLeftLeg != 1 && FrontRightLeg != 1 && BackLeftLeg == 1 then
self:VJ_ACT_PLAYACTIVITY("Flinch_Rear_Legs",true,false,true)
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(8)
elseif FrontLeftLeg != 1 && FrontRightLeg == 1 && BackLeftLeg != 1 then
self.AnimTbl_IdleStand = {"Idle_01_FR_RR"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_5}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_5}
self:SetHitboxSet(5)
elseif FrontLeftLeg == 1 && BackLeftLeg == 1 && FrontRightLeg != 1 then -- Front leg
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(14)
elseif FrontRightLeg == 1 && BackLeftLeg == 1 && FrontLeftLeg != 1 then -- Front Leg
self.AnimTbl_IdleStand = {"Idle_01_RR_RL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_8}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_8}
self:SetHitboxSet(15)
elseif FrontLeftLeg == 1 && FrontRightLeg == 1 && BackLeftLeg != 1 then -- Back Leg
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(13)
elseif FrontLeftLeg == 1 && FrontRightLeg == 1 && BackLeftLeg == 1 then -- Back Leg
self.AnimTbl_IdleStand = {"Idle_01_FR_FL"}
self.AnimTbl_Walk = {ACT_VM_UNDEPLOY_4}
self.AnimTbl_Run = {ACT_VM_UNDEPLOY_4}
self:SetHitboxSet(11)
end
end
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnAcceptInput(event,activator,caller,data)
--//Wings\\--
if event == "OpenWings" then
self:SetBodygroup(1, 1)
WingSFX:Stop()
WingSFX = CreateSound(self, "npc/creatures/antlion/wings/loop_0"..math.random(1,2)..".wav")
WingSFX:SetSoundLevel(70)
WingSFX:Play()
elseif event == "CloseWings" then
self:SetBodygroup(1, 0)
WingSFX:Stop()
end
--// Burrow/Emerge \\--
if event == "BurrowOut" then
self:StopParticles()
VJ_CreateSound(self,"npc/creatures/antlion/dig/erupt_0"..math.random(1,5)..".mp3",80,100)
ParticleEffectAttach("AntlionFX_UnBurrow",PATTACH_POINT_FOLLOW,self,0)
util.ScreenShake(self:GetPos(), 16, 100, 0.5, 256)
self:DrawShadow(true)
elseif event == "BurrowIn" then
ParticleEffectAttach("AntlionFX_UndGroundMov",PATTACH_POINT_FOLLOW,self,0)
VJ_CreateSound(self,"npc/creatures/antlion/dig/dig_down_0"..math.random(1,5)..".mp3",80,100)
ParticleEffectAttach("AntlionFX_Burrow",PATTACH_POINT_FOLLOW,self,0)
util.ScreenShake(self:GetPos(), 16, 100, 0.5, 256)
self:DrawShadow(false)
end
-- Turning Speed/Movement Adjustments --
if string.StartWith(event, "TurnSpeed_") then
local nb = tonumber(string.sub(event, 11))
self:SetMaxYawSpeed(nb)
end
--//Melee Code\\--
if event == "Hit" then
self:MeleeAttackCode()
end
--//VFX\\--
if event == "Explode" then
self:StopParticles()
util.ScreenShake(self:GetPos(),12,100,0.6,300)
self:EmitSound("npc/damage/antlion_body_burst_0"..math.random(1,3)..".mp3", 80, 100, 1)
self:EmitSound("npc/damage/break_npc_0"..math.random(1,3)..".mp3", 80, 100, 1)
ParticleEffect("spit_impact_orange",self:GetAttachment(5).Pos,Angle( 0, 0, 0 ),nil)
ParticleEffect("splat_nophys_orange",self:GetAttachment(5).Pos,Angle( 0, 0, 0 ),nil)
SafeRemoveEntityDelayed(self, 0)
end
local event = string.Explode(" ",event)
local eventType = event[1]
local eventPara1 = event[2]
local eventPara2 = event[3]
local eventPara3 = event[4] -- You can make as many of these as you want, the number is based on how many separate words are in the event
if eventType == "melee" then
self.MeleeAttackDamageType = eventPara1
self.MeleeAttackDamage = eventPara2
self.MeleeAttackDamageDistance = eventPara3
self:MeleeAttackCode()
end
if eventType == "snd" then
VJ_CreateSound(self,self.SoundTbl_Events[eventPara1],eventPara2,eventPara3)
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CustomOnThink()
if !self.Drowning && !self.Flipped && self:IsDirt(self:GetPos()) && self:IsOnGround() && !self.Dead && !self.IsDigging && self:GetEnemy() != nil && !self.VJ_IsBeingControlled && !self.Burrowing && !self.Flinching && !self.RangeAttacking && !self.MeleeAttacking then
if math.random(1,20) == 1 && CurTime() > self.BurrowDelay then
self:Burrow()
end
end
if self:WaterLevel() >= 2 then
if self.Drowning == false then
self:SetVelocity(Vector(0,0,0))
self.Drowning = true
self:VJ_ACT_PLAYACTIVITY("Drown",true,5,true)
timer.Simple(5,function() if IsValid(self) then self:TakeDamage(self:Health(), self, self) end end)
self.HasDeathAnimation = false
self.HasDeathRagdoll = true
end
end
if !self.Drowning && !self.Flipped && self:IsDirt(self:GetPos()) && self:IsOnGround() && !self.Dead && !self.IsDigging && self.VJ_IsBeingControlled && !self.Burrowing && !self.Flinching && !self.RangeAttacking && !self.MeleeAttacking then
if self.VJ_TheController:KeyDown(IN_DUCK) then
self:Burrow()
end
end
if !self.Drowning && !self.Flipped && self:IsOnGround() && !self.Dead && !self.IsDigging && self:GetEnemy() != nil && !self.Burrowing && !self.Flinching && !self.RangeAttacking && !self.MeleeAttacking then
self:DoDodge(300, 5, "evade_Left", "evade_Right", "Evade_Back")
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:GetFitAtPos(pos)
local stepHeight = self.loco and self.loco:GetStepHeight() or self.GetStepSize and self:GetStepSize() or 24
local stepPos = pos + Vector(0,0,stepHeight)
local tr = util.TraceEntity({
start = stepPos,
endpos = stepPos,
filter = self,
mask = MASK_NPCSOLID
}, self)
return not tr.Hit and stepPos
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:FindViablePos(curPos, fallback)
curPos = curPos or self:GetPos()
local nearestMesh = navmesh.GetNearestNavArea(curPos, false, 1024, false, true)
local nearest = IsValid(nearestMesh) and nearestMesh:GetClosestPointOnArea(curPos)
local nearestPos = nearest and self:GetFitAtPos(nearest)
if nearestPos then -- Check if we can fit at the closest position
return nearestPos
else -- Check the center pos
local center = IsValid(nearestMesh) and nearestMesh:GetCenter()
local centerPos = center and self:GetFitAtPos(center)
if centerPos then -- use the center position instead if we can
return centerPos
else
local nearestMeshes = navmesh.Find(center or curPos, 1024, 64, 64)
for k, v in pairs(nearestMeshes) do
if nearestMeshes ~= nearestMesh then
local otherNearest = v:GetClosestPointOnArea(curPos)
local otherNearestPos = self:GetFitAtPos(otherNearest)
if otherNearestPos then
return otherNearestPos
else
local otherCenter = v:GetCenter()
local otherCenterPos = self:GetFitAtPos(otherCenter)
if otherCenterPos then
return otherCenter
end
end
end
end
end
end
return fallback
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:Burrow()
local basePos = self:GetEnemy():GetPos() -- position we start looking from
local dist = math.random(128,256) -- min and max distance outward
local ang = Angle(0,math.random(0,360),0) -- find a random angle
local pos = basePos + ang:Forward() * dist --- its all coming together
local viable = self:FindViablePos(pos)
if viable && self:IsDirt(viable) && self.Burrowing == false then
self:VJ_ACT_PLAYACTIVITY("BurrowIn",true,VJ_GetSequenceDuration(self,"BurrowIn"),true)
self.HasMeleeAttack = false
self.Burrowing = true
self:DrawShadow(false)
self.GodMode = true
timer.Simple(VJ_GetSequenceDuration(self,"BurrowIn"),function() if IsValid(self) then
if IsValid(self) && !self.Dead then
self:StopParticles()
self.GodMode = false
VJ_CreateSound(self,"npc/creatures/antlion/dig/rumble_0"..math.random(1,2)..".mp3",70,100)
local act = VJ_PICK({"UnBurrow01", "UnBurrow02", "UnBurrow03", "UnBurrow04"})
self:SetNoDraw(true)
self:VJ_ACT_PLAYACTIVITY(act,true,VJ_GetSequenceDuration(self,act),true)
self:SetPos(viable)
self:DrawShadow(true)
timer.Simple(0.15,function()
if IsValid(self) then
self:SetNoDraw(false)
end
end)
timer.Simple(VJ_GetSequenceDuration(self,act),function() if IsValid(self) then self.HasMeleeAttack = true self.Burrowing = false end end)
end
end
end)
self.BurrowDelay = CurTime()+math.random(15,20)
end
end
/*-----------------------------------------------
*** Copyright (c) 2012-2021 by Mayhem, 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.
-----------------------------------------------*/