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

186 lines
4.3 KiB
Lua
Raw Normal View History

SWEP.Base = "weapon_zs_zombie"
SWEP.PrintName = "Flesh Creeper"
SWEP.MeleeDelay = 0.5
SWEP.MeleeReach = 52
SWEP.MeleeDamage = 15
SWEP.MeleeForceScale = 1.25
SWEP.MeleeSize = 4.5 --3
SWEP.MeleeDamageType = DMG_SLASH
SWEP.Primary.Delay = 0.75
SWEP.Secondary.Automatic = false
AccessorFuncDT(SWEP, "RightClickStart", "Float", 2)
AccessorFuncDT(SWEP, "AttackAnimTime", "Float", 3)
AccessorFuncDT(SWEP, "Pouncing", "Boolean", 1)
function SWEP:Think()
self.BaseClass.Think(self)
if self:GetHoldingRightClick() and not self:GetOwner():KeyDown(IN_ATTACK2) then
self:SetRightClickStart(0)
if self.BuildSoundPlaying then
self.BuildSoundPlaying = false
self.BuildSound:ChangeVolume(0, 0.5)
end
elseif self:IsBuilding() then
if not self.BuildSoundPlaying then
self.BuildSoundPlaying = true
self.BuildSound:ChangeVolume(0.45, 0.5)
end
if SERVER then
self:BuildingThink()
end
end
if self:IsPouncing() then
self.FlySound:PlayEx(0.5, 60)
local owner = self:GetOwner()
local delay = owner:GetMeleeSpeedMul()
local time = CurTime()
if owner:WaterLevel() >= 2 then
self:SetPouncing(false)
self:SetNextPrimaryFire(time + 0.8 * delay)
elseif owner:OnGround() and owner:IsOnGround() then
self:SetPouncing(false)
self:SetNextPrimaryFire(time + 0.9 * delay)
if IsFirstTimePredicted() then
owner:EmitSound("npc/antlion/land1.wav", 65, 140, 0.65)
end
end
else
self.FlySound:Stop()
end
self:NextThink(CurTime())
return true
end
function SWEP:Move(mv)
if self:IsPouncing() then
if CurTime() < self.PoundAttackStart + 0.1 then
local vel = mv:GetVelocity()
vel.z = 350
self:GetOwner():SetGroundEntity(NULL)
mv:SetVelocity(vel)
end
mv:SetMaxSpeed(mv:GetMaxSpeed() * 5)
mv:SetMaxClientSpeed(mv:GetMaxClientSpeed() * 5)
return true
end
end
function SWEP:ApplyMeleeDamage(ent, trace, damage)
if ent.ZombieConstruction then
damage = damage * 3
end
self.BaseClass.ApplyMeleeDamage(self, ent, trace, damage)
end
function SWEP:Initialize()
self.BaseClass.Initialize(self)
self.BuildSound = CreateSound(self, "npc/antlion/charge_loop1.wav")
self.BuildSound:PlayEx(0, 100)
self.FlySound = CreateSound(self, "npc/antlion/fly1.wav")
end
function SWEP:OnRemove()
self.BaseClass.OnRemove(self)
self.BuildSound:Stop()
self.FlySound:Stop()
end
function SWEP:PrimaryAttack()
if self:GetHoldingRightClick() or not self:GetOwner():OnGround() then return end
self.BaseClass.PrimaryAttack(self)
if self:IsSwinging() then
self:SetAttackAnimTime(CurTime() + self.Primary.Delay)
end
end
function SWEP:SecondaryAttack()
if self:IsSwinging() or self:IsInAttackAnim() or not self:GetOwner():OnGround() then return end
self:SetRightClickStart(CurTime())
end
function SWEP:GetHoldingRightClick()
return self:GetRightClickStart() > 0
end
function SWEP:IsBuilding()
return self:GetHoldingRightClick() and (CurTime() - self:GetRightClickStart()) >= 1
end
function SWEP:Reload()
local owner = self:GetOwner()
if self:IsPouncing() or CurTime() < self:GetNextPrimaryFire() or not owner:IsOnGround() or self:IsSwinging() or self:GetHoldingRightClick() then return end
self.PoundAttackStart = CurTime()
local vel = owner:GetAimVector()
vel.z = math.max(0.55, vel.z)
vel:Normalize()
owner:SetGroundEntity(NULL)
owner:SetVelocity(vel * 350)
self.m_ViewAngles = owner:EyeAngles()
self:SetPouncing(true)
end
function SWEP:IsMoaning()
return false
end
function SWEP:PlayAlertSound()
self:GetOwner():EmitSound("npc/barnacle/barnacle_pull"..math.random(4)..".wav", 70)
end
function SWEP:PlayIdleSound()
self:GetOwner():EmitSound("npc/barnacle/barnacle_pull"..math.random(4)..".wav", 70, 85)
end
function SWEP:PlayAttackSound()
end
function SWEP:PlayHitSound()
self:EmitSound("physics/body/body_medium_impact_hard"..math.random(6)..".wav", 70, math.random(110, 120), nil, CHAN_AUTO)
end
function SWEP:PlayMissSound()
self:EmitSound("npc/zombie/claw_miss"..math.random(2)..".wav", 70, math.random(90, 100), nil, CHAN_AUTO)
end
function SWEP:IsInAttackAnim()
return self:GetAttackAnimTime() > 0 and CurTime() < self:GetAttackAnimTime()
end
function SWEP:SetPouncing(pouncing)
if not pouncing then
self.m_ViewAngles = nil
end
self:SetDTBool(1, pouncing)
end
function SWEP:IsPouncing()
return self:GetDTBool(1)
end
SWEP.GetPouncing = SWEP.IsPouncing