127 lines
3.3 KiB
Lua
127 lines
3.3 KiB
Lua
|
AddCSLuaFile()
|
||
|
|
||
|
SWEP.Base = "weapon_zs_headcrab"
|
||
|
|
||
|
SWEP.PrintName = "Bloodsucker Headcrab"
|
||
|
|
||
|
SWEP.PounceDamage = 6
|
||
|
|
||
|
SWEP.NoHitRecovery = 0.6
|
||
|
SWEP.HitRecovery = 0.75
|
||
|
|
||
|
function SWEP:Initialize()
|
||
|
self:HideViewAndWorldModel()
|
||
|
end
|
||
|
|
||
|
if SERVER then SWEP.NextHeal = 0 end
|
||
|
function SWEP:Think()
|
||
|
local curtime = CurTime()
|
||
|
local owner = self:GetOwner()
|
||
|
|
||
|
if self:GetBurrowTime() > 0 and curtime >= self:GetBurrowTime() then
|
||
|
if not self:CanBurrow() then
|
||
|
self:SetBurrowTime(-(curtime + self.BurrowTime))
|
||
|
else
|
||
|
owner:DrawShadow(false)
|
||
|
if SERVER and curtime >= self.NextHeal then
|
||
|
self.NextHeal = curtime + 0.333
|
||
|
|
||
|
if owner:GetVelocity():LengthSqr() > 8 then
|
||
|
local effectdata = EffectData()
|
||
|
effectdata:SetOrigin(owner:GetPos() % 2)
|
||
|
util.Effect("headcrab_dust", effectdata, true, true)
|
||
|
end
|
||
|
|
||
|
if owner:Health() < owner:GetMaxHealth() then
|
||
|
owner:SetHealth(owner:Health() + 1)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
elseif self:GetBurrowTime() < 0 and curtime >= -self:GetBurrowTime() then
|
||
|
self:SetBurrowTime(0)
|
||
|
elseif self:GetPouncing() then
|
||
|
if owner:IsOnGround() or 1 < owner:WaterLevel() then
|
||
|
self:SetPouncing(false)
|
||
|
self:SetNextPrimaryFire(curtime + self.NoHitRecovery)
|
||
|
else
|
||
|
--owner:LagCompensation(true)
|
||
|
|
||
|
local shootpos = owner:GetShootPos()
|
||
|
local trace = owner:CompensatedMeleeTrace(8, 12, shootpos, owner:GetForward())
|
||
|
local ent = trace.Entity
|
||
|
|
||
|
if trace.Hit then
|
||
|
self:SetPouncing(false)
|
||
|
self:SetNextPrimaryFire(curtime + self.HitRecovery)
|
||
|
end
|
||
|
|
||
|
if ent:IsValid() then
|
||
|
self:SetPouncing(false)
|
||
|
|
||
|
local damage = self.PounceDamage
|
||
|
|
||
|
local phys = ent:GetPhysicsObject()
|
||
|
if ent:IsPlayer() then
|
||
|
ent:MeleeViewPunch(damage)
|
||
|
if SERVER then
|
||
|
local nearest = ent:NearestPoint(shootpos)
|
||
|
util.Blood(nearest, math.Rand(damage * 0.5, damage * 0.75), (nearest - shootpos):GetNormalized(), math.Rand(damage * 5, damage * 10), true)
|
||
|
end
|
||
|
|
||
|
owner:AirBrake()
|
||
|
elseif phys:IsValid() and phys:IsMoveable() then
|
||
|
phys:ApplyForceOffset(damage * 600 * owner:EyeAngles():Forward(), (ent:NearestPoint(shootpos) + ent:GetPos() * 2) / 3)
|
||
|
ent:SetPhysicsAttacker(owner)
|
||
|
end
|
||
|
|
||
|
ent:TakeSpecialDamage(damage, self.PounceDamageType, owner, self, trace.HitPos)
|
||
|
if ent:IsPlayer() then
|
||
|
if SERVER then
|
||
|
self:EmitBiteSound()
|
||
|
ent:AddLegDamage(7.2)
|
||
|
end
|
||
|
|
||
|
if owner:Health() < owner:GetMaxHealth() then
|
||
|
owner:SetHealth(math.min(owner:Health() + self.PounceDamage, owner:GetMaxHealth()))
|
||
|
end
|
||
|
|
||
|
ent:GiveStatus("sickness", 5)
|
||
|
elseif SERVER then
|
||
|
self:EmitBiteObjectSound()
|
||
|
end
|
||
|
|
||
|
owner:ViewPunch(Angle(math.Rand(-20, 20), math.Rand(-20, 20), math.Rand(-20, 20)))
|
||
|
elseif trace.HitWorld then
|
||
|
if SERVER then
|
||
|
self:EmitHitSound()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--owner:LagCompensation(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:NextThink(curtime)
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function SWEP:EmitBiteSound()
|
||
|
self:GetOwner():EmitSound("NPC_FastHeadcrab.Bite")
|
||
|
self:GetOwner():EmitSound("npc/barnacle/barnacle_gulp"..math.random(2)..".wav", 70, math.random(125, 130))
|
||
|
end
|
||
|
|
||
|
function SWEP:EmitBiteObjectSound()
|
||
|
self:GetOwner():EmitSound("NPC_FastHeadcrab.Bite")
|
||
|
end
|
||
|
|
||
|
function SWEP:EmitIdleSound()
|
||
|
self:GetOwner():EmitSound("NPC_FastHeadcrab.Idle")
|
||
|
end
|
||
|
|
||
|
function SWEP:EmitAttackSound()
|
||
|
self:GetOwner():EmitSound("npc/headcrab_fast/attack"..math.random(3)..".wav", 70, math.random(215,220))
|
||
|
end
|
||
|
|
||
|
function SWEP:Reload()
|
||
|
end
|