zombiesurvival-evolved/gamemodes/zombiesurvival/entities/weapons/weapon_zs_barbedheadcrab/shared.lua

134 lines
3.6 KiB
Lua
Raw Permalink Normal View History

SWEP.Base = "weapon_zs_poisonheadcrab"
SWEP.PrintName = "Barbed Headcrab"
SWEP.PounceDamage = 36
function SWEP:Think()
local curtime = CurTime()
local owner = self:GetOwner()
if self:IsGoingToSpit() and self:GetNextSpit() <= curtime then
self:SetNextSpit(0)
self:SetNextPrimaryFire(curtime + 2.5)
self:SetNextSecondaryFire(self:GetNextPrimaryFire())
if SERVER then
owner:EmitSound("npc/roller/mine/rmine_blades_out2.wav", 74, 220)
owner.LastRangedAttack = CurTime()
local ent = ents.Create("projectile_bristle")
if ent:IsValid() then
ent:SetOwner(owner)
local aimvec = owner:GetAimVector()
local vStart = owner:GetShootPos()
local tr = util.TraceLine({start=vStart, endpos=vStart + owner:GetAimVector() * 30, filter=owner})
if tr.Hit then
ent:SetPos(tr.HitPos + tr.HitNormal * 4)
else
ent:SetPos(tr.HitPos)
end
local angs = owner:EyeAngles()
angs:RotateAroundAxis(owner:EyeAngles():Up(), 90)
ent:SetAngles(angs)
ent:Spawn()
local phys = ent:GetPhysicsObject()
if phys:IsValid() then
phys:SetVelocityInstantaneous(aimvec * 900)
end
end
end
elseif self:IsGoingToLeap() and self:GetNextLeap() <= curtime then
self:SetNextLeap(0)
if owner:IsOnGround() then
local vel = owner:GetAimVector()
vel.z = math.max(0.45, vel.z)
vel:Normalize()
owner:SetGroundEntity(NULL)
owner:SetLocalVelocity(vel * 470)
self:SetLeaping(true)
if SERVER then
owner:EmitSound("NPC_BlackHeadcrab.Attack")
end
end
elseif self:IsLeaping() then
if owner:IsOnGround() or 1 < owner:WaterLevel() then
self:SetLeaping(false)
self:SetNextPrimaryFire(curtime + 0.8)
else
--owner:LagCompensation(true)
local vStart = owner:LocalToWorld(owner:OBBCenter())
local trace = owner:CompensatedMeleeTrace(owner:BoundingRadius() + 8, 12, vStart, owner:GetForward())
local ent = trace.Entity
if ent:IsValid() then
local phys = ent:GetPhysicsObject()
if phys:IsValid() and not ent:IsPlayer() and phys:IsMoveable() then
local vel = 12000 * owner:EyeAngles():Forward()
phys:ApplyForceOffset(vel, (ent:NearestPoint(vStart) + ent:GetPos() * 2) / 3)
ent:SetPhysicsAttacker(owner)
end
self:SetLeaping(false)
self:SetNextPrimaryFire(curtime + 1)
if SERVER then
owner:EmitSound("NPC_BlackHeadcrab.Bite")
end
owner:ViewPunch(Angle(math.Rand(-20, 20), math.Rand(-20, 20), math.Rand(-20, 20)))
if ent:IsPlayer() then
ent:MeleeViewPunch(self.PounceDamage)
end
if ent:IsPlayer() then
local bleed = ent:GiveStatus("bleed")
if bleed and bleed:IsValid() then
bleed:AddDamage(self.PounceDamage / 2)
bleed.Damager = owner
end
ent:TakeSpecialDamage(self.PounceDamage / 2, DMG_SLASH, owner, self)
else
ent:TakeSpecialDamage(self.PounceDamage, DMG_SLASH, owner, self)
end
elseif trace.HitWorld then
if SERVER then
owner:EmitSound("NPC_BlackHeadcrab.Impact")
end
self:SetLeaping(false)
self:SetNextPrimaryFire(curtime + 1)
end
--owner:LagCompensation(false)
end
end
self:NextThink(curtime)
return true
end
function SWEP:SecondaryAttack()
local owner = self:GetOwner()
if self:IsLeaping() or self:IsGoingToSpit() or self:IsGoingToLeap() or CurTime() < self:GetNextSecondaryFire() or not self:GetOwner():IsOnGround() then return end
self:SetNextSpit(CurTime() + self.SpitWindUp)
if SERVER then
local sndname = "npc/headcrab_poison/ph_scream"..math.random(3)..".wav"
for i = 1, 3 do
timer.Simple(0.02 * i, function()
if owner:IsValid() then owner:EmitSound(sndname, 75, 140 - i*2, 0.8) end
end)
end
end
end